diff --git a/build.gradle b/build.gradle index d2585c0f39..2b98f5b1d8 100644 --- a/build.gradle +++ b/build.gradle @@ -418,6 +418,7 @@ spotless { java { target("compatLib/**/src/**/*.java") googleJavaFormat().aosp() + removeUnusedImports() } kotlin { target("lawnchair/src/**/*.kt") diff --git a/compatLib/compatLibVQ/build.gradle b/compatLib/compatLibVQ/build.gradle index e4f82051d6..6612b081b7 100644 --- a/compatLib/compatLibVQ/build.gradle +++ b/compatLib/compatLibVQ/build.gradle @@ -9,6 +9,5 @@ android { addFrameworkJar('framework-10.jar') dependencies { - implementation projects.compatLib - implementation projects.compatLib.compatLibVR + api projects.compatLib } diff --git a/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/ActivityManagerCompatVQ.java b/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/ActivityManagerCompatVQ.java index c5bbfa3db0..f6cd27dfc1 100644 --- a/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/ActivityManagerCompatVQ.java +++ b/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/ActivityManagerCompatVQ.java @@ -1,5 +1,7 @@ package app.lawnchair.compatlib.ten; +import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; + import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityTaskManager; @@ -8,42 +10,43 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Rect; import android.os.RemoteException; +import android.util.Log; import android.view.IRecentsAnimationController; import android.view.IRecentsAnimationRunner; import android.view.RemoteAnimationTarget; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import app.lawnchair.compatlib.ActivityManagerCompat; import app.lawnchair.compatlib.RecentsAnimationRunnerCompat; -import app.lawnchair.compatlib.eleven.ActivityManagerCompatVR; +import java.util.ArrayList; import java.util.List; -public class ActivityManagerCompatVQ extends ActivityManagerCompatVR { +@RequiresApi(29) +public class ActivityManagerCompatVQ implements ActivityManagerCompat { + protected final String TAG = getClass().getCanonicalName(); @Override public void invalidateHomeTaskSnapshot(Activity homeActivity) { - // do nothing ,android Q not support + // Do nothing, Android Q doesn't support this. } + @NonNull @Override - public ActivityManager.RunningTaskInfo[] getRunningTasks(boolean filterOnlyVisibleRecents) { - + public List getRunningTasks(boolean filterOnlyVisibleRecents) { int ignoreActivityType = WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; if (filterOnlyVisibleRecents) { ignoreActivityType = WindowConfiguration.ACTIVITY_TYPE_RECENTS; } try { - - List tasks = - ActivityTaskManager.getService() - .getFilteredTasks( - NUM_RECENT_ACTIVITIES_REQUEST, - ignoreActivityType, - WindowConfiguration.WINDOWING_MODE_PINNED); - if (tasks.isEmpty()) { - return null; - } - return tasks.toArray(new ActivityManager.RunningTaskInfo[tasks.size()]); + return ActivityTaskManager.getService() + .getFilteredTasks( + NUM_RECENT_ACTIVITIES_REQUEST, + ignoreActivityType, + WindowConfiguration.WINDOWING_MODE_PINNED); } catch (RemoteException e) { - return null; + return new ArrayList<>(); } } @@ -65,8 +68,6 @@ public class ActivityManagerCompatVQ extends ActivityManagerCompatVR { controller, apps, null, homeContentInsets, minimizedHomeBounds); } - public void reportAllDrawn() {} - @Override public void onAnimationCanceled(boolean deferredWithScreenshot) { runnerCompat.onAnimationCanceled(deferredWithScreenshot); @@ -75,14 +76,13 @@ public class ActivityManagerCompatVQ extends ActivityManagerCompatVR { } try { ActivityTaskManager.getService().startRecentsActivity(intent, null, runner); - } catch (RemoteException e) { - + } catch (RemoteException ignored) { } } + @Nullable @Override public ActivityManager.RunningTaskInfo getRunningTask(boolean filterOnlyVisibleRecents) { - int ignoreActivityType = WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; if (filterOnlyVisibleRecents) { ignoreActivityType = WindowConfiguration.ACTIVITY_TYPE_RECENTS; @@ -103,7 +103,55 @@ public class ActivityManagerCompatVQ extends ActivityManagerCompatVR { } } + @NonNull @Override + public List getRecentTasks(int numTasks, int userId) { + try { + return ActivityTaskManager.getService() + .getRecentTasks(numTasks, RECENT_IGNORE_UNAVAILABLE, userId) + .getList(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to get recent tasks", e); + return new ArrayList<>(); + } + } + + @Override + public ThumbnailData getTaskThumbnail(int taskId, boolean isLowResolution) { + ActivityManager.TaskSnapshot snapshot = null; + try { + snapshot = ActivityTaskManager.getService().getTaskSnapshot(taskId, isLowResolution); + } catch (RemoteException e) { + Log.w(TAG, "Failed to retrieve task snapshot", e); + } + if (snapshot != null) { + return makeThumbnailData(snapshot); + } else { + return null; + } + } + + @Override + public ThumbnailData takeScreenshot( + IRecentsAnimationController animationController, int taskId) { + try { + ActivityManager.TaskSnapshot snapshot = animationController.screenshotTask(taskId); + return snapshot != null ? makeThumbnailData(snapshot) : new ThumbnailData(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to screenshot task", e); + return new ThumbnailData(); + } + } + + @Override + public ThumbnailData convertTaskSnapshotToThumbnailData(Object taskSnapshot) { + if (taskSnapshot != null) { + return makeThumbnailData((ActivityManager.TaskSnapshot) taskSnapshot); + } else { + return null; + } + } + public ThumbnailData makeThumbnailData(ActivityManager.TaskSnapshot snapshot) { ThumbnailData data = new ThumbnailData(); data.thumbnail = diff --git a/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/ActivityOptionsCompatVQ.java b/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/ActivityOptionsCompatVQ.java index d542ae75de..83b4e9ed17 100644 --- a/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/ActivityOptionsCompatVQ.java +++ b/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/ActivityOptionsCompatVQ.java @@ -4,16 +4,24 @@ import android.app.ActivityOptions; import android.content.Context; import android.os.Handler; import android.view.RemoteAnimationAdapter; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import app.lawnchair.compatlib.ActivityOptionsCompat; -public class ActivityOptionsCompatVQ extends ActivityOptionsCompat { +@RequiresApi(29) +public class ActivityOptionsCompatVQ implements ActivityOptionsCompat { + protected final String TAG = getClass().getCanonicalName(); + + @NonNull @Override public ActivityOptions makeCustomAnimation( - Context context, + @NonNull Context context, int enterResId, int exitResId, - Runnable callback, - Handler callbackHandler) { + @NonNull final Handler callbackHandler, + @Nullable final Runnable startedListener, + @Nullable final Runnable finishedListener) { return ActivityOptions.makeCustomAnimation( context, enterResId, @@ -22,18 +30,19 @@ public class ActivityOptionsCompatVQ extends ActivityOptionsCompat { new ActivityOptions.OnAnimationStartedListener() { @Override public void onAnimationStarted() { - if (callback != null) { - callbackHandler.post(callback); + if (startedListener != null) { + startedListener.run(); } } }); } + @NonNull @Override public ActivityOptions makeRemoteAnimation( - RemoteAnimationAdapter remoteAnimationAdapter, - Object remoteTransition, - String debugName) { + @Nullable RemoteAnimationAdapter remoteAnimationAdapter, + @Nullable Object remoteTransition, + @Nullable String debugName) { return ActivityOptions.makeRemoteAnimation(remoteAnimationAdapter); } } diff --git a/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/QuickstepCompatFactoryVQ.java b/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/QuickstepCompatFactoryVQ.java index ccb95c803c..0d968eca7a 100644 --- a/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/QuickstepCompatFactoryVQ.java +++ b/compatLib/compatLibVQ/src/main/java/app/lawnchair/compatlib/ten/QuickstepCompatFactoryVQ.java @@ -1,11 +1,16 @@ package app.lawnchair.compatlib.ten; +import android.window.RemoteTransition; import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import app.lawnchair.compatlib.ActivityManagerCompat; import app.lawnchair.compatlib.ActivityOptionsCompat; -import app.lawnchair.compatlib.eleven.QuickstepCompatFactoryVR; +import app.lawnchair.compatlib.QuickstepCompatFactory; +import app.lawnchair.compatlib.RemoteTransitionCompat; -public class QuickstepCompatFactoryVQ extends QuickstepCompatFactoryVR { +@RequiresApi(29) +public class QuickstepCompatFactoryVQ implements QuickstepCompatFactory { + protected final String TAG = getClass().getCanonicalName(); @NonNull @Override @@ -18,4 +23,10 @@ public class QuickstepCompatFactoryVQ extends QuickstepCompatFactoryVR { public ActivityOptionsCompat getActivityOptionsCompat() { return new ActivityOptionsCompatVQ(); } + + @NonNull + @Override + public RemoteTransitionCompat getRemoteTransitionCompat() { + return RemoteTransition::new; + } } diff --git a/compatLib/compatLibVR/build.gradle b/compatLib/compatLibVR/build.gradle index a75997d039..f986eac6fb 100644 --- a/compatLib/compatLibVR/build.gradle +++ b/compatLib/compatLibVR/build.gradle @@ -9,5 +9,5 @@ android { addFrameworkJar('framework-11.jar') dependencies { - implementation projects.compatLib + api projects.compatLib.compatLibVQ } diff --git a/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/ActivityManagerCompatVR.java b/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/ActivityManagerCompatVR.java index 11cc5c133b..2f1062e1ae 100644 --- a/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/ActivityManagerCompatVR.java +++ b/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/ActivityManagerCompatVR.java @@ -1,6 +1,5 @@ package app.lawnchair.compatlib.eleven; -import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; import static android.app.ActivityTaskManager.getService; import static android.graphics.Bitmap.Config.ARGB_8888; @@ -19,20 +18,23 @@ import android.util.Log; import android.view.IRecentsAnimationController; import android.view.IRecentsAnimationRunner; import android.view.RemoteAnimationTarget; -import app.lawnchair.compatlib.ActivityManagerCompat; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import app.lawnchair.compatlib.RecentsAnimationRunnerCompat; -import java.util.ArrayList; +import app.lawnchair.compatlib.ten.ActivityManagerCompatVQ; +import java.util.Collections; import java.util.List; -public class ActivityManagerCompatVR extends ActivityManagerCompat { - - private static final String TAG = "ActivityManagerCompatVR"; +@RequiresApi(30) +public class ActivityManagerCompatVR extends ActivityManagerCompatVQ { @Override public void invalidateHomeTaskSnapshot(Activity homeActivity) { try { ActivityTaskManager.getService() - .invalidateHomeTaskSnapshot(homeActivity.getActivityToken()); + .invalidateHomeTaskSnapshot( + homeActivity == null ? null : homeActivity.getActivityToken()); } catch (RemoteException e) { Log.w(TAG, "Failed to invalidate home snapshot", e); } @@ -78,6 +80,7 @@ public class ActivityManagerCompatVR extends ActivityManagerCompat { } } + @Nullable @Override public ActivityManager.RunningTaskInfo getRunningTask(boolean filterOnlyVisibleRecents) { // Note: The set of running tasks from the system is ordered by recency @@ -93,59 +96,18 @@ public class ActivityManagerCompatVR extends ActivityManagerCompat { } } + @NonNull @Override - public List getRecentTasks(int numTasks, int userId) { + public List getRunningTasks(boolean filterOnlyVisibleRecents) { try { return ActivityTaskManager.getService() - .getRecentTasks(numTasks, RECENT_IGNORE_UNAVAILABLE, userId) - .getList(); + .getFilteredTasks(NUM_RECENT_ACTIVITIES_REQUEST, filterOnlyVisibleRecents); } catch (RemoteException e) { - Log.e(TAG, "Failed to get recent tasks", e); - return new ArrayList<>(); + return Collections.emptyList(); } } @Override - public ActivityManager.RunningTaskInfo[] getRunningTasks(boolean filterOnlyVisibleRecents) { - try { - List tasks = - ActivityTaskManager.getService() - .getFilteredTasks( - NUM_RECENT_ACTIVITIES_REQUEST, filterOnlyVisibleRecents); - if (tasks.isEmpty()) { - return null; - } - return tasks.toArray(new ActivityManager.RunningTaskInfo[tasks.size()]); - } catch (RemoteException e) { - return null; - } - } - - public ThumbnailData getTaskThumbnail(int taskId, boolean isLowResolution) { - ActivityManager.TaskSnapshot snapshot = null; - try { - snapshot = ActivityTaskManager.getService().getTaskSnapshot(taskId, isLowResolution); - } catch (RemoteException e) { - Log.w(TAG, "Failed to retrieve task snapshot", e); - } - if (snapshot != null) { - return makeThumbnailData(snapshot); - } else { - return null; - } - } - - public ThumbnailData takeScreenshot( - IRecentsAnimationController animationController, int taskId) { - try { - ActivityManager.TaskSnapshot snapshot = animationController.screenshotTask(taskId); - return snapshot != null ? makeThumbnailData(snapshot) : new ThumbnailData(); - } catch (RemoteException e) { - Log.e(TAG, "Failed to screenshot task", e); - return new ThumbnailData(); - } - } - public ThumbnailData makeThumbnailData(ActivityManager.TaskSnapshot snapshot) { ThumbnailData data = new ThumbnailData(); final GraphicBuffer buffer = snapshot.getSnapshot(); @@ -174,27 +136,4 @@ public class ActivityManagerCompatVR extends ActivityManagerCompat { data.snapshotId = snapshot.getId(); return data; } - - public ThumbnailData convertTaskSnapshotToThumbnailData(Object taskSnapshot) { - if (taskSnapshot != null) { - return makeThumbnailData((ActivityManager.TaskSnapshot) taskSnapshot); - } else { - return null; - } - } - - public static class ThumbnailData { - - public Bitmap thumbnail; - public int orientation; - public int rotation; - public Rect insets; - public boolean reducedResolution; - public boolean isRealSnapshot; - public boolean isTranslucent; - public int windowingMode; - public int systemUiVisibility; - public float scale; - public long snapshotId; - } } diff --git a/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/ActivityOptionsCompatVR.java b/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/ActivityOptionsCompatVR.java index f9fecd37c4..e4e3097beb 100644 --- a/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/ActivityOptionsCompatVR.java +++ b/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/ActivityOptionsCompatVR.java @@ -3,20 +3,23 @@ package app.lawnchair.compatlib.eleven; import android.app.ActivityOptions; import android.content.Context; import android.os.Handler; -import android.util.Log; -import android.view.RemoteAnimationAdapter; -import app.lawnchair.compatlib.ActivityOptionsCompat; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import app.lawnchair.compatlib.ten.ActivityOptionsCompatVQ; -public class ActivityOptionsCompatVR extends ActivityOptionsCompat { - private static final String TAG = "ActivityOptionsCompatVR"; +@RequiresApi(30) +public class ActivityOptionsCompatVR extends ActivityOptionsCompatVQ { + @NonNull @Override public ActivityOptions makeCustomAnimation( - Context context, + @NonNull Context context, int enterResId, int exitResId, - Runnable callback, - Handler callbackHandler) { + @NonNull final Handler callbackHandler, + @Nullable final Runnable startedListener, + @Nullable final Runnable finishedListener) { return ActivityOptions.makeCustomAnimation( context, enterResId, @@ -25,20 +28,18 @@ public class ActivityOptionsCompatVR extends ActivityOptionsCompat { new ActivityOptions.OnAnimationStartedListener() { @Override public void onAnimationStarted() { - if (callback != null) { - callbackHandler.post(callback); + if (startedListener != null) { + startedListener.run(); } } }, - null /* finishedListener */); - } - - @Override - public ActivityOptions makeRemoteAnimation( - RemoteAnimationAdapter remoteAnimationAdapter, - Object remoteTransition, - String debugName) { - Log.e(TAG, "makeRemoteAnimation: " + debugName); - return ActivityOptions.makeRemoteAnimation(remoteAnimationAdapter); + new ActivityOptions.OnAnimationFinishedListener() { + @Override + public void onAnimationFinished() { + if (finishedListener != null) { + finishedListener.run(); + } + } + }); } } diff --git a/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/QuickstepCompatFactoryVR.java b/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/QuickstepCompatFactoryVR.java index fb4919d1d9..accdd10a6e 100644 --- a/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/QuickstepCompatFactoryVR.java +++ b/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/QuickstepCompatFactoryVR.java @@ -1,16 +1,13 @@ package app.lawnchair.compatlib.eleven; -import android.app.IApplicationThread; -import android.window.IRemoteTransition; -import android.window.RemoteTransition; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import app.lawnchair.compatlib.ActivityManagerCompat; import app.lawnchair.compatlib.ActivityOptionsCompat; -import app.lawnchair.compatlib.QuickstepCompatFactory; -import app.lawnchair.compatlib.RemoteTransitionCompat; +import app.lawnchair.compatlib.ten.QuickstepCompatFactoryVQ; -public class QuickstepCompatFactoryVR extends QuickstepCompatFactory { +@RequiresApi(30) +public class QuickstepCompatFactoryVR extends QuickstepCompatFactoryVQ { @NonNull @Override @@ -23,18 +20,4 @@ public class QuickstepCompatFactoryVR extends QuickstepCompatFactory { public ActivityOptionsCompat getActivityOptionsCompat() { return new ActivityOptionsCompatVR(); } - - @NonNull - @Override - public RemoteTransitionCompat getRemoteTransitionCompat() { - return new RemoteTransitionCompat() { - @Override - public RemoteTransition getRemoteTransition( - @NonNull IRemoteTransition remoteTransition, - @Nullable IApplicationThread appThread, - @Nullable String debugName) { - return new RemoteTransition(remoteTransition, appThread, debugName); - } - }; - } } diff --git a/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/WindowManagerCompatVR.java b/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/WindowManagerCompatVR.java index beef46c2d5..9d0d0be0d5 100644 --- a/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/WindowManagerCompatVR.java +++ b/compatLib/compatLibVR/src/main/java/app/lawnchair/compatlib/eleven/WindowManagerCompatVR.java @@ -9,7 +9,9 @@ import android.app.WindowConfiguration; import android.os.RemoteException; import android.util.Log; import android.view.WindowManagerGlobal; +import androidx.annotation.RequiresApi; +@RequiresApi(30) public class WindowManagerCompatVR { public static final int NAV_BAR_POS_INVALID = NAV_BAR_INVALID; public static final int NAV_BAR_POS_LEFT = NAV_BAR_LEFT; diff --git a/compatLib/compatLibVS/build.gradle b/compatLib/compatLibVS/build.gradle index 235b07c256..9f7b402a26 100644 --- a/compatLib/compatLibVS/build.gradle +++ b/compatLib/compatLibVS/build.gradle @@ -9,5 +9,5 @@ android { addFrameworkJar('framework-12.jar') dependencies { - implementation projects.compatLib + api projects.compatLib.compatLibVR } diff --git a/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/ActivityManagerCompatVS.java b/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/ActivityManagerCompatVS.java index 0499c37293..8456868478 100644 --- a/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/ActivityManagerCompatVS.java +++ b/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/ActivityManagerCompatVS.java @@ -1,7 +1,6 @@ package app.lawnchair.compatlib.twelve; import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; -import static android.app.ActivityTaskManager.getService; import android.app.Activity; import android.app.ActivityClient; @@ -15,15 +14,15 @@ import android.view.IRecentsAnimationController; import android.view.IRecentsAnimationRunner; import android.view.RemoteAnimationTarget; import android.window.TaskSnapshot; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import app.lawnchair.compatlib.ActivityManagerCompat; +import androidx.annotation.RequiresApi; import app.lawnchair.compatlib.RecentsAnimationRunnerCompat; +import app.lawnchair.compatlib.eleven.ActivityManagerCompatVR; import java.util.List; -public class ActivityManagerCompatVS extends ActivityManagerCompat { - - private static final String TAG = "ActivityManagerCompatVS"; - private final ActivityTaskManager mAtm = ActivityTaskManager.getInstance(); +@RequiresApi(31) +public class ActivityManagerCompatVS extends ActivityManagerCompatVR { @Override public void invalidateHomeTaskSnapshot(Activity homeActivity) { @@ -31,8 +30,8 @@ public class ActivityManagerCompatVS extends ActivityManagerCompat { ActivityClient.getInstance() .invalidateHomeTaskSnapshot( homeActivity == null ? null : homeActivity.getActivityToken()); - } catch (Throwable e) { - Log.w(TAG, "Failed to invalidate home snapshot", e); + } catch (Throwable ignored) { + super.invalidateHomeTaskSnapshot(homeActivity); } } @@ -41,7 +40,7 @@ public class ActivityManagerCompatVS extends ActivityManagerCompat { public TaskSnapshot getTaskSnapshot( int taskId, boolean isLowResolution, boolean takeSnapshotIfNeeded) { try { - return getService().getTaskSnapshot(taskId, isLowResolution); + return ActivityTaskManager.getService().getTaskSnapshot(taskId, isLowResolution); } catch (RemoteException e) { Log.w(TAG, "Failed to getTaskSnapshot", e); return null; @@ -82,31 +81,35 @@ public class ActivityManagerCompatVS extends ActivityManagerCompat { }; } try { - getService().startRecentsActivity(intent, eventTime, runner); + ActivityTaskManager.getService().startRecentsActivity(intent, eventTime, runner); } catch (RemoteException e) { Log.e(TAG, "Failed to cancel recents animation", e); } } + @Nullable @Override public ActivityManager.RunningTaskInfo getRunningTask(boolean filterOnlyVisibleRecents) { // Note: The set of running tasks from the system is ordered by recency - List tasks = mAtm.getTasks(1, filterOnlyVisibleRecents); + List tasks = + ActivityTaskManager.getInstance().getTasks(1, filterOnlyVisibleRecents); if (tasks.isEmpty()) { return null; } return tasks.get(0); } + @NonNull @Override public List getRecentTasks(int numTasks, int userId) { - return mAtm.getRecentTasks(numTasks, RECENT_IGNORE_UNAVAILABLE, userId); + return ActivityTaskManager.getInstance() + .getRecentTasks(numTasks, RECENT_IGNORE_UNAVAILABLE, userId); } + @NonNull @Override - public ActivityManager.RunningTaskInfo[] getRunningTasks(boolean filterOnlyVisibleRecents) { - List tasks = - mAtm.getTasks(NUM_RECENT_ACTIVITIES_REQUEST, filterOnlyVisibleRecents); - return tasks.toArray(new ActivityManager.RunningTaskInfo[tasks.size()]); + public List getRunningTasks(boolean filterOnlyVisibleRecents) { + return ActivityTaskManager.getInstance() + .getTasks(NUM_RECENT_ACTIVITIES_REQUEST, filterOnlyVisibleRecents); } } diff --git a/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/ActivityOptionsCompatVS.java b/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/ActivityOptionsCompatVS.java index 13aa1b7573..d2d2f7206f 100644 --- a/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/ActivityOptionsCompatVS.java +++ b/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/ActivityOptionsCompatVS.java @@ -1,44 +1,7 @@ package app.lawnchair.compatlib.twelve; -import android.app.ActivityOptions; -import android.content.Context; -import android.os.Handler; -import android.util.Log; -import android.view.RemoteAnimationAdapter; -import app.lawnchair.compatlib.ActivityOptionsCompat; +import androidx.annotation.RequiresApi; +import app.lawnchair.compatlib.eleven.ActivityOptionsCompatVR; -public class ActivityOptionsCompatVS extends ActivityOptionsCompat { - private static final String TAG = "ActivityOptionsCompatVS"; - - @Override - public ActivityOptions makeCustomAnimation( - Context context, - int enterResId, - int exitResId, - Runnable callback, - Handler callbackHandler) { - return ActivityOptions.makeCustomTaskAnimation( - context, - enterResId, - exitResId, - callbackHandler, - new ActivityOptions.OnAnimationStartedListener() { - @Override - public void onAnimationStarted() { - if (callback != null) { - callbackHandler.post(callback); - } - } - }, - null /* finishedListener */); - } - - @Override - public ActivityOptions makeRemoteAnimation( - RemoteAnimationAdapter remoteAnimationAdapter, - Object remoteTransition, - String debugName) { - Log.e(TAG, "makeRemoteAnimation: " + debugName); - return ActivityOptions.makeRemoteAnimation(remoteAnimationAdapter); - } -} +@RequiresApi(31) +public class ActivityOptionsCompatVS extends ActivityOptionsCompatVR {} diff --git a/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/QuickstepCompatFactoryVS.java b/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/QuickstepCompatFactoryVS.java index 35e6ce53bd..8e5dddacdc 100644 --- a/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/QuickstepCompatFactoryVS.java +++ b/compatLib/compatLibVS/src/main/java/app/lawnchair/compatlib/twelve/QuickstepCompatFactoryVS.java @@ -4,15 +4,16 @@ import android.app.IApplicationThread; import android.window.IRemoteTransition; import android.window.RemoteTransition; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import app.lawnchair.compatlib.ActivityManagerCompat; import app.lawnchair.compatlib.ActivityOptionsCompat; -import app.lawnchair.compatlib.QuickstepCompatFactory; import app.lawnchair.compatlib.RemoteTransitionCompat; +import app.lawnchair.compatlib.eleven.QuickstepCompatFactoryVR; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; -public class QuickstepCompatFactoryVS extends QuickstepCompatFactory { +@RequiresApi(31) +public class QuickstepCompatFactoryVS extends QuickstepCompatFactoryVR { @NonNull @Override @@ -29,15 +30,7 @@ public class QuickstepCompatFactoryVS extends QuickstepCompatFactory { @NonNull @Override public RemoteTransitionCompat getRemoteTransitionCompat() { - return new RemoteTransitionCompat() { - @Override - public RemoteTransition getRemoteTransition( - @NonNull IRemoteTransition remoteTransition, - @Nullable IApplicationThread appThread, - @Nullable String debugName) { - return createRemoteTransition(remoteTransition, appThread, debugName); - } - }; + return this::createRemoteTransition; } // TODO remove this as it causing glitches on first launch opening/closing app diff --git a/compatLib/compatLibVT/build.gradle b/compatLib/compatLibVT/build.gradle index 5a6188fc41..101c48a87a 100644 --- a/compatLib/compatLibVT/build.gradle +++ b/compatLib/compatLibVT/build.gradle @@ -9,6 +9,5 @@ android { addFrameworkJar('framework-13.jar') dependencies { - implementation projects.compatLib - implementation projects.compatLib.compatLibVS + api projects.compatLib.compatLibVS } diff --git a/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/ActivityManagerCompatVT.java b/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/ActivityManagerCompatVT.java index 4a376d2b74..3548886321 100644 --- a/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/ActivityManagerCompatVT.java +++ b/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/ActivityManagerCompatVT.java @@ -1,7 +1,5 @@ package app.lawnchair.compatlib.thirteen; -import static android.app.ActivityTaskManager.getService; - import android.app.ActivityTaskManager; import android.content.Intent; import android.graphics.Rect; @@ -11,14 +9,13 @@ import android.view.IRecentsAnimationController; import android.view.IRecentsAnimationRunner; import android.view.RemoteAnimationTarget; import android.window.TaskSnapshot; +import androidx.annotation.RequiresApi; import app.lawnchair.compatlib.RecentsAnimationRunnerCompat; import app.lawnchair.compatlib.twelve.ActivityManagerCompatVS; +@RequiresApi(33) public class ActivityManagerCompatVT extends ActivityManagerCompatVS { - private static final String TAG = "ActivityManagerCompatVT"; - private final ActivityTaskManager mAtm = ActivityTaskManager.getInstance(); - @Override public void startRecentsActivity( Intent intent, long eventTime, RecentsAnimationRunnerCompat runnerCompat) { @@ -54,7 +51,7 @@ public class ActivityManagerCompatVT extends ActivityManagerCompatVS { }; } try { - getService().startRecentsActivity(intent, eventTime, runner); + ActivityTaskManager.getService().startRecentsActivity(intent, eventTime, runner); } catch (RemoteException e) { Log.e(TAG, "Failed to cancel recents animation", e); } @@ -64,14 +61,14 @@ public class ActivityManagerCompatVT extends ActivityManagerCompatVS { public TaskSnapshot getTaskSnapshot( int taskId, boolean isLowResolution, boolean takeSnapshotIfNeeded) { try { - // android13 qpr1 - return getService() + // Android 13 QPR1 + return ActivityTaskManager.getService() .getTaskSnapshot(taskId, isLowResolution, true /* takeSnapshotIfNeeded */); } catch (RemoteException e) { Log.e(TAG, "Failed to getTaskSnapshot", e); return null; } catch (NoSuchMethodError e) { - // android13/12 + // Android 13 or 12 return super.getTaskSnapshot(taskId, isLowResolution, takeSnapshotIfNeeded); } } diff --git a/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/ActivityOptionsCompatVT.java b/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/ActivityOptionsCompatVT.java index 48a9f7682f..5a0edc3d6b 100644 --- a/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/ActivityOptionsCompatVT.java +++ b/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/ActivityOptionsCompatVT.java @@ -6,29 +6,44 @@ import android.os.Handler; import android.util.Log; import android.view.RemoteAnimationAdapter; import android.window.RemoteTransition; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import app.lawnchair.compatlib.twelve.ActivityOptionsCompatVS; +@RequiresApi(33) public class ActivityOptionsCompatVT extends ActivityOptionsCompatVS { - private static final String TAG = "ActivityOptionsCompatVT"; - - @Override - public ActivityOptions makeCustomAnimation( - Context context, - int enterResId, - int exitResId, - Runnable callback, - Handler callbackHandler) { - return super.makeCustomAnimation(context, enterResId, exitResId, callback, callbackHandler); - } - + @NonNull @Override public ActivityOptions makeRemoteAnimation( - RemoteAnimationAdapter remoteAnimationAdapter, - Object remoteTransition, - String debugName) { + @Nullable RemoteAnimationAdapter remoteAnimationAdapter, + @Nullable Object remoteTransition, + @Nullable String debugName) { Log.e(TAG, "makeRemoteAnimation: " + debugName); return ActivityOptions.makeRemoteAnimation( remoteAnimationAdapter, (RemoteTransition) remoteTransition); } + + @NonNull + @Override + public ActivityOptions makeCustomAnimation( + @NonNull Context context, + int enterResId, + int exitResId, + @NonNull Handler callbackHandler, + Runnable callback, + Runnable finishedListener) { + return ActivityOptions.makeCustomTaskAnimation( + context, + enterResId, + exitResId, + callbackHandler, + elapsedRealTime -> { + if (callback != null) { + callbackHandler.post(callback); + } + }, + null /* finishedListener */); + } } diff --git a/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/QuickstepCompatFactoryVT.java b/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/QuickstepCompatFactoryVT.java index b1a2573a3f..ff00c39db8 100644 --- a/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/QuickstepCompatFactoryVT.java +++ b/compatLib/compatLibVT/src/main/java/app/lawnchair/compatlib/thirteen/QuickstepCompatFactoryVT.java @@ -1,15 +1,14 @@ package app.lawnchair.compatlib.thirteen; -import android.app.IApplicationThread; -import android.window.IRemoteTransition; import android.window.RemoteTransition; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import app.lawnchair.compatlib.ActivityManagerCompat; import app.lawnchair.compatlib.ActivityOptionsCompat; import app.lawnchair.compatlib.RemoteTransitionCompat; import app.lawnchair.compatlib.twelve.QuickstepCompatFactoryVS; +@RequiresApi(33) public class QuickstepCompatFactoryVT extends QuickstepCompatFactoryVS { @NonNull @@ -27,14 +26,7 @@ public class QuickstepCompatFactoryVT extends QuickstepCompatFactoryVS { @NonNull @Override public RemoteTransitionCompat getRemoteTransitionCompat() { - return new RemoteTransitionCompat() { - @Override - public RemoteTransition getRemoteTransition( - @NonNull IRemoteTransition remoteTransition, - @Nullable IApplicationThread appThread, - @Nullable String debugName) { - return new RemoteTransition(remoteTransition, appThread); - } - }; + return (remoteTransition, appThread, debugName) -> + new RemoteTransition(remoteTransition, appThread); } } diff --git a/compatLib/compatLibVU/build.gradle b/compatLib/compatLibVU/build.gradle index 8c7c0384df..f97b512e0b 100644 --- a/compatLib/compatLibVU/build.gradle +++ b/compatLib/compatLibVU/build.gradle @@ -9,7 +9,5 @@ android { addFrameworkJar('framework-14.jar') dependencies { - implementation projects.compatLib - implementation projects.compatLib.compatLibVS - implementation projects.compatLib.compatLibVT + api projects.compatLib.compatLibVT } diff --git a/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/ActivityManagerCompatVU.java b/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/ActivityManagerCompatVU.java index d10fcc8281..a10b17404f 100644 --- a/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/ActivityManagerCompatVU.java +++ b/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/ActivityManagerCompatVU.java @@ -1,74 +1,7 @@ package app.lawnchair.compatlib.fourteen; -import static android.app.ActivityTaskManager.getService; - -import android.content.Intent; -import android.graphics.Rect; -import android.os.RemoteException; -import android.util.Log; -import android.view.IRecentsAnimationController; -import android.view.IRecentsAnimationRunner; -import android.view.RemoteAnimationTarget; -import android.window.TaskSnapshot; -import app.lawnchair.compatlib.RecentsAnimationRunnerCompat; +import androidx.annotation.RequiresApi; import app.lawnchair.compatlib.thirteen.ActivityManagerCompatVT; -public class ActivityManagerCompatVU extends ActivityManagerCompatVT { - - private static final String TAG = "ActivityManagerCompatVU"; - - @Override - public void startRecentsActivity( - Intent intent, long eventTime, RecentsAnimationRunnerCompat runnerCompat) { - IRecentsAnimationRunner runner = null; - if (runnerCompat != null) { - runner = - new IRecentsAnimationRunner.Stub() { - @Override - public void onAnimationStart( - IRecentsAnimationController controller, - RemoteAnimationTarget[] apps, - RemoteAnimationTarget[] wallpapers, - Rect homeContentInsets, - Rect minimizedHomeBounds) { - runnerCompat.onAnimationStart( - controller, - apps, - wallpapers, - homeContentInsets, - minimizedHomeBounds); - } - - @Override - public void onAnimationCanceled( - int[] taskIds, TaskSnapshot[] taskSnapshots) { - runnerCompat.onAnimationCanceled(taskIds, taskSnapshots); - } - - @Override - public void onTasksAppeared(RemoteAnimationTarget[] apps) { - runnerCompat.onTasksAppeared(apps); - } - }; - } - try { - getService().startRecentsActivity(intent, eventTime, runner); - } catch (RemoteException e) { - Log.e(TAG, "Failed to cancel recents animation", e); - } - } - - @Override - public TaskSnapshot getTaskSnapshot( - int taskId, boolean isLowResolution, boolean takeSnapshotIfNeeded) { - try { - return getService() - .getTaskSnapshot(taskId, isLowResolution, true /* takeSnapshotIfNeeded */); - } catch (RemoteException e) { - Log.e(TAG, "Failed to getTaskSnapshot", e); - return null; - } catch (NoSuchMethodError e) { - return super.getTaskSnapshot(taskId, isLowResolution, takeSnapshotIfNeeded); - } - } -} +@RequiresApi(34) +public class ActivityManagerCompatVU extends ActivityManagerCompatVT {} diff --git a/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/ActivityOptionsCompatVU.java b/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/ActivityOptionsCompatVU.java index 9ad6b2a2ab..01424c57b8 100644 --- a/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/ActivityOptionsCompatVU.java +++ b/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/ActivityOptionsCompatVU.java @@ -3,27 +3,43 @@ package app.lawnchair.compatlib.fourteen; import android.app.ActivityOptions; import android.content.Context; import android.os.Handler; -import android.view.RemoteAnimationAdapter; -import android.window.RemoteTransition; -import app.lawnchair.compatlib.ActivityOptionsCompat; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import app.lawnchair.compatlib.thirteen.ActivityOptionsCompatVT; -public class ActivityOptionsCompatVU extends ActivityOptionsCompat { +@RequiresApi(34) +public class ActivityOptionsCompatVU extends ActivityOptionsCompatVT { + @NonNull @Override public ActivityOptions makeCustomAnimation( - Context context, + @NonNull Context context, int enterResId, int exitResId, - Runnable callback, - Handler callbackHandler) { - return null; - } - - @Override - public ActivityOptions makeRemoteAnimation( - RemoteAnimationAdapter remoteAnimationAdapter, - Object remoteTransition, - String debugName) { - return ActivityOptions.makeRemoteAnimation( - remoteAnimationAdapter, (RemoteTransition) remoteTransition); + @NonNull final Handler callbackHandler, + @Nullable final Runnable startedListener, + @Nullable final Runnable finishedListener) { + return ActivityOptions.makeCustomAnimation( + context, + enterResId, + exitResId, + 0, + callbackHandler, + new ActivityOptions.OnAnimationStartedListener() { + @Override + public void onAnimationStarted(long elapsedRealTime) { + if (startedListener != null) { + startedListener.run(); + } + } + }, + new ActivityOptions.OnAnimationFinishedListener() { + @Override + public void onAnimationFinished(long elapsedRealTime) { + if (finishedListener != null) { + finishedListener.run(); + } + } + }); } } diff --git a/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/QuickstepCompatFactoryVU.java b/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/QuickstepCompatFactoryVU.java index 194d0aafe7..beac653ff6 100644 --- a/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/QuickstepCompatFactoryVU.java +++ b/compatLib/compatLibVU/src/main/java/app/lawnchair/compatlib/fourteen/QuickstepCompatFactoryVU.java @@ -1,15 +1,14 @@ package app.lawnchair.compatlib.fourteen; -import android.app.IApplicationThread; -import android.window.IRemoteTransition; import android.window.RemoteTransition; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import app.lawnchair.compatlib.ActivityManagerCompat; import app.lawnchair.compatlib.ActivityOptionsCompat; import app.lawnchair.compatlib.RemoteTransitionCompat; import app.lawnchair.compatlib.thirteen.QuickstepCompatFactoryVT; +@RequiresApi(34) public class QuickstepCompatFactoryVU extends QuickstepCompatFactoryVT { @NonNull @@ -27,14 +26,6 @@ public class QuickstepCompatFactoryVU extends QuickstepCompatFactoryVT { @NonNull @Override public RemoteTransitionCompat getRemoteTransitionCompat() { - return new RemoteTransitionCompat() { - @Override - public RemoteTransition getRemoteTransition( - @NonNull IRemoteTransition remoteTransition, - @Nullable IApplicationThread appThread, - @Nullable String debugName) { - return new RemoteTransition(remoteTransition, appThread, debugName); - } - }; + return RemoteTransition::new; } } diff --git a/compatLib/src/main/java/app/lawnchair/compatlib/ActivityManagerCompat.java b/compatLib/src/main/java/app/lawnchair/compatlib/ActivityManagerCompat.java index 349bb66204..237e91d4ab 100644 --- a/compatLib/src/main/java/app/lawnchair/compatlib/ActivityManagerCompat.java +++ b/compatLib/src/main/java/app/lawnchair/compatlib/ActivityManagerCompat.java @@ -3,38 +3,63 @@ package app.lawnchair.compatlib; import android.app.Activity; import android.app.ActivityManager; import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.Rect; +import android.view.IRecentsAnimationController; import android.window.TaskSnapshot; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import java.util.List; -public abstract class ActivityManagerCompat { +public interface ActivityManagerCompat { + int NUM_RECENT_ACTIVITIES_REQUEST = 3; - public static final int NUM_RECENT_ACTIVITIES_REQUEST = 3; + void invalidateHomeTaskSnapshot(final Activity homeActivity); - public abstract void invalidateHomeTaskSnapshot(final Activity homeActivity); + void startRecentsActivity( + Intent intent, long eventTime, RecentsAnimationRunnerCompat runnerCompat); - /** - * Called only in S+ platform - * - * @param taskId - * @param isLowResolution - * @param takeSnapshotIfNeeded - * @return - */ @Nullable - public TaskSnapshot getTaskSnapshot( + @RequiresApi(31) + default TaskSnapshot getTaskSnapshot( int taskId, boolean isLowResolution, boolean takeSnapshotIfNeeded) { return null; } - public abstract void startRecentsActivity( - Intent intent, long eventTime, RecentsAnimationRunnerCompat runnerCompat); + default ThumbnailData getTaskThumbnail(int taskId, boolean isLowResolution) { + return null; + } - public abstract ActivityManager.RunningTaskInfo getRunningTask( - boolean filterOnlyVisibleRecents); + default ThumbnailData takeScreenshot( + IRecentsAnimationController animationController, int taskId) { + return null; + } - public abstract List getRecentTasks(int numTasks, int userId); + default ThumbnailData convertTaskSnapshotToThumbnailData(Object taskSnapshot) { + return null; + } - public abstract ActivityManager.RunningTaskInfo[] getRunningTasks( - boolean filterOnlyVisibleRecents); + @Nullable + ActivityManager.RunningTaskInfo getRunningTask(boolean filterOnlyVisibleRecents); + + @NonNull + List getRunningTasks(boolean filterOnlyVisibleRecents); + + @NonNull + List getRecentTasks(int numTasks, int userId); + + public static class ThumbnailData { + public Bitmap thumbnail; + public int orientation; + public int rotation; + public Rect insets; + public boolean reducedResolution; + public boolean isRealSnapshot; + public boolean isTranslucent; + public int windowingMode; + public int systemUiVisibility; + public float scale; + public long snapshotId; + } } diff --git a/compatLib/src/main/java/app/lawnchair/compatlib/ActivityOptionsCompat.java b/compatLib/src/main/java/app/lawnchair/compatlib/ActivityOptionsCompat.java index 8ab4d41f62..d48e7df4ef 100644 --- a/compatLib/src/main/java/app/lawnchair/compatlib/ActivityOptionsCompat.java +++ b/compatLib/src/main/java/app/lawnchair/compatlib/ActivityOptionsCompat.java @@ -4,17 +4,23 @@ import android.app.ActivityOptions; import android.content.Context; import android.os.Handler; import android.view.RemoteAnimationAdapter; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; -public abstract class ActivityOptionsCompat { - public abstract ActivityOptions makeCustomAnimation( - Context context, +public interface ActivityOptionsCompat { + + @NonNull + ActivityOptions makeCustomAnimation( + @NonNull Context context, int enterResId, int exitResId, - final Runnable callback, - final Handler callbackHandler); + @NonNull final Handler callbackHandler, + @Nullable final Runnable startedListener, + @Nullable final Runnable finishedListener); - public abstract ActivityOptions makeRemoteAnimation( - RemoteAnimationAdapter remoteAnimationAdapter, - Object remoteTransition, - String debugName); + @NonNull + ActivityOptions makeRemoteAnimation( + @Nullable RemoteAnimationAdapter remoteAnimationAdapter, + @Nullable Object remoteTransition, + @Nullable String debugName); } diff --git a/compatLib/src/main/java/app/lawnchair/compatlib/QuickstepCompatFactory.java b/compatLib/src/main/java/app/lawnchair/compatlib/QuickstepCompatFactory.java index e40b788ac8..be36772840 100644 --- a/compatLib/src/main/java/app/lawnchair/compatlib/QuickstepCompatFactory.java +++ b/compatLib/src/main/java/app/lawnchair/compatlib/QuickstepCompatFactory.java @@ -2,14 +2,14 @@ package app.lawnchair.compatlib; import androidx.annotation.NonNull; -public abstract class QuickstepCompatFactory { +public interface QuickstepCompatFactory { @NonNull - public abstract ActivityManagerCompat getActivityManagerCompat(); + ActivityManagerCompat getActivityManagerCompat(); @NonNull - public abstract ActivityOptionsCompat getActivityOptionsCompat(); + ActivityOptionsCompat getActivityOptionsCompat(); @NonNull - public abstract RemoteTransitionCompat getRemoteTransitionCompat(); + RemoteTransitionCompat getRemoteTransitionCompat(); } diff --git a/compatLib/src/main/java/app/lawnchair/compatlib/RemoteTransitionCompat.java b/compatLib/src/main/java/app/lawnchair/compatlib/RemoteTransitionCompat.java index 2fc96731fc..f26ad7d8e2 100644 --- a/compatLib/src/main/java/app/lawnchair/compatlib/RemoteTransitionCompat.java +++ b/compatLib/src/main/java/app/lawnchair/compatlib/RemoteTransitionCompat.java @@ -1,14 +1,14 @@ package app.lawnchair.compatlib; -import android.annotation.NonNull; -import android.annotation.Nullable; import android.app.IApplicationThread; import android.window.IRemoteTransition; import android.window.RemoteTransition; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; -public abstract class RemoteTransitionCompat { +public interface RemoteTransitionCompat { - public abstract RemoteTransition getRemoteTransition( + RemoteTransition getRemoteTransition( @NonNull IRemoteTransition remoteTransition, @Nullable IApplicationThread appThread, @Nullable String debugName); diff --git a/lawnchair/src/app/lawnchair/LawnchairLauncher.kt b/lawnchair/src/app/lawnchair/LawnchairLauncher.kt index cb675f73f6..ee905509f5 100644 --- a/lawnchair/src/app/lawnchair/LawnchairLauncher.kt +++ b/lawnchair/src/app/lawnchair/LawnchairLauncher.kt @@ -20,7 +20,6 @@ import android.app.ActivityOptions import android.content.Context import android.content.Intent import android.content.IntentSender -import android.graphics.Color import android.graphics.drawable.Drawable import android.os.Bundle import android.os.Handler @@ -367,20 +366,18 @@ class LawnchairLauncher : override fun makeDefaultActivityOptions(splashScreenStyle: Int): ActivityOptionsWrapper { val callbacks = RunnableList() - val options = if (!Utilities.ATLEAST_R) { - ActivityOptions.makeBasic() - } else if (Utilities.ATLEAST_T) { - ActivityOptions.makeCustomAnimation( + val options = if (Utilities.ATLEAST_Q) { + LawnchairQuickstepCompat.activityOptionsCompat.makeCustomAnimation( this, 0, 0, - Color.TRANSPARENT, Executors.MAIN_EXECUTOR.handler, null, - ) { _ -> callbacks.executeAllAndDestroy() } + ) { + callbacks.executeAllAndDestroy() + } } else { - LawnchairQuickstepCompat.activityOptionsCompat - .makeCustomAnimation(this, 0, 0, null, Executors.MAIN_EXECUTOR.handler) + ActivityOptions.makeBasic() } if (Utilities.ATLEAST_T) { options.setSplashScreenStyle(splashScreenStyle) diff --git a/lawnchair/src/app/lawnchair/overview/LawnchairOverviewActionsView.kt b/lawnchair/src/app/lawnchair/overview/LawnchairOverviewActionsView.kt index f9d99887fb..f11c08b351 100644 --- a/lawnchair/src/app/lawnchair/overview/LawnchairOverviewActionsView.kt +++ b/lawnchair/src/app/lawnchair/overview/LawnchairOverviewActionsView.kt @@ -9,6 +9,7 @@ import android.widget.Space import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat import androidx.core.view.isVisible +import app.lawnchair.launcherNullable import app.lawnchair.preferences.PreferenceManager import app.lawnchair.util.RecentHelper import app.lawnchair.util.isDefaultLauncher @@ -28,14 +29,13 @@ class LawnchairOverviewActionsView @JvmOverloads constructor( ) : OverviewActionsView(context, attrs, defStyleAttr) { private val prefs = PreferenceManager.getInstance(context) - + private val launcher: Launcher? = context.launcherNullable private lateinit var container: LinearLayout private lateinit var screenshotAction: Button private lateinit var shareAction: Button private lateinit var lensAction: Button private lateinit var clearAllAction: Button private lateinit var lockedAction: Button - val launcher: Launcher? = if (context.isDefaultLauncher()) Launcher.getLauncher(context) else null private var rv: RecentsView? = null private val lockedTaskStateLister = object : StateManager.StateListener { diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 7d5b68581e..eff9c26d3b 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -1049,14 +1049,11 @@ public class QuickstepLauncher extends Launcher { @Override public ActivityOptionsWrapper makeDefaultActivityOptions(int splashScreenStyle) { RunnableList callbacks = new RunnableList(); - ActivityOptions options = LawnchairQuickstepCompat.ATLEAST_R ? ActivityOptions.makeCustomAnimation( - this, 0, 0, Color.TRANSPARENT, - Executors.MAIN_EXECUTOR.getHandler(), null, - elapsedRealTime -> callbacks.executeAllAndDestroy()) : ActivityOptions.makeBasic(); - if (LawnchairQuickstepCompat.ATLEAST_T) { - options.setSplashScreenStyle(splashScreenStyle); - } - Utilities.allowBGLaunch(options); + ActivityOptions options = ActivityOptions.makeCustomAnimation( + this, 0, 0, Color.TRANSPARENT, + Executors.MAIN_EXECUTOR.getHandler(), null, + elapsedRealTime -> callbacks.executeAllAndDestroy()); + options.setSplashScreenStyle(splashScreenStyle); return new ActivityOptionsWrapper(options, callbacks); } diff --git a/quickstep/src/com/android/quickstep/TopTaskTracker.java b/quickstep/src/com/android/quickstep/TopTaskTracker.java index e0fcdcbcba..15b2e3e580 100644 --- a/quickstep/src/com/android/quickstep/TopTaskTracker.java +++ b/quickstep/src/com/android/quickstep/TopTaskTracker.java @@ -252,7 +252,7 @@ public class TopTaskTracker extends ISplitScreenListener.Stub implements TaskSta return null; } List visibleNonExcludedTasks = mAllCachedTasks.stream() - .filter(t -> t.isVisible + .filter(t -> (t.isVisible && LawnchairQuickstepCompat.ATLEAST_S) && (t.baseIntent.getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) == 0) .collect(Collectors.toList()); return visibleNonExcludedTasks.isEmpty() ? null diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index c2866af29b..3b5fdc714c 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -973,16 +973,10 @@ public class TaskView extends FrameLayout implements Reusable { */ private ActivityOptions makeCustomAnimation(Context context, int enterResId, int exitResId, final Runnable callback, final Handler callbackHandler) { - if (!LawnchairQuickstepCompat.ATLEAST_T) { - return LawnchairQuickstepCompat.getActivityOptionsCompat().makeCustomAnimation(context, enterResId, exitResId, callback, callbackHandler); + if (Utilities.ATLEAST_Q) { + return LawnchairQuickstepCompat.getActivityOptionsCompat().makeCustomAnimation(context, enterResId, exitResId, callbackHandler, callback, null); } - return ActivityOptions.makeCustomTaskAnimation(context, enterResId, exitResId, - callbackHandler, - elapsedRealTime -> { - if (callback != null) { - callbackHandler.post(callback); - } - }, null /* finishedListener */); + return ActivityOptions.makeBasic(); } /** diff --git a/systemUIShared/src/app/lawnchair/compat/LawnchairQuickstepCompat.kt b/systemUIShared/src/app/lawnchair/compat/LawnchairQuickstepCompat.kt index e7f36dbb46..ab443c3b1f 100644 --- a/systemUIShared/src/app/lawnchair/compat/LawnchairQuickstepCompat.kt +++ b/systemUIShared/src/app/lawnchair/compat/LawnchairQuickstepCompat.kt @@ -1,6 +1,7 @@ package app.lawnchair.compat import android.os.Build +import androidx.annotation.ChecksSdkIntAtLeast import app.lawnchair.compatlib.ActivityManagerCompat import app.lawnchair.compatlib.ActivityOptionsCompat import app.lawnchair.compatlib.QuickstepCompatFactory @@ -13,33 +14,34 @@ import app.lawnchair.compatlib.twelve.QuickstepCompatFactoryVS object LawnchairQuickstepCompat { + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.Q) @JvmField val ATLEAST_Q: Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.R) @JvmField val ATLEAST_R: Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.S) @JvmField val ATLEAST_S: Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.TIRAMISU) @JvmField val ATLEAST_T: Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) @JvmField val ATLEAST_U: Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE - @JvmStatic - val factory: QuickstepCompatFactory = if (ATLEAST_U) { - QuickstepCompatFactoryVU() - } else if (ATLEAST_T) { - QuickstepCompatFactoryVT() - } else if (ATLEAST_S) { - QuickstepCompatFactoryVS() - } else if (ATLEAST_R) { - QuickstepCompatFactoryVR() - } else { - QuickstepCompatFactoryVQ() + val factory: QuickstepCompatFactory = when { + ATLEAST_U -> QuickstepCompatFactoryVU() + ATLEAST_T -> QuickstepCompatFactoryVT() + ATLEAST_S -> QuickstepCompatFactoryVS() + ATLEAST_R -> QuickstepCompatFactoryVR() + ATLEAST_Q -> QuickstepCompatFactoryVQ() + else -> error("Unsupported SDK version") } @JvmStatic @@ -50,4 +52,4 @@ object LawnchairQuickstepCompat { @JvmStatic val remoteTransitionCompat: RemoteTransitionCompat = factory.remoteTransitionCompat -} \ No newline at end of file +} diff --git a/systemUIShared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/systemUIShared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index 630032d8de..7846d6932f 100644 --- a/systemUIShared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/systemUIShared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -20,8 +20,8 @@ import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED; import static android.app.ActivityManager.LOCK_TASK_MODE_NONE; import static android.app.ActivityTaskManager.getService; -import android.annotation.NonNull; -import android.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; @@ -51,7 +51,6 @@ import com.android.internal.app.IVoiceInteractionManagerService; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.function.Consumer; @@ -104,25 +103,12 @@ public class ActivityManagerWrapper { * @return the top running task filtering only for tasks that can be visible in the recent tasks * list (can be {@code null}). */ + @Nullable public ActivityManager.RunningTaskInfo getRunningTask(boolean filterOnlyVisibleRecents) { // Note: The set of running tasks from the system is ordered by recency return LawnchairQuickstepCompat.getActivityManagerCompat().getRunningTask(filterOnlyVisibleRecents); } - /** - * @see #getRunningTasks(boolean , int) - */ - public ActivityManager.RunningTaskInfo[] getRunningTasks(boolean filterOnlyVisibleRecents) { - return LawnchairQuickstepCompat.getActivityManagerCompat().getRunningTasks(filterOnlyVisibleRecents); - } - - /** - * @return a list of the recents tasks. - */ - public List getRecentTasks(int numTasks, int userId) { - return LawnchairQuickstepCompat.getActivityManagerCompat().getRecentTasks(numTasks, userId); - } - /** * We ask for {@link #NUM_RECENT_ACTIVITIES_REQUEST} activities because when in split screen, * we'll get back 2 activities for each split app and one for launcher. Launcher might be more @@ -130,26 +116,31 @@ public class ActivityManagerWrapper { * out on one of the split apps * * @return an array of up to {@link #NUM_RECENT_ACTIVITIES_REQUEST} running tasks - * filtering only for tasks that can be visible in the recent tasks list. + * filtering only for tasks that can be visible in the recent tasks list. */ - public ActivityManager.RunningTaskInfo[] getRunningTasks(boolean filterOnlyVisibleRecents, - int displayId) { - // Note: The set of running tasks from the system is ordered by recency - List tasks = mAtm != null ? - mAtm.getTasks(NUM_RECENT_ACTIVITIES_REQUEST, - filterOnlyVisibleRecents, /* keepInExtras= */ false, displayId) : new ArrayList<>(); - return LawnchairQuickstepCompat.ATLEAST_U ? tasks.toArray(new RunningTaskInfo[tasks.size()]) - : LawnchairQuickstepCompat.getActivityManagerCompat().getRunningTasks(filterOnlyVisibleRecents); + @NonNull + public ActivityManager.RunningTaskInfo[] getRunningTasks(boolean filterOnlyVisibleRecents) { + var tasks = LawnchairQuickstepCompat.getActivityManagerCompat().getRunningTasks(filterOnlyVisibleRecents); + return tasks.toArray(new ActivityManager.RunningTaskInfo[tasks.size()]); + } + + /** + * @return a list of the recents tasks. + */ + @NonNull + public List getRecentTasks(int numTasks, int userId) { + return LawnchairQuickstepCompat.getActivityManagerCompat().getRecentTasks(numTasks, userId); } /** * @return a {@link ThumbnailData} with {@link TaskSnapshot} for the given {@param taskId}. * The snapshot will be triggered if no cached {@link TaskSnapshot} exists. */ - public @NonNull ThumbnailData getTaskThumbnail(int taskId, boolean isLowResolution) { - if (!LawnchairQuickstepCompat.ATLEAST_S){ - ActivityManagerCompatVR compat = ((ActivityManagerCompatVR) LawnchairQuickstepCompat.getActivityManagerCompat()); - ActivityManagerCompatVR.ThumbnailData data = compat.getTaskThumbnail(taskId, isLowResolution); + @NonNull + public ThumbnailData getTaskThumbnail(int taskId, boolean isLowResolution) { + if (!LawnchairQuickstepCompat.ATLEAST_S) { + var compat = LawnchairQuickstepCompat.getActivityManagerCompat(); + var data = compat.getTaskThumbnail(taskId, isLowResolution); if (data != null) { return new ThumbnailData(data); } else { @@ -157,11 +148,7 @@ public class ActivityManagerWrapper { } } TaskSnapshot snapshot = LawnchairQuickstepCompat.getActivityManagerCompat().getTaskSnapshot(taskId, isLowResolution, true); - if (snapshot != null) { - return new ThumbnailData(snapshot); - } else { - return new ThumbnailData(); - } + return snapshot != null ? new ThumbnailData(snapshot) : new ThumbnailData(); } /** diff --git a/systemUIShared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java b/systemUIShared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java index c0bdc395cb..338f9c544b 100644 --- a/systemUIShared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java +++ b/systemUIShared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java @@ -42,8 +42,8 @@ public class RecentsAnimationControllerCompat { public ThumbnailData screenshotTask(int taskId) { if (!LawnchairQuickstepCompat.ATLEAST_S) { - ActivityManagerCompatVR compat = (ActivityManagerCompatVR) LawnchairQuickstepCompat.getActivityManagerCompat(); - ActivityManagerCompatVR.ThumbnailData data = compat.takeScreenshot(mAnimationController, taskId); + var compat = LawnchairQuickstepCompat.getActivityManagerCompat(); + var data = compat.takeScreenshot(mAnimationController, taskId); return data != null ? new ThumbnailData(data) : new ThumbnailData(); } try {