From e93b06f45c7384a7d12db4da496197fc73edb99a Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 24 Feb 2018 20:19:35 +0100 Subject: [PATCH] redirect on empty conversation list --- .../services/XmppConnectionService.java | 15 ++++- .../ui/ConversationActivity.java | 64 ++++++++++++++++++- .../conversations/ui/WelcomeActivity.java | 2 +- 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 5a1ae4097..4c0c9722c 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1648,6 +1648,19 @@ public class XmppConnectionService extends Service { return null; } + public boolean isConversationsListEmpty(final Conversation ignore) { + synchronized (this.conversations) { + final int size = this.conversations.size(); + if (size == 0) { + return true; + } else if (size == 1) { + return this.conversations.get(0) == ignore; + } else { + return false; + } + } + } + public Conversation findOrCreateConversation(Account account, Jid jid, boolean muc, final boolean async) { return this.findOrCreateConversation(account, jid, muc, false, async); } @@ -3771,7 +3784,7 @@ public class XmppConnectionService extends Service { public Account getPendingAccount() { Account pending = null; for (Account account : getAccounts()) { - if (account.isOptionSet(Account.OPTION_REGISTER)) { + if (!account.isOptionSet(Account.OPTION_LOGGED_IN_SUCCESSFULLY)) { pending = account; } else { return null; diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index fced378a3..345173901 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -44,9 +44,12 @@ import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; +import java.util.concurrent.atomic.AtomicBoolean; + import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.databinding.ActivityConversationsBinding; +import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.ui.interfaces.OnConversationArchived; @@ -73,6 +76,7 @@ public class ConversationActivity extends XmppActivity implements OnConversation private final PendingItem pendingViewIntent = new PendingItem<>(); private ActivityConversationsBinding binding; private boolean mActivityPaused = true; + private AtomicBoolean mRedirectInProcess = new AtomicBoolean(false); private static boolean isViewIntent(Intent i) { return i != null && ACTION_VIEW_CONVERSATION.equals(i.getAction()) && i.hasExtra(EXTRA_CONVERSATION); @@ -94,6 +98,9 @@ public class ConversationActivity extends XmppActivity implements OnConversation @Override void onBackendConnected() { + if (performRedirectIfNecessary(true)) { + return; + } for (@IdRes int id : FRAGMENT_ID_NOTIFICATION_ORDER) { notifyFragmentOfBackendConnected(id); } @@ -113,6 +120,55 @@ public class ConversationActivity extends XmppActivity implements OnConversation } } + private boolean performRedirectIfNecessary(boolean noAnimation) { + return performRedirectIfNecessary(null, noAnimation); + } + + private boolean performRedirectIfNecessary(final Conversation ignore, final boolean noAnimation) { + if (xmppConnectionService == null) { + return false; + } + boolean isConversationsListEmpty = xmppConnectionService.isConversationsListEmpty(ignore); + if (isConversationsListEmpty && mRedirectInProcess.compareAndSet(false, true)) { + final Intent intent = getRedirectionIntent(noAnimation); + runOnUiThread(() -> { + startActivity(intent); + if (noAnimation) { + overridePendingTransition(0, 0); + } + }); + } + return mRedirectInProcess.get(); + } + + private Intent getRedirectionIntent(boolean noAnimation) { + Account pendingAccount = xmppConnectionService.getPendingAccount(); + Intent intent; + if (pendingAccount != null) { + intent = new Intent(this, EditAccountActivity.class); + intent.putExtra("jid", pendingAccount.getJid().toBareJid().toString()); + } else { + if (xmppConnectionService.getAccounts().size() == 0) { + if (Config.X509_VERIFICATION) { + intent = new Intent(this, ManageAccountActivity.class); + } else if (Config.MAGIC_CREATE_DOMAIN != null) { + intent = new Intent(this, WelcomeActivity.class); + WelcomeActivity.addInviteUri(intent, getIntent()); + } else { + intent = new Intent(this, EditAccountActivity.class); + } + } else { + intent = new Intent(this, StartConversationActivity.class); + } + } + intent.putExtra("init", true); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + if (noAnimation) { + intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + } + return intent; + } + private void notifyFragmentOfBackendConnected(@IdRes int id) { final Fragment fragment = getFragmentManager().findFragmentById(id); if (fragment != null && fragment instanceof XmppFragment) { @@ -211,6 +267,7 @@ public class ConversationActivity extends XmppActivity implements OnConversation if (this.mTheme != theme) { recreate(); } + mRedirectInProcess.set(false); super.onStart(); } @@ -297,7 +354,9 @@ public class ConversationActivity extends XmppActivity implements OnConversation @Override public void onConversationArchived(Conversation conversation) { - //TODO; check if nothing more left; + if (performRedirectIfNecessary(conversation, false)) { + return; + } Fragment mainFragment = getFragmentManager().findFragmentById(R.id.main_fragment); if (mainFragment != null && mainFragment instanceof ConversationFragment) { getFragmentManager().popBackStack(); @@ -337,6 +396,9 @@ public class ConversationActivity extends XmppActivity implements OnConversation @Override public void onConversationUpdate() { + if (performRedirectIfNecessary(false)) { + return; + } this.refreshUi(); } diff --git a/src/main/java/eu/siacs/conversations/ui/WelcomeActivity.java b/src/main/java/eu/siacs/conversations/ui/WelcomeActivity.java index 26d18b7ae..a9188f224 100644 --- a/src/main/java/eu/siacs/conversations/ui/WelcomeActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/WelcomeActivity.java @@ -96,7 +96,7 @@ public class WelcomeActivity extends XmppActivity { public static void launch(AppCompatActivity activity) { Intent intent = new Intent(activity, WelcomeActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); activity.startActivity(intent); activity.overridePendingTransition(0,0); }