aboutsummaryrefslogtreecommitdiffstats
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/AndroidManifest.xml3
-rw-r--r--src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java2
-rw-r--r--src/main/java/de/pixart/messenger/ui/ContactDetailsActivity.java3
-rw-r--r--src/main/java/de/pixart/messenger/ui/ConversationsActivity.java14
-rw-r--r--src/main/java/de/pixart/messenger/ui/IntroActivity.java134
-rw-r--r--src/main/java/de/pixart/messenger/ui/SettingsActivity.java35
-rw-r--r--src/main/java/de/pixart/messenger/ui/StartUI.java5
-rw-r--r--src/main/java/de/pixart/messenger/ui/util/IntroHelper.java39
-rw-r--r--src/main/res/drawable-hdpi/intro_account_details_icon.pngbin0 -> 971 bytes
-rw-r--r--src/main/res/drawable-hdpi/intro_account_icon.pngbin0 -> 1330 bytes
-rw-r--r--src/main/res/drawable-hdpi/intro_memory_icon.pngbin0 -> 711 bytes
-rw-r--r--src/main/res/drawable-hdpi/intro_start_chat_icon.pngbin0 -> 1044 bytes
-rw-r--r--src/main/res/drawable-mdpi/intro_account_details_icon.pngbin0 -> 880 bytes
-rw-r--r--src/main/res/drawable-mdpi/intro_account_icon.pngbin0 -> 951 bytes
-rw-r--r--src/main/res/drawable-mdpi/intro_memory_icon.pngbin0 -> 694 bytes
-rw-r--r--src/main/res/drawable-mdpi/intro_start_chat_icon.pngbin0 -> 794 bytes
-rw-r--r--src/main/res/drawable-xhdpi/intro_account_details_icon.pngbin0 -> 1677 bytes
-rw-r--r--src/main/res/drawable-xhdpi/intro_account_icon.pngbin0 -> 1968 bytes
-rw-r--r--src/main/res/drawable-xhdpi/intro_memory_icon.pngbin0 -> 1187 bytes
-rw-r--r--src/main/res/drawable-xhdpi/intro_start_chat_icon.pngbin0 -> 1621 bytes
-rw-r--r--src/main/res/drawable-xxhdpi/intro_account_details_icon.pngbin0 -> 2064 bytes
-rw-r--r--src/main/res/drawable-xxhdpi/intro_account_icon.pngbin0 -> 2670 bytes
-rw-r--r--src/main/res/drawable-xxhdpi/intro_memory_icon.pngbin0 -> 1547 bytes
-rw-r--r--src/main/res/drawable-xxhdpi/intro_start_chat_icon.pngbin0 -> 2229 bytes
-rw-r--r--src/main/res/drawable-xxxhdpi/intro_account_details_icon.pngbin0 -> 5313 bytes
-rw-r--r--src/main/res/drawable-xxxhdpi/intro_account_icon.pngbin0 -> 6431 bytes
-rw-r--r--src/main/res/drawable-xxxhdpi/intro_memory_icon.pngbin0 -> 3715 bytes
-rw-r--r--src/main/res/drawable-xxxhdpi/intro_start_chat_icon.pngbin0 -> 5163 bytes
-rw-r--r--src/main/res/values/defaults.xml1
-rw-r--r--src/main/res/values/strings.xml22
-rw-r--r--src/main/res/xml/preferences.xml4
31 files changed, 250 insertions, 12 deletions
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index b9e1624ae..3bf8be676 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -342,6 +342,9 @@
android:name=".ui.ChannelDiscoveryActivity"
android:label="@string/discover_channels"
android:launchMode="singleTask" />
+ <activity android:name=".ui.IntroActivity"
+ android:launchMode="singleTask"
+ android:label="@string/app_name" />
<service android:name=".services.ExportBackupService" />
<service android:name=".services.ImportBackupService" />
diff --git a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java
index 043edfe49..6fdd8c50a 100644
--- a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java
+++ b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java
@@ -54,6 +54,7 @@ import me.drakeet.support.toast.ToastCompat;
import rocks.xmpp.addr.Jid;
import static de.pixart.messenger.entities.Bookmark.printableValue;
+import static de.pixart.messenger.ui.util.IntroHelper.showIntro;
import static de.pixart.messenger.utils.StringUtils.changed;
public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, XmppConnectionService.OnConfigurationPushed, TextWatcher, OnMediaLoaded {
@@ -262,6 +263,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
intent.putExtra("uuid", mConversation.getUuid());
startActivity(intent);
});
+ showIntro(this, true);
}
@Override
diff --git a/src/main/java/de/pixart/messenger/ui/ContactDetailsActivity.java b/src/main/java/de/pixart/messenger/ui/ContactDetailsActivity.java
index 4bee618f5..f8421cac9 100644
--- a/src/main/java/de/pixart/messenger/ui/ContactDetailsActivity.java
+++ b/src/main/java/de/pixart/messenger/ui/ContactDetailsActivity.java
@@ -67,6 +67,8 @@ import de.pixart.messenger.xmpp.OnUpdateBlocklist;
import de.pixart.messenger.xmpp.XmppConnection;
import rocks.xmpp.addr.Jid;
+import static de.pixart.messenger.ui.util.IntroHelper.showIntro;
+
public class ContactDetailsActivity extends OmemoActivity implements OnAccountUpdate, OnRosterUpdate, OnUpdateBlocklist, OnKeyStatusUpdated, OnMediaLoaded {
public static final String ACTION_VIEW_CONTACT = "view_contact";
@@ -278,6 +280,7 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
mMediaAdapter = new MediaAdapter(this, R.dimen.media_size);
this.binding.media.setAdapter(mMediaAdapter);
GridManager.setupLayoutManager(this, this.binding.media, R.dimen.media_size);
+ showIntro(this, false);
}
@Override
diff --git a/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java b/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java
index 75b3ce91a..26e44a0f2 100644
--- a/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java
+++ b/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java
@@ -40,17 +40,12 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
-import androidx.databinding.DataBindingUtil;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.Settings;
-import androidx.annotation.IdRes;
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@@ -59,6 +54,12 @@ import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.widget.Toolbar;
+import androidx.databinding.DataBindingUtil;
+
import net.java.otr4j.session.SessionStatus;
import org.openintents.openpgp.util.OpenPgpApi;
@@ -73,6 +74,7 @@ import de.pixart.messenger.crypto.OmemoSetting;
import de.pixart.messenger.databinding.ActivityConversationsBinding;
import de.pixart.messenger.entities.Account;
import de.pixart.messenger.entities.Conversation;
+import de.pixart.messenger.entities.Conversational;
import de.pixart.messenger.entities.MucOptions;
import de.pixart.messenger.entities.Presence;
import de.pixart.messenger.services.XmppConnectionService;
@@ -83,6 +85,7 @@ import de.pixart.messenger.ui.interfaces.OnConversationSelected;
import de.pixart.messenger.ui.interfaces.OnConversationsListItemUpdated;
import de.pixart.messenger.ui.util.ActivityResult;
import de.pixart.messenger.ui.util.ConversationMenuConfigurator;
+import de.pixart.messenger.ui.util.IntroHelper;
import de.pixart.messenger.ui.util.PendingItem;
import de.pixart.messenger.utils.EmojiWrapper;
import de.pixart.messenger.utils.ExceptionHelper;
@@ -531,6 +534,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
} else {
invalidateActionBarTitle();
}
+ IntroHelper.showIntro(this, conversation.getMode() == Conversational.MODE_MULTI);
}
public boolean onXmppUriClicked(Uri uri) {
diff --git a/src/main/java/de/pixart/messenger/ui/IntroActivity.java b/src/main/java/de/pixart/messenger/ui/IntroActivity.java
new file mode 100644
index 000000000..802072efe
--- /dev/null
+++ b/src/main/java/de/pixart/messenger/ui/IntroActivity.java
@@ -0,0 +1,134 @@
+package de.pixart.messenger.ui;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.github.paolorotolo.appintro.AppIntro;
+import com.github.paolorotolo.appintro.AppIntroFragment;
+import com.github.paolorotolo.appintro.model.SliderPage;
+
+import de.pixart.messenger.R;
+
+import static de.pixart.messenger.ui.util.IntroHelper.SaveIntroShown;
+
+public class IntroActivity extends AppIntro {
+ public static final String ACTIVITY = "activity";
+ public static final String MULTICHAT = "multi_chat";
+ public static final String START_UI = "StartUI";
+ public static final String CONVERSATIONS_ACTIVITY = "ConversationsActivity";
+ public static final String CONTACT_DETAILS_ACTIVITY = "ContactDetailsActivity";
+ public static final String CONFERENCE_DETAILS_ACTIVITY = "ConferenceDetailsActivity";
+ String activity = null;
+ boolean mode_multi = false;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final int backgroundColor = getResources().getColor(R.color.primary_dark);
+ final int barColor = getResources().getColor(R.color.primary);
+ final int separatorColor = getResources().getColor(R.color.accent);
+
+ setBarColor(barColor);
+ setSeparatorColor(separatorColor);
+ setProgressButtonEnabled(true);
+ showSkipButton(false);
+ setBackButtonVisibilityWithDone(true);
+ setGoBackLock(true);
+ setFadeAnimation();
+
+ final Intent intent = getIntent();
+ if (intent != null) {
+ activity = intent.getStringExtra(ACTIVITY);
+ mode_multi = intent.getBooleanExtra(MULTICHAT, false);
+ }
+ if (activity == null) {
+ finish();
+ }
+ switch (activity) {
+ case START_UI:
+ SliderPage welcome = new SliderPage();
+ welcome.setTitle(getString(R.string.welcome_header));
+ welcome.setDescription(getString(R.string.intro_desc_main));
+ welcome.setImageDrawable(R.drawable.main_logo);
+ welcome.setBgColor(backgroundColor);
+ addSlide(AppIntroFragment.newInstance(welcome));
+
+ SliderPage permissions = new SliderPage();
+ permissions.setTitle(getString(R.string.intro_permissions));
+ permissions.setDescription(getString(R.string.intro_desc_permissions));
+ permissions.setImageDrawable(R.drawable.intro_memory_icon);
+ permissions.setBgColor(backgroundColor);
+ addSlide(AppIntroFragment.newInstance(permissions));
+
+ SliderPage account = new SliderPage();
+ account.setTitle(getString(R.string.intro_account));
+ account.setDescription(getString(R.string.intro_desc_account));
+ account.setImageDrawable(R.drawable.intro_account_icon);
+ account.setBgColor(backgroundColor);
+ addSlide(AppIntroFragment.newInstance(account));
+
+ SliderPage startChatting = new SliderPage();
+ startChatting.setTitle(getString(R.string.intro_start_chatting));
+ startChatting.setDescription(getString(R.string.intro_desc_start_chatting));
+ startChatting.setImageDrawable(R.drawable.intro_start_chat_icon);
+ startChatting.setBgColor(backgroundColor);
+ addSlide(AppIntroFragment.newInstance(startChatting));
+ break;
+ case CONVERSATIONS_ACTIVITY:
+ SliderPage openChat = new SliderPage();
+ openChat.setTitle(getString(R.string.intro_start_chatting));
+ openChat.setDescription(getString(R.string.intro_desc_open_chat));
+ openChat.setImageDrawable(R.drawable.intro_start_chat_icon);
+ openChat.setBgColor(backgroundColor);
+ addSlide(AppIntroFragment.newInstance(openChat));
+
+ SliderPage chatDetails = new SliderPage();
+ chatDetails.setTitle(getString(R.string.intro_chat_details));
+ chatDetails.setDescription(getString(R.string.intro_desc_chat_details));
+ chatDetails.setImageDrawable(R.drawable.intro_account_details_icon);
+ chatDetails.setBgColor(backgroundColor);
+ addSlide(AppIntroFragment.newInstance(chatDetails));
+
+ if (mode_multi) {
+ SliderPage highlightUser = new SliderPage();
+ highlightUser.setTitle(getString(R.string.intro_highlight_user));
+ highlightUser.setDescription(getString(R.string.intro_desc_highlight_user));
+ highlightUser.setImageDrawable(R.drawable.intro_account_details_icon);
+ highlightUser.setBgColor(backgroundColor);
+ addSlide(AppIntroFragment.newInstance(highlightUser));
+ }
+ break;
+ case CONTACT_DETAILS_ACTIVITY:
+ case CONFERENCE_DETAILS_ACTIVITY:
+ SliderPage openChatDetails = new SliderPage();
+ openChatDetails.setTitle(getString(R.string.intro_chat_details));
+ openChatDetails.setDescription(getString(R.string.intro_desc_open_chat_details));
+ openChatDetails.setImageDrawable(R.drawable.intro_account_details_icon);
+ openChatDetails.setBgColor(backgroundColor);
+ addSlide(AppIntroFragment.newInstance(openChatDetails));
+ }
+ }
+
+ @Override
+ public void onSkipPressed(Fragment currentFragment) {
+ super.onSkipPressed(currentFragment);
+ finish();
+ }
+
+ @Override
+ public void onDonePressed(Fragment currentFragment) {
+ super.onDonePressed(currentFragment);
+ SaveIntroShown(getBaseContext(), activity, mode_multi);
+ finish();
+ }
+
+ @Override
+ public void onSlideChanged(@Nullable Fragment oldFragment, @Nullable Fragment newFragment) {
+ super.onSlideChanged(oldFragment, newFragment);
+ // Do something when the slide changes.
+ }
+}
diff --git a/src/main/java/de/pixart/messenger/ui/SettingsActivity.java b/src/main/java/de/pixart/messenger/ui/SettingsActivity.java
index 26b1bfdd9..ba7508556 100644
--- a/src/main/java/de/pixart/messenger/ui/SettingsActivity.java
+++ b/src/main/java/de/pixart/messenger/ui/SettingsActivity.java
@@ -15,18 +15,20 @@ import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
-import androidx.annotation.NonNull;
-import androidx.core.content.ContextCompat;
-import androidx.appcompat.app.AlertDialog;
import android.util.Log;
import android.widget.Toast;
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.core.content.ContextCompat;
+
import java.io.File;
import java.security.KeyStoreException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import de.pixart.messenger.Config;
import de.pixart.messenger.R;
@@ -37,6 +39,7 @@ import de.pixart.messenger.services.ExportBackupService;
import de.pixart.messenger.services.MemorizingTrustManager;
import de.pixart.messenger.ui.util.StyledAttributes;
import de.pixart.messenger.utils.TimeframeUtils;
+import me.drakeet.support.toast.ToastCompat;
import rocks.xmpp.addr.Jid;
public class SettingsActivity extends XmppActivity implements
@@ -266,6 +269,15 @@ public class SettingsActivity extends XmppActivity implements
});
}
+ final Preference showIntroAgainPreference = mSettingsFragment.findPreference("show_intro");
+ if (showIntroAgainPreference != null) {
+ showIntroAgainPreference.setSummary(getString(R.string.pref_show_intro_summary));
+ showIntroAgainPreference.setOnPreferenceClickListener(preference -> {
+ showIntroAgain();
+ return true;
+ });
+ }
+
if (Config.ONLY_INTERNAL_STORAGE) {
final Preference cleanCachePreference = mSettingsFragment.findPreference("clean_cache");
if (cleanCachePreference != null) {
@@ -519,4 +531,21 @@ public class SettingsActivity extends XmppActivity implements
Log.d(Config.LOGTAG, "Get number of accounts from file: " + NumberOfAccounts);
return NumberOfAccounts;
}
+
+ private void showIntroAgain() {
+ SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(this.getBaseContext());
+ Map<String, ?> allEntries = getPrefs.getAll();
+ for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
+ if (entry.getKey().contains("intro_shown_on_activity")) {
+ SharedPreferences.Editor e = getPrefs.edit();
+ e.putBoolean(entry.getKey(), true);
+ if (e.commit()) {
+ ToastCompat.makeText(this, R.string.show_intro_again, ToastCompat.LENGTH_SHORT).show();
+ } else {
+ ToastCompat.makeText(this, R.string.show_intro_again_failed, ToastCompat.LENGTH_SHORT).show();
+ }
+
+ }
+ }
+ }
}
diff --git a/src/main/java/de/pixart/messenger/ui/StartUI.java b/src/main/java/de/pixart/messenger/ui/StartUI.java
index 7abfc0912..c3c2596d2 100644
--- a/src/main/java/de/pixart/messenger/ui/StartUI.java
+++ b/src/main/java/de/pixart/messenger/ui/StartUI.java
@@ -9,14 +9,16 @@ import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
+import android.util.Log;
+
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
-import android.util.Log;
import java.util.List;
import de.pixart.messenger.Config;
import de.pixart.messenger.R;
+import de.pixart.messenger.ui.util.IntroHelper;
import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.EasyPermissions;
@@ -33,6 +35,7 @@ public class StartUI extends AppCompatActivity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start_ui);
+ IntroHelper.showIntro(this, false);
requestNeededPermissions();
}
diff --git a/src/main/java/de/pixart/messenger/ui/util/IntroHelper.java b/src/main/java/de/pixart/messenger/ui/util/IntroHelper.java
new file mode 100644
index 000000000..817551c4f
--- /dev/null
+++ b/src/main/java/de/pixart/messenger/ui/util/IntroHelper.java
@@ -0,0 +1,39 @@
+package de.pixart.messenger.ui.util;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+
+import de.pixart.messenger.ui.IntroActivity;
+
+import static de.pixart.messenger.ui.IntroActivity.ACTIVITY;
+import static de.pixart.messenger.ui.IntroActivity.MULTICHAT;
+
+public class IntroHelper {
+ public static void showIntro(Activity activity, boolean mode_multi) {
+ Thread t = new Thread(() -> {
+ SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(activity.getBaseContext());
+ String activityname = activity.getClass().getSimpleName();
+ String INTRO = "intro_shown_on_activity_" + activityname + "_MultiMode_" + mode_multi;
+ boolean SHOW_INTRO = getPrefs.getBoolean(INTRO, true);
+
+ if (SHOW_INTRO) {
+ final Intent i = new Intent(activity, IntroActivity.class);
+ i.putExtra(ACTIVITY, activityname);
+ i.putExtra(MULTICHAT, mode_multi);
+ activity.runOnUiThread(() -> activity.startActivity(i));
+ }
+ });
+ t.start();
+ }
+
+ public static void SaveIntroShown(Context context, String activity, boolean mode_multi) {
+ SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+ String INTRO = "intro_shown_on_activity_" + activity + "_MultiMode_" + mode_multi;
+ SharedPreferences.Editor e = getPrefs.edit();
+ e.putBoolean(INTRO, false);
+ e.apply();
+ }
+}
diff --git a/src/main/res/drawable-hdpi/intro_account_details_icon.png b/src/main/res/drawable-hdpi/intro_account_details_icon.png
new file mode 100644
index 000000000..2a5e6f393
--- /dev/null
+++ b/src/main/res/drawable-hdpi/intro_account_details_icon.png
Binary files differ
diff --git a/src/main/res/drawable-hdpi/intro_account_icon.png b/src/main/res/drawable-hdpi/intro_account_icon.png
new file mode 100644
index 000000000..eb3b5e196
--- /dev/null
+++ b/src/main/res/drawable-hdpi/intro_account_icon.png
Binary files differ
diff --git a/src/main/res/drawable-hdpi/intro_memory_icon.png b/src/main/res/drawable-hdpi/intro_memory_icon.png
new file mode 100644
index 000000000..6a511921d
--- /dev/null
+++ b/src/main/res/drawable-hdpi/intro_memory_icon.png
Binary files differ
diff --git a/src/main/res/drawable-hdpi/intro_start_chat_icon.png b/src/main/res/drawable-hdpi/intro_start_chat_icon.png
new file mode 100644
index 000000000..4454c061c
--- /dev/null
+++ b/src/main/res/drawable-hdpi/intro_start_chat_icon.png
Binary files differ
diff --git a/src/main/res/drawable-mdpi/intro_account_details_icon.png b/src/main/res/drawable-mdpi/intro_account_details_icon.png
new file mode 100644
index 000000000..3b2fd3f10
--- /dev/null
+++ b/src/main/res/drawable-mdpi/intro_account_details_icon.png
Binary files differ
diff --git a/src/main/res/drawable-mdpi/intro_account_icon.png b/src/main/res/drawable-mdpi/intro_account_icon.png
new file mode 100644
index 000000000..b5449c366
--- /dev/null
+++ b/src/main/res/drawable-mdpi/intro_account_icon.png
Binary files differ
diff --git a/src/main/res/drawable-mdpi/intro_memory_icon.png b/src/main/res/drawable-mdpi/intro_memory_icon.png
new file mode 100644
index 000000000..9de4df911
--- /dev/null
+++ b/src/main/res/drawable-mdpi/intro_memory_icon.png
Binary files differ
diff --git a/src/main/res/drawable-mdpi/intro_start_chat_icon.png b/src/main/res/drawable-mdpi/intro_start_chat_icon.png
new file mode 100644
index 000000000..09356f98d
--- /dev/null
+++ b/src/main/res/drawable-mdpi/intro_start_chat_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xhdpi/intro_account_details_icon.png b/src/main/res/drawable-xhdpi/intro_account_details_icon.png
new file mode 100644
index 000000000..e60fcd466
--- /dev/null
+++ b/src/main/res/drawable-xhdpi/intro_account_details_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xhdpi/intro_account_icon.png b/src/main/res/drawable-xhdpi/intro_account_icon.png
new file mode 100644
index 000000000..dfb7495a2
--- /dev/null
+++ b/src/main/res/drawable-xhdpi/intro_account_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xhdpi/intro_memory_icon.png b/src/main/res/drawable-xhdpi/intro_memory_icon.png
new file mode 100644
index 000000000..39f5c0b91
--- /dev/null
+++ b/src/main/res/drawable-xhdpi/intro_memory_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xhdpi/intro_start_chat_icon.png b/src/main/res/drawable-xhdpi/intro_start_chat_icon.png
new file mode 100644
index 000000000..5df2c36c6
--- /dev/null
+++ b/src/main/res/drawable-xhdpi/intro_start_chat_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xxhdpi/intro_account_details_icon.png b/src/main/res/drawable-xxhdpi/intro_account_details_icon.png
new file mode 100644
index 000000000..03b37b6ba
--- /dev/null
+++ b/src/main/res/drawable-xxhdpi/intro_account_details_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xxhdpi/intro_account_icon.png b/src/main/res/drawable-xxhdpi/intro_account_icon.png
new file mode 100644
index 000000000..3f37e3c78
--- /dev/null
+++ b/src/main/res/drawable-xxhdpi/intro_account_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xxhdpi/intro_memory_icon.png b/src/main/res/drawable-xxhdpi/intro_memory_icon.png
new file mode 100644
index 000000000..c452a74fa
--- /dev/null
+++ b/src/main/res/drawable-xxhdpi/intro_memory_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xxhdpi/intro_start_chat_icon.png b/src/main/res/drawable-xxhdpi/intro_start_chat_icon.png
new file mode 100644
index 000000000..700c313e6
--- /dev/null
+++ b/src/main/res/drawable-xxhdpi/intro_start_chat_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xxxhdpi/intro_account_details_icon.png b/src/main/res/drawable-xxxhdpi/intro_account_details_icon.png
new file mode 100644
index 000000000..ad68c95fe
--- /dev/null
+++ b/src/main/res/drawable-xxxhdpi/intro_account_details_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xxxhdpi/intro_account_icon.png b/src/main/res/drawable-xxxhdpi/intro_account_icon.png
new file mode 100644
index 000000000..a93292776
--- /dev/null
+++ b/src/main/res/drawable-xxxhdpi/intro_account_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xxxhdpi/intro_memory_icon.png b/src/main/res/drawable-xxxhdpi/intro_memory_icon.png
new file mode 100644
index 000000000..0acd26b5e
--- /dev/null
+++ b/src/main/res/drawable-xxxhdpi/intro_memory_icon.png
Binary files differ
diff --git a/src/main/res/drawable-xxxhdpi/intro_start_chat_icon.png b/src/main/res/drawable-xxxhdpi/intro_start_chat_icon.png
new file mode 100644
index 000000000..6e728afe1
--- /dev/null
+++ b/src/main/res/drawable-xxxhdpi/intro_start_chat_icon.png
Binary files differ
diff --git a/src/main/res/values/defaults.xml b/src/main/res/values/defaults.xml
index 137a3541c..42bdd649b 100644
--- a/src/main/res/values/defaults.xml
+++ b/src/main/res/values/defaults.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="welcome_header" translatable="false">Pix-Art Messenger</string>
<string name="type_pc" translatable="false">Computer</string>
<string name="type_phone" translatable="false">Mobile phone</string>
<string name="type_tablet" translatable="false">Tablet</string>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 47dfc1b9b..c7c819540 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -546,7 +546,7 @@
<string name="import_database">Import backup</string>
<string name="invite_again">Invite again</string>
<string name="inviteUser_Subject">has invited you via</string>
- <string name="InviteText">Hello,\n\nthe user %s has invited you to Pix-Art Messenger. If you are using Android, give it a try and click the following link to start over...</string>
+ <string name="InviteText">Hello,\n\nthe user %s has invited you to Pix-Art Messenger. If you are using Android, give it a try and click the following link to start over…</string>
<string name="pref_broadcast_last_activity">Broadcast Last User Interaction</string>
<string name="pref_broadcast_last_activity_summary">Let all your contacts know when use Pix-Art Messenger</string>
<string name="invite_user">Invite to Pix-Art Messenger</string>
@@ -579,7 +579,7 @@
<string name="show_error_message">Show error message</string>
<string name="error_message">Error Message</string>
<string name="data_saver_enabled">Data saver enabled</string>
- <string name="data_saver_enabled_explained">Your operating system is restricting Pix-Art Messenger from accessing the Internet when in background. To receive notifications of new messages you should allow Pix-Art Messenger unrestricted access when Data saver is on.\\nPix-Art Messenger will still make an effort to save data when possible.</string>
+ <string name="data_saver_enabled_explained">Your operating system is restricting Pix-Art Messenger from accessing the Internet when in background. To receive notifications of new messages you should allow Pix-Art Messenger unrestricted access when Data saver is on.\n\nPix-Art Messenger will still make an effort to save data when possible.</string>
<string name="device_does_not_support_data_saver">Your device does not supporting disabling data saver for Pix-Art Messenger.</string>
<string name="add_to_contact_list">Add to contact list</string>
<string name="contact">Contact</string>
@@ -941,4 +941,22 @@
<string name="pref_use_invidious">Replace YouTube links with Invidious</string>
<string name="pref_use_invidious_summary">Invidious is a privacy friendly alternative to YouTube</string>
<string name="this_device">This device</string>
+ <string name="intro_desc_main">Learn how to use Pix-Art Messenger.</string>
+ <string name="welcome_header">Welcome to Pix-Art Messenger</string>
+ <string name="intro_permissions">Permissions</string>
+ <string name="intro_desc_permissions">Pix-Art Messenger will ask you for granting a few permissions. We need to have at least access to your external storage. Any other permissions are requested as required. Note: We will ask you for contacts permissions to read Jabber-IDs from your addressbook. We will not share, upload or copy any of your contacts.</string>
+ <string name="intro_account">Your account</string>
+ <string name="intro_desc_account">To start over, you will need an own account. This works like e-mail works. If you have an own account, just login with your Jabber-ID and password. If you would like to create a new account, you have the choice between choosing a suggested server from the drop-down menu or use a custom one. You have also the possibility to import an existing account into the app.</string>
+ <string name="intro_start_chatting">Start chatting</string>
+ <string name="intro_desc_start_chatting">Congratulations! But how about chatting? Just add Jabber-IDs of your contacts, or if you have given contacts permissions and Jabber-IDs in your addressbook they will be shown up. You can also add or join group chats or join public channels.</string>
+ <string name="intro_desc_open_chat">Now you can start chatting, share locations, files, videos and images or send voice messages.</string>
+ <string name="intro_chat_details">Chat details</string>
+ <string name="intro_desc_chat_details">You want to open the chat details? Just tip on the chat name in the menu bar on the top.</string>
+ <string name="intro_highlight_user">Highlight user</string>
+ <string name="intro_desc_highlight_user">If you want to highlight a user in a group chat just touch the users avatar in the chat. Alternatively, especially if the user is not in the chat, switch to the chat details and look for the user in the participants list. A long touch on the users avatar will show up a popup menu where you can highlight the user.</string>
+ <string name="intro_desc_open_chat_details">You have opened the chat details. Here you can see the details of the chat, change the new message notification behaviour, add or remove the chat from your contact list and much more.</string>
+ <string name="pref_show_intro_summary">Show the intro screens again</string>
+ <string name="pref_show_intro">Show intro again</string>
+ <string name="show_intro_again">Intro screens will be shown again</string>
+ <string name="show_intro_again_failed">Resetting intro screens failed. Try again…</string>
</resources>
diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml
index 6273d601b..7fb3d2189 100644
--- a/src/main/res/xml/preferences.xml
+++ b/src/main/res/xml/preferences.xml
@@ -86,6 +86,10 @@
android:key="show_own_accounts"
android:summary="@string/pref_show_own_accounts_summary"
android:title="@string/pref_show_own_accounts" />
+ <Preference
+ android:key="show_intro"
+ android:summary="@string/pref_show_intro_summary"
+ android:title="@string/pref_show_intro" />
</PreferenceScreen>
<!--Notifications-->
<PreferenceScreen