From 1b542cea6c411d2e615c81033cc1dfdd74d3a23b Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Mon, 13 Mar 2017 15:13:39 +0800 Subject: [PATCH] finished streaming service lifecycle --- twidere/src/main/AndroidManifest.xml | 10 +- .../edu/tsinghua/hotmobi/HotMobiLogger.java | 2 +- .../twidere/util/ActivityTracker.java | 122 ------------------ .../twidere/activity/HomeActivity.kt | 9 +- .../twidere/app/TwidereApplication.kt | 13 +- .../AccountStreamingSettingsFragment.kt | 5 + .../fragment/BaseAccountPreferenceFragment.kt | 60 ++++----- .../receiver/ConnectivityStateReceiver.kt | 6 +- .../twidere/receiver/PowerStateReceiver.kt | 43 ++++++ .../mariotaku/twidere/service/BaseService.kt | 2 + .../twidere/service/StreamingService.kt | 24 +++- .../mariotaku/twidere/util/ActivityTracker.kt | 109 ++++++++++++++++ 12 files changed, 237 insertions(+), 168 deletions(-) delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/util/ActivityTracker.java create mode 100644 twidere/src/main/kotlin/org/mariotaku/twidere/receiver/PowerStateReceiver.kt create mode 100644 twidere/src/main/kotlin/org/mariotaku/twidere/util/ActivityTracker.kt diff --git a/twidere/src/main/AndroidManifest.xml b/twidere/src/main/AndroidManifest.xml index 7d58c7195..4f8548ce4 100644 --- a/twidere/src/main/AndroidManifest.xml +++ b/twidere/src/main/AndroidManifest.xml @@ -647,7 +647,15 @@ - + + + + + + + void log(final T event, final PreProcessing preProcessing) { log(null, event, preProcessing); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ActivityTracker.java b/twidere/src/main/java/org/mariotaku/twidere/util/ActivityTracker.java deleted file mode 100644 index e9c1f9a9a..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ActivityTracker.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.twidere.util; - - -import android.app.Activity; -import android.app.Application; -import android.content.Context; -import android.os.Bundle; - -import org.apache.commons.collections.primitives.ArrayIntList; -import org.apache.commons.collections.primitives.IntList; -import org.mariotaku.twidere.BuildConfig; -import org.mariotaku.twidere.activity.HomeActivity; - -import edu.tsinghua.hotmobi.HotMobiLogger; -import edu.tsinghua.hotmobi.PreProcessing; -import edu.tsinghua.hotmobi.model.SessionEvent; - -/** - * Created by mariotaku on 15/10/5. - */ -public class ActivityTracker implements Application.ActivityLifecycleCallbacks { - - private final IntList mInternalStack = new ArrayIntList(); - private SessionEvent mSessionEvent; - private boolean mHomeActivityStarted; - - private boolean isSwitchingInSameTask(int hashCode) { - return mInternalStack.lastIndexOf(hashCode) < mInternalStack.size() - 1; - } - - public int size() { - return mInternalStack.size(); - } - - public boolean isEmpty() { - return mInternalStack.isEmpty(); - } - - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - - } - - @Override - public void onActivityStarted(final Activity activity) { - mInternalStack.add(System.identityHashCode(activity)); - if (activity instanceof HomeActivity) { - mHomeActivityStarted = true; - } - // BEGIN HotMobi - if (mSessionEvent == null && BuildConfig.HOTMOBI_LOG_ENABLED) { - mSessionEvent = SessionEvent.create(activity); - } - // END HotMobi - } - - @Override - public void onActivityResumed(Activity activity) { - - } - - @Override - public void onActivityPaused(Activity activity) { - - } - - @Override - public void onActivityStopped(Activity activity) { - final int hashCode = System.identityHashCode(activity); - if (activity instanceof HomeActivity) { - mHomeActivityStarted = false; - } - // BEGIN HotMobi - final SessionEvent event = mSessionEvent; - if (event != null && !isSwitchingInSameTask(hashCode)) { - event.markEnd(); - HotMobiLogger.getInstance(activity).log(event, new PreProcessing() { - @Override - public void process(SessionEvent event, Context appContext) { - event.dumpPreferences(appContext); - } - }); - mSessionEvent = null; - } - // END HotMobi - - mInternalStack.removeElement(hashCode); - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - - } - - @Override - public void onActivityDestroyed(Activity activity) { - - } - - public boolean isHomeActivityStarted() { - return mHomeActivityStarted; - } -} diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt index 9c07179bd..4ae9ab5a3 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt @@ -66,8 +66,6 @@ import org.mariotaku.chameleon.ChameleonUtils import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.set import org.mariotaku.ktextension.* -import org.mariotaku.sqliteqb.library.Columns -import org.mariotaku.sqliteqb.library.SQLFunctions import org.mariotaku.twidere.Constants.* import org.mariotaku.twidere.R import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarShowHideHelper @@ -87,10 +85,9 @@ import org.mariotaku.twidere.model.SupportTabSpec import org.mariotaku.twidere.model.Tab import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.event.UnreadCountUpdatedEvent -import org.mariotaku.twidere.provider.TwidereDataStore import org.mariotaku.twidere.provider.TwidereDataStore.Activities -import org.mariotaku.twidere.provider.TwidereDataStore.Statuses import org.mariotaku.twidere.provider.TwidereDataStore.Messages.Conversations +import org.mariotaku.twidere.provider.TwidereDataStore.Statuses import org.mariotaku.twidere.service.StreamingService import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback @@ -270,7 +267,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp val initialTabPosition = handleIntent(intent, savedInstanceState == null) setTabPosition(initialTabPosition) - startService(Intent(this, StreamingService::class.java)) + StreamingService.startOrStopService(this) if (!showDrawerTutorial() && !kPreferences[defaultAutoRefreshAskedKey]) { showAutoRefreshConfirm() @@ -312,7 +309,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp override fun onDestroy() { if (isFinishing) { // Stop only when exiting explicitly - stopService(Intent(this, StreamingService::class.java)) + StreamingService.startOrStopService(this) } // Delete unused items in databases. diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/app/TwidereApplication.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/app/TwidereApplication.kt index 1ab3b82f3..d781e08ec 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/app/TwidereApplication.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/app/TwidereApplication.kt @@ -45,10 +45,9 @@ import org.mariotaku.twidere.TwidereConstants.* import org.mariotaku.twidere.activity.AssistLauncherActivity import org.mariotaku.twidere.activity.MainActivity import org.mariotaku.twidere.activity.MainHondaJOJOActivity -import org.mariotaku.twidere.constant.apiLastChangeKey -import org.mariotaku.twidere.constant.bugReportsKey -import org.mariotaku.twidere.constant.defaultFeatureLastUpdated +import org.mariotaku.twidere.constant.* import org.mariotaku.twidere.model.DefaultFeatures +import org.mariotaku.twidere.service.StreamingService import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.content.TwidereSQLiteOpenHelper import org.mariotaku.twidere.util.dagger.GeneralComponentHelper @@ -258,6 +257,14 @@ class TwidereApplication : Application(), Constants, OnSharedPreferenceChangeLis KEY_NAME_FIRST, KEY_I_WANT_MY_STARS_BACK -> { contentNotificationManager.updatePreferences() } + streamingPowerSavingKey.key, streamingNonMeteredNetworkKey.key -> { + val streamingIntent = Intent(this, StreamingService::class.java) + if (activityTracker.isHomeActivityLaunched) { + startService(streamingIntent) + } else { + stopService(streamingIntent) + } + } } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountStreamingSettingsFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountStreamingSettingsFragment.kt index c2481c27d..4025209e9 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountStreamingSettingsFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountStreamingSettingsFragment.kt @@ -21,6 +21,7 @@ package org.mariotaku.twidere.fragment import org.mariotaku.twidere.R import org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_ENABLE_STREAMING +import org.mariotaku.twidere.service.StreamingService class AccountStreamingSettingsFragment : BaseAccountPreferenceFragment() { @@ -31,4 +32,8 @@ class AccountStreamingSettingsFragment : BaseAccountPreferenceFragment() { override val switchPreferenceKey: String? = KEY_ENABLE_STREAMING + override fun onSwitchPreferenceChanged(isChecked: Boolean) { + super.onSwitchPreferenceChanged(isChecked) + StreamingService.startOrStopService(context) + } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BaseAccountPreferenceFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BaseAccountPreferenceFragment.kt index c1563c60d..c7a2d610f 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BaseAccountPreferenceFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BaseAccountPreferenceFragment.kt @@ -19,7 +19,6 @@ package org.mariotaku.twidere.fragment -import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.os.Bundle import android.preference.PreferenceActivity.EXTRA_SHOW_FRAGMENT @@ -27,14 +26,30 @@ import android.text.TextUtils import android.view.Menu import android.view.MenuInflater import android.widget.CompoundButton -import android.widget.CompoundButton.OnCheckedChangeListener import org.mariotaku.twidere.R import org.mariotaku.twidere.TwidereConstants.ACCOUNT_PREFERENCES_NAME_PREFIX import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT import org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_NAME_FIRST import org.mariotaku.twidere.model.AccountDetails -abstract class BaseAccountPreferenceFragment : BasePreferenceFragment(), OnCheckedChangeListener, OnSharedPreferenceChangeListener { +abstract class BaseAccountPreferenceFragment : BasePreferenceFragment() { + + protected val account: AccountDetails? + get() { + return arguments?.getParcelable(EXTRA_ACCOUNT) + } + + protected abstract val preferencesResource: Int + + protected abstract val switchPreferenceDefault: Boolean + + protected abstract val switchPreferenceKey: String? + + private val preferenceChangeListener = OnSharedPreferenceChangeListener { _, key -> + if (key == switchPreferenceKey) { + updatePreferenceScreen() + } + } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) @@ -48,7 +63,7 @@ abstract class BaseAccountPreferenceFragment : BasePreferenceFragment(), OnCheck pm.sharedPreferencesName = preferenceName addPreferencesFromResource(preferencesResource) val prefs = pm.sharedPreferences - prefs.registerOnSharedPreferenceChangeListener(this) + prefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener) val activity = activity val intent = activity.intent if (intent.hasExtra(EXTRA_SHOW_FRAGMENT)) { @@ -63,19 +78,10 @@ abstract class BaseAccountPreferenceFragment : BasePreferenceFragment(), OnCheck override fun onDestroy() { val pm = preferenceManager val prefs = pm.sharedPreferences - prefs.unregisterOnSharedPreferenceChangeListener(this) + prefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener) super.onDestroy() } - override fun onCheckedChanged(buttonView: CompoundButton, isChecked: Boolean) { - val prefs = preferenceManager.sharedPreferences - val editor = prefs.edit() - if (prefs.getBoolean(switchPreferenceKey, switchPreferenceDefault) != isChecked) { - editor.putBoolean(switchPreferenceKey, isChecked) - editor.apply() - updatePreferenceScreen() - } - } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { val switchKey = switchPreferenceKey @@ -84,28 +90,24 @@ abstract class BaseAccountPreferenceFragment : BasePreferenceFragment(), OnCheck val actionView = menu.findItem(R.id.toggle).actionView val toggle = actionView.findViewById(android.R.id.toggle) as CompoundButton val prefs = preferenceManager.sharedPreferences - toggle.setOnCheckedChangeListener(this) + toggle.setOnCheckedChangeListener { _, isChecked -> + val editor = prefs.edit() + if (prefs.getBoolean(switchPreferenceKey, switchPreferenceDefault) != isChecked) { + editor.putBoolean(switchPreferenceKey, isChecked) + editor.apply() + onSwitchPreferenceChanged(isChecked) + updatePreferenceScreen() + } + } toggle.isChecked = prefs.getBoolean(switchKey, switchPreferenceDefault) } super.onCreateOptionsMenu(menu, inflater) } - override fun onSharedPreferenceChanged(preferences: SharedPreferences, key: String) { - if (key == switchPreferenceKey) { - updatePreferenceScreen() - } + protected open fun onSwitchPreferenceChanged(isChecked: Boolean) { + } - protected val account: AccountDetails? - get() { - return arguments?.getParcelable(EXTRA_ACCOUNT) - } - - protected abstract val preferencesResource: Int - - protected abstract val switchPreferenceDefault: Boolean - - protected abstract val switchPreferenceKey: String? private fun updatePreferenceScreen() { val screen = preferenceScreen diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/receiver/ConnectivityStateReceiver.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/receiver/ConnectivityStateReceiver.kt index 9848dad87..93b5c4a44 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/receiver/ConnectivityStateReceiver.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/receiver/ConnectivityStateReceiver.kt @@ -30,6 +30,7 @@ import edu.tsinghua.hotmobi.model.NetworkEvent import org.mariotaku.kpreferences.get import org.mariotaku.twidere.TwidereConstants.SHARED_PREFERENCES_NAME import org.mariotaku.twidere.constant.usageStatisticsKey +import org.mariotaku.twidere.service.StreamingService import org.mariotaku.twidere.util.DebugLog import org.mariotaku.twidere.util.Utils import org.mariotaku.twidere.util.dagger.DependencyHolder @@ -50,7 +51,8 @@ class ConnectivityStateReceiver : BroadcastReceiver() { val appContext = context.applicationContext val cm = appContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val isNetworkMetered = ConnectivityManagerCompat.isActiveNetworkMetered(cm) - DependencyHolder.get(context).mediaPreloader.isNetworkMetered = isNetworkMetered + val holder = DependencyHolder.get(context) + holder.mediaPreloader.isNetworkMetered = isNetworkMetered val isCharging = Utils.isCharging(appContext) if (!isNetworkMetered && isCharging) { val currentTime = System.currentTimeMillis() @@ -59,7 +61,7 @@ class ConnectivityStateReceiver : BroadcastReceiver() { appContext.startService(Intent(appContext, UploadLogsService::class.java)) } } - + StreamingService.startOrStopService(context) } companion object { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/receiver/PowerStateReceiver.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/receiver/PowerStateReceiver.kt new file mode 100644 index 000000000..57f2a55bc --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/receiver/PowerStateReceiver.kt @@ -0,0 +1,43 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2017 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.receiver + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import org.mariotaku.twidere.service.StreamingService + +/** + * Created by mariotaku on 2017/3/13. + */ + +class PowerStateReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + Intent.ACTION_POWER_CONNECTED -> { + StreamingService.startOrStopService(context) + } + Intent.ACTION_POWER_DISCONNECTED -> { + StreamingService.startOrStopService(context) + } + } + } + +} diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/service/BaseService.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/service/BaseService.kt index 5ca0572cd..071ea22c4 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/service/BaseService.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/service/BaseService.kt @@ -45,6 +45,8 @@ abstract class BaseService : Service() { lateinit var taskServiceRunner: TaskServiceRunner @Inject lateinit var connectivityManager: ConnectivityManager + @Inject + lateinit var activityTracker: ActivityTracker override fun onCreate() { super.onCreate() diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/service/StreamingService.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/service/StreamingService.kt index 4b7069830..eb82f9f8c 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/service/StreamingService.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/service/StreamingService.kt @@ -41,6 +41,7 @@ import org.mariotaku.twidere.util.DataStoreUtils import org.mariotaku.twidere.util.DebugLog import org.mariotaku.twidere.util.IntentUtils import org.mariotaku.twidere.util.Utils +import org.mariotaku.twidere.util.dagger.DependencyHolder import org.mariotaku.twidere.util.dagger.GeneralComponentHelper import org.mariotaku.twidere.util.streaming.TwitterTimelineStreamCallback import java.util.* @@ -56,7 +57,9 @@ class StreamingService : BaseService() { private val submittedTasks = WeakHashMap>() private val accountChangeObserver = OnAccountsUpdateListener { - setupStreaming() + if (!setupStreaming()) { + stopSelf() + } } override fun onCreate() { @@ -84,27 +87,31 @@ class StreamingService : BaseService() { if (setupStreaming()) { return START_STICKY } + stopSelf() return START_NOT_STICKY } override fun onBind(intent: Intent) = throw UnsupportedOperationException() + /** + * @return True if there're enabled accounts, false if request not met and service should be stopped + */ private fun setupStreaming(): Boolean { + if (!activityTracker.isHomeActivityLaunched) { + return false + } val isNetworkMetered = ConnectivityManagerCompat.isActiveNetworkMetered(connectivityManager) if (preferences[streamingNonMeteredNetworkKey] && isNetworkMetered) { - stopSelf() return false } val isCharging = Utils.isCharging(this) if (preferences[streamingPowerSavingKey] && !isCharging) { - stopSelf() return false } if (updateStreamingInstances()) { showNotification() return true } else { - stopSelf() return false } } @@ -339,6 +346,15 @@ class StreamingService : BaseService() { private val NOTIFICATION_SERVICE_STARTED = 1 + fun startOrStopService(context: Context) { + val streamingIntent = Intent(context, StreamingService::class.java) + val holder = DependencyHolder.get(context) + if (holder.activityTracker.isHomeActivityLaunched) { + context.startService(streamingIntent) + } else { + context.stopService(streamingIntent) + } + } } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/ActivityTracker.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/ActivityTracker.kt new file mode 100644 index 000000000..ae65b38f2 --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/ActivityTracker.kt @@ -0,0 +1,109 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.util + + +import android.app.Activity +import android.app.Application +import android.os.Bundle +import edu.tsinghua.hotmobi.HotMobiLogger +import edu.tsinghua.hotmobi.model.SessionEvent +import org.apache.commons.collections.primitives.ArrayIntList +import org.mariotaku.twidere.BuildConfig +import org.mariotaku.twidere.activity.HomeActivity + +/** + * Created by mariotaku on 15/10/5. + */ +class ActivityTracker : Application.ActivityLifecycleCallbacks { + + private val internalStack = ArrayIntList() + + private var sessionEvent: SessionEvent? = null + + var isHomeActivityStarted: Boolean = false + private set + var isHomeActivityLaunched: Boolean = false + private set + + private fun isSwitchingInSameTask(hashCode: Int): Boolean { + return internalStack.lastIndexOf(hashCode) < internalStack.size() - 1 + } + + fun size(): Int { + return internalStack.size() + } + + val isEmpty: Boolean + get() = internalStack.isEmpty + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + if (activity is HomeActivity) { + isHomeActivityLaunched = true + } + } + + override fun onActivityStarted(activity: Activity) { + internalStack.add(System.identityHashCode(activity)) + if (activity is HomeActivity) { + isHomeActivityStarted = true + } + // BEGIN HotMobi + if (sessionEvent == null && BuildConfig.HOTMOBI_LOG_ENABLED) { + sessionEvent = SessionEvent.create(activity) + } + // END HotMobi + } + + override fun onActivityResumed(activity: Activity) { + + } + + override fun onActivityPaused(activity: Activity) { + + } + + override fun onActivityStopped(activity: Activity) { + val hashCode = System.identityHashCode(activity) + if (activity is HomeActivity) { + isHomeActivityStarted = false + } + // BEGIN HotMobi + val event = sessionEvent + if (event != null && !isSwitchingInSameTask(hashCode)) { + event.markEnd() + HotMobiLogger.getInstance(activity).log(event, SessionEvent::dumpPreferences) + sessionEvent = null + } + // END HotMobi + + internalStack.removeElement(hashCode) + } + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { + + } + + override fun onActivityDestroyed(activity: Activity) { + if (activity is HomeActivity && activity.isFinishing()) { + isHomeActivityLaunched = false + } + } +}