mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-11 06:44:00 +00:00
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 commitee450e696d. Revert "Reformat" This reverts commit38c8f21ed3. * Use launcherNullable * Fixes more crashes --------- Co-authored-by: MrSluffy <werdna.jac@gmail.com>
This commit is contained in:
@@ -418,6 +418,7 @@ spotless {
|
||||
java {
|
||||
target("compatLib/**/src/**/*.java")
|
||||
googleJavaFormat().aosp()
|
||||
removeUnusedImports()
|
||||
}
|
||||
kotlin {
|
||||
target("lawnchair/src/**/*.kt")
|
||||
|
||||
@@ -9,6 +9,5 @@ android {
|
||||
addFrameworkJar('framework-10.jar')
|
||||
|
||||
dependencies {
|
||||
implementation projects.compatLib
|
||||
implementation projects.compatLib.compatLibVR
|
||||
api projects.compatLib
|
||||
}
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,5 +9,5 @@ android {
|
||||
addFrameworkJar('framework-11.jar')
|
||||
|
||||
dependencies {
|
||||
implementation projects.compatLib
|
||||
api projects.compatLib.compatLibVQ
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -9,5 +9,5 @@ android {
|
||||
addFrameworkJar('framework-12.jar')
|
||||
|
||||
dependencies {
|
||||
implementation projects.compatLib
|
||||
api projects.compatLib.compatLibVR
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -9,6 +9,5 @@ android {
|
||||
addFrameworkJar('framework-13.jar')
|
||||
|
||||
dependencies {
|
||||
implementation projects.compatLib
|
||||
implementation projects.compatLib.compatLibVS
|
||||
api projects.compatLib.compatLibVS
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 */);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user