Reimplement QuickSwitch compat libs (#4084)

* Reimplement makeDefaultActivityOptions

* No need to post again

* Cleanups

* Tweak LawnchairQuickstepCompat

* Let compatLibVR depend on compatLibVQ

* Let compatLibVS depend on compatLibVR

* Cleanup compatLibVT

* Let compatLibVU depend on compatLibVT

* Add ActivityManagerCompatVS.getRunningTasks back

* Fix ActivityManagerCompatVS

* Don't return null running tasks

* Annotate getTaskSnapshot

* Fix style

* Retrun list from getRunningTasks

* Tweaks

* Cleanups

* null check

* Add ActivityManagerCompatVS.invalidateHomeTaskSnapshot back

* Move ThumbnailData

* Fixed err

* Cleanup

* Add RequiresApi

* Make RemoteTransitionCompat as an interface

* Annotate ActivityOptionsCompat

* More interfaces

* Replace aidl files with generated sources

* Reformat

* Revert "Replace aidl files with generated sources"

This reverts commit ee450e696d.

Revert "Reformat"

This reverts commit 38c8f21ed3.

* Use launcherNullable

* Fixes more crashes

---------

Co-authored-by: MrSluffy <werdna.jac@gmail.com>
This commit is contained in:
Zongle Wang
2024-03-10 11:24:14 +08:00
committed by GitHub
parent 0ca884dc25
commit bfb4ddfa48
34 changed files with 377 additions and 476 deletions

View File

@@ -418,6 +418,7 @@ spotless {
java {
target("compatLib/**/src/**/*.java")
googleJavaFormat().aosp()
removeUnusedImports()
}
kotlin {
target("lawnchair/src/**/*.kt")

View File

@@ -9,6 +9,5 @@ android {
addFrameworkJar('framework-10.jar')
dependencies {
implementation projects.compatLib
implementation projects.compatLib.compatLibVR
api projects.compatLib
}

View File

@@ -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<ActivityManager.RunningTaskInfo> getRunningTasks(boolean filterOnlyVisibleRecents) {
int ignoreActivityType = WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
if (filterOnlyVisibleRecents) {
ignoreActivityType = WindowConfiguration.ACTIVITY_TYPE_RECENTS;
}
try {
List<ActivityManager.RunningTaskInfo> 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<ActivityManager.RecentTaskInfo> 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 =

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -9,5 +9,5 @@ android {
addFrameworkJar('framework-11.jar')
dependencies {
implementation projects.compatLib
api projects.compatLib.compatLibVQ
}

View File

@@ -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<ActivityManager.RecentTaskInfo> getRecentTasks(int numTasks, int userId) {
public List<ActivityManager.RunningTaskInfo> 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<ActivityManager.RunningTaskInfo> 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;
}
}

View File

@@ -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();
}
}
});
}
}

View File

@@ -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);
}
};
}
}

View File

@@ -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;

View File

@@ -9,5 +9,5 @@ android {
addFrameworkJar('framework-12.jar')
dependencies {
implementation projects.compatLib
api projects.compatLib.compatLibVR
}

View File

@@ -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<ActivityManager.RunningTaskInfo> tasks = mAtm.getTasks(1, filterOnlyVisibleRecents);
List<ActivityManager.RunningTaskInfo> tasks =
ActivityTaskManager.getInstance().getTasks(1, filterOnlyVisibleRecents);
if (tasks.isEmpty()) {
return null;
}
return tasks.get(0);
}
@NonNull
@Override
public List<ActivityManager.RecentTaskInfo> 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<ActivityManager.RunningTaskInfo> tasks =
mAtm.getTasks(NUM_RECENT_ACTIVITIES_REQUEST, filterOnlyVisibleRecents);
return tasks.toArray(new ActivityManager.RunningTaskInfo[tasks.size()]);
public List<ActivityManager.RunningTaskInfo> getRunningTasks(boolean filterOnlyVisibleRecents) {
return ActivityTaskManager.getInstance()
.getTasks(NUM_RECENT_ACTIVITIES_REQUEST, filterOnlyVisibleRecents);
}
}

View File

@@ -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 {}

View File

@@ -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

View File

@@ -9,6 +9,5 @@ android {
addFrameworkJar('framework-13.jar')
dependencies {
implementation projects.compatLib
implementation projects.compatLib.compatLibVS
api projects.compatLib.compatLibVS
}

View File

@@ -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);
}
}

View File

@@ -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 */);
}
}

View File

@@ -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);
}
}

View File

@@ -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
}

View File

@@ -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 {}

View File

@@ -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();
}
}
});
}
}

View File

@@ -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;
}
}

View File

@@ -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<ActivityManager.RecentTaskInfo> 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<ActivityManager.RunningTaskInfo> getRunningTasks(boolean filterOnlyVisibleRecents);
@NonNull
List<ActivityManager.RecentTaskInfo> 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;
}
}

View File

@@ -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);
}

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -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)

View File

@@ -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<TaskOverlayFactoryImpl.OverlayUICallbacks>(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<Launcher, *>? = null
private val lockedTaskStateLister = object : StateManager.StateListener<LauncherState> {

View File

@@ -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);
}

View File

@@ -252,7 +252,7 @@ public class TopTaskTracker extends ISplitScreenListener.Stub implements TaskSta
return null;
}
List<RunningTaskInfo> 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

View File

@@ -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();
}
/**

View File

@@ -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
}
}

View File

@@ -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<ActivityManager.RecentTaskInfo> 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<ActivityManager.RunningTaskInfo> 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<ActivityManager.RecentTaskInfo> 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();
}
/**

View File

@@ -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 {