From e994660cb053ecf5eeecd4d117a6f5827ec25bfe Mon Sep 17 00:00:00 2001 From: John Andrew Camu Date: Mon, 20 Nov 2023 14:46:36 +0800 Subject: [PATCH] Patches for crashes in Android Q, R and S (#3728) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial Patches for to support Q,R and S - TODO create Widget Factory Holder * Remove tracing * Fixed Resources$NotFoundException Lawnchair (Debug) bug report 15-Nov-2023 2:32:03 pm version: 13 Dev (#2291) (13) commit: c5bed50 build.brand: samsung build.device: m30s build.display: RP1A.200720.012.M307FXXS4CWC2 build.fingerprint: samsung/m30sdd/m30s:11/RP1A.200720.012/M307FXXS4CWC2:user/release-keys build.hardware: exynos9611 build.id: RP1A.200720.012 build.manufacturer: samsung build.model: SM-M307F build.product: m30sdd build.type: user version.codename: REL version.incremental: M307FXXS4CWC2 version.release: 11 version.sdk_int: 30 display.density_dpi: 420 isRecentsEnabled: false error: Uncaught exception android.view.InflateException: Binary XML file line #27 in app.lawnchair.debug:layout/task_desktop: Resource ID #0x106002f Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x106002f at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:255) at android.content.res.Resources.getColor(Resources.java:1169) at com.android.quickstep.views.DesktopTaskView.onFinishInflate(DesktopTaskView.java:124) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1134) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1082) at android.view.LayoutInflater.inflate(LayoutInflater.java:680) at android.view.LayoutInflater.inflate(LayoutInflater.java:532) at com.android.launcher3.util.ViewPool.inflateNewView(ViewPool.java:106) at com.android.launcher3.util.ViewPool.lambda$initPool$1(ViewPool.java:69) at com.android.launcher3.util.ViewPool.$r8$lambda$wSRnQcMZiOmM7xwf4gm88rNehhg(ViewPool.java:0) at com.android.launcher3.util.ViewPool$$ExternalSyntheticLambda1.run(R8$$SyntheticClass:0) at java.lang.Thread.run(Thread.java:923) * Fix java.lang.NoClassDefFoundError OnBackInvokedCallback$Stub java.lang.NoClassDefFoundError: Failed resolution of: Landroid/window/IOnBackInvokedCallback$Stub; at com.android.launcher3.QuickstepTransitionManager.(QuickstepTransitionManager.java:265) at com.android.launcher3.uioverrides.QuickstepLauncher.buildAppTransitionManager(QuickstepLauncher.java:302) at com.android.launcher3.uioverrides.QuickstepLauncher.setupViews(QuickstepLauncher.java:236) at app.lawnchair.LawnchairLauncher.setupViews(LawnchairLauncher.kt:244) at com.android.launcher3.Launcher.onCreate(Launcher.java:518) at com.android.launcher3.uioverrides.QuickstepLauncher.onCreate(QuickstepLauncher.java:527) at app.lawnchair.LawnchairLauncher.onCreate(LawnchairLauncher.kt:186) at android.app.Activity.performCreate(Activity.java:8057) at android.app.Activity.performCreate(Activity.java:8037) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1341) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3688) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3864) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2253) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7870) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) Caused by: java.lang.ClassNotFoundException: Didn't find class "android.window.IOnBackInvokedCallback$Stub" on path: DexPathList[[zip file "/data/app/~~xd_Rtvu8nzsZdmkjP4cE7A==/app.lawnchair.debug-LCjip_oNAIceiLCO_DoA3g==/base.apk"],nativeLibraryDirectories=[/data/app/~~xd_Rtvu8nzsZdmkjP4cE7A==/app.lawnchair.debug-LCjip_oNAIceiLCO_DoA3g==/lib/arm64, /data/app/~~xd_Rtvu8nzsZdmkjP4cE7A==/app.lawnchair.debug-LCjip_oNAIceiLCO_DoA3g==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64, /system/product/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at com.android.launcher3.QuickstepTransitionManager.(QuickstepTransitionManager.java:265)  at com.android.launcher3.uioverrides.QuickstepLauncher.buildAppTransitionManager(QuickstepLauncher.java:302)  at com.android.launcher3.uioverrides.QuickstepLauncher.setupViews(QuickstepLauncher.java:236)  at app.lawnchair.LawnchairLauncher.setupViews(LawnchairLauncher.kt:244)  at com.android.launcher3.Launcher.onCreate(Launcher.java:518)  at com.android.launcher3.uioverrides.QuickstepLauncher.onCreate(QuickstepLauncher.java:527)  at app.lawnchair.LawnchairLauncher.onCreate(LawnchairLauncher.kt:186)  at android.app.Activity.performCreate(Activity.java:8057)  at android.app.Activity.performCreate(Activity.java:8037)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1341)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3688)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3864)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2253)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loopOnce(Looper.java:201)  at android.os.Looper.loop(Looper.java:288)  at android.app.ActivityThread.main(ActivityThread.java:7870)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) * Clean up and add our own window manager proxy - Add our own LawnchairWindowManagerProxy based on SystemWindowManagerProxy to reduce conflict when merging aosp * Keep androidx.core.app.CoreComponentFactory java.lang.ClassNotFoundException: Didn't find class "androidx.core.app.CoreComponentFactory" on path: DexPathList[[],nativeLibraryDirectories=[/data/app/app.lawnchair.debug- * Fix crash on LauncherPreviewRenderer on A10 FATAL EXCEPTION: main Process: app.lawnchair.debug, PID: 8873 java.lang.NoSuchMethodError: No interface method getCurrentWindowMetrics()Landroid/view/WindowMetrics; in class Landroid/view/WindowManager; or its super classes (declaration of 'android.view.WindowManager' appears in /system/framework/framework.jar!classes3.dex) at com.android.launcher3.graphics.LauncherPreviewRenderer.(LauncherPreviewRenderer.java:246) at app.lawnchair.views.LauncherPreviewView.renderView(LauncherPreviewView.kt:138) at app.lawnchair.views.LauncherPreviewView.loadModelData$lambda$3$lambda$2(LauncherPreviewView.kt:109) at app.lawnchair.views.LauncherPreviewView.$r8$lambda$cYc0chie-2LAfMVJGiDN9mdIeDA(Unknown Source:0) at app.lawnchair.views.LauncherPreviewView$$ExternalSyntheticLambda1.run(Unknown Source:6) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:940) * Add our own LawnchairWidgetHolder * Reformat * improved readability * Pass spotless * Fix Resources$NotFoundException Lawnchair (Debug) bug report 19 Nov 2023 12:06:33 pm version: 13 Dev (#2327) (13) commit: 9683178 build.brand: Teclast build.device: T40Pro_2022_EEA build.display: V1.02_20230826 build.fingerprint: Teclast/T40Pro_2022_EEA/T40Pro_2022_EEA:12/SP1A.210812.016/221010:user/release-keys build.hardware: ums9230_1h10 build.id: SP1A.210812.016 build.manufacturer: Teclast build.model: T40 Pro_EEA build.product: T40Pro_2022_EEA build.type: user version.codename: REL version.incremental: 221010 version.release: 12 version.sdk_int: 31 display.density_dpi: 280 isRecentsEnabled: false error: Uncaught exception java.lang.RuntimeException: Unable to start activity ComponentInfo{app.lawnchair.debug/app.lawnchair.LawnchairLauncher}: android.content.res.Resources$NotFoundException: Resource ID #0x7f0700b8 type #0x5 is not valid at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3683) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3840) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:105) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:136) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2252) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7941) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:553) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f0700b8 type #0x5 is not valid at android.content.res.Resources.getFloat(Resources.java:1224) at com.android.launcher3.DeviceProfile.(DeviceProfile.java:397) at com.android.launcher3.DeviceProfile$Builder.build(DeviceProfile.java:1938) at com.android.launcher3.InvariantDeviceProfile.initGrid(InvariantDeviceProfile.java:441) at com.android.launcher3.InvariantDeviceProfile.initGrid(InvariantDeviceProfile.java:339) at com.android.launcher3.InvariantDeviceProfile.initGrid(InvariantDeviceProfile.java:353) at com.android.launcher3.InvariantDeviceProfile.(InvariantDeviceProfile.java:213) at com.android.launcher3.InvariantDeviceProfile.$r8$lambda$DNcXzmawjoq65q3wgQi9M48DryY(Unknown Source:2) at com.android.launcher3.InvariantDeviceProfile$$ExternalSyntheticLambda4.get(Unknown Source:0) at com.android.launcher3.util.MainThreadInitializedObject.lambda$get$0(MainThreadInitializedObject.java:60) at com.android.launcher3.util.MainThreadInitializedObject.$r8$lambda$xtvr3aByNYHC2nsBQ97HC1SKg4A(Unknown Source:0) at com.android.launcher3.util.MainThreadInitializedObject$$ExternalSyntheticLambda0.get(Unknown Source:4) at com.android.launcher3.util.TraceHelper.allowIpcs(TraceHelper.java:84) at com.android.launcher3.util.MainThreadInitializedObject.get(MainThreadInitializedObject.java:59) at com.android.launcher3.LauncherAppState.(LauncherAppState.java:166) at com.android.launcher3.LauncherAppState.(LauncherAppState.java:109) at com.android.launcher3.LauncherAppState$$ExternalSyntheticLambda12.get(Unknown Source:2) at com.android.launcher3.util.MainThreadInitializedObject.lambda$get$0(MainThreadInitializedObject.java:60) at com.android.launcher3.util.MainThreadInitializedObject.$r8$lambda$xtvr3aByNYHC2nsBQ97HC1SKg4A(Unknown Source:0) at com.android.launcher3.util.MainThreadInitializedObject$$ExternalSyntheticLambda0.get(Unknown Source:4) at com.android.launcher3.util.TraceHelper.allowIpcs(TraceHelper.java:84) at com.android.launcher3.util.MainThreadInitializedObject.get(MainThreadInitializedObject.java:59) at com.android.launcher3.LauncherAppState.getInstance(LauncherAppState.java:97) at com.android.launcher3.Launcher.onCreate(Launcher.java:492) at com.android.launcher3.uioverrides.QuickstepLauncher.onCreate(QuickstepLauncher.java:527) at app.lawnchair.LawnchairLauncher.onCreate(LawnchairLauncher.kt:205) at android.app.Activity.performCreate(Activity.java:8060) at android.app.Activity.performCreate(Activity.java:8040) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3653) ... 12 more * Keep InputMethodService.canImeRenderGesturalNavButtons --------- Co-authored-by: Goooler --- lawnchair/res/values-v30/colors.xml | 5 ++ lawnchair/res/values/config.xml | 4 ++ lawnchair/src/app/lawnchair/LawnchairApp.kt | 5 ++ .../src/app/lawnchair/LawnchairLauncher.kt | 24 ++++++--- .../factory/LawnchairWidgetHolder.kt | 54 +++++++++++++++++++ .../util/LawnchairWindowManagerProxy.kt | 47 ++++++++++++++++ proguard.pro | 1 + .../launcher3/QuickstepTransitionManager.java | 13 +++-- .../statehandlers/DepthController.java | 17 ++++-- .../taskbar/NavbarButtonsViewController.java | 3 +- .../taskbar/TaskbarActivityContext.java | 2 - .../uioverrides/QuickstepLauncher.java | 15 +++--- .../android/quickstep/RecentsActivity.java | 2 - .../RecentsAnimationDeviceState.java | 3 +- .../quickstep/TaskAnimationManager.java | 4 +- .../quickstep/util/BaseDepthController.java | 2 +- .../graphics/LauncherPreviewRenderer.java | 20 ++++--- .../systemui/shared/system/BlurUtils.java | 5 +- .../config/ResourceUnfoldTransitionConfig.kt | 30 +++++++---- 19 files changed, 205 insertions(+), 51 deletions(-) create mode 100644 lawnchair/res/values-v30/colors.xml create mode 100644 lawnchair/src/app/lawnchair/factory/LawnchairWidgetHolder.kt create mode 100644 lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt diff --git a/lawnchair/res/values-v30/colors.xml b/lawnchair/res/values-v30/colors.xml new file mode 100644 index 0000000000..52aee4639d --- /dev/null +++ b/lawnchair/res/values-v30/colors.xml @@ -0,0 +1,5 @@ + + + @android:color/transparent + @android:color/transparent + diff --git a/lawnchair/res/values/config.xml b/lawnchair/res/values/config.xml index 2ad7a32678..a459cb0e71 100644 --- a/lawnchair/res/values/config.xml +++ b/lawnchair/res/values/config.xml @@ -39,6 +39,8 @@ app.lawnchair.overview.TaskOverlayFactoryImpl com.android.wallpaper com.google.android.apps.wallpaper + app.lawnchair.factory.LawnchairWidgetHolder$LawnchairHolderFactory + app.lawnchair.util.LawnchairWindowManagerProxy true @@ -116,4 +118,6 @@ 1.0 5 + + 1.10 diff --git a/lawnchair/src/app/lawnchair/LawnchairApp.kt b/lawnchair/src/app/lawnchair/LawnchairApp.kt index 65d944bb25..95ce8c7b9f 100644 --- a/lawnchair/src/app/lawnchair/LawnchairApp.kt +++ b/lawnchair/src/app/lawnchair/LawnchairApp.kt @@ -46,6 +46,7 @@ import com.android.launcher3.BuildConfig import com.android.launcher3.InvariantDeviceProfile import com.android.launcher3.Launcher import com.android.launcher3.R +import com.android.launcher3.Utilities import com.android.quickstep.RecentsActivity import com.android.systemui.shared.system.QuickStepContract import java.io.File @@ -54,6 +55,7 @@ class LawnchairApp : Application() { private val compatible = Build.VERSION.SDK_INT in BuildConfig.QUICKSTEP_MIN_SDK..BuildConfig.QUICKSTEP_MAX_SDK private val isRecentsComponent: Boolean by lazy { checkRecentsComponent() } private val recentsEnabled: Boolean get() = compatible && isRecentsComponent + private val isAtleastT = Utilities.ATLEAST_T internal var accessibilityService: LawnchairAccessibilityService? = null val isVibrateOnIconAnimation: Boolean by lazy { getSystemUiBoolean("config_vibrateOnIconAnimation", false) } @@ -201,6 +203,9 @@ class LawnchairApp : Application() { @JvmStatic val isRecentsEnabled: Boolean get() = instance.recentsEnabled + @JvmStatic + val isAtleastT: Boolean get() = instance.isAtleastT + fun Launcher.showQuickstepWarningIfNecessary() { val launcher = this if (!lawnchairApp.isRecentsComponent || isRecentsEnabled) return diff --git a/lawnchair/src/app/lawnchair/LawnchairLauncher.kt b/lawnchair/src/app/lawnchair/LawnchairLauncher.kt index 0acf337a2d..6ea6c2b553 100644 --- a/lawnchair/src/app/lawnchair/LawnchairLauncher.kt +++ b/lawnchair/src/app/lawnchair/LawnchairLauncher.kt @@ -46,6 +46,7 @@ import androidx.savedstate.SavedStateRegistryController import androidx.savedstate.SavedStateRegistryOwner import androidx.savedstate.setViewTreeSavedStateRegistryOwner import app.lawnchair.LawnchairApp.Companion.showQuickstepWarningIfNecessary +import app.lawnchair.factory.LawnchairWidgetHolder import app.lawnchair.gestures.GestureController import app.lawnchair.gestures.VerticalSwipeTouchController import app.lawnchair.gestures.config.GestureHandlerConfig @@ -72,6 +73,7 @@ import com.android.launcher3.uioverrides.states.OverviewState import com.android.launcher3.util.SystemUiController.UI_STATE_BASE_WINDOW import com.android.launcher3.util.Themes import com.android.launcher3.util.TouchController +import com.android.launcher3.widget.LauncherWidgetHolder import com.android.launcher3.widget.RoundedCornerEnforcement import com.android.systemui.plugins.shared.LauncherOverlayManager import com.android.systemui.shared.system.QuickStepContract @@ -299,12 +301,22 @@ class LawnchairLauncher : gestureController.onHomePressed() } -// fun shouldBackButtonBeHidden(toState: LauncherState): Boolean { -// if (toState == LauncherState.NORMAL && hasBackGesture) { -// return false -// } -// return super.shouldBackButtonBeHidden(toState) -// } + override fun registerBackDispatcher() { + if (LawnchairApp.isAtleastT) { + super.registerBackDispatcher() + } + } + + override fun createAppWidgetHolder(): LauncherWidgetHolder { + val factory = LauncherWidgetHolder.HolderFactory.newFactory(this) as LawnchairWidgetHolder.LawnchairHolderFactory + return factory.newInstance( + this, + ) { appWidgetId: Int -> + workspace.removeWidget( + appWidgetId, + ) + } + } override fun onStart() { super.onStart() diff --git a/lawnchair/src/app/lawnchair/factory/LawnchairWidgetHolder.kt b/lawnchair/src/app/lawnchair/factory/LawnchairWidgetHolder.kt new file mode 100644 index 0000000000..8fef8f13c4 --- /dev/null +++ b/lawnchair/src/app/lawnchair/factory/LawnchairWidgetHolder.kt @@ -0,0 +1,54 @@ +package app.lawnchair.factory + +import android.appwidget.AppWidgetHost +import android.content.Context +import android.widget.RemoteViews +import com.android.internal.annotations.Keep +import com.android.launcher3.config.FeatureFlags +import com.android.launcher3.widget.LauncherWidgetHolder +import java.util.function.IntConsumer + +class LawnchairWidgetHolder(context: Context, intConsumer: IntConsumer?) : LauncherWidgetHolder(context, intConsumer) { + + @Keep + class LawnchairHolderFactory + @Suppress("unused") + constructor(context: Context?) : + HolderFactory() { + override fun newInstance( + context: Context, + appWidgetRemovedCallback: IntConsumer?, + ): LauncherWidgetHolder { + return newInstance(context, appWidgetRemovedCallback, null) + } + + /** + * @param context The context of the caller + * @param appWidgetRemovedCallback The callback that is called when widgets are removed + * @param interactionHandler The interaction handler when the widgets are clicked + * @return A new [LauncherWidgetHolder] instance + */ + fun newInstance( + context: Context, + appWidgetRemovedCallback: IntConsumer?, + interactionHandler: RemoteViews.InteractionHandler?, + ): LauncherWidgetHolder { + return if (!FeatureFlags.ENABLE_WIDGET_HOST_IN_BACKGROUND.get()) { + object : LauncherWidgetHolder(context, appWidgetRemovedCallback) { + override fun createHost( + context: Context, + appWidgetRemovedCallback: IntConsumer?, + ): AppWidgetHost { + val host = super.createHost(context, appWidgetRemovedCallback) + if (interactionHandler != null) { + host.setInteractionHandler(interactionHandler) + } + return host + } + } + } else { + LawnchairWidgetHolder(context, appWidgetRemovedCallback) + } + } + } +} diff --git a/lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt b/lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt new file mode 100644 index 0000000000..126e683162 --- /dev/null +++ b/lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt @@ -0,0 +1,47 @@ +package app.lawnchair.util + +import android.content.Context +import android.util.ArrayMap +import android.view.Display.DEFAULT_DISPLAY +import android.view.Surface +import android.view.WindowManager +import androidx.annotation.Keep +import app.lawnchair.LawnchairApp +import com.android.internal.policy.SystemBarUtils +import com.android.launcher3.util.WindowBounds +import com.android.launcher3.util.window.CachedDisplayInfo +import com.android.launcher3.util.window.WindowManagerProxy + +@Keep +class LawnchairWindowManagerProxy(context: Context) : WindowManagerProxy(true) { + + override fun getRotation(displayInfoContext: Context): Int { + if (LawnchairApp.isAtleastT) { + return displayInfoContext.resources.configuration.windowConfiguration.rotation + } + return super.getRotation(displayInfoContext) + } + + override fun getStatusBarHeight(context: Context, isPortrait: Boolean, statusBarInset: Int): Int { + if (LawnchairApp.isAtleastT) { + return SystemBarUtils.getStatusBarHeight(context) + } + return super.getStatusBarHeight(context, isPortrait, statusBarInset) + } + + override fun estimateInternalDisplayBounds(displayInfoContext: Context): ArrayMap> { + if (LawnchairApp.isAtleastT) { + val result = ArrayMap>() + val windowManager = displayInfoContext.getSystemService(WindowManager::class.java) + val possibleMaximumWindowMetrics = + windowManager.getPossibleMaximumWindowMetrics(DEFAULT_DISPLAY) + for (windowMetrics in possibleMaximumWindowMetrics) { + val info = getDisplayInfo(windowMetrics, Surface.ROTATION_0) + val bounds = estimateWindowBounds(displayInfoContext, info) + result[info] = bounds + } + return result + } + return super.estimateInternalDisplayBounds(displayInfoContext) + } +} diff --git a/proguard.pro b/proguard.pro index eb535b851a..5cad2c2143 100644 --- a/proguard.pro +++ b/proguard.pro @@ -150,6 +150,7 @@ -keep class com.android.launcher3.Utilities { *; } -keep class app.lawnchair.LawnchairLauncher { *; } -keep class com.google.protobuf.Timestamp { *; } +-keep class androidx.core.app.CoreComponentFactory { *; } -keepattributes InnerClasses -keep class app.lawnchair.compatlib.** { diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 0868e0a73f..16ff7331b8 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -261,8 +261,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener mDragLayer = mLauncher.getDragLayer(); mHandler = new Handler(Looper.getMainLooper()); mDeviceProfile = mLauncher.getDeviceProfile(); - mBackAnimationController = new LauncherBackAnimationController(mLauncher, this); - + mBackAnimationController = LawnchairApp.isAtleastT() ? new LauncherBackAnimationController(mLauncher, this) : null; Resources res = mLauncher.getResources(); mClosingWindowTransY = res.getDimensionPixelSize(R.dimen.closing_window_trans_y); mMaxShadowRadius = res.getDimensionPixelSize(R.dimen.max_shadow_radius); @@ -2068,13 +2067,17 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener private static class MyDepthController extends DepthController { MyDepthController(Launcher l) { super(l); - setCrossWindowBlursEnabled( - CrossWindowBlurListeners.getInstance().isCrossWindowBlurEnabled()); + if(LawnchairApp.isAtleastT()){ + setCrossWindowBlursEnabled( + CrossWindowBlurListeners.getInstance().isCrossWindowBlurEnabled()); + } } @Override public void setSurface(SurfaceControl surface) { - super.setSurface(surface); + if(LawnchairApp.isAtleastT()){ + super.setSurface(surface); + } } } } diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java index c3f7eda1c3..dc8c4de694 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java +++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java @@ -74,8 +74,11 @@ public class DepthController extends BaseDepthController implements StateHandler mOnAttachListener = new View.OnAttachStateChangeListener() { @Override public void onViewAttachedToWindow(View view) { - CrossWindowBlurListeners.getInstance().addListener(mLauncher.getMainExecutor(), - mCrossWindowBlurListener); + if(app.lawnchair.LawnchairApp.isAtleastT()){ + CrossWindowBlurListeners.getInstance().addListener(mLauncher.getMainExecutor(), + mCrossWindowBlurListener); + } + mLauncher.getScrimView().addOpaquenessListener(mOpaquenessListener); // To handle the case where window token is invalid during last setDepth call. @@ -84,7 +87,9 @@ public class DepthController extends BaseDepthController implements StateHandler @Override public void onViewDetachedFromWindow(View view) { - CrossWindowBlurListeners.getInstance().removeListener(mCrossWindowBlurListener); + if(app.lawnchair.LawnchairApp.isAtleastT()){ + CrossWindowBlurListeners.getInstance().removeListener(mCrossWindowBlurListener); + } mLauncher.getScrimView().removeOpaquenessListener(mOpaquenessListener); } }; @@ -134,8 +139,10 @@ public class DepthController extends BaseDepthController implements StateHandler @Override public void applyDepthAndBlur() { - ensureDependencies(); - super.applyDepthAndBlur(); + if(app.lawnchair.LawnchairApp.isAtleastT()){ + ensureDependencies(); + super.applyDepthAndBlur(); + } } @Override diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index a713ff53a7..5273b5756e 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -224,8 +224,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT TaskbarManager.isPhoneMode(deviceProfile)); mNavButtonsView.getLayoutParams().height = p.y; - mIsImeRenderingNavButtons = - InputMethodService.canImeRenderGesturalNavButtons() && mContext.imeDrawsImeNavBar(); + mIsImeRenderingNavButtons = app.lawnchair.LawnchairApp.isAtleastT() ? InputMethodService.canImeRenderGesturalNavButtons() && mContext.imeDrawsImeNavBar() : mContext.imeDrawsImeNavBar(); if (!mIsImeRenderingNavButtons) { // IME switcher View imeSwitcherButton = addButton(R.drawable.ic_ime_switcher, BUTTON_IME_SWITCH, diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index b5aafe29f0..eb0889dff4 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -291,8 +291,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { @Override public void dispatchDeviceProfileChanged() { super.dispatchDeviceProfileChanged(); - Trace.instantForTrack(TRACE_TAG_APP, "TaskbarActivityContext#DeviceProfileChanged", - getDeviceProfile().toSmallString()); } /** diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 143f1a9ecb..8efad00c5d 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -71,6 +71,7 @@ import android.hardware.SensorManager; import android.hardware.devicestate.DeviceStateManager; import android.hardware.display.DisplayManager; import android.media.permission.SafeCloseable; +import android.os.Build; import android.os.Bundle; import android.os.CancellationSignal; import android.os.IBinder; @@ -949,21 +950,25 @@ public class QuickstepLauncher extends Launcher { mAppTransitionManager.hasControlRemoteAppTransitionPermission() ? mAppTransitionManager.getActivityLaunchOptions(v) : super.getActivityLaunchOptions(v, item); - if (mLastTouchUpTime > 0) { + if (mLastTouchUpTime > 0 && app.lawnchair.LawnchairApp.isAtleastT()) { activityOptions.options.setSourceInfo(ActivityOptions.SourceInfo.TYPE_LAUNCHER, mLastTouchUpTime); } if (item != null && (item.animationType == DEFAULT_NO_ICON - || item.animationType == VIEW_BACKGROUND)) { + || item.animationType == VIEW_BACKGROUND) && app.lawnchair.LawnchairApp.isAtleastT()) { activityOptions.options.setSplashScreenStyle( SplashScreen.SPLASH_SCREEN_STYLE_SOLID_COLOR); } else { - activityOptions.options.setSplashScreenStyle(SplashScreen.SPLASH_SCREEN_STYLE_ICON); + if (app.lawnchair.LawnchairApp.isAtleastT()) { + activityOptions.options.setSplashScreenStyle(SplashScreen.SPLASH_SCREEN_STYLE_ICON); + } } activityOptions.options.setLaunchDisplayId( (v != null && v.getDisplay() != null) ? v.getDisplay().getDisplayId() : Display.DEFAULT_DISPLAY); - addLaunchCookie(item, activityOptions.options); + if(app.lawnchair.LawnchairApp.isAtleastT()){ + addLaunchCookie(item, activityOptions.options); + } return activityOptions; } @Override @@ -1098,8 +1103,6 @@ public class QuickstepLauncher extends Launcher { @Override public void dispatchDeviceProfileChanged() { super.dispatchDeviceProfileChanged(); - Trace.instantForTrack(TRACE_TAG_APP, "QuickstepLauncher#DeviceProfileChanged", - getDeviceProfile().toSmallString()); SystemUiProxy.INSTANCE.get(this).setLauncherAppIconSize(mDeviceProfile.iconSizePx); if (mTaskbarManager != null) { mTaskbarManager.debugWhyTaskbarNotDestroyed("QuickstepLauncher#onDeviceProfileChanged"); diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 09674f2bcd..70c5ee05ba 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -462,8 +462,6 @@ public final class RecentsActivity extends StatefulActivity { @Override public void dispatchDeviceProfileChanged() { super.dispatchDeviceProfileChanged(); - Trace.instantForTrack(TRACE_TAG_APP, "RecentsActivity#DeviceProfileChanged", - getDeviceProfile().toSmallString()); } private AnimatorListenerAdapter resetStateListener() { diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java index cc74047b75..2edeb88ca6 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java @@ -95,8 +95,7 @@ public class RecentsAnimationDeviceState implements DisplayInfoChangeListener { private final RotationTouchHelper mRotationTouchHelper; private final TaskStackChangeListener mPipListener; // Cache for better performance since it doesn't change at runtime. - private final boolean mCanImeRenderGesturalNavButtons = - InputMethodService.canImeRenderGesturalNavButtons(); + private final boolean mCanImeRenderGesturalNavButtons = LawnchairApp.isAtleastT() ? InputMethodService.canImeRenderGesturalNavButtons() : isImeRenderingNavButtons(); private final ArrayList mOnDestroyActions = new ArrayList<>(); diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java index dde5d55de4..23f43ee223 100644 --- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java +++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java @@ -244,7 +244,9 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn if (!homeIsOnTop) { options.setTransientLaunch(); } - options.setSourceInfo(ActivityOptions.SourceInfo.TYPE_RECENTS_ANIMATION, eventTime); + if(app.lawnchair.LawnchairApp.isAtleastT()){ + options.setSourceInfo(ActivityOptions.SourceInfo.TYPE_RECENTS_ANIMATION, eventTime); + } UI_HELPER_EXECUTOR.execute(() -> mCtx.startActivity(intent, options.toBundle())); } else { UI_HELPER_EXECUTOR.execute(() -> ActivityManagerWrapper.getInstance() diff --git a/quickstep/src/com/android/quickstep/util/BaseDepthController.java b/quickstep/src/com/android/quickstep/util/BaseDepthController.java index cecf58d105..c93e4e048e 100644 --- a/quickstep/src/com/android/quickstep/util/BaseDepthController.java +++ b/quickstep/src/com/android/quickstep/util/BaseDepthController.java @@ -163,7 +163,7 @@ public class BaseDepthController { * Sets the specified app target surface to apply the blur to. */ protected void setSurface(SurfaceControl surface) { - if (mSurface != surface) { + if (mSurface != surface && app.lawnchair.LawnchairApp.isAtleastT()) { mSurface = surface; applyDepthAndBlur(); } diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java index b5af3c028e..41c8a9d1bf 100644 --- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java +++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java @@ -242,13 +242,19 @@ public class LauncherPreviewRenderer extends ContextWrapper mDpOrig = mDp; } - WindowInsets currentWindowInsets = context.getSystemService(WindowManager.class) - .getCurrentWindowMetrics().getWindowInsets(); - mInsets = new Rect( - currentWindowInsets.getSystemWindowInsetLeft(), - currentWindowInsets.getSystemWindowInsetTop(), - currentWindowInsets.getSystemWindowInsetRight(), - mDp.isTaskbarPresent ? 0 : currentWindowInsets.getSystemWindowInsetBottom()); + if (Utilities.ATLEAST_R) { + WindowInsets currentWindowInsets = context.getSystemService(WindowManager.class) + .getCurrentWindowMetrics().getWindowInsets(); + mInsets = new Rect( + currentWindowInsets.getSystemWindowInsetLeft(), + currentWindowInsets.getSystemWindowInsetTop(), + currentWindowInsets.getSystemWindowInsetRight(), + currentWindowInsets.getSystemWindowInsetBottom()); + } else { + mInsets = new Rect(); + mInsets.left = mInsets.right = (mDp.widthPx - mDp.availableWidthPx) / 2; + mInsets.top = mInsets.bottom = (mDp.heightPx - mDp.availableHeightPx) / 2; + } mDp.updateInsets(mInsets); BaseIconFactory iconFactory = diff --git a/systemUIShared/src/com/android/systemui/shared/system/BlurUtils.java b/systemUIShared/src/com/android/systemui/shared/system/BlurUtils.java index 61b0e4d902..5cda38dad4 100644 --- a/systemUIShared/src/com/android/systemui/shared/system/BlurUtils.java +++ b/systemUIShared/src/com/android/systemui/shared/system/BlurUtils.java @@ -16,9 +16,8 @@ package com.android.systemui.shared.system; -import static android.view.CrossWindowBlurListeners.CROSS_WINDOW_BLUR_SUPPORTED; - import android.app.ActivityManager; +import android.os.Build; import android.os.SystemProperties; public abstract class BlurUtils { @@ -29,7 +28,7 @@ public abstract class BlurUtils { * @return {@code true} when supported. */ public static boolean supportsBlursOnWindows() { - return CROSS_WINDOW_BLUR_SUPPORTED && ActivityManager.isHighEndGfx() + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && ActivityManager.isHighEndGfx() && !SystemProperties.getBoolean("persist.sysui.disableBlur", false); } } diff --git a/systemUnFold/src/com/android/systemui/unfold/config/ResourceUnfoldTransitionConfig.kt b/systemUnFold/src/com/android/systemui/unfold/config/ResourceUnfoldTransitionConfig.kt index c51372975a..08221ea650 100644 --- a/systemUnFold/src/com/android/systemui/unfold/config/ResourceUnfoldTransitionConfig.kt +++ b/systemUnFold/src/com/android/systemui/unfold/config/ResourceUnfoldTransitionConfig.kt @@ -21,21 +21,33 @@ import javax.inject.Singleton @Singleton class ResourceUnfoldTransitionConfig @Inject constructor() : UnfoldTransitionConfig { + private fun getBooleanResource(resourceName: String): Boolean { + val id = Resources.getSystem().getIdentifier(resourceName, "bool", "android") + return if (id != 0) { + Resources.getSystem().getBoolean(id) + } else { + false + } + } + + private fun getIntResource(resourceName: String): Int { + val id = Resources.getSystem().getIdentifier(resourceName, "integer", "android") + return if (id != 0) { + Resources.getSystem().getInteger(id) + } else { + 0 + } + } + override val isEnabled: Boolean by lazy { - val id = Resources.getSystem() - .getIdentifier("config_unfoldTransitionEnabled", "bool", "android") - Resources.getSystem().getBoolean(id) + getBooleanResource("config_unfoldTransitionEnabled") } override val isHingeAngleEnabled: Boolean by lazy { - val id = Resources.getSystem() - .getIdentifier("config_unfoldTransitionHingeAngle", "bool", "android") - Resources.getSystem().getBoolean(id) + getBooleanResource("config_unfoldTransitionHingeAngle") } override val halfFoldedTimeoutMillis: Int by lazy { - val id = Resources.getSystem() - .getIdentifier("config_unfoldTransitionHalfFoldedTimeout", "integer", "android") - Resources.getSystem().getInteger(id) + getIntResource("config_unfoldTransitionHalfFoldedTimeout") } }