From 1d7c0a4bf6b3da3482778c76bb9fa9a750ac1bee Mon Sep 17 00:00:00 2001 From: Suphon Thanakornpakapong Date: Sat, 9 Oct 2021 15:59:29 +0700 Subject: [PATCH] Fix crash below 12 --- .../shared/system/ActivityManagerWrapper.java | 4 +++- .../shared/system/ActivityOptionsCompat.java | 5 ++++- .../android/systemui/shared/system/BlurUtils.java | 2 ++ lawnchair/src/app/lawnchair/util/DrawableUtils.kt | 11 +++++++++++ .../com/android/launcher3/BaseQuickstepLauncher.java | 6 ++++-- .../launcher3/model/QuickstepModelDelegate.java | 7 +++++++ .../launcher3/statehandlers/DepthController.java | 12 ++++++++---- res/values/colors.xml | 2 +- src/com/android/launcher3/config/FeatureFlags.java | 2 +- src/com/android/launcher3/graphics/Scrim.java | 8 +++++++- .../launcher3/shortcuts/DeepShortcutView.java | 4 +++- 11 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 lawnchair/src/app/lawnchair/util/DrawableUtils.kt diff --git a/SystemUIShared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/SystemUIShared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index 9164137feb..a4c8462c83 100644 --- a/SystemUIShared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/SystemUIShared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -28,6 +28,7 @@ import android.app.ActivityClient; import android.app.ActivityManager; import android.app.ActivityManager.RecentTaskInfo; import android.app.ActivityManager.RunningTaskInfo; +import android.os.Build; import android.window.TaskSnapshot; import android.app.ActivityOptions; import android.app.ActivityTaskManager; @@ -71,7 +72,8 @@ public class ActivityManagerWrapper { // Should match the value in AssistManager private static final String INVOCATION_TIME_MS_KEY = "invocation_time_ms"; - private final ActivityTaskManager mAtm = ActivityTaskManager.getInstance(); + private static final boolean ATLEAST_S = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S; + private final ActivityTaskManager mAtm = ATLEAST_S ? ActivityTaskManager.getInstance() : null; private ActivityManagerWrapper() { } public static ActivityManagerWrapper getInstance() { diff --git a/SystemUIShared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java b/SystemUIShared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java index e2ca349cc5..e8c7437869 100644 --- a/SystemUIShared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java +++ b/SystemUIShared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java @@ -22,6 +22,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECOND import android.app.ActivityOptions; import android.content.Context; +import android.os.Build; import android.os.Handler; import com.android.systemui.shared.recents.model.Task; @@ -101,7 +102,9 @@ public abstract class ActivityOptionsCompat { * Sets the launch event time from launcher. */ public static ActivityOptions setLauncherSourceInfo(ActivityOptions opts, long uptimeMillis) { - opts.setSourceInfo(ActivityOptions.SourceInfo.TYPE_LAUNCHER, uptimeMillis); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + opts.setSourceInfo(ActivityOptions.SourceInfo.TYPE_LAUNCHER, uptimeMillis); + } return opts; } diff --git a/SystemUIShared/src/com/android/systemui/shared/system/BlurUtils.java b/SystemUIShared/src/com/android/systemui/shared/system/BlurUtils.java index 61b0e4d902..9df17db349 100644 --- a/SystemUIShared/src/com/android/systemui/shared/system/BlurUtils.java +++ b/SystemUIShared/src/com/android/systemui/shared/system/BlurUtils.java @@ -19,6 +19,7 @@ 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,6 +30,7 @@ public abstract class BlurUtils { * @return {@code true} when supported. */ public static boolean supportsBlursOnWindows() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return false; return CROSS_WINDOW_BLUR_SUPPORTED && ActivityManager.isHighEndGfx() && !SystemProperties.getBoolean("persist.sysui.disableBlur", false); } diff --git a/lawnchair/src/app/lawnchair/util/DrawableUtils.kt b/lawnchair/src/app/lawnchair/util/DrawableUtils.kt new file mode 100644 index 0000000000..d312d6d531 --- /dev/null +++ b/lawnchair/src/app/lawnchair/util/DrawableUtils.kt @@ -0,0 +1,11 @@ +package app.lawnchair.util + +import android.graphics.drawable.GradientDrawable + +fun GradientDrawable.getCornerRadiiCompat(): FloatArray? { + return try { + cornerRadii + } catch (e: NullPointerException) { + null + } +} diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java index a44de793a3..ac307895fa 100644 --- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java @@ -449,8 +449,10 @@ public abstract class BaseQuickstepLauncher extends Launcher ActivityOptionsCompat.setLauncherSourceInfo( activityOptions.options, mLastTouchUpTime); } - activityOptions.options.setSplashscreenStyle(SplashScreen.SPLASH_SCREEN_STYLE_ICON); - addLaunchCookie(item, activityOptions.options); + if (Utilities.ATLEAST_S) { + activityOptions.options.setSplashscreenStyle(SplashScreen.SPLASH_SCREEN_STYLE_ICON); + addLaunchCookie(item, activityOptions.options); + } return activityOptions; } diff --git a/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java b/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java index a9c2a5e51d..743e8ff356 100644 --- a/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java +++ b/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java @@ -26,6 +26,7 @@ import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SH import static com.android.launcher3.Utilities.getDevicePrefs; import static com.android.launcher3.hybridhotseat.HotseatPredictionModel.convertDataModelToAppTargetBundle; +import android.Manifest; import android.app.prediction.AppPredictionContext; import android.app.prediction.AppPredictionManager; import android.app.prediction.AppPredictor; @@ -36,6 +37,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; +import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.os.UserHandle; import android.util.Log; @@ -46,6 +48,7 @@ import androidx.annotation.WorkerThread; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.InvariantDeviceProfile.OnIDPChangeListener; import com.android.launcher3.LauncherAppState; +import com.android.launcher3.Utilities; import com.android.launcher3.logging.InstanceId; import com.android.launcher3.logging.InstanceIdSequence; import com.android.launcher3.model.BgDataModel.FixedContainerItems; @@ -200,6 +203,10 @@ public class QuickstepModelDelegate extends ModelDelegate implements OnIDPChange return; } + if (!Utilities.ATLEAST_Q) return; + int usagePerm = mApp.getContext().checkCallingOrSelfPermission(Manifest.permission.PACKAGE_USAGE_STATS); + if (usagePerm != PackageManager.PERMISSION_GRANTED) return; + registerPredictor(mAllAppsState, apm.createAppPredictionSession( new AppPredictionContext.Builder(context) .setUiSurface("home") diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java index d8f8ff5dd4..eb6788e463 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java +++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java @@ -154,17 +154,21 @@ public class DepthController implements StateHandler, if (windowToken != null) { mWallpaperManager.setWallpaperZoomOut(windowToken, mDepth); } - CrossWindowBlurListeners.getInstance().addListener(mLauncher.getMainExecutor(), - mCrossWindowBlurListener); + if (Utilities.ATLEAST_S) { + CrossWindowBlurListeners.getInstance().addListener(mLauncher.getMainExecutor(), + mCrossWindowBlurListener); + } } @Override public void onViewDetachedFromWindow(View view) { - CrossWindowBlurListeners.getInstance().removeListener(mCrossWindowBlurListener); + if (Utilities.ATLEAST_S) { + CrossWindowBlurListeners.getInstance().removeListener(mCrossWindowBlurListener); + } } }; mLauncher.getRootView().addOnAttachStateChangeListener(mOnAttachListener); - if (mLauncher.getRootView().isAttachedToWindow()) { + if (mLauncher.getRootView().isAttachedToWindow() && Utilities.ATLEAST_S) { CrossWindowBlurListeners.getInstance().addListener(mLauncher.getMainExecutor(), mCrossWindowBlurListener); } diff --git a/res/values/colors.xml b/res/values/colors.xml index 1b68fb68a7..0a928bb139 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -72,7 +72,7 @@ #F9F9F9 #464746 - ?attr/colorPrimary + @color/primary_500 #FFFFFFFF #FFFFFFFF diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java index 471c9cd4f8..618ce33cc6 100644 --- a/src/com/android/launcher3/config/FeatureFlags.java +++ b/src/com/android/launcher3/config/FeatureFlags.java @@ -96,7 +96,7 @@ public final class FeatureFlags { "ENABLE_QUICKSTEP_LIVE_TILE", true, "Enable live tile in Quickstep overview"); public static final BooleanFlag ENABLE_QUICKSTEP_WIDGET_APP_START = getDebugFlag( - "ENABLE_QUICKSTEP_WIDGET_APP_START", true, + "ENABLE_QUICKSTEP_WIDGET_APP_START", Utilities.ATLEAST_S, "Enable Quickstep animation when launching activities from an app widget"); // Keep as DeviceFlag to allow remote disable in emergency. diff --git a/src/com/android/launcher3/graphics/Scrim.java b/src/com/android/launcher3/graphics/Scrim.java index a77e0587c0..8ea7c225f3 100644 --- a/src/com/android/launcher3/graphics/Scrim.java +++ b/src/com/android/launcher3/graphics/Scrim.java @@ -23,6 +23,8 @@ import android.util.FloatProperty; import android.view.View; import com.android.launcher3.R; +import com.android.launcher3.Utilities; +import com.android.launcher3.util.Themes; /** * Contains general scrim properties such as wallpaper-extracted color that subclasses can use. @@ -50,7 +52,11 @@ public class Scrim { public Scrim(View view) { mRoot = view; - mScrimColor = mRoot.getContext().getColor(R.color.wallpaper_popup_scrim); + if (Utilities.ATLEAST_S) { + mScrimColor = mRoot.getContext().getColor(R.color.wallpaper_popup_scrim); + } else { + mScrimColor = Themes.getColorAccent(mRoot.getContext()); + } } public void draw(Canvas canvas) { diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutView.java b/src/com/android/launcher3/shortcuts/DeepShortcutView.java index 71d288c0ab..bb2ecefd1b 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutView.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutView.java @@ -39,6 +39,8 @@ import com.android.launcher3.popup.PopupContainerWithArrow; import com.android.launcher3.util.Themes; import com.android.launcher3.views.BubbleTextHolder; +import app.lawnchair.util.DrawableUtilsKt; + /** * A {@link android.widget.FrameLayout} that contains an icon and a {@link BubbleTextView} for text. * This lets us animate the child BubbleTextView's background (transparent ripple) separately from @@ -101,7 +103,7 @@ public class DeepShortcutView extends FrameLayout implements BubbleTextHolder { GradientDrawable backgroundMask = new GradientDrawable(); backgroundMask.setColor(color); backgroundMask.setShape(GradientDrawable.RECTANGLE); - if (background.getCornerRadii() != null) { + if (DrawableUtilsKt.getCornerRadiiCompat(background) != null) { backgroundMask.setCornerRadii(background.getCornerRadii()); } else { backgroundMask.setCornerRadius(background.getCornerRadius());