diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2018-02-20 14:21:20 -0800 |
---|---|---|
committer | Sunny Goyal <sunnygoyal@google.com> | 2018-02-20 16:06:06 -0800 |
commit | 60876ac0d77cbf3abda9eb609f6cd49ea3081cfa (patch) | |
tree | ea819bbdd357ab85137593bdd02cf891776cf984 /src/com/android/launcher3/states | |
parent | 224f58c4bc9516fd67e77ae42cb084b8c357c3a7 (diff) | |
download | android_packages_apps_Trebuchet-60876ac0d77cbf3abda9eb609f6cd49ea3081cfa.tar.gz android_packages_apps_Trebuchet-60876ac0d77cbf3abda9eb609f6cd49ea3081cfa.tar.bz2 android_packages_apps_Trebuchet-60876ac0d77cbf3abda9eb609f6cd49ea3081cfa.zip |
Handling recents animation cancelation
When the animation is cancelled, if remove the pending handler
(incase it has not executed yet) and revert back to the old
state if it has executed.
Change-Id: Iddc305aaaeae78c06cbf6c1c271254409cc1487d
Diffstat (limited to 'src/com/android/launcher3/states')
-rw-r--r-- | src/com/android/launcher3/states/InternalStateHandler.java | 74 |
1 files changed, 47 insertions, 27 deletions
diff --git a/src/com/android/launcher3/states/InternalStateHandler.java b/src/com/android/launcher3/states/InternalStateHandler.java index 729838337..d3c0fef4e 100644 --- a/src/com/android/launcher3/states/InternalStateHandler.java +++ b/src/com/android/launcher3/states/InternalStateHandler.java @@ -24,7 +24,6 @@ import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.MainThreadExecutor; -import com.android.launcher3.util.Preconditions; import java.lang.ref.WeakReference; @@ -38,7 +37,7 @@ public abstract class InternalStateHandler extends Binder { public static final String EXTRA_STATE_HANDLER = "launcher.state_handler"; - private static WeakReference<InternalStateHandler> sPendingHandler = new WeakReference<>(null); + private static final Scheduler sScheduler = new Scheduler(); /** * Initializes the handler when the launcher is ready. @@ -53,30 +52,12 @@ public abstract class InternalStateHandler extends Binder { return intent; } - public final void initWhenReady(MainThreadExecutor executor) { - sPendingHandler = new WeakReference<>(this); - executor.execute(this::initIfReadOnUIThread); - } - - private void initIfReadOnUIThread() { - LauncherAppState app = LauncherAppState.getInstanceNoCreate(); - if (app == null) { - return; - } - Callbacks cb = app.getModel().getCallback(); - if (!(cb instanceof Launcher)) { - return; - } - Launcher launcher = (Launcher) cb; - if (!init(launcher, launcher.isStarted())) { - sPendingHandler.clear(); - } + public final void initWhenReady() { + sScheduler.schedule(this); } public void clearReference() { - if (sPendingHandler.get() == this) { - sPendingHandler.clear(); - } + sScheduler.clearReference(this); } public static boolean handleCreate(Launcher launcher, Intent intent) { @@ -101,14 +82,53 @@ public abstract class InternalStateHandler extends Binder { } } if (!result && !explicitIntent) { - InternalStateHandler pendingHandler = sPendingHandler.get(); + result = sScheduler.initIfPending(launcher, alreadyOnHome); + } + return result; + } + + private static class Scheduler implements Runnable { + + private WeakReference<InternalStateHandler> mPendingHandler = new WeakReference<>(null); + private MainThreadExecutor mMainThreadExecutor; + + public synchronized void schedule(InternalStateHandler handler) { + mPendingHandler = new WeakReference<>(handler); + if (mMainThreadExecutor == null) { + mMainThreadExecutor = new MainThreadExecutor(); + } + mMainThreadExecutor.execute(this); + } + + @Override + public void run() { + LauncherAppState app = LauncherAppState.getInstanceNoCreate(); + if (app == null) { + return; + } + Callbacks cb = app.getModel().getCallback(); + if (!(cb instanceof Launcher)) { + return; + } + Launcher launcher = (Launcher) cb; + initIfPending(launcher, launcher.isStarted()); + } + + public synchronized boolean initIfPending(Launcher launcher, boolean alreadyOnHome) { + InternalStateHandler pendingHandler = mPendingHandler.get(); if (pendingHandler != null) { if (!pendingHandler.init(launcher, alreadyOnHome)) { - sPendingHandler.clear(); + mPendingHandler.clear(); } - result = true; + return true; + } + return false; + } + + public synchronized void clearReference(InternalStateHandler handler) { + if (mPendingHandler.get() == handler) { + mPendingHandler.clear(); } } - return result; } }
\ No newline at end of file |