summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/states
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2018-02-20 14:21:20 -0800
committerSunny Goyal <sunnygoyal@google.com>2018-02-20 16:06:06 -0800
commit60876ac0d77cbf3abda9eb609f6cd49ea3081cfa (patch)
treeea819bbdd357ab85137593bdd02cf891776cf984 /src/com/android/launcher3/states
parent224f58c4bc9516fd67e77ae42cb084b8c357c3a7 (diff)
downloadandroid_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.java74
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