diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/BaseActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/BaseActivity.kt index d1e4697ef..ad03129de 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/BaseActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/BaseActivity.kt @@ -51,7 +51,7 @@ import org.mariotaku.restfu.http.RestHttpClient import org.mariotaku.twidere.BuildConfig import org.mariotaku.twidere.TwidereConstants.SHARED_PREFERENCES_NAME import org.mariotaku.twidere.activity.iface.IControlBarActivity -import org.mariotaku.twidere.activity.iface.IExtendedActivity +import org.mariotaku.twidere.activity.iface.IBaseActivity import org.mariotaku.twidere.activity.iface.IThemedActivity import org.mariotaku.twidere.constant.themeColorKey import org.mariotaku.twidere.constant.themeKey @@ -72,7 +72,7 @@ import java.util.* import javax.inject.Inject @SuppressLint("Registered") -open class BaseActivity : ChameleonActivity(), IExtendedActivity, IThemedActivity, +open class BaseActivity : ChameleonActivity(), IBaseActivity, IThemedActivity, IControlBarActivity, OnFitSystemWindowsListener, SystemWindowsInsetsCallback, KeyboardShortcutCallback, OnPreferenceDisplayDialogCallback { @@ -103,7 +103,7 @@ open class BaseActivity : ChameleonActivity(), IExtendedActivity, @Inject lateinit var restHttpClient: RestHttpClient - private val actionHelper = IExtendedActivity.ActionHelper(this) + private val actionHelper = IBaseActivity.ActionHelper(this) // Registered listeners private val controlBarOffsetListeners = ArrayList() @@ -261,8 +261,8 @@ open class BaseActivity : ChameleonActivity(), IExtendedActivity, actionHelper.dispatchOnResumeFragments() } - override fun executeAfterFragmentResumed(action: (BaseActivity) -> Unit) { - actionHelper.executeAfterFragmentResumed(action) + override fun executeAfterFragmentResumed(useHandler: Boolean, action: (BaseActivity) -> Unit) { + actionHelper.executeAfterFragmentResumed(useHandler, action) } override final val currentThemeBackgroundAlpha by lazy { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MediaViewerActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MediaViewerActivity.kt index 71a2a0c2e..53c339896 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MediaViewerActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MediaViewerActivity.kt @@ -46,8 +46,8 @@ import org.mariotaku.mediaviewer.library.* import org.mariotaku.mediaviewer.library.subsampleimageview.SubsampleImageViewerFragment.EXTRA_MEDIA_URI import org.mariotaku.twidere.R import org.mariotaku.twidere.TwidereConstants.* +import org.mariotaku.twidere.activity.iface.IBaseActivity import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarShowHideHelper -import org.mariotaku.twidere.activity.iface.IExtendedActivity import org.mariotaku.twidere.annotation.CacheFileType import org.mariotaku.twidere.fragment.PermissionRequestDialog import org.mariotaku.twidere.fragment.ProgressDialogFragment @@ -450,7 +450,7 @@ class MediaViewerActivity : BaseActivity(), IMediaViewerActivity, MediaSwipeClos private val PROGRESS_FRAGMENT_TAG = "progress" override fun dismissProgress() { - val activity = context as IExtendedActivity<*> + val activity = context as IBaseActivity<*> activity.executeAfterFragmentResumed { activity -> val fm = activity.supportFragmentManager val fragment = fm.findFragmentByTag(PROGRESS_FRAGMENT_TAG) as? DialogFragment @@ -459,7 +459,7 @@ class MediaViewerActivity : BaseActivity(), IMediaViewerActivity, MediaSwipeClos } override fun showProgress() { - val activity = context as IExtendedActivity<*> + val activity = context as IBaseActivity<*> activity.executeAfterFragmentResumed { activity -> val fragment = ProgressDialogFragment() fragment.isCancelable = false diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/iface/IExtendedActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/iface/IBaseActivity.kt similarity index 64% rename from twidere/src/main/kotlin/org/mariotaku/twidere/activity/iface/IExtendedActivity.kt rename to twidere/src/main/kotlin/org/mariotaku/twidere/activity/iface/IBaseActivity.kt index 6ec3f6514..6ab187ef7 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/iface/IExtendedActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/iface/IBaseActivity.kt @@ -27,14 +27,14 @@ import java.util.* /** * Created by mariotaku on 15/12/28. */ -interface IExtendedActivity { +interface IBaseActivity { - fun executeAfterFragmentResumed(action: (A) -> Unit) + fun executeAfterFragmentResumed(useHandler: Boolean = false, action: (A) -> Unit) class ActionHelper(private val activity: A) { private var fragmentResumed: Boolean = false - private val actionQueue = LinkedList<(A) -> Unit>() + private val actionQueue = LinkedList>() private val handler = Handler(Looper.getMainLooper()) fun dispatchOnPause() { @@ -49,19 +49,25 @@ interface IExtendedActivity { private fun executePending() { if (!fragmentResumed) return - var action: ((A) -> Unit)? + var info: ExecuteInfo? do { - action = actionQueue.poll() - // Sometimes actions called too fast, so we wait for next loop - handler.post { - action?.invoke(activity) + val cur = actionQueue.poll() + cur?.let { cur -> + if (cur.useHandler) { + handler.post { cur.action(activity) } + } else { + cur.action(activity) + } } - } while (action != null) + info = cur + } while (info != null) } - fun executeAfterFragmentResumed(action: (A) -> Unit) { - actionQueue.add(action) + fun executeAfterFragmentResumed(useHandler: Boolean = false, action: (A) -> Unit) { + actionQueue.add(ExecuteInfo(action, useHandler)) executePending() } + + private data class ExecuteInfo(val action: (A) -> Unit, val useHandler: Boolean) } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/DraftsFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/DraftsFragment.kt index c2ac6560e..5241d55fb 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/DraftsFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/DraftsFragment.kt @@ -46,7 +46,7 @@ import org.mariotaku.kpreferences.get import org.mariotaku.sqliteqb.library.Expression import org.mariotaku.twidere.R import org.mariotaku.twidere.TwidereConstants.* -import org.mariotaku.twidere.activity.iface.IExtendedActivity +import org.mariotaku.twidere.activity.iface.IBaseActivity import org.mariotaku.twidere.adapter.DraftsAdapter import org.mariotaku.twidere.constant.IntentConstants import org.mariotaku.twidere.constant.textSizeKey @@ -244,7 +244,7 @@ class DraftsFragment : BaseFragment(), LoaderCallbacks, OnItemClickList override fun onPreExecute() { val activity = activityRef.get() ?: return - (activity as IExtendedActivity<*>).executeAfterFragmentResumed { activity -> + (activity as IBaseActivity<*>).executeAfterFragmentResumed { activity -> val f = ProgressDialogFragment.show(activity.supportFragmentManager, FRAGMENT_TAG_DELETING_DRAFTS) f.isCancelable = false } @@ -252,7 +252,7 @@ class DraftsFragment : BaseFragment(), LoaderCallbacks, OnItemClickList override fun onPostExecute(result: Unit) { val activity = activityRef.get() ?: return - (activity as IExtendedActivity<*>).executeAfterFragmentResumed { activity -> + (activity as IBaseActivity<*>).executeAfterFragmentResumed { activity -> val fm = activity.supportFragmentManager val f = fm.findFragmentByTag(FRAGMENT_TAG_DELETING_DRAFTS) if (f is DialogFragment) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt index 4cb10d730..5da08d456 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt @@ -95,7 +95,7 @@ import org.mariotaku.twidere.activity.AccountSelectorActivity import org.mariotaku.twidere.activity.BaseActivity import org.mariotaku.twidere.activity.ColorPickerDialogActivity import org.mariotaku.twidere.activity.LinkHandlerActivity -import org.mariotaku.twidere.activity.iface.IExtendedActivity +import org.mariotaku.twidere.activity.iface.IBaseActivity import org.mariotaku.twidere.adapter.SupportTabsAdapter import org.mariotaku.twidere.annotation.AccountType import org.mariotaku.twidere.annotation.Referral @@ -1652,7 +1652,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener, val checkedPositions = dialog.listView.checkedItemPositions val weakActivity = WeakReference(activity) promiseOnUi { - val activity = weakActivity.get() as? IExtendedActivity<*> ?: return@promiseOnUi + val activity = weakActivity.get() as? IBaseActivity<*> ?: return@promiseOnUi activity.executeAfterFragmentResumed { activity -> ProgressDialogFragment.show(activity.supportFragmentManager, "update_lists_progress") } @@ -1677,7 +1677,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener, throw UpdateListsException(successfulStates) } }.alwaysUi { - val activity = weakActivity.get() as? IExtendedActivity<*> ?: return@alwaysUi + val activity = weakActivity.get() as? IBaseActivity<*> ?: return@alwaysUi activity.executeAfterFragmentResumed { activity -> val manager = activity.supportFragmentManager val df = manager.findFragmentByTag("update_lists_progress") as? DialogFragment diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/iface/IBaseFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/iface/IBaseFragment.kt index 930d6027f..6cc52a820 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/iface/IBaseFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/iface/IBaseFragment.kt @@ -84,15 +84,18 @@ interface IBaseFragment { private fun executePending() { if (!fragmentResumed) return - var info: ExecuteInfo - while (true) { - info = actionQueue.poll() ?: break - if (info.useHandler) { - handler.post { info.action(fragment) } - } else { - info.action(fragment) + var info: ExecuteInfo? + do { + val cur = actionQueue.poll() + cur?.let { cur -> + if (cur.useHandler) { + handler.post { cur.action(fragment) } + } else { + cur.action(fragment) + } } - } + info = cur + } while (info != null) } fun executeAfterFragmentResumed(useHandler: Boolean = false, action: (F) -> Unit) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/media/ExoPlayerPageFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/media/ExoPlayerPageFragment.kt index 3ccb04818..6977e63e6 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/media/ExoPlayerPageFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/media/ExoPlayerPageFragment.kt @@ -33,6 +33,7 @@ import android.view.ViewGroup import com.google.android.exoplayer2.* import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory import com.google.android.exoplayer2.source.ExtractorMediaSource +import com.google.android.exoplayer2.source.LoopingMediaSource import com.google.android.exoplayer2.source.TrackGroupArray import com.google.android.exoplayer2.trackselection.AdaptiveVideoTrackSelection import com.google.android.exoplayer2.trackselection.DefaultTrackSelector @@ -49,6 +50,8 @@ import org.mariotaku.twidere.constant.IntentConstants.EXTRA_POSITION import org.mariotaku.twidere.fragment.iface.IBaseFragment import org.mariotaku.twidere.fragment.media.VideoPageFragment.Companion.EXTRA_PAUSED_BY_USER import org.mariotaku.twidere.fragment.media.VideoPageFragment.Companion.EXTRA_PLAY_AUDIO +import org.mariotaku.twidere.fragment.media.VideoPageFragment.Companion.isControlDisabled +import org.mariotaku.twidere.fragment.media.VideoPageFragment.Companion.isLoopEnabled import org.mariotaku.twidere.fragment.media.VideoPageFragment.Companion.isMutedByDefault import org.mariotaku.twidere.fragment.media.VideoPageFragment.Companion.media import org.mariotaku.twidere.util.UserAgentUtils @@ -97,7 +100,7 @@ class ExoPlayerPageFragment : MediaViewerFragment(), IBaseFragment { + ExoPlayer.STATE_IDLE -> { hideProgress() } } @@ -134,6 +137,7 @@ class ExoPlayerPageFragment : MediaViewerFragment(), IBaseFragment Build.VERSION_CODES.M) { @@ -166,6 +169,17 @@ class ExoPlayerPageFragment : MediaViewerFragment(), IBaseFragment).executeAfterFragmentResumed { activity -> + (context as IBaseActivity<*>).executeAfterFragmentResumed { activity -> val fragment = ProgressDialogFragment() fragment.isCancelable = false fragment.show(activity.supportFragmentManager, PROGRESS_FRAGMENT_TAG) @@ -45,7 +45,7 @@ abstract class ProgressSaveFileTask( } override fun dismissProgress() { - (context as IExtendedActivity<*>).executeAfterFragmentResumed { activity -> + (context as IBaseActivity<*>).executeAfterFragmentResumed { activity -> val fm = activity.supportFragmentManager val fragment = fm.findFragmentByTag(PROGRESS_FRAGMENT_TAG) as? DialogFragment fragment?.dismiss()