From d8b158b4b6195711cbb7e50c90c436ae220b17cb Mon Sep 17 00:00:00 2001 From: Kazuki Yamaguchi Date: Sun, 29 Jan 2017 22:29:41 +0900 Subject: Account belongs to MainActivity (again) --- .../net/lacolaco/smileessence/Application.java | 65 ++++++++++++++++------ .../smileessence/activity/MainActivity.java | 40 +++++++++---- .../activity/ManageAccountsActivity.java | 2 +- 3 files changed, 77 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/net/lacolaco/smileessence/Application.java b/app/src/main/java/net/lacolaco/smileessence/Application.java index e5563706..0b2b07ab 100644 --- a/app/src/main/java/net/lacolaco/smileessence/Application.java +++ b/app/src/main/java/net/lacolaco/smileessence/Application.java @@ -24,11 +24,15 @@ package net.lacolaco.smileessence; +import android.app.Activity; +import android.os.Bundle; import com.crashlytics.android.Crashlytics; import com.crashlytics.android.core.CrashlyticsCore; +import com.squareup.haha.perflib.Main; import com.squareup.leakcanary.LeakCanary; import com.squareup.leakcanary.RefWatcher; import io.fabric.sdk.android.Fabric; +import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.data.Account; import net.lacolaco.smileessence.data.OrmaHolder; import net.lacolaco.smileessence.logging.Logger; @@ -46,8 +50,7 @@ import java.util.WeakHashMap; */ public class Application extends android.app.Application { private static Application instance; - private Account currentAccount; - private final Set currentAccountChangedListeners = Collections.newSetFromMap(new WeakHashMap<>()); + private MainActivity lastUsedMainActivity; private int resId; private RefWatcher refWatcher; @@ -58,13 +61,13 @@ public class Application extends android.app.Application { OrmaHolder.initialize(this); instance = this; // プロセスの寿命の間 1 度しか呼ばれないので安全 refWatcher = LeakCanary.install(this); + registerActivityLifecycleCallbacks(new ActivityLifeCycleListener()); Logger.debug("onCreate"); } // --------------------- reset --------------------- public void resetState() { - currentAccount = null; - currentAccountChangedListeners.clear(); + lastUsedMainActivity = null; resId = -1; } @@ -79,6 +82,10 @@ public class Application extends android.app.Application { } } + public MainActivity getLastUsedMainActivity() { + return lastUsedMainActivity; + } + // --------------------- theme --------------------- public int getThemeResId() { if (resId == -1) { @@ -90,22 +97,10 @@ public class Application extends android.app.Application { // --------------------- current account --------------------- public Account getCurrentAccount() { - return currentAccount; - } - - public void setCurrentAccount(Account val) { - Logger.debug(String.format("setCurrentAccount: %s", val.getUser().getScreenName())); - currentAccount = val; - for (OnCurrentAccountChangedListener listener : currentAccountChangedListeners) { - new UIHandler().post(() -> listener.onCurrentAccountChanged(val)); - } + return lastUsedMainActivity != null ? lastUsedMainActivity.getCurrentAccount() : null; } - public void addOnCurrentAccountChangedListener(OnCurrentAccountChangedListener listener) { - currentAccountChangedListeners.add(listener); - } - - public interface OnCurrentAccountChangedListener { + public interface OnCurrentAccountChangedListener { // will be removed void onCurrentAccountChanged(Account newAccount); } @@ -113,4 +108,38 @@ public class Application extends android.app.Application { public RefWatcher getRefWatcher() { return refWatcher; } + + private class ActivityLifeCycleListener implements ActivityLifecycleCallbacks { + @Override + public void onActivityCreated(Activity activity, Bundle savedInstanceState) { + } + + @Override + public void onActivityStarted(Activity activity) { + } + + @Override + public void onActivityResumed(Activity activity) { + if (activity instanceof MainActivity) + lastUsedMainActivity = (MainActivity) activity; + } + + @Override + public void onActivityPaused(Activity activity) { + if (activity instanceof MainActivity) + lastUsedMainActivity = null; + } + + @Override + public void onActivityStopped(Activity activity) { + } + + @Override + public void onActivitySaveInstanceState(Activity activity, Bundle outState) { + } + + @Override + public void onActivityDestroyed(Activity activity) { + } + } } diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java index e2871e17..fef4e7e2 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java +++ b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.java @@ -57,16 +57,16 @@ import net.lacolaco.smileessence.notification.Notificator; import net.lacolaco.smileessence.preference.InternalPreferenceHelper; import net.lacolaco.smileessence.twitter.UserStreamListener; import net.lacolaco.smileessence.twitter.task.Users; -import net.lacolaco.smileessence.util.BitmapOptimizer; -import net.lacolaco.smileessence.util.BitmapURLTask; -import net.lacolaco.smileessence.util.IntentUtils; -import net.lacolaco.smileessence.util.UIObserverBundle; +import net.lacolaco.smileessence.util.*; import net.lacolaco.smileessence.view.adapter.PageListAdapter; import net.lacolaco.smileessence.view.dialog.ConfirmDialogFragment; import net.lacolaco.smileessence.view.page.*; import twitter4j.TwitterStream; import java.lang.reflect.Field; +import java.util.Collections; +import java.util.Set; +import java.util.WeakHashMap; public class MainActivity extends Activity implements Application.OnCurrentAccountChangedListener, ViewPager.OnPageChangeListener { // ------------------------------ FIELDS ------------------------------ @@ -74,6 +74,8 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou public static final int REQUEST_GET_PICTURE_FROM_GALLERY = 11; private static final int REQUEST_MANAGE_ACCOUNT = 13; private static final int REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION = 14; + private Account currentAccount; + private final Set currentAccountChangedListeners = Collections.newSetFromMap(new WeakHashMap<>()); /* will be removed eventually */ private ViewPager viewPager; private ImageView currentAccountIconImageView; private PageListAdapter pagerAdapter; @@ -81,6 +83,22 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou private UserStreamListener userStreamListener; private final UIObserverBundle currentUserBundle = new UIObserverBundle(); + public Account getCurrentAccount() { + return currentAccount; + } + + public void setCurrentAccount(Account val) { + Logger.debug(String.format("setCurrentAccount: %s", val.getUser().getScreenName())); + currentAccount = val; + for (Application.OnCurrentAccountChangedListener listener : currentAccountChangedListeners) { + new UIHandler().post(() -> listener.onCurrentAccountChanged(val)); + } + } + + public void addOnCurrentAccountChangedListener(Application.OnCurrentAccountChangedListener listener) { + currentAccountChangedListeners.add(listener); + } + public boolean isStreaming() { return userStreamListener != null && userStreamListener.isConnected(); } @@ -172,7 +190,7 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_MANAGE_ACCOUNT: - if (resultCode == RESULT_CANCELED && Application.getInstance().getCurrentAccount() == null) { + if (resultCode == RESULT_CANCELED && getCurrentAccount() == null) { forceFinish(); } break; @@ -201,7 +219,7 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou Account.load(); ExtractionWord.load(); initializePages(); - app.addOnCurrentAccountChangedListener(this); + addOnCurrentAccountChangedListener(this); int wextPermission = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE); if (wextPermission == PackageManager.PERMISSION_GRANTED) { @@ -235,7 +253,7 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou private void startMainLogic() { Account account = getLastUsedAccount(); if (account != null) { - ((Application) getApplication()).setCurrentAccount(account); + setCurrentAccount(account); IntentRouter.onNewIntent(this, getIntent()); } else { startActivityForResult(new Intent(this, ManageAccountsActivity.class), REQUEST_MANAGE_ACCOUNT); @@ -320,7 +338,7 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou return true; } case R.id.actionbar_aclog: { - IntentUtils.openUri(this, Application.getInstance().getCurrentAccount().getUser().getAclogTimelineURL()); + IntentUtils.openUri(this, getCurrentAccount().getUser().getAclogTimelineURL()); return true; } case R.id.actionbar_report: { @@ -383,8 +401,8 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou if (stream != null) { new Thread(stream::cleanUp).start(); } - stream = Application.getInstance().getCurrentAccount().getTwitterStream(); - userStreamListener = new UserStreamListener(Application.getInstance().getCurrentAccount()); + stream = getCurrentAccount().getTwitterStream(); + userStreamListener = new UserStreamListener(getCurrentAccount()); stream.addListener(userStreamListener); stream.addConnectionLifeCycleListener(userStreamListener); stream.user(); @@ -430,7 +448,7 @@ public class MainActivity extends Activity implements Application.OnCurrentAccou private void updateActionBarTitle() { ActionBar actionBar = getActionBar(); - Account currentAccount = Application.getInstance().getCurrentAccount(); + Account currentAccount = getCurrentAccount(); if (actionBar != null && currentAccount != null) { String screenName = currentAccount.getUser().getScreenName(); String pageTitle = pagerAdapter.getName(viewPager.getCurrentItem()); diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.java b/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.java index d88a1a9e..e95e9dd9 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.java +++ b/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.java @@ -127,7 +127,7 @@ public class ManageAccountsActivity extends Activity implements AdapterView.OnIt private void safeFinish() { if (newAccount != null) { if (newAccount != Application.getInstance().getCurrentAccount()) { - Application.getInstance().setCurrentAccount(newAccount); + Application.getInstance().getLastUsedMainActivity().setCurrentAccount(newAccount); InternalPreferenceHelper.getInstance().set(R.string.key_last_used_account_id, newAccount.getUserId()); } setResult(RESULT_OK); -- cgit v1.2.3