diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4f580e0bd6..517bd6d70e 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -20,7 +20,7 @@ - + Tap another app to use split screen + Choose another app to use split screen Cancel Exit split screen selection diff --git a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java index 5d4e19dbcc..842f0ef96e 100644 --- a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java +++ b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java @@ -24,9 +24,7 @@ import static com.android.systemui.shared.recents.utilities.Utilities.postAtFron import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; -import android.annotation.TargetApi; import android.content.Context; -import android.os.Build; import android.os.Handler; import android.os.RemoteException; import android.view.IRemoteAnimationFinishedCallback; @@ -57,7 +55,6 @@ import java.lang.ref.WeakReference; * the runner implementation. When this animation manager is destroyed, we remove the Launcher * reference to the runner, leaving only the weak ref from the runner. */ -@TargetApi(Build.VERSION_CODES.P) public class LauncherAnimationRunner extends RemoteAnimationRunnerCompat { private static final RemoteAnimationFactory DEFAULT_FACTORY = diff --git a/quickstep/src/com/android/launcher3/LauncherInitListener.java b/quickstep/src/com/android/launcher3/LauncherInitListener.java index f64b5cfafe..523923df6a 100644 --- a/quickstep/src/com/android/launcher3/LauncherInitListener.java +++ b/quickstep/src/com/android/launcher3/LauncherInitListener.java @@ -15,14 +15,10 @@ */ package com.android.launcher3; -import android.annotation.TargetApi; -import android.os.Build; - import com.android.quickstep.util.ActivityInitListener; import java.util.function.BiPredicate; -@TargetApi(Build.VERSION_CODES.P) public class LauncherInitListener extends ActivityInitListener { /** diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 656af312bf..e8a3d3eef5 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -64,6 +64,7 @@ import static com.android.launcher3.views.FloatingIconView.SHAPE_PROGRESS_DURATI import static com.android.launcher3.views.FloatingIconView.getFloatingIconView; import static com.android.quickstep.TaskAnimationManager.ENABLE_SHELL_TRANSITIONS; import static com.android.quickstep.TaskViewUtils.findTaskViewToLaunch; +import static com.android.quickstep.util.AnimUtils.completeRunnableListCallback; import static com.android.systemui.shared.system.QuickStepContract.getWindowCornerRadius; import static com.android.systemui.shared.system.QuickStepContract.supportsRoundedCornersOnWindows; @@ -88,6 +89,7 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.IBinder; +import android.os.IRemoteCallback; import android.os.Looper; import android.os.SystemProperties; import android.os.UserHandle; @@ -351,6 +353,9 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener new RemoteAnimationAdapter(runner, duration, statusBarTransitionDelay), new RemoteTransition(runner.toRemoteTransition(), mLauncher.getIApplicationThread(), "QuickstepLaunch")); + IRemoteCallback endCallback = completeRunnableListCallback(onEndCallback); + options.setOnAnimationAbortListener(endCallback); + options.setOnAnimationFinishedListener(endCallback); return new ActivityOptionsWrapper(options, onEndCallback); } @@ -1663,14 +1668,20 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener ? Cuj.CUJ_LAUNCHER_APP_CLOSE_TO_HOME_FALLBACK : Cuj.CUJ_LAUNCHER_APP_CLOSE_TO_HOME); - anim.addListener(new AnimatorListenerAdapter() { + AnimatorListenerAdapter endListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); AccessibilityManagerCompat.sendTestProtocolEventToTest( mLauncher, WALLPAPER_OPEN_ANIMATION_FINISHED_MESSAGE); } - }); + }; + + if (fromPredictiveBack) { + rectFSpringAnim.addAnimatorListener(endListener); + } else { + anim.addListener(endListener); + } // Only register the content animation for cancellation when state changes mLauncher.getStateManager().setCurrentAnimation(anim); diff --git a/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java b/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java index e680ea90b6..caf8a0bf1e 100644 --- a/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java +++ b/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java @@ -16,10 +16,8 @@ package com.android.launcher3.appprediction; -import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; -import android.os.Build; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -50,7 +48,6 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -@TargetApi(Build.VERSION_CODES.P) public class PredictionRowView extends LinearLayout implements OnDeviceProfileChangeListener, FloatingHeaderRow { diff --git a/quickstep/src/com/android/launcher3/model/AppEventProducer.java b/quickstep/src/com/android/launcher3/model/AppEventProducer.java index e17fc8879c..a931f36f3f 100644 --- a/quickstep/src/com/android/launcher3/model/AppEventProducer.java +++ b/quickstep/src/com/android/launcher3/model/AppEventProducer.java @@ -45,14 +45,12 @@ import static com.android.launcher3.model.PredictionHelper.isTrackedForHotseatPr import static com.android.launcher3.model.PredictionHelper.isTrackedForWidgetPrediction; import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; -import android.annotation.TargetApi; import android.app.prediction.AppTarget; import android.app.prediction.AppTargetEvent; import android.app.prediction.AppTargetId; import android.content.ComponentName; import android.content.Context; import android.content.pm.ShortcutInfo; -import android.os.Build; import android.os.Handler; import android.os.Message; import android.os.Process; @@ -84,7 +82,6 @@ import java.util.function.ObjIntConsumer; /** * Utility class to track stats log and emit corresponding app events */ -@TargetApi(Build.VERSION_CODES.R) public class AppEventProducer implements StatsLogConsumer { private static final int MSG_LAUNCH = 0; diff --git a/quickstep/src/com/android/launcher3/model/WellbeingModel.java b/quickstep/src/com/android/launcher3/model/WellbeingModel.java index 003c2fc292..3d04cb6828 100644 --- a/quickstep/src/com/android/launcher3/model/WellbeingModel.java +++ b/quickstep/src/com/android/launcher3/model/WellbeingModel.java @@ -20,7 +20,6 @@ import static android.content.ContentResolver.SCHEME_CONTENT; import static com.android.launcher3.util.SimpleBroadcastReceiver.getPackageFilter; -import android.annotation.TargetApi; import android.app.RemoteAction; import android.content.ContentProviderClient; import android.content.ContentResolver; @@ -30,7 +29,6 @@ import android.content.IntentFilter; import android.content.pm.LauncherApps; import android.database.ContentObserver; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.DeadObjectException; import android.os.Handler; @@ -63,7 +61,6 @@ import java.util.Map; /** * Data model for digital wellbeing status of apps. */ -@TargetApi(Build.VERSION_CODES.Q) public final class WellbeingModel extends BgObjectWithLooper { private static final String TAG = "WellbeingModel"; private static final int[] RETRY_TIMES_MS = {5000, 15000, 30000}; diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java index 535c8ecec6..f9816102d4 100644 --- a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java @@ -104,13 +104,6 @@ public class FallbackTaskbarUIController extends TaskbarUIController { } } - @Override - protected boolean isInOverview() { - TopTaskTracker.CachedTaskInfo topTask = TopTaskTracker.INSTANCE - .get(mControllers.taskbarActivityContext).getCachedTopTask(true); - return topTask.isRecentsTask(); - } - @Override public RecentsView getRecentsView() { return mRecentsActivity.getOverviewPanel(); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 2b88f0202c..3f5793f28a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -37,24 +37,23 @@ import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCH import static com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_DRAGGING; import static com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_FULLSCREEN; import static com.android.launcher3.testing.shared.ResourceUtils.getBoolByName; +import static com.android.quickstep.util.AnimUtils.completeRunnableListCallback; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING; import android.animation.AnimatorSet; import android.animation.ValueAnimator; -import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityOptions; -import android.app.ActivityTaskManager; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo.Config; import android.content.pm.LauncherApps; import android.content.res.Resources; -import android.graphics.Color; import android.graphics.PixelFormat; import android.graphics.Rect; import android.hardware.display.DisplayManager; +import android.os.IRemoteCallback; import android.os.Process; import android.os.Trace; import android.provider.Settings; @@ -66,7 +65,6 @@ import android.view.Surface; import android.view.View; import android.view.WindowInsets; import android.view.WindowManager; -import android.widget.FrameLayout; import android.widget.Toast; import androidx.annotation.NonNull; @@ -134,13 +132,10 @@ import com.android.systemui.unfold.updates.RotationChangeProvider; import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider; import java.io.PrintWriter; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.Set; import java.util.function.Consumer; -import java.util.stream.Collectors; /** * The {@link ActivityContext} with which we inflate Taskbar-related Views. This allows UI elements @@ -744,13 +739,14 @@ public class TaskbarActivityContext extends BaseTaskbarContext { @Override public ActivityOptionsWrapper makeDefaultActivityOptions(int splashScreenStyle) { RunnableList callbacks = new RunnableList(); - ActivityOptions options = ActivityOptions.makeCustomAnimation( - this, 0, 0, Color.TRANSPARENT, - Executors.MAIN_EXECUTOR.getHandler(), null, - elapsedRealTime -> callbacks.executeAllAndDestroy()); + ActivityOptions options = ActivityOptions.makeCustomAnimation(this, 0, 0); options.setSplashScreenStyle(splashScreenStyle); options.setPendingIntentBackgroundActivityStartMode( ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED); + IRemoteCallback endCallback = completeRunnableListCallback(callbacks); + options.setOnAnimationAbortListener(endCallback); + options.setOnAnimationFinishedListener(endCallback); + return new ActivityOptionsWrapper(options, callbacks); } @@ -1179,25 +1175,15 @@ public class TaskbarActivityContext extends BaseTaskbarContext { @Nullable Task foundTask = foundTasks[0]; if (foundTask != null) { TaskView foundTaskView = recents.getTaskViewByTaskId(foundTask.key.id); - if (foundTaskView != null) { - // The foundTaskView contains the 1-2 taskIds we are looking for. - // If we are already in-app and running the correct tasks, no need - // to do anything. - if (FeatureFlags.enableAppPairs() - && isAlreadyInApp(foundTaskView.getTaskIds())) { - return; - } - // If we are in Overview and the TaskView tile is visible, expand that - // tile. - if (foundTaskView.isVisibleToUser()) { - TestLogging.recordEvent( - TestProtocol.SEQUENCE_MAIN, "start: taskbarAppIcon"); - foundTaskView.launchTasks(); - return; - } + if (foundTaskView != null + && foundTaskView.isVisibleToUser()) { + TestLogging.recordEvent( + TestProtocol.SEQUENCE_MAIN, "start: taskbarAppIcon"); + foundTaskView.launchTasks(); + return; } } - // If none of the above cases apply, launch a new app or app pair. + if (findExactPairMatch) { // We did not find the app pair we were looking for, so launch one. recents.getSplitSelectController().getAppPairsController().launchAppPair( @@ -1209,27 +1195,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { ); } - /** - * Checks if a given list of taskIds are all already running in-app. - */ - private boolean isAlreadyInApp(int[] ids) { - if (mControllers.uiController.isInOverview()) { - return false; - } - - RunningTaskInfo[] currentlyRunningTasks = ActivityManagerWrapper.getInstance() - .getRunningTasks(false /* filterOnlyVisibleRecents */); - Set currentlyRunningIds = Arrays.stream(currentlyRunningTasks) - .map(task -> task.taskId).collect(Collectors.toSet()); - - for (int id : ids) { - if (id != ActivityTaskManager.INVALID_TASK_ID && !currentlyRunningIds.contains(id)) { - return false; - } - } - return true; - } - private void startItemInfoActivity(ItemInfo info) { Intent intent = new Intent(info.getIntent()) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 729609b699..0991fce04b 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -54,6 +54,7 @@ import static com.android.launcher3.testing.shared.TestProtocol.QUICK_SWITCH_STA import static com.android.launcher3.util.DisplayController.CHANGE_ACTIVE_SCREEN; import static com.android.launcher3.util.DisplayController.CHANGE_NAVIGATION_MODE; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; +import static com.android.quickstep.util.AnimUtils.completeRunnableListCallback; import static com.android.quickstep.util.SplitAnimationTimings.TABLET_HOME_TO_SPLIT; import static com.android.quickstep.views.DesktopTaskView.isDesktopModeSupported; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_HOME_KEY; @@ -67,7 +68,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.content.res.Configuration; -import android.graphics.Color; import android.graphics.Rect; import android.graphics.RectF; import android.hardware.display.DisplayManager; @@ -75,6 +75,7 @@ import android.media.permission.SafeCloseable; import android.os.Build; import android.os.Bundle; import android.os.IBinder; +import android.os.IRemoteCallback; import android.os.SystemProperties; import android.os.Trace; import android.util.AttributeSet; @@ -145,7 +146,6 @@ import com.android.launcher3.uioverrides.touchcontrollers.TransposedQuickSwitchT import com.android.launcher3.uioverrides.touchcontrollers.TwoButtonNavbarTouchController; import com.android.launcher3.util.ActivityOptionsWrapper; import com.android.launcher3.util.DisplayController; -import com.android.launcher3.util.Executors; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.NavigationMode; import com.android.launcher3.util.ObjectWrapper; @@ -1140,13 +1140,14 @@ public class QuickstepLauncher extends Launcher { @Override public ActivityOptionsWrapper makeDefaultActivityOptions(int splashScreenStyle) { RunnableList callbacks = new RunnableList(); - ActivityOptions options = ActivityOptions.makeCustomAnimation( - this, 0, 0, Color.TRANSPARENT, - Executors.MAIN_EXECUTOR.getHandler(), null, - elapsedRealTime -> callbacks.executeAllAndDestroy()); + ActivityOptions options = ActivityOptions.makeCustomAnimation(this, 0, 0); options.setSplashScreenStyle(splashScreenStyle); options.setPendingIntentBackgroundActivityStartMode( ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED); + + IRemoteCallback endCallback = completeRunnableListCallback(callbacks); + options.setOnAnimationAbortListener(endCallback); + options.setOnAnimationFinishedListener(endCallback); return new ActivityOptionsWrapper(options, callbacks); } diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java index 23e922c945..27224f2fed 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java @@ -17,6 +17,7 @@ package com.android.launcher3.uioverrides; import static com.android.app.animation.Interpolators.LINEAR; import static com.android.launcher3.LauncherState.CLEAR_ALL_BUTTON; +import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.LauncherState.OVERVIEW_ACTIONS; import static com.android.launcher3.LauncherState.OVERVIEW_SPLIT_SELECT; import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_ACTIONS_FADE; @@ -27,6 +28,7 @@ import static com.android.quickstep.views.RecentsView.TASK_MODALNESS; import static com.android.quickstep.views.RecentsView.TASK_PRIMARY_SPLIT_TRANSLATION; import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_SPLIT_TRANSLATION; import static com.android.quickstep.views.TaskView.FLAG_UPDATE_ALL; +import static com.android.wm.shell.Flags.enableSplitContextual; import android.animation.AnimatorSet; import android.annotation.TargetApi; @@ -120,7 +122,9 @@ public final class RecentsViewStateController extends */ private void handleSplitSelectionState(@NonNull LauncherState toState, @NonNull PendingAnimation builder, boolean animate) { - if (toState != OVERVIEW_SPLIT_SELECT) { + boolean goingToOverviewFromWorkspaceContextual = enableSplitContextual() && + toState == OVERVIEW && mLauncher.isSplitSelectionActive(); + if (toState != OVERVIEW_SPLIT_SELECT && !goingToOverviewFromWorkspaceContextual) { // Not going to split return; } @@ -135,9 +139,11 @@ public final class RecentsViewStateController extends SplitAnimationTimings timings = AnimUtils.getDeviceOverviewToSplitTimings(mLauncher.getDeviceProfile().isTablet); - - mRecentsView.createSplitSelectInitAnimation(builder, - toState.getTransitionDuration(mLauncher, true /* isToState */)); + if (!goingToOverviewFromWorkspaceContextual) { + // This animation is already done for the contextual case, don't redo it + mRecentsView.createSplitSelectInitAnimation(builder, + toState.getTransitionDuration(mLauncher, true /* isToState */)); + } // Shift tasks vertically downward to get out of placeholder view builder.setFloat(mRecentsView, taskViewsFloat.first, toState.getSplitSelectTranslation(mLauncher), diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java index 396d0abeb0..76502358ea 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java @@ -17,6 +17,7 @@ package com.android.launcher3.uioverrides.states; import static com.android.app.animation.Interpolators.DECELERATE_2; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW; +import static com.android.wm.shell.Flags.enableSplitContextual; import android.content.Context; import android.graphics.Rect; @@ -120,9 +121,21 @@ public class OverviewState extends LauncherState { if (showFloatingSearch) { elements |= FLOATING_SEARCH_BAR; } + if (enableSplitContextual() && launcher.isSplitSelectionActive()) { + elements &= ~CLEAR_ALL_BUTTON; + } return elements; } + @Override + public float getSplitSelectTranslation(Launcher launcher) { + if (!enableSplitContextual() || !launcher.isSplitSelectionActive()) { + return 0f; + } + RecentsView recentsView = launcher.getOverviewPanel(); + return recentsView.getSplitSelectTranslation(); + } + @Override public int getFloatingSearchBarRestingMarginBottom(Launcher launcher) { return areElementsVisible(launcher, FLOATING_SEARCH_BAR) ? 0 diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java index 19bfe069c8..ec84550898 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java @@ -59,7 +59,7 @@ public abstract class TaskViewTouchController private static final long MAX_TASK_DISMISS_ANIMATION_DURATION = 600; public static final int TASK_DISMISS_VIBRATION_PRIMITIVE = - Utilities.ATLEAST_R ? VibrationEffect.Composition.PRIMITIVE_TICK : -1; + VibrationEffect.Composition.PRIMITIVE_TICK; public static final float TASK_DISMISS_VIBRATION_PRIMITIVE_SCALE = 1f; public static final VibrationEffect TASK_DISMISS_VIBRATION_FALLBACK = VibrationConstants.EFFECT_TEXTURE_TICK; diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index cbf6ad67f1..60d0e2ba45 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -64,7 +64,6 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ValueAnimator; -import android.annotation.TargetApi; import android.app.ActivityManager; import android.app.TaskInfo; import android.app.WindowConfiguration; @@ -75,7 +74,6 @@ import android.graphics.Matrix; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; -import android.os.Build; import android.os.IBinder; import android.os.SystemClock; import android.util.Log; @@ -161,7 +159,6 @@ import java.util.function.Consumer; /** * Handles the navigation gestures when Launcher is the default home activity. */ -@TargetApi(Build.VERSION_CODES.R) public abstract class AbsSwipeUpHandler, Q extends RecentsView, S extends BaseState> extends SwipeUpAnimationLogic implements OnApplyWindowInsetsListener, diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java index 2dd6a29093..377b866d09 100644 --- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java +++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java @@ -35,13 +35,11 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; -import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; import android.graphics.Color; import android.graphics.PointF; import android.graphics.Rect; -import android.os.Build; import android.view.Gravity; import android.view.MotionEvent; import android.view.RemoteAnimationTarget; @@ -77,7 +75,6 @@ import java.util.function.Predicate; /** * Utility class which abstracts out the logical differences between Launcher and RecentsActivity. */ -@TargetApi(Build.VERSION_CODES.P) public abstract class BaseActivityInterface, ACTIVITY_TYPE extends StatefulActivity> { diff --git a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java index 57b9a396da..e77a4504e5 100644 --- a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java @@ -29,7 +29,6 @@ import static com.android.launcher3.anim.AnimatorListeners.forEndCallback; import static com.android.quickstep.OverviewComponentObserver.startHomeIntentSafely; import android.animation.ObjectAnimator; -import android.annotation.TargetApi; import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityOptions; import android.content.Context; @@ -37,7 +36,6 @@ import android.content.Intent; import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.RectF; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -66,7 +64,6 @@ import com.android.launcher3.states.StateAnimationConfig; import com.android.launcher3.util.DisplayController; import com.android.quickstep.fallback.FallbackRecentsView; import com.android.quickstep.fallback.RecentsState; -import com.android.quickstep.util.ActiveGestureLog; import com.android.quickstep.util.RectFSpringAnim; import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties; import com.android.quickstep.util.TransformParams; @@ -82,7 +79,6 @@ import java.util.function.Consumer; /** * Handles the navigation gestures when a 3rd party launcher is the default home activity. */ -@TargetApi(Build.VERSION_CODES.R) public class FallbackSwipeHandler extends AbsSwipeUpHandler { diff --git a/quickstep/src/com/android/quickstep/GestureState.java b/quickstep/src/com/android/quickstep/GestureState.java index 575be5f8df..d02909c527 100644 --- a/quickstep/src/com/android/quickstep/GestureState.java +++ b/quickstep/src/com/android/quickstep/GestureState.java @@ -29,9 +29,7 @@ import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.SET_END_TARGET_HOME; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.SET_END_TARGET_NEW_TASK; -import android.annotation.TargetApi; import android.content.Intent; -import android.os.Build; import android.view.MotionEvent; import android.view.RemoteAnimationTarget; @@ -58,7 +56,6 @@ import java.util.function.Predicate; * Manages the state for an active system gesture, listens for events from the system and Launcher, * and fires events when the states change. */ -@TargetApi(Build.VERSION_CODES.R) public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationListener { final Predicate mLastStartedTaskIdPredicate = new Predicate<>() { diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index b2429ad3ec..315316d56e 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -18,10 +18,8 @@ package com.android.quickstep; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.quickstep.util.ActiveGestureLog.INTENT_EXTRA_LOG_TRACE_ID; -import android.annotation.TargetApi; import android.content.Intent; import android.graphics.PointF; -import android.os.Build; import android.os.SystemClock; import android.os.Trace; import android.view.View; @@ -51,7 +49,6 @@ import java.util.HashMap; /** * Helper class to handle various atomic commands for switching between Overview. */ -@TargetApi(Build.VERSION_CODES.P) public class OverviewCommandHelper { public static final int TYPE_SHOW = 1; diff --git a/quickstep/src/com/android/quickstep/QuickstepProcessInitializer.java b/quickstep/src/com/android/quickstep/QuickstepProcessInitializer.java index d1939efa78..3c902e6f91 100644 --- a/quickstep/src/com/android/quickstep/QuickstepProcessInitializer.java +++ b/quickstep/src/com/android/quickstep/QuickstepProcessInitializer.java @@ -15,10 +15,8 @@ */ package com.android.quickstep; -import android.annotation.TargetApi; import android.content.Context; import android.content.pm.PackageManager; -import android.os.Build; import android.os.Looper; import android.os.Trace; import android.os.UserManager; @@ -30,7 +28,6 @@ import com.android.launcher3.MainProcessInitializer; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; @SuppressWarnings("unused") -@TargetApi(Build.VERSION_CODES.R) public class QuickstepProcessInitializer extends MainProcessInitializer { private static final String TAG = "QuickstepProcessInitializer"; diff --git a/quickstep/src/com/android/quickstep/RecentTasksList.java b/quickstep/src/com/android/quickstep/RecentTasksList.java index 7c263b87cd..f3704e0950 100644 --- a/quickstep/src/com/android/quickstep/RecentTasksList.java +++ b/quickstep/src/com/android/quickstep/RecentTasksList.java @@ -23,12 +23,10 @@ import static com.android.quickstep.util.SplitScreenUtils.convertShellSplitBound import static com.android.quickstep.views.DesktopTaskView.isDesktopModeSupported; import static com.android.wm.shell.util.GroupedRecentTaskInfo.TYPE_FREEFORM; -import android.annotation.TargetApi; import android.app.ActivityManager; import android.app.KeyguardManager; import android.app.TaskInfo; import android.content.ComponentName; -import android.os.Build; import android.os.Process; import android.os.RemoteException; import android.util.SparseBooleanArray; @@ -53,7 +51,6 @@ import java.util.stream.Collectors; /** * Manages the recent task list from the system, caching it as necessary. */ -@TargetApi(Build.VERSION_CODES.R) public class RecentTasksList { private static final TaskLoadResult INVALID_RESULT = new TaskLoadResult(-1, false, 0); diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java index 2e40117507..8ff43f0122 100644 --- a/quickstep/src/com/android/quickstep/TaskViewUtils.java +++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java @@ -43,14 +43,12 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ValueAnimator; -import android.annotation.TargetApi; import android.content.ComponentName; import android.content.Context; import android.graphics.Matrix; import android.graphics.Matrix.ScaleToFit; import android.graphics.Rect; import android.graphics.RectF; -import android.os.Build; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; import android.view.View; @@ -94,7 +92,6 @@ import java.util.function.Consumer; /** * Utility class for helpful methods related to {@link TaskView} objects and their tasks. */ -@TargetApi(Build.VERSION_CODES.R) public final class TaskViewUtils { private TaskViewUtils() {} diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index ce6ddd8218..55a7985598 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -56,7 +56,6 @@ import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_SH import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_SPLIT_SCREEN; import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_STARTING_WINDOW; -import android.annotation.TargetApi; import android.app.PendingIntent; import android.app.RemoteAction; import android.app.Service; @@ -66,7 +65,6 @@ import android.content.Intent; import android.content.res.Configuration; import android.graphics.Region; import android.graphics.drawable.Icon; -import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.os.Looper; @@ -152,7 +150,6 @@ import java.util.function.Function; /** * Service connected by system-UI for handling touch interaction. */ -@TargetApi(Build.VERSION_CODES.R) public class TouchInteractionService extends Service { private static final String SUBSTRING_PREFIX = "; "; diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 1008da36fa..0ee50a46b2 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -24,9 +24,7 @@ import static com.android.quickstep.fallback.RecentsState.MODAL_TASK; import static com.android.quickstep.fallback.RecentsState.OVERVIEW_SPLIT_SELECT; import android.animation.AnimatorSet; -import android.annotation.TargetApi; import android.content.Context; -import android.os.Build; import android.util.AttributeSet; import android.view.MotionEvent; @@ -55,7 +53,6 @@ import com.android.systemui.shared.recents.model.Task; import java.util.ArrayList; -@TargetApi(Build.VERSION_CODES.R) public class FallbackRecentsView extends RecentsView implements StateListener { diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java index eedd20485b..c8c7dc2597 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java @@ -31,12 +31,10 @@ import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.VelocityUtils.PX_PER_MS; import static com.android.quickstep.util.ActiveGestureLog.INTENT_EXTRA_LOG_TRACE_ID; -import android.annotation.TargetApi; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.graphics.PointF; -import android.os.Build; import android.util.Log; import android.view.MotionEvent; import android.view.VelocityTracker; @@ -71,7 +69,6 @@ import java.util.function.Consumer; /** * Input consumer for handling events originating from an activity other than Launcher */ -@TargetApi(Build.VERSION_CODES.P) public class OtherActivityInputConsumer extends ContextWrapper implements InputConsumer { public static final String DOWN_EVT = "OtherActivityInputConsumer.DOWN"; diff --git a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java index df552cffc6..1129e025c5 100644 --- a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java @@ -17,9 +17,7 @@ package com.android.quickstep.interaction; import static com.android.launcher3.config.FeatureFlags.ENABLE_NEW_GESTURE_NAV_TUTORIAL; -import android.annotation.TargetApi; import android.graphics.PointF; -import android.os.Build; import com.android.launcher3.R; import com.android.launcher3.Utilities; @@ -30,7 +28,6 @@ import com.android.quickstep.util.LottieAnimationColorUtils; import java.util.Map; /** A {@link TutorialController} for the Home tutorial. */ -@TargetApi(Build.VERSION_CODES.R) final class HomeGestureTutorialController extends SwipeUpGestureTutorialController { HomeGestureTutorialController(HomeGestureTutorialFragment fragment, TutorialType tutorialType) { diff --git a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java index 65f3a01149..a04dd4456b 100644 --- a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java @@ -21,9 +21,7 @@ import static com.android.launcher3.config.FeatureFlags.ENABLE_NEW_GESTURE_NAV_T import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; -import android.annotation.TargetApi; import android.graphics.PointF; -import android.os.Build; import android.os.Handler; import androidx.annotation.ColorInt; @@ -42,7 +40,6 @@ import java.util.ArrayList; import java.util.Map; /** A {@link TutorialController} for the Overview tutorial. */ -@TargetApi(Build.VERSION_CODES.R) final class OverviewGestureTutorialController extends SwipeUpGestureTutorialController { private static final float LAUNCHER_COLOR_BLENDING_RATIO = 0.4f; diff --git a/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java index 87defc5252..d5cc447670 100644 --- a/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java @@ -29,13 +29,11 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ValueAnimator; -import android.annotation.TargetApi; import android.content.Context; import android.graphics.Outline; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; -import android.os.Build; import android.view.View; import android.view.ViewOutlineProvider; @@ -63,7 +61,6 @@ import com.android.quickstep.util.SurfaceTransaction; import com.android.quickstep.util.SurfaceTransaction.MockProperties; import com.android.quickstep.util.TransformParams; -@TargetApi(Build.VERSION_CODES.R) abstract class SwipeUpGestureTutorialController extends TutorialController { private static final int FAKE_PREVIOUS_TASK_MARGIN = Utilities.dpToPx(24); diff --git a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java index cf9fc74819..d265918e18 100644 --- a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java +++ b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java @@ -139,7 +139,7 @@ public class StatsLogCompatManager extends StatsLogManager { if (IS_VERBOSE) { Log.d(TAG, String.format("\nwriteSnapshot(%d):\n%s", instanceId.getId(), info)); } - if (!Utilities.ATLEAST_R || Utilities.isRunningInTestHarness()) { + if (Utilities.isRunningInTestHarness()) { return; } SysUiStatsLog.write(SysUiStatsLog.LAUNCHER_SNAPSHOT, @@ -342,9 +342,6 @@ public class StatsLogCompatManager extends StatsLogManager { @Override public void log(EventEnum event) { - if (!Utilities.ATLEAST_R) { - return; - } if (DEBUG) { String name = (event instanceof Enum) ? ((Enum) event).name() : event.getId() + ""; diff --git a/quickstep/src/com/android/quickstep/util/AnimUtils.java b/quickstep/src/com/android/quickstep/util/AnimUtils.java index 7fbbb6e5b8..1f2a02c816 100644 --- a/quickstep/src/com/android/quickstep/util/AnimUtils.java +++ b/quickstep/src/com/android/quickstep/util/AnimUtils.java @@ -16,6 +16,13 @@ package com.android.quickstep.util; +import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; + +import android.os.Bundle; +import android.os.IRemoteCallback; + +import com.android.launcher3.util.RunnableList; + /** * Utility class containing methods to help manage animations, interpolators, and timings. */ @@ -48,4 +55,16 @@ public class AnimUtils { ? SplitAnimationTimings.TABLET_APP_PAIR_LAUNCH : SplitAnimationTimings.PHONE_APP_PAIR_LAUNCH; } + + /** + * Returns a IRemoteCallback which completes the provided list as a result + */ + public static IRemoteCallback completeRunnableListCallback(RunnableList list) { + return new IRemoteCallback.Stub() { + @Override + public void sendResult(Bundle bundle) { + MAIN_EXECUTOR.execute(list::executeAllAndDestroy); + } + }; + } } diff --git a/quickstep/src/com/android/quickstep/util/SurfaceTransactionApplier.java b/quickstep/src/com/android/quickstep/util/SurfaceTransactionApplier.java index df5765cb24..a26d056da1 100644 --- a/quickstep/src/com/android/quickstep/util/SurfaceTransactionApplier.java +++ b/quickstep/src/com/android/quickstep/util/SurfaceTransactionApplier.java @@ -15,8 +15,6 @@ */ package com.android.quickstep.util; -import android.annotation.TargetApi; -import android.os.Build; import android.os.Handler; import android.os.Message; import android.view.SurfaceControl; @@ -34,7 +32,6 @@ import com.android.quickstep.RemoteAnimationTargets.ReleaseCheck; * android.view.SyncRtSurfaceTransactionApplier * with some Launcher specific utility methods */ -@TargetApi(Build.VERSION_CODES.R) public class SurfaceTransactionApplier extends ReleaseCheck { private static final int MSG_UPDATE_SEQUENCE_NUMBER = 0; diff --git a/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java b/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java index 57b265b2b4..937a7281b6 100644 --- a/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java +++ b/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java @@ -21,7 +21,6 @@ import static android.provider.Settings.ACTION_APP_USAGE_SETTINGS; import static com.android.launcher3.Utilities.prefixTextWithIcon; import static com.android.launcher3.util.Executors.THREAD_POOL_EXECUTOR; -import android.annotation.TargetApi; import android.app.ActivityOptions; import android.content.ActivityNotFoundException; import android.content.Intent; @@ -33,7 +32,6 @@ import android.icu.text.MeasureFormat; import android.icu.text.MeasureFormat.FormatWidth; import android.icu.util.Measure; import android.icu.util.MeasureUnit; -import android.os.Build; import android.os.UserHandle; import android.util.Log; import android.util.Pair; @@ -61,7 +59,6 @@ import java.lang.annotation.RetentionPolicy; import java.time.Duration; import java.util.Locale; -@TargetApi(Build.VERSION_CODES.Q) public final class DigitalWellBeingToast { private static final float THRESHOLD_LEFT_ICON_ONLY = 0.4f; diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 997624f3d1..6b3484d388 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -81,7 +81,6 @@ import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.annotation.SuppressLint; -import android.annotation.TargetApi; import android.app.WindowConfiguration; import android.content.Context; import android.content.Intent; @@ -98,7 +97,6 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Typeface; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.Bundle; import android.os.SystemClock; import android.os.UserHandle; @@ -231,7 +229,6 @@ import java.util.stream.Collectors; /** * A list of recent tasks. */ -@TargetApi(Build.VERSION_CODES.R) public abstract class RecentsView, STATE_TYPE extends BaseState> extends PagedView implements Insettable, TaskThumbnailCache.HighResLoadingState.HighResLoadingStateChangedCallback, diff --git a/quickstep/src/com/android/quickstep/views/SplitInstructionsView.java b/quickstep/src/com/android/quickstep/views/SplitInstructionsView.java index f39a9011cd..c4b93b7268 100644 --- a/quickstep/src/com/android/quickstep/views/SplitInstructionsView.java +++ b/quickstep/src/com/android/quickstep/views/SplitInstructionsView.java @@ -120,10 +120,12 @@ public class SplitInstructionsView extends LinearLayout { private void init() { TextView cancelTextView = findViewById(R.id.split_instructions_text_cancel); + TextView instructionTextView = findViewById(R.id.split_instructions_text); if (FeatureFlags.enableSplitContextually()) { cancelTextView.setVisibility(VISIBLE); cancelTextView.setOnClickListener((v) -> exitSplitSelection()); + instructionTextView.setText(R.string.toast_contextual_split_select_app); } } diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index c8d631df10..68710a7946 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -57,7 +57,6 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.os.Handler; import android.util.AttributeSet; import android.util.FloatProperty; import android.util.Log; @@ -119,8 +118,6 @@ import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; -import kotlin.Unit; - import java.lang.annotation.Retention; import java.util.Arrays; import java.util.Collections; @@ -129,6 +126,8 @@ import java.util.List; import java.util.function.Consumer; import java.util.stream.Stream; +import kotlin.Unit; + /** * A task in the Recents view. */ @@ -969,20 +968,6 @@ public class TaskView extends FrameLayout implements Reusable { } } - /** - * Returns ActivityOptions for overriding task transition animation. - */ - private ActivityOptions makeCustomAnimation(Context context, int enterResId, - int exitResId, final Runnable callback, final Handler callbackHandler) { - return ActivityOptions.makeCustomTaskAnimation(context, enterResId, exitResId, - callbackHandler, - elapsedRealTime -> { - if (callback != null) { - callbackHandler.post(callback); - } - }, null /* finishedListener */); - } - /** * Launch of the current task (both live and inactive tasks) with an animation. */ @@ -1339,10 +1324,8 @@ public class TaskView extends FrameLayout implements Reusable { setPivotX((right - left) * 0.5f); setPivotY(mSnapshotView.getTop() + mSnapshotView.getHeight() * 0.5f); } - if (Utilities.ATLEAST_Q) { - SYSTEM_GESTURE_EXCLUSION_RECT.get(0).set(0, 0, getWidth(), getHeight()); - setSystemGestureExclusionRects(SYSTEM_GESTURE_EXCLUSION_RECT); - } + SYSTEM_GESTURE_EXCLUSION_RECT.get(0).set(0, 0, getWidth(), getHeight()); + setSystemGestureExclusionRects(SYSTEM_GESTURE_EXCLUSION_RECT); } /** diff --git a/res/drawable/private_space_app_divider.xml b/res/drawable/private_space_app_divider.xml new file mode 100644 index 0000000000..7d069efd8b --- /dev/null +++ b/res/drawable/private_space_app_divider.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/res/layout/private_space_divider.xml b/res/layout/private_space_divider.xml new file mode 100644 index 0000000000..fff862970a --- /dev/null +++ b/res/layout/private_space_divider.xml @@ -0,0 +1,25 @@ + + \ No newline at end of file diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 603e697395..3016559f96 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -487,4 +487,5 @@ 36dp 36dp 89dp + 16dp diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index 79b831e117..4a277f0ed5 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -191,14 +191,12 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); - if (Utilities.ATLEAST_Q) { - for (int i = 0; i < HANDLE_COUNT; i++) { - View dragHandle = mDragHandles[i]; - mSystemGestureExclusionRects.get(i).set(dragHandle.getLeft(), dragHandle.getTop(), - dragHandle.getRight(), dragHandle.getBottom()); - } - setSystemGestureExclusionRects(mSystemGestureExclusionRects); + for (int i = 0; i < HANDLE_COUNT; i++) { + View dragHandle = mDragHandles[i]; + mSystemGestureExclusionRects.get(i).set(dragHandle.getLeft(), dragHandle.getTop(), + dragHandle.getRight(), dragHandle.getBottom()); } + setSystemGestureExclusionRects(mSystemGestureExclusionRects); } public static void showForWidget(LauncherAppWidgetHostView widget, CellLayout cellLayout) { diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java index b6f66152dc..1c2ed4343d 100644 --- a/src/com/android/launcher3/BaseDraggingActivity.java +++ b/src/com/android/launcher3/BaseDraggingActivity.java @@ -20,11 +20,8 @@ import static com.android.launcher3.util.DisplayController.CHANGE_ROTATION; import android.content.Context; import android.content.res.Configuration; -import android.graphics.Point; -import android.graphics.Rect; import android.os.Bundle; import android.view.ActionMode; -import android.view.Display; import android.view.View; import androidx.annotation.MainThread; @@ -165,15 +162,7 @@ public abstract class BaseDraggingActivity extends BaseActivity protected abstract void reapplyUi(); protected WindowBounds getMultiWindowDisplaySize() { - if (Utilities.ATLEAST_R) { - return WindowBounds.fromWindowMetrics(getWindowManager().getCurrentWindowMetrics()); - } - // Note: Calls to getSize() can't rely on our cached DefaultDisplay since it can return - // the app window size - Display display = getWindowManager().getDefaultDisplay(); - Point mwSize = new Point(); - display.getSize(mwSize); - return new WindowBounds(new Rect(0, 0, mwSize.x, mwSize.y), new Rect()); + return WindowBounds.fromWindowMetrics(getWindowManager().getCurrentWindowMetrics()); } @Override diff --git a/src/com/android/launcher3/ExtendedEditText.java b/src/com/android/launcher3/ExtendedEditText.java index ec26f5849c..fe9348c451 100644 --- a/src/com/android/launcher3/ExtendedEditText.java +++ b/src/com/android/launcher3/ExtendedEditText.java @@ -15,8 +15,6 @@ */ package com.android.launcher3; -import static com.android.launcher3.logging.KeyboardStateManager.KeyboardState.SHOW; - import android.content.Context; import android.graphics.Rect; import android.text.TextUtils; @@ -93,7 +91,6 @@ public class ExtendedEditText extends EditText { * @return true if the keyboard is shown correctly and focus is given to this view. */ public boolean showKeyboard() { - onKeyboardShown(); return requestFocus() && showSoftInputInternal(); } @@ -120,11 +117,6 @@ public class ExtendedEditText extends EditText { } } - protected void onKeyboardShown() { - ActivityContext.lookupContext(getContext()).getStatsLogManager() - .keyboardStateManager().setKeyboardState(SHOW); - } - private boolean showSoftInputInternal() { boolean result = false; InputMethodManager imm = getContext().getSystemService(InputMethodManager.class); diff --git a/src/com/android/launcher3/GestureNavContract.java b/src/com/android/launcher3/GestureNavContract.java index c782dca4ca..9ef6edc6cf 100644 --- a/src/com/android/launcher3/GestureNavContract.java +++ b/src/com/android/launcher3/GestureNavContract.java @@ -20,11 +20,9 @@ import static android.content.Intent.EXTRA_USER; import static com.android.launcher3.AbstractFloatingView.TYPE_ICON_SURFACE; -import android.annotation.TargetApi; import android.content.ComponentName; import android.content.Intent; import android.graphics.RectF; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -69,7 +67,6 @@ public class GestureNavContract { /** * Sends the position information to the receiver */ - @TargetApi(Build.VERSION_CODES.R) public void sendEndPosition(RectF position, ActivityContext context, @Nullable SurfaceControl surfaceControl) { Bundle result = new Bundle(); @@ -95,9 +92,6 @@ public class GestureNavContract { * Clears and returns the GestureNavContract if it was present in the intent. */ public static GestureNavContract fromIntent(Intent intent) { - if (!Utilities.ATLEAST_R) { - return null; - } Bundle extras = intent.getBundleExtra(EXTRA_GESTURE_CONTRACT); if (extras == null) { return null; diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index b531780599..44a1bf0685 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -19,6 +19,7 @@ package com.android.launcher3; import static android.app.PendingIntent.FLAG_IMMUTABLE; import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; import static android.content.pm.ActivityInfo.CONFIG_UI_MODE; +import static android.view.WindowInsetsAnimation.Callback.DISPATCH_MODE_CONTINUE_ON_SUBTREE; import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; import static com.android.app.animation.Interpolators.EMPHASIZED; @@ -66,6 +67,8 @@ import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.config.FeatureFlags.ENABLE_SMARTSPACE_REMOVAL; import static com.android.launcher3.config.FeatureFlags.FOLDABLE_SINGLE_PAGE; import static com.android.launcher3.config.FeatureFlags.MULTI_SELECT_EDIT_MODE; +import static com.android.launcher3.logging.KeyboardStateManager.KeyboardState.HIDE; +import static com.android.launcher3.logging.KeyboardStateManager.KeyboardState.SHOW; import static com.android.launcher3.logging.StatsLogManager.EventEnum; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_BACKGROUND; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME; @@ -138,6 +141,8 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver.OnPreDrawListener; +import android.view.WindowInsets; +import android.view.WindowInsetsAnimation; import android.view.WindowManager.LayoutParams; import android.view.accessibility.AccessibilityEvent; import android.view.animation.OvershootInterpolator; @@ -575,9 +580,7 @@ public class Launcher extends StatefulActivity mRotationHelper.initialize(); TraceHelper.INSTANCE.endSection(); - if (Utilities.ATLEAST_R) { - getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_NOTHING); - } + getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_NOTHING); setTitle(R.string.home_screen); mStartupLatencyLogger.logEnd(LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE); @@ -1083,6 +1086,25 @@ public class Launcher extends StatefulActivity DiscoveryBounce.showForHomeIfNeeded(this); mAppWidgetHolder.setActivityResumed(true); + + // Listen for IME changes to keep state up to date. + getRootView().setWindowInsetsAnimationCallback( + new WindowInsetsAnimation.Callback(DISPATCH_MODE_CONTINUE_ON_SUBTREE) { + @Override + public WindowInsets onProgress(WindowInsets windowInsets, + List windowInsetsAnimations) { + return windowInsets; + } + + @Override + public void onEnd(WindowInsetsAnimation animation) { + WindowInsets insets = getRootView().getRootWindowInsets(); + boolean isImeVisible = + insets != null && insets.isVisible(WindowInsets.Type.ime()); + getStatsLogManager().keyboardStateManager().setKeyboardState( + isImeVisible ? SHOW : HIDE); + } + }); } private void logStopAndResume(boolean isResume) { diff --git a/src/com/android/launcher3/LauncherRootView.java b/src/com/android/launcher3/LauncherRootView.java index 1592154c3a..7176733786 100644 --- a/src/com/android/launcher3/LauncherRootView.java +++ b/src/com/android/launcher3/LauncherRootView.java @@ -2,11 +2,9 @@ package com.android.launcher3; import static com.android.launcher3.config.FeatureFlags.SEPARATE_RECENTS_ACTIVITY; -import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; -import android.os.Build; import android.util.AttributeSet; import android.view.ViewDebug; import android.view.WindowInsets; @@ -112,15 +110,13 @@ public class LauncherRootView extends InsettableFrameLayout { mSysUiScrim.setSize(r - l, b - t); } - @TargetApi(Build.VERSION_CODES.Q) public void setForceHideBackArrow(boolean forceHideBackArrow) { this.mForceHideBackArrow = forceHideBackArrow; setDisallowBackGesture(mDisallowBackGesture); } - @TargetApi(Build.VERSION_CODES.Q) public void setDisallowBackGesture(boolean disallowBackGesture) { - if (!Utilities.ATLEAST_Q || SEPARATE_RECENTS_ACTIVITY.get()) { + if (SEPARATE_RECENTS_ACTIVITY.get()) { return; } mDisallowBackGesture = disallowBackGesture; diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index e0f6101056..2b886e4570 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -121,15 +121,6 @@ public final class Utilities { public static final String[] EMPTY_STRING_ARRAY = new String[0]; public static final Person[] EMPTY_PERSON_ARRAY = new Person[0]; - @ChecksSdkIntAtLeast(api = VERSION_CODES.P) - public static final boolean ATLEAST_P = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P; - - @ChecksSdkIntAtLeast(api = VERSION_CODES.Q) - public static final boolean ATLEAST_Q = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q; - - @ChecksSdkIntAtLeast(api = VERSION_CODES.R) - public static final boolean ATLEAST_R = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R; - @ChecksSdkIntAtLeast(api = VERSION_CODES.S) public static final boolean ATLEAST_S = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S; diff --git a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java index ad875e0dc3..fba7537dac 100644 --- a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java +++ b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java @@ -35,6 +35,7 @@ import com.android.launcher3.views.ActivityContext; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Objects; import java.util.TreeMap; import java.util.function.Predicate; @@ -269,10 +270,10 @@ public class AlphabeticalAppsList implement addApps = mWorkProviderManager.shouldShowWorkApps(); } if (addApps) { - addAppsWithSections(mApps, position); + position = addAppsWithSections(mApps, position); } if (Flags.enablePrivateSpace()) { - addPrivateSpaceItems(position); + position = addPrivateSpaceItems(position); } } mAccessibilityResultsCount = (int) mAdapterItems.stream() @@ -287,7 +288,8 @@ public class AlphabeticalAppsList implement for (AdapterItem item : mAdapterItems) { item.rowIndex = 0; if (BaseAllAppsAdapter.isDividerViewType(item.viewType) - || BaseAllAppsAdapter.isPrivateSpaceHeaderView(item.viewType)) { + || BaseAllAppsAdapter.isPrivateSpaceHeaderView(item.viewType) + || BaseAllAppsAdapter.isPrivateSpaceSysAppsDividerView(item.viewType)) { numAppsInSection = 0; } else if (BaseAllAppsAdapter.isIconViewType(item.viewType)) { if (numAppsInSection % mNumAppsPerRowAllApps == 0) { @@ -309,12 +311,12 @@ public class AlphabeticalAppsList implement } } - void addPrivateSpaceItems(int position) { + int addPrivateSpaceItems(int position) { if (mPrivateProviderManager != null && !mPrivateProviderManager.isPrivateSpaceHidden() && !mPrivateApps.isEmpty()) { // Always add PS Header if Space is present and visible. - position += mPrivateProviderManager.addPrivateSpaceHeader(mAdapterItems); + position = mPrivateProviderManager.addPrivateSpaceHeader(mAdapterItems); int privateSpaceState = mPrivateProviderManager.getCurrentState(); switch (privateSpaceState) { case PrivateProfileManager.STATE_DISABLED: @@ -322,15 +324,37 @@ public class AlphabeticalAppsList implement break; case PrivateProfileManager.STATE_ENABLED: // Add PS Apps only in Enabled State. - mPrivateProviderManager.addPrivateSpaceInstallAppButton(mAdapterItems); - position++; - addAppsWithSections(mPrivateApps, position); + position = addPrivateSpaceApps(position); break; } } + return position; } - private void addAppsWithSections(List appList, int startPosition) { + private int addPrivateSpaceApps(int position) { + // Add Install Apps Button first. + if (Flags.privateSpaceAppInstallerButton()) { + mPrivateProviderManager.addPrivateSpaceInstallAppButton(mAdapterItems); + position++; + } + + // Split of private space apps into user-installed and system apps. + Map> split = mPrivateApps.stream() + .collect(Collectors.partitioningBy(mPrivateProviderManager + .splitIntoUserInstalledAndSystemApps())); + // Add user installed apps + position = addAppsWithSections(split.get(true), position); + // Add system apps separator. + if (Flags.privateSpaceSysAppsSeparation()) { + position = mPrivateProviderManager.addSystemAppsDivider(mAdapterItems); + } + // Add system apps. + position = addAppsWithSections(split.get(false), position); + + return position; + } + + private int addAppsWithSections(List appList, int startPosition) { String lastSectionName = null; boolean hasPrivateApps = false; if (mPrivateProviderManager != null) { @@ -357,6 +381,7 @@ public class AlphabeticalAppsList implement } startPosition++; } + return startPosition; } /** diff --git a/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java b/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java index 5eeb259fe5..28c87b6fa7 100644 --- a/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java +++ b/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java @@ -17,6 +17,7 @@ package com.android.launcher3.allapps; import static com.android.launcher3.allapps.SectionDecorationInfo.ROUND_BOTTOM_LEFT; import static com.android.launcher3.allapps.SectionDecorationInfo.ROUND_BOTTOM_RIGHT; +import static com.android.launcher3.allapps.SectionDecorationInfo.ROUND_NOTHING; import static com.android.launcher3.allapps.SectionDecorationInfo.ROUND_TOP_LEFT; import static com.android.launcher3.allapps.SectionDecorationInfo.ROUND_TOP_RIGHT; import static com.android.launcher3.allapps.UserProfileManager.STATE_DISABLED; @@ -61,7 +62,8 @@ public abstract class BaseAllAppsAdapter ex public static final int VIEW_TYPE_WORK_EDU_CARD = 1 << 4; public static final int VIEW_TYPE_WORK_DISABLED_CARD = 1 << 5; public static final int VIEW_TYPE_PRIVATE_SPACE_HEADER = 1 << 6; - public static final int NEXT_ID = 7; + public static final int VIEW_TYPE_PRIVATE_SPACE_SYS_APPS_DIVIDER = 1 << 7; + public static final int NEXT_ID = 8; // Common view type masks public static final int VIEW_TYPE_MASK_DIVIDER = VIEW_TYPE_ALL_APPS_DIVIDER; @@ -69,6 +71,8 @@ public abstract class BaseAllAppsAdapter ex public static final int VIEW_TYPE_MASK_PRIVATE_SPACE_HEADER = VIEW_TYPE_PRIVATE_SPACE_HEADER; + public static final int VIEW_TYPE_MASK_PRIVATE_SPACE_SYS_APPS_DIVIDER = + VIEW_TYPE_PRIVATE_SPACE_SYS_APPS_DIVIDER; protected final SearchAdapterProvider mAdapterProvider; @@ -199,6 +203,11 @@ public abstract class BaseAllAppsAdapter ex return isViewType(viewType, VIEW_TYPE_MASK_PRIVATE_SPACE_HEADER); } + /** Checks if the passed viewType represents private space system apps divider. */ + public static boolean isPrivateSpaceSysAppsDividerView(int viewType) { + return isViewType(viewType, VIEW_TYPE_MASK_PRIVATE_SPACE_SYS_APPS_DIVIDER); + } + public void setIconFocusListener(OnFocusChangeListener focusListener) { mIconFocusListener = focusListener; } @@ -227,9 +236,9 @@ public abstract class BaseAllAppsAdapter ex case VIEW_TYPE_EMPTY_SEARCH: return new ViewHolder(mLayoutInflater.inflate(R.layout.all_apps_empty_search, parent, false)); - case VIEW_TYPE_ALL_APPS_DIVIDER: + case VIEW_TYPE_ALL_APPS_DIVIDER, VIEW_TYPE_PRIVATE_SPACE_SYS_APPS_DIVIDER: return new ViewHolder(mLayoutInflater.inflate( - R.layout.all_apps_divider, parent, false)); + R.layout.private_space_divider, parent, false)); case VIEW_TYPE_WORK_EDU_CARD: return new ViewHolder(mLayoutInflater.inflate( R.layout.work_apps_edu, parent, false)); @@ -282,6 +291,11 @@ public abstract class BaseAllAppsAdapter ex new SectionDecorationInfo(mActivityContext, roundRegions, false /* decorateTogether */); break; + case VIEW_TYPE_PRIVATE_SPACE_SYS_APPS_DIVIDER: + adapterItem = mApps.getAdapterItems().get(position); + adapterItem.decorationInfo = new SectionDecorationInfo(mActivityContext, + ROUND_NOTHING, true /* decorateTogether */); + break; case VIEW_TYPE_ALL_APPS_DIVIDER: case VIEW_TYPE_WORK_DISABLED_CARD: // nothing to do diff --git a/src/com/android/launcher3/allapps/LauncherAllAppsContainerView.java b/src/com/android/launcher3/allapps/LauncherAllAppsContainerView.java index 5e48177d75..63a168e4e3 100644 --- a/src/com/android/launcher3/allapps/LauncherAllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/LauncherAllAppsContainerView.java @@ -21,7 +21,6 @@ import android.view.WindowInsets; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; -import com.android.launcher3.Utilities; import com.android.launcher3.statemanager.StateManager; /** @@ -43,11 +42,7 @@ public class LauncherAllAppsContainerView extends ActivityAllAppsContainerView mAllApps; private final Predicate mPrivateProfileMatcher; + private Set mPreInstalledSystemPackages = new HashSet<>(); + private Intent mAppInstallerIntent = new Intent(); private PrivateAppsSectionDecorator mPrivateAppsSectionDecorator; private boolean mPrivateSpaceSettingsAvailable; private Runnable mUnlockRunnable; @@ -73,7 +77,7 @@ public class PrivateProfileManager extends UserProfileManager { super(userManager, statsLogManager, userCache); mAllApps = allApps; mPrivateProfileMatcher = (user) -> userCache.getUserInfo(user).isPrivate(); - UI_HELPER_EXECUTOR.post(this::setPrivateSpaceSettingsAvailable); + UI_HELPER_EXECUTOR.post(this::initializeInBackgroundThread); } /** Adds Private Space Header to the layout. */ @@ -83,18 +87,17 @@ public class PrivateProfileManager extends UserProfileManager { return adapterItems.size(); } + /** Adds Private Space System Apps Divider to the layout. */ + public int addSystemAppsDivider(List adapterItems) { + adapterItems.add(new BaseAllAppsAdapter + .AdapterItem(VIEW_TYPE_PRIVATE_SPACE_SYS_APPS_DIVIDER)); + mAllApps.mAH.get(MAIN).mAdapter.notifyItemInserted(adapterItems.size() - 1); + return adapterItems.size(); + } + /** Adds Private Space install app button to the layout. */ public void addPrivateSpaceInstallAppButton(List adapterItems) { Context context = mAllApps.getContext(); - // Prepare intent - UserCache userCache = UserCache.getInstance(context); - UserHandle userHandle = userCache.getUserProfiles().stream() - .filter(user -> userCache.getUserInfo(user).type == UserIconInfo.TYPE_PRIVATE) - .findFirst() - .orElse(null); - Intent intent = ApiWrapper.getAppMarketActivityIntent(context, - BuildConfig.APPLICATION_ID, userHandle); - // Prepare bitmapInfo Intent.ShortcutIconResource shortcut = Intent.ShortcutIconResource.fromContext( context, com.android.launcher3.R.drawable.private_space_install_app_icon); @@ -102,7 +105,7 @@ public class PrivateProfileManager extends UserProfileManager { AppInfo itemInfo = new AppInfo(); itemInfo.title = context.getResources().getString(R.string.ps_add_button_label); - itemInfo.intent = intent; + itemInfo.intent = mAppInstallerIntent; itemInfo.bitmap = bitmapInfo; itemInfo.contentDescription = context.getResources().getString( com.android.launcher3.R.string.ps_add_button_content_description); @@ -166,6 +169,22 @@ public class PrivateProfileManager extends UserProfileManager { return mPrivateSpaceSettingsAvailable; } + /** Initializes binder call based properties in non-main thread. + *

+ * This can cause the Private Space container items to not load/respond correctly sometimes, + * when the All Apps Container loads for the first time (device restarts, new profiles + * added/removed, etc.), as the properties are being set in non-ui thread whereas the container + * loads in the ui thread. + * This case should still be ok, as locking the Private Space container and unlocking it, + * reloads the values, fixing the incorrect UI. + */ + private void initializeInBackgroundThread() { + Preconditions.assertNonUiThread(); + setPreInstalledSystemPackages(); + setAppInstallerIntent(); + setPrivateSpaceSettingsAvailable(); + } + private void setPrivateSpaceSettingsAvailable() { if (mPrivateSpaceSettingsAvailable) { return; @@ -178,6 +197,22 @@ public class PrivateProfileManager extends UserProfileManager { mPrivateSpaceSettingsAvailable = resolveInfo != null; } + private void setPreInstalledSystemPackages() { + Preconditions.assertNonUiThread(); + if (getProfileUser() != null) { + mPreInstalledSystemPackages = new HashSet<>(ApiWrapper + .getPreInstalledSystemPackages(mAllApps.getContext(), getProfileUser())); + } + } + + private void setAppInstallerIntent() { + Preconditions.assertNonUiThread(); + if (getProfileUser() != null) { + mAppInstallerIntent = ApiWrapper.getAppMarketActivityIntent(mAllApps.getContext(), + BuildConfig.APPLICATION_ID, getProfileUser()); + } + } + @VisibleForTesting void resetPrivateSpaceDecorator(int updatedState) { ActivityAllAppsContainerView.AdapterHolder mainAdapterHolder = mAllApps.mAH.get(MAIN); @@ -225,4 +260,14 @@ public class PrivateProfileManager extends UserProfileManager { public Predicate getUserMatcher() { return mPrivateProfileMatcher; } + + /** + * Splits private apps into user installed and system apps. + * When the list of system apps is empty, all apps are treated as system. + */ + public Predicate splitIntoUserInstalledAndSystemApps() { + return appInfo -> !mPreInstalledSystemPackages.isEmpty() + && (appInfo.componentName == null + || !(mPreInstalledSystemPackages.contains(appInfo.componentName.getPackageName()))); + } } diff --git a/src/com/android/launcher3/allapps/UserProfileManager.java b/src/com/android/launcher3/allapps/UserProfileManager.java index 8894f45692..6a1f37a28d 100644 --- a/src/com/android/launcher3/allapps/UserProfileManager.java +++ b/src/com/android/launcher3/allapps/UserProfileManager.java @@ -23,7 +23,6 @@ import android.os.UserManager; import androidx.annotation.IntDef; -import com.android.launcher3.Utilities; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.pm.UserCache; @@ -70,16 +69,13 @@ public abstract class UserProfileManager { /** Sets quiet mode as enabled/disabled for the profile type. */ protected void setQuietMode(boolean enabled) { - if (Utilities.ATLEAST_P) { - UI_HELPER_EXECUTOR.post(() -> { + UI_HELPER_EXECUTOR.post(() -> mUserCache.getUserProfiles() .stream() .filter(getUserMatcher()) .findFirst() .ifPresent(userHandle -> - mUserManager.requestQuietModeEnabled(enabled, userHandle)); - }); - } + mUserManager.requestQuietModeEnabled(enabled, userHandle))); } /** Sets current state for the profile type. */ diff --git a/src/com/android/launcher3/allapps/WorkModeSwitch.java b/src/com/android/launcher3/allapps/WorkModeSwitch.java index 48400b23b9..eb7d429f56 100644 --- a/src/com/android/launcher3/allapps/WorkModeSwitch.java +++ b/src/com/android/launcher3/allapps/WorkModeSwitch.java @@ -83,11 +83,9 @@ public class WorkModeSwitch extends LinearLayout implements Insettable, mIcon = findViewById(R.id.work_icon); mTextView = findViewById(R.id.pause_text); setSelected(true); - if (Utilities.ATLEAST_R) { - KeyboardInsetAnimationCallback keyboardInsetAnimationCallback = - new KeyboardInsetAnimationCallback(this); - setWindowInsetsAnimationCallback(keyboardInsetAnimationCallback); - } + KeyboardInsetAnimationCallback keyboardInsetAnimationCallback = + new KeyboardInsetAnimationCallback(this); + setWindowInsetsAnimationCallback(keyboardInsetAnimationCallback); setInsets(mActivityContext.getDeviceProfile().getInsets()); updateStringFromCache(); diff --git a/src/com/android/launcher3/allapps/WorkPausedCard.java b/src/com/android/launcher3/allapps/WorkPausedCard.java index 18826673a1..e1eeabe258 100644 --- a/src/com/android/launcher3/allapps/WorkPausedCard.java +++ b/src/com/android/launcher3/allapps/WorkPausedCard.java @@ -26,7 +26,6 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.model.StringCache; import com.android.launcher3.views.ActivityContext; @@ -80,11 +79,9 @@ public class WorkPausedCard extends LinearLayout implements View.OnClickListener @Override public void onClick(View view) { - if (Utilities.ATLEAST_P) { - setEnabled(false); - mActivityContext.getAppsView().getWorkManager().setWorkProfileEnabled(true); - mActivityContext.getStatsLogManager().logger().log(LAUNCHER_TURN_ON_WORK_APPS_TAP); - } + setEnabled(false); + mActivityContext.getAppsView().getWorkManager().setWorkProfileEnabled(true); + mActivityContext.getStatsLogManager().logger().log(LAUNCHER_TURN_ON_WORK_APPS_TAP); } @Override diff --git a/src/com/android/launcher3/allapps/WorkProfileManager.java b/src/com/android/launcher3/allapps/WorkProfileManager.java index c430a36279..a54e52c905 100644 --- a/src/com/android/launcher3/allapps/WorkProfileManager.java +++ b/src/com/android/launcher3/allapps/WorkProfileManager.java @@ -199,8 +199,7 @@ public class WorkProfileManager extends UserProfileManager } private void onWorkFabClicked(View view) { - if (Utilities.ATLEAST_P && getCurrentState() == STATE_ENABLED - && mWorkModeSwitch.isEnabled()) { + if (getCurrentState() == STATE_ENABLED && mWorkModeSwitch.isEnabled()) { logEvents(LAUNCHER_TURN_OFF_WORK_APPS_TAP); setWorkProfileEnabled(false); } diff --git a/src/com/android/launcher3/anim/PendingAnimation.java b/src/com/android/launcher3/anim/PendingAnimation.java index fd731f473e..586beb2d5e 100644 --- a/src/com/android/launcher3/anim/PendingAnimation.java +++ b/src/com/android/launcher3/anim/PendingAnimation.java @@ -25,7 +25,6 @@ import android.animation.ValueAnimator; import android.os.Trace; import android.util.FloatProperty; -import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatorPlaybackController.Holder; import java.util.ArrayList; @@ -86,7 +85,7 @@ public class PendingAnimation extends AnimatedPropertySetter { /** If trace is enabled, add counter to trace animation progress. */ public void logAnimationProgressToTrace(String counterName) { - if (Utilities.ATLEAST_Q && Trace.isEnabled()) { + if (Trace.isEnabled()) { super.addOnFrameListener( animation -> Trace.setCounter( counterName, (long) (animation.getAnimatedFraction() * 100))); diff --git a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java index d37b1f08e3..5f786a4a68 100644 --- a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java +++ b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java @@ -110,9 +110,6 @@ public class AccessibilityManagerCompat { } public static int getRecommendedTimeoutMillis(Context context, int originalTimeout, int flags) { - if (Utilities.ATLEAST_Q) { - return getManager(context).getRecommendedTimeoutMillis(originalTimeout, flags); - } - return originalTimeout; + return getManager(context).getRecommendedTimeoutMillis(originalTimeout, flags); } } diff --git a/src/com/android/launcher3/dragndrop/DragController.java b/src/com/android/launcher3/dragndrop/DragController.java index aa5329b8d7..3ccde0ac6a 100644 --- a/src/com/android/launcher3/dragndrop/DragController.java +++ b/src/com/android/launcher3/dragndrop/DragController.java @@ -16,8 +16,6 @@ package com.android.launcher3.dragndrop; -import static com.android.launcher3.Utilities.ATLEAST_Q; - import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; @@ -404,9 +402,7 @@ public abstract class DragController mMotionDown.set(dragLayerPos.x, dragLayerPos.y); } - if (ATLEAST_Q) { - mLastTouchClassification = ev.getClassification(); - } + mLastTouchClassification = ev.getClassification(); return mDragDriver != null && mDragDriver.onInterceptTouchEvent(ev); } @@ -441,7 +437,7 @@ public abstract class DragController mLastTouch.set(x, y); int distanceDragged = mDistanceSinceScroll; - if (ATLEAST_Q && mLastTouchClassification == MotionEvent.CLASSIFICATION_DEEP_PRESS) { + if (mLastTouchClassification == MotionEvent.CLASSIFICATION_DEEP_PRESS) { distanceDragged /= DEEP_PRESS_DISTANCE_FACTOR; } if (mIsInPreDrag && mOptions.preDragCondition != null diff --git a/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java b/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java index 6f295e6c50..6a43b24366 100644 --- a/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java +++ b/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java @@ -37,7 +37,6 @@ import android.util.Log; import androidx.annotation.Nullable; import androidx.annotation.UiThread; -import com.android.launcher3.Utilities; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.folder.PreviewBackground; import com.android.launcher3.icons.BitmapRenderer; @@ -74,13 +73,9 @@ public class FolderAdaptiveIcon extends AdaptiveIconDrawable { return mBadge; } - @TargetApi(Build.VERSION_CODES.P) public static @Nullable FolderAdaptiveIcon createFolderAdaptiveIcon( ActivityContext activity, int folderId, Point size) { Preconditions.assertNonUiThread(); - if (!Utilities.ATLEAST_P) { - return null; - } // assume square if (size.x != size.y) { diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 084f829884..7ae70e097f 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -297,10 +297,8 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo mFooter = findViewById(R.id.folder_footer); mFooterHeight = dp.folderFooterHeightPx; - if (Utilities.ATLEAST_R) { - mKeyboardInsetAnimationCallback = new KeyboardInsetAnimationCallback(this); - setWindowInsetsAnimationCallback(mKeyboardInsetAnimationCallback); - } + mKeyboardInsetAnimationCallback = new KeyboardInsetAnimationCallback(this); + setWindowInsetsAnimationCallback(mKeyboardInsetAnimationCallback); } public boolean onLongClick(View v) { @@ -422,18 +420,16 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo @Override public WindowInsets onApplyWindowInsets(WindowInsets windowInsets) { - if (Utilities.ATLEAST_R) { - this.setTranslationY(0); + this.setTranslationY(0); - if (windowInsets.isVisible(WindowInsets.Type.ime())) { - Insets keyboardInsets = windowInsets.getInsets(WindowInsets.Type.ime()); - int folderHeightFromBottom = getHeightFromBottom(); + if (windowInsets.isVisible(WindowInsets.Type.ime())) { + Insets keyboardInsets = windowInsets.getInsets(WindowInsets.Type.ime()); + int folderHeightFromBottom = getHeightFromBottom(); - if (keyboardInsets.bottom > folderHeightFromBottom) { - // Translate this folder above the keyboard, then add the folder name's padding - this.setTranslationY(folderHeightFromBottom - keyboardInsets.bottom - - mFolderName.getPaddingBottom()); - } + if (keyboardInsets.bottom > folderHeightFromBottom) { + // Translate this folder above the keyboard, then add the folder name's padding + this.setTranslationY(folderHeightFromBottom - keyboardInsets.bottom + - mFolderName.getPaddingBottom()); } } @@ -812,15 +808,13 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo a.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { - if (Utilities.ATLEAST_R) { - setWindowInsetsAnimationCallback(null); - } + setWindowInsetsAnimationCallback(null); mIsAnimatingClosed = true; } @Override public void onAnimationEnd(Animator animation) { - if (Utilities.ATLEAST_R && mKeyboardInsetAnimationCallback != null) { + if (mKeyboardInsetAnimationCallback != null) { setWindowInsetsAnimationCallback(mKeyboardInsetAnimationCallback); } closeComplete(true); diff --git a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java index 18200f6447..dc8694d2f6 100644 --- a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java +++ b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java @@ -19,7 +19,6 @@ import static com.android.launcher3.LauncherPrefs.THEMED_ICONS; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.launcher3.util.Themes.isThemedIconEnabled; -import android.annotation.TargetApi; import android.content.ContentProvider; import android.content.ContentValues; import android.content.pm.PackageManager; @@ -27,7 +26,6 @@ import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; import android.os.Binder; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -41,7 +39,6 @@ import android.util.Pair; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.InvariantDeviceProfile.GridOption; import com.android.launcher3.LauncherPrefs; -import com.android.launcher3.Utilities; import com.android.launcher3.util.Executors; /** @@ -184,13 +181,12 @@ public class GridCustomizationsProvider extends ContentProvider { return null; } - if (!Utilities.ATLEAST_R || !METHOD_GET_PREVIEW.equals(method)) { + if (!METHOD_GET_PREVIEW.equals(method)) { return null; } return getPreview(extras); } - @TargetApi(Build.VERSION_CODES.R) private synchronized Bundle getPreview(Bundle request) { PreviewLifecycleObserver observer = null; try { diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java index 7dcc8a8637..e0a66276b6 100644 --- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java +++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java @@ -26,7 +26,6 @@ import static com.android.launcher3.config.FeatureFlags.shouldShowFirstPageWidge import static com.android.launcher3.model.ModelUtils.filterCurrentWorkspaceItems; import static com.android.launcher3.model.ModelUtils.getMissingHotseatRanks; -import android.annotation.TargetApi; import android.app.Fragment; import android.app.WallpaperColors; import android.app.WallpaperManager; @@ -39,7 +38,6 @@ import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.PointF; import android.graphics.Rect; -import android.os.Build; import android.os.Handler; import android.os.Looper; import android.util.AttributeSet; @@ -121,7 +119,6 @@ import java.util.concurrent.ConcurrentLinkedQueue; * 3) Place appropriate elements like icons and first-page qsb * 4) Measure and draw the view on a canvas */ -@TargetApi(Build.VERSION_CODES.R) public class LauncherPreviewRenderer extends ContextWrapper implements ActivityContext, WorkspaceLayoutManager, LayoutInflater.Factory2 { diff --git a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java index ec6b94dfeb..051fb6f4fe 100644 --- a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java +++ b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java @@ -49,7 +49,6 @@ import com.android.launcher3.DeviceProfile; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; -import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.graphics.LauncherPreviewRenderer.PreviewContext; import com.android.launcher3.model.BgDataModel; @@ -211,10 +210,7 @@ public class PreviewSurfaceRenderer { return new ContextThemeWrapper(context, Themes.getActivityThemeRes(context)); } - if (Utilities.ATLEAST_R) { - context = context.createWindowContext( - LayoutParams.TYPE_APPLICATION_OVERLAY, null); - } + context = context.createWindowContext(LayoutParams.TYPE_APPLICATION_OVERLAY, null); LocalColorExtractor.newInstance(context) .applyColorsOverride(context, mWallpaperColors); return new ContextThemeWrapper(context, diff --git a/src/com/android/launcher3/model/ModelDbController.java b/src/com/android/launcher3/model/ModelDbController.java index 6c6471347e..ba2b64d9c1 100644 --- a/src/com/android/launcher3/model/ModelDbController.java +++ b/src/com/android/launcher3/model/ModelDbController.java @@ -458,7 +458,7 @@ public class ModelDbController { LauncherWidgetHolder widgetHolder) { ContentResolver cr = mContext.getContentResolver(); String blobHandlerDigest = Settings.Secure.getString(cr, LAYOUT_DIGEST_KEY); - if (Utilities.ATLEAST_R && !TextUtils.isEmpty(blobHandlerDigest)) { + if (!TextUtils.isEmpty(blobHandlerDigest)) { BlobStoreManager blobManager = mContext.getSystemService(BlobStoreManager.class); try (InputStream in = new ParcelFileDescriptor.AutoCloseInputStream( blobManager.openBlob(BlobHandle.createWithSha256( diff --git a/src/com/android/launcher3/model/data/WorkspaceItemInfo.java b/src/com/android/launcher3/model/data/WorkspaceItemInfo.java index 9e169cf130..435d223af8 100644 --- a/src/com/android/launcher3/model/data/WorkspaceItemInfo.java +++ b/src/com/android/launcher3/model/data/WorkspaceItemInfo.java @@ -189,8 +189,7 @@ public class WorkspaceItemInfo extends ItemInfoWithIcon { runtimeStatusFlags |= FLAG_DISABLED_BY_PUBLISHER; } disabledMessage = shortcutInfo.getDisabledMessage(); - if (Utilities.ATLEAST_P - && shortcutInfo.getDisabledReason() == ShortcutInfo.DISABLED_REASON_VERSION_LOWER) { + if (shortcutInfo.getDisabledReason() == ShortcutInfo.DISABLED_REASON_VERSION_LOWER) { runtimeStatusFlags |= FLAG_DISABLED_VERSION_LOWER; } else { runtimeStatusFlags &= ~FLAG_DISABLED_VERSION_LOWER; diff --git a/src/com/android/launcher3/pm/InstallSessionHelper.java b/src/com/android/launcher3/pm/InstallSessionHelper.java index ca27eb28c4..0d474628b2 100644 --- a/src/com/android/launcher3/pm/InstallSessionHelper.java +++ b/src/com/android/launcher3/pm/InstallSessionHelper.java @@ -24,7 +24,6 @@ import android.content.pm.LauncherApps; import android.content.pm.PackageInstaller; import android.content.pm.PackageInstaller.SessionInfo; import android.content.pm.PackageManager; -import android.os.Process; import android.os.UserHandle; import android.text.TextUtils; @@ -34,7 +33,6 @@ import androidx.annotation.WorkerThread; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.SessionCommitReceiver; -import com.android.launcher3.Utilities; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.ItemInstallQueue; import com.android.launcher3.util.IntArray; @@ -132,7 +130,7 @@ public class InstallSessionHelper { public SessionInfo getActiveSessionInfo(UserHandle user, String pkg) { for (SessionInfo info : getAllVerifiedSessions()) { boolean match = pkg.equals(info.getAppPackageName()); - if (Utilities.ATLEAST_Q && !user.equals(getUserHandle(info))) { + if (!user.equals(getUserHandle(info))) { match = false; } if (match) { @@ -180,9 +178,8 @@ public class InstallSessionHelper { @NonNull public List getAllVerifiedSessions() { - List list = new ArrayList<>(Utilities.ATLEAST_Q - ? Objects.requireNonNull(mLauncherApps).getAllPackageInstallerSessions() - : mInstaller.getAllSessions()); + List list = new ArrayList<>( + Objects.requireNonNull(mLauncherApps).getAllPackageInstallerSessions()); Iterator it = list.iterator(); while (it.hasNext()) { if (verify(it.next()) == null) { @@ -252,6 +249,6 @@ public class InstallSessionHelper { } public static UserHandle getUserHandle(@NonNull final SessionInfo info) { - return Utilities.ATLEAST_Q ? info.getUser() : Process.myUserHandle(); + return info.getUser(); } } diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index 934d43b187..c9c5fd3d98 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -17,7 +17,6 @@ package com.android.launcher3.popup; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_SHORTCUTS; -import static com.android.launcher3.Utilities.ATLEAST_P; import static com.android.launcher3.Utilities.squaredHypot; import static com.android.launcher3.Utilities.squaredTouchSlop; import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS; @@ -248,10 +247,7 @@ public class PopupContainerWithArrow * Animates and loads shortcuts on background thread for this popup container */ private void loadAppShortcuts(ItemInfo originalItemInfo) { - - if (ATLEAST_P) { - setAccessibilityPaneTitle(getTitleForAccessibility()); - } + setAccessibilityPaneTitle(getTitleForAccessibility()); mOriginalIcon.setForceHideDot(true); // All views are added. Animate layout from now on. setLayoutTransition(new LayoutTransition()); diff --git a/src/com/android/launcher3/popup/RemoteActionShortcut.java b/src/com/android/launcher3/popup/RemoteActionShortcut.java index 8df58d2146..688da4934f 100644 --- a/src/com/android/launcher3/popup/RemoteActionShortcut.java +++ b/src/com/android/launcher3/popup/RemoteActionShortcut.java @@ -20,13 +20,11 @@ import static com.android.launcher3.Utilities.allowBGLaunch; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SYSTEM_SHORTCUT_PAUSE_TAP; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; -import android.annotation.TargetApi; import android.app.ActivityOptions; import android.app.PendingIntent; import android.app.RemoteAction; import android.content.Context; import android.content.Intent; -import android.os.Build; import android.util.Log; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; @@ -42,7 +40,6 @@ import com.android.launcher3.model.data.ItemInfo; import java.lang.ref.WeakReference; -@TargetApi(Build.VERSION_CODES.Q) public class RemoteActionShortcut extends SystemShortcut { private static final String TAG = "RemoteActionShortcut"; private static final boolean DEBUG = Utilities.IS_DEBUG_DEVICE; diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java index 1c53855adb..22bc13bb25 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -326,9 +326,6 @@ public class RestoreDbTask { */ private UserHandle getUserForAncestralSerialNumber(BackupManager backupManager, long ancestralSerialNumber) { - if (!Utilities.ATLEAST_Q) { - return null; - } return backupManager.getUserForAncestralSerialNumber(ancestralSerialNumber); } diff --git a/src/com/android/launcher3/settings/SettingsActivity.java b/src/com/android/launcher3/settings/SettingsActivity.java index 8cb15a5e6c..a5f9c2a53f 100644 --- a/src/com/android/launcher3/settings/SettingsActivity.java +++ b/src/com/android/launcher3/settings/SettingsActivity.java @@ -52,7 +52,6 @@ import androidx.recyclerview.widget.RecyclerView; import com.android.launcher3.BuildConfig; import com.android.launcher3.LauncherFiles; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.states.RotationHelper; import com.android.launcher3.uioverrides.flags.DeveloperOptionsUI; @@ -120,7 +119,7 @@ public class SettingsActivity extends FragmentActivity } private boolean startPreference(String fragment, Bundle args, String key) { - if (Utilities.ATLEAST_P && getSupportFragmentManager().isStateSaved()) { + if (getSupportFragmentManager().isStateSaved()) { // Sometimes onClick can come after onPause because of being posted on the handler. // Skip starting new preferences in that case. return false; diff --git a/src/com/android/launcher3/testing/TestInformationHandler.java b/src/com/android/launcher3/testing/TestInformationHandler.java index ccff095c0e..315b5e3a93 100644 --- a/src/com/android/launcher3/testing/TestInformationHandler.java +++ b/src/com/android/launcher3/testing/TestInformationHandler.java @@ -15,19 +15,17 @@ */ package com.android.launcher3.testing; -import static com.android.launcher3.allapps.AllAppsStore.DEFER_UPDATES_TEST; import static com.android.launcher3.Flags.enableGridOnlyOverview; +import static com.android.launcher3.allapps.AllAppsStore.DEFER_UPDATES_TEST; import static com.android.launcher3.config.FeatureFlags.FOLDABLE_SINGLE_PAGE; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; -import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.graphics.Insets; import android.graphics.Point; import android.graphics.Rect; -import android.os.Build; import android.os.Bundle; import android.view.WindowInsets; @@ -60,7 +58,6 @@ import java.util.function.Supplier; /** * Class to handle requests from tests */ -@TargetApi(Build.VERSION_CODES.Q) public class TestInformationHandler implements ResourceBasedOverride { public static TestInformationHandler newInstance(Context context) { diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java index 369008db9c..9d50e6ac9c 100644 --- a/src/com/android/launcher3/touch/ItemClickHandler.java +++ b/src/com/android/launcher3/touch/ItemClickHandler.java @@ -190,16 +190,12 @@ public class ItemClickHandler { boolean downloadStarted) { ItemInfo item = (ItemInfo) v.getTag(); CompletableFuture siFuture; - if (Utilities.ATLEAST_Q) { - siFuture = CompletableFuture.supplyAsync(() -> - InstallSessionHelper.INSTANCE.get(launcher) - .getActiveSessionInfo(item.user, packageName), - UI_HELPER_EXECUTOR); - } else { - siFuture = CompletableFuture.completedFuture(null); - } + siFuture = CompletableFuture.supplyAsync(() -> + InstallSessionHelper.INSTANCE.get(launcher) + .getActiveSessionInfo(item.user, packageName), + UI_HELPER_EXECUTOR); Consumer marketLaunchAction = sessionInfo -> { - if (sessionInfo != null && Utilities.ATLEAST_Q) { + if (sessionInfo != null) { LauncherApps launcherApps = launcher.getSystemService(LauncherApps.class); try { launcherApps.startPackageInstallerSessionDetailsActivity(sessionInfo, null, diff --git a/src/com/android/launcher3/util/IOUtils.java b/src/com/android/launcher3/util/IOUtils.java index 1cec0ecc10..296efe9277 100644 --- a/src/com/android/launcher3/util/IOUtils.java +++ b/src/com/android/launcher3/util/IOUtils.java @@ -19,7 +19,6 @@ package com.android.launcher3.util; import android.os.FileUtils; import android.util.Log; -import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; import java.io.ByteArrayOutputStream; @@ -51,17 +50,7 @@ public class IOUtils { } public static long copy(InputStream from, OutputStream to) throws IOException { - if (Utilities.ATLEAST_Q) { - return FileUtils.copy(from, to); - } - byte[] buf = new byte[BUF_SIZE]; - long total = 0; - int r; - while ((r = from.read(buf)) != -1) { - to.write(buf, 0, r); - total += r; - } - return total; + return FileUtils.copy(from, to); } public static void closeSilently(Closeable c) { diff --git a/src/com/android/launcher3/util/TraceHelper.java b/src/com/android/launcher3/util/TraceHelper.java index 138cc4af3e..edcd3f6059 100644 --- a/src/com/android/launcher3/util/TraceHelper.java +++ b/src/com/android/launcher3/util/TraceHelper.java @@ -20,12 +20,10 @@ import android.os.Trace; import androidx.annotation.MainThread; -import com.android.launcher3.Utilities; +import kotlin.random.Random; import java.util.function.Supplier; -import kotlin.random.Random; - /** * A wrapper around {@link Trace} to allow better testing. * @@ -67,9 +65,6 @@ public class TraceHelper { @SuppressWarnings("NewApi") @SuppressLint("NewApi") public SafeCloseable beginAsyncSection(String sectionName) { - if (!Utilities.ATLEAST_Q) { - return () -> { }; - } int cookie = Random.Default.nextInt(); Trace.beginAsyncSection(sectionName, cookie); return () -> Trace.endAsyncSection(sectionName, cookie); @@ -81,9 +76,6 @@ public class TraceHelper { @SuppressWarnings("NewApi") @SuppressLint("NewApi") public SafeCloseable allowIpcs(String rpcName) { - if (!Utilities.ATLEAST_Q) { - return () -> { }; - } int cookie = Random.Default.nextInt(); Trace.beginAsyncSection(rpcName, cookie); return () -> Trace.endAsyncSection(rpcName, cookie); diff --git a/src/com/android/launcher3/util/VibratorWrapper.java b/src/com/android/launcher3/util/VibratorWrapper.java index 4f20bbcf44..fef1c723eb 100644 --- a/src/com/android/launcher3/util/VibratorWrapper.java +++ b/src/com/android/launcher3/util/VibratorWrapper.java @@ -28,12 +28,10 @@ import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import android.annotation.SuppressLint; -import android.annotation.TargetApi; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.media.AudioAttributes; -import android.os.Build; import android.os.SystemClock; import android.os.VibrationEffect; import android.os.Vibrator; @@ -48,7 +46,6 @@ import com.android.launcher3.config.FeatureFlags; /** * Wrapper around {@link Vibrator} to easily perform haptic feedback where necessary. */ -@TargetApi(Build.VERSION_CODES.Q) public class VibratorWrapper { public static final MainThreadInitializedObject INSTANCE = @@ -138,7 +135,7 @@ public class VibratorWrapper { mThresholdUntilNextDragCallMillis = 0; } - if (Utilities.ATLEAST_R && mVibrator.areAllPrimitivesSupported( + if (mVibrator.areAllPrimitivesSupported( VibrationEffect.Composition.PRIMITIVE_QUICK_RISE, VibrationEffect.Composition.PRIMITIVE_TICK)) { if (FeatureFlags.ENABLE_SEARCH_HAPTIC_HINT.get()) { @@ -226,8 +223,7 @@ public class VibratorWrapper { public void vibrate(int primitiveId, float primitiveScale, VibrationEffect fallbackEffect) { if (mHasVibrator && mIsHapticFeedbackEnabled) { UI_HELPER_EXECUTOR.execute(() -> { - if (Utilities.ATLEAST_R && primitiveId >= 0 - && mVibrator.areAllPrimitivesSupported(primitiveId)) { + if (primitiveId >= 0 && mVibrator.areAllPrimitivesSupported(primitiveId)) { mVibrator.vibrate(VibrationEffect.startComposition() .addPrimitive(primitiveId, primitiveScale) .compose(), VIBRATION_ATTRS); diff --git a/src/com/android/launcher3/util/window/WindowManagerProxy.java b/src/com/android/launcher3/util/window/WindowManagerProxy.java index 51a96c4d8a..209a3dc779 100644 --- a/src/com/android/launcher3/util/window/WindowManagerProxy.java +++ b/src/com/android/launcher3/util/window/WindowManagerProxy.java @@ -105,24 +105,7 @@ public class WindowManagerProxy implements ResourceBasedOverride { /** * Returns the real bounds for the provided display after applying any insets normalization */ - @TargetApi(Build.VERSION_CODES.R) public WindowBounds getRealBounds(Context displayInfoContext, CachedDisplayInfo info) { - if (!Utilities.ATLEAST_R) { - Point smallestSize = new Point(); - Point largestSize = new Point(); - getDisplay(displayInfoContext).getCurrentSizeRange(smallestSize, largestSize); - - if (info.size.y > info.size.x) { - // Portrait - return new WindowBounds(info.size.x, info.size.y, smallestSize.x, largestSize.y, - info.rotation); - } else { - // Landscape - return new WindowBounds(info.size.x, info.size.y, largestSize.x, smallestSize.y, - info.rotation); - } - } - WindowMetrics windowMetrics = displayInfoContext.getSystemService(WindowManager.class) .getMaximumWindowMetrics(); Rect insets = new Rect(); @@ -133,10 +116,9 @@ public class WindowManagerProxy implements ResourceBasedOverride { /** * Returns an updated insets, accounting for various Launcher UI specific overrides like taskbar */ - @TargetApi(Build.VERSION_CODES.R) public WindowInsets normalizeWindowInsets(Context context, WindowInsets oldInsets, Rect outInsets) { - if (!Utilities.ATLEAST_R || !mTaskbarDrawnInProcess) { + if (!mTaskbarDrawnInProcess) { outInsets.set(oldInsets.getSystemWindowInsetLeft(), oldInsets.getSystemWindowInsetTop(), oldInsets.getSystemWindowInsetRight(), oldInsets.getSystemWindowInsetBottom()); return oldInsets; @@ -220,8 +202,7 @@ public class WindowManagerProxy implements ResourceBasedOverride { } boolean isTablet = swDp >= MIN_TABLET_WIDTH; - boolean isTabletOrGesture = isTablet - || (Utilities.ATLEAST_R && isGestureNav(context)); + boolean isTabletOrGesture = isTablet || isGestureNav(context); // Use the status bar height resources because current system API to get the status bar // height doesn't allow to do this for an arbitrary display, it returns value only @@ -360,17 +341,14 @@ public class WindowManagerProxy implements ResourceBasedOverride { } /** - * * Returns the display associated with the context, or DEFAULT_DISPLAY if the context isn't * associated with a display. */ protected Display getDisplay(Context displayInfoContext) { - if (Utilities.ATLEAST_R) { - try { - return displayInfoContext.getDisplay(); - } catch (UnsupportedOperationException e) { - // Ignore - } + try { + return displayInfoContext.getDisplay(); + } catch (UnsupportedOperationException e) { + // Ignore } return displayInfoContext.getSystemService(DisplayManager.class).getDisplay( DEFAULT_DISPLAY); diff --git a/src/com/android/launcher3/views/ActivityContext.java b/src/com/android/launcher3/views/ActivityContext.java index 0cddc97749..c5317e3d5c 100644 --- a/src/com/android/launcher3/views/ActivityContext.java +++ b/src/com/android/launcher3/views/ActivityContext.java @@ -19,7 +19,6 @@ import static android.window.SplashScreen.SPLASH_SCREEN_STYLE_SOLID_COLOR; import static com.android.launcher3.LauncherSettings.Animation.DEFAULT_NO_ICON; import static com.android.launcher3.Utilities.allowBGLaunch; -import static com.android.launcher3.logging.KeyboardStateManager.KeyboardState.HIDE; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ALLAPPS_KEYBOARD_CLOSED; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_PENDING_INTENT; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_TAP; @@ -266,32 +265,26 @@ public interface ActivityContext { if (root == null) { return; } - if (Utilities.ATLEAST_R) { - Preconditions.assertUIThread(); - // Hide keyboard with WindowInsetsController if could. In case - // hideSoftInputFromWindow may get ignored by input connection being finished - // when the screen is off. - // - // In addition, inside IMF, the keyboards are closed asynchronously that launcher no - // longer need to post to the message queue. - final WindowInsetsController wic = root.getWindowInsetsController(); - WindowInsets insets = root.getRootWindowInsets(); - boolean isImeShown = insets != null && insets.isVisible(WindowInsets.Type.ime()); - if (wic != null) { - // Only hide the keyboard if it is actually showing. - if (isImeShown) { - StatsLogManager slm = getStatsLogManager(); - slm.keyboardStateManager().setKeyboardState(HIDE); - - // this method cannot be called cross threads - wic.hide(WindowInsets.Type.ime()); - slm.logger().log(LAUNCHER_ALLAPPS_KEYBOARD_CLOSED); - } - - // If the WindowInsetsController is not null, we end here regardless of whether we - // hid the keyboard or not. - return; + Preconditions.assertUIThread(); + // Hide keyboard with WindowInsetsController if could. In case hideSoftInputFromWindow may + // get ignored by input connection being finished when the screen is off. + // + // In addition, inside IMF, the keyboards are closed asynchronously that launcher no longer + // need to post to the message queue. + final WindowInsetsController wic = root.getWindowInsetsController(); + WindowInsets insets = root.getRootWindowInsets(); + boolean isImeShown = insets != null && insets.isVisible(WindowInsets.Type.ime()); + if (wic != null) { + // Only hide the keyboard if it is actually showing. + if (isImeShown) { + // this method cannot be called cross threads + wic.hide(WindowInsets.Type.ime()); + getStatsLogManager().logger().log(LAUNCHER_ALLAPPS_KEYBOARD_CLOSED); } + + // If the WindowInsetsController is not null, we end here regardless of whether we hid + // the keyboard or not. + return; } InputMethodManager imm = root.getContext().getSystemService(InputMethodManager.class); diff --git a/src/com/android/launcher3/views/BaseDragLayer.java b/src/com/android/launcher3/views/BaseDragLayer.java index a1cd697eee..abc5ef88dd 100644 --- a/src/com/android/launcher3/views/BaseDragLayer.java +++ b/src/com/android/launcher3/views/BaseDragLayer.java @@ -551,25 +551,21 @@ public abstract class BaseDragLayer @Override public WindowInsets dispatchApplyWindowInsets(WindowInsets insets) { - if (Utilities.ATLEAST_Q) { - Insets gestureInsets = insets.getMandatorySystemGestureInsets(); - int gestureInsetBottom = gestureInsets.bottom; - Insets imeInset = Utilities.ATLEAST_R - ? insets.getInsets(WindowInsets.Type.ime()) - : Insets.NONE; - DeviceProfile dp = mActivity.getDeviceProfile(); - if (dp.isTaskbarPresent) { - // Ignore taskbar gesture insets to avoid interfering with TouchControllers. - gestureInsetBottom = ResourceUtils.getNavbarSize( - ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, getResources()); - } - mSystemGestureRegion.set( - Math.max(gestureInsets.left, imeInset.left), - Math.max(gestureInsets.top, imeInset.top), - Math.max(gestureInsets.right, imeInset.right), - Math.max(gestureInsetBottom, imeInset.bottom) - ); + Insets gestureInsets = insets.getMandatorySystemGestureInsets(); + int gestureInsetBottom = gestureInsets.bottom; + Insets imeInset = insets.getInsets(WindowInsets.Type.ime()); + DeviceProfile dp = mActivity.getDeviceProfile(); + if (dp.isTaskbarPresent) { + // Ignore taskbar gesture insets to avoid interfering with TouchControllers. + gestureInsetBottom = ResourceUtils.getNavbarSize( + ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, getResources()); } + mSystemGestureRegion.set( + Math.max(gestureInsets.left, imeInset.left), + Math.max(gestureInsets.top, imeInset.top), + Math.max(gestureInsets.right, imeInset.right), + Math.max(gestureInsetBottom, imeInset.bottom) + ); return super.dispatchApplyWindowInsets(insets); } } diff --git a/src/com/android/launcher3/views/ClipIconView.java b/src/com/android/launcher3/views/ClipIconView.java index 7737adb905..5d3fa9bc4e 100644 --- a/src/com/android/launcher3/views/ClipIconView.java +++ b/src/com/android/launcher3/views/ClipIconView.java @@ -25,7 +25,6 @@ import static java.lang.Math.max; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; -import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; @@ -36,7 +35,6 @@ import android.graphics.RectF; import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.os.Build; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup.MarginLayoutParams; @@ -55,7 +53,6 @@ import com.android.launcher3.graphics.IconShape; * Supports springing just the foreground layer. * Supports clipping the icon to/from its icon shape. */ -@TargetApi(Build.VERSION_CODES.Q) public class ClipIconView extends View implements ClipPathView { private static final Rect sTmpRect = new Rect(); diff --git a/src/com/android/launcher3/views/FloatingIconView.java b/src/com/android/launcher3/views/FloatingIconView.java index 32c70a3120..f76b53b90d 100644 --- a/src/com/android/launcher3/views/FloatingIconView.java +++ b/src/com/android/launcher3/views/FloatingIconView.java @@ -24,14 +24,12 @@ import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; import static com.android.launcher3.views.IconLabelDotView.setIconAndDotVisible; import android.animation.Animator; -import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.CancellationSignal; import android.util.AttributeSet; import android.util.Log; @@ -67,7 +65,6 @@ import java.util.function.Supplier; /** * A view that is created to look like another view with the purpose of creating fluid animations. */ -@TargetApi(Build.VERSION_CODES.Q) public class FloatingIconView extends FrameLayout implements Animator.AnimatorListener, OnGlobalLayoutListener, FloatingView { diff --git a/src/com/android/launcher3/views/FloatingSurfaceView.java b/src/com/android/launcher3/views/FloatingSurfaceView.java index bfb75f0022..76b6fdebad 100644 --- a/src/com/android/launcher3/views/FloatingSurfaceView.java +++ b/src/com/android/launcher3/views/FloatingSurfaceView.java @@ -18,14 +18,12 @@ package com.android.launcher3.views; import static com.android.launcher3.views.FloatingIconView.getLocationBoundsForView; import static com.android.launcher3.views.IconLabelDotView.setIconAndDotVisible; -import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; import android.graphics.Picture; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.RectF; -import android.os.Build; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.SurfaceHolder; @@ -47,7 +45,6 @@ import com.android.launcher3.util.window.RefreshRateTracker; * Similar to {@link FloatingIconView} but displays a surface with the targetIcon. It then passes * the surfaceHandle to the {@link GestureNavContract}. */ -@TargetApi(Build.VERSION_CODES.R) public class FloatingSurfaceView extends AbstractFloatingView implements OnGlobalLayoutListener, Insettable, SurfaceHolder.Callback2 { diff --git a/src/com/android/launcher3/views/RecyclerViewFastScroller.java b/src/com/android/launcher3/views/RecyclerViewFastScroller.java index c0b24fa9f4..8408cc760d 100644 --- a/src/com/android/launcher3/views/RecyclerViewFastScroller.java +++ b/src/com/android/launcher3/views/RecyclerViewFastScroller.java @@ -30,7 +30,6 @@ import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; -import android.os.Build; import android.util.AttributeSet; import android.util.Log; import android.util.Property; @@ -40,7 +39,6 @@ import android.view.ViewConfiguration; import android.view.WindowInsets; import android.widget.TextView; -import androidx.annotation.RequiresApi; import androidx.recyclerview.widget.RecyclerView; import com.android.launcher3.FastScrollRecyclerView; @@ -352,26 +350,21 @@ public class RecyclerViewFastScroller extends View { float r = getScrollThumbRadius(); mThumbBounds.set(-halfW, 0, halfW, mThumbHeight); canvas.drawRoundRect(mThumbBounds, r, r, mThumbPaint); - if (Utilities.ATLEAST_Q) { - mThumbBounds.roundOut(SYSTEM_GESTURE_EXCLUSION_RECT.get(0)); - // swiping very close to the thumb area (not just within it's bound) - // will also prevent back gesture - SYSTEM_GESTURE_EXCLUSION_RECT.get(0).offset(mThumbDrawOffset.x, mThumbDrawOffset.y); - if (Utilities.ATLEAST_Q && mSystemGestureInsets != null) { - SYSTEM_GESTURE_EXCLUSION_RECT.get(0).left = - SYSTEM_GESTURE_EXCLUSION_RECT.get(0).right - mSystemGestureInsets.right; - } - setSystemGestureExclusionRects(SYSTEM_GESTURE_EXCLUSION_RECT); + mThumbBounds.roundOut(SYSTEM_GESTURE_EXCLUSION_RECT.get(0)); + // swiping very close to the thumb area (not just within it's bound) + // will also prevent back gesture + SYSTEM_GESTURE_EXCLUSION_RECT.get(0).offset(mThumbDrawOffset.x, mThumbDrawOffset.y); + if (mSystemGestureInsets != null) { + SYSTEM_GESTURE_EXCLUSION_RECT.get(0).left = + SYSTEM_GESTURE_EXCLUSION_RECT.get(0).right - mSystemGestureInsets.right; } + setSystemGestureExclusionRects(SYSTEM_GESTURE_EXCLUSION_RECT); canvas.restoreToCount(saveCount); } @Override - @RequiresApi(Build.VERSION_CODES.Q) public WindowInsets onApplyWindowInsets(WindowInsets insets) { - if (Utilities.ATLEAST_Q) { - mSystemGestureInsets = insets.getSystemGestureInsets(); - } + mSystemGestureInsets = insets.getSystemGestureInsets(); return super.onApplyWindowInsets(insets); } diff --git a/src/com/android/launcher3/widget/AddItemWidgetsBottomSheet.java b/src/com/android/launcher3/widget/AddItemWidgetsBottomSheet.java index 80b1cdd83c..4f5d31160a 100644 --- a/src/com/android/launcher3/widget/AddItemWidgetsBottomSheet.java +++ b/src/com/android/launcher3/widget/AddItemWidgetsBottomSheet.java @@ -16,8 +16,6 @@ package com.android.launcher3.widget; -import static com.android.launcher3.Utilities.ATLEAST_R; - import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Insets; @@ -153,17 +151,10 @@ public class AddItemWidgetsBottomSheet extends AbstractSlideInView private int getNavBarScrimHeight(WindowInsets insets) { if (mDisableNavBarScrim) { return 0; - } else if (Utilities.ATLEAST_Q) { - return insets.getTappableElementInsets().bottom; } else { - return insets.getStableInsetBottom(); + return insets.getTappableElementInsets().bottom; } } diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java index e0de269eed..e77ec12e18 100644 --- a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java +++ b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java @@ -16,11 +16,9 @@ package com.android.launcher3.widget; -import android.annotation.TargetApi; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.graphics.Rect; -import android.os.Build; import android.os.Handler; import android.os.Parcelable; import android.os.SystemClock; @@ -44,7 +42,6 @@ import com.android.launcher3.CheckLongPressHelper; import com.android.launcher3.Flags; import com.android.launcher3.Launcher; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.LauncherAppWidgetInfo; @@ -105,7 +102,7 @@ public class LauncherAppWidgetHostView extends BaseLauncherAppWidgetHostView setDefaultFocusHighlightEnabled(false); } - if (Utilities.ATLEAST_Q && Themes.getAttrBoolean(mLauncher, R.attr.isWorkspaceDarkText)) { + if (Themes.getAttrBoolean(mLauncher, R.attr.isWorkspaceDarkText)) { setOnLightBackground(true); } mColorExtractor = new LocalColorExtractor(); // no-op @@ -131,10 +128,9 @@ public class LauncherAppWidgetHostView extends BaseLauncherAppWidgetHostView } @Override - @TargetApi(Build.VERSION_CODES.Q) public void setAppWidget(int appWidgetId, AppWidgetProviderInfo info) { super.setAppWidget(appWidgetId, info); - if (!mTrackingWidgetUpdate && Utilities.ATLEAST_Q) { + if (!mTrackingWidgetUpdate) { mTrackingWidgetUpdate = true; Trace.beginAsyncSection(TRACE_METHOD_NAME + info.provider, appWidgetId); Log.i(TAG, "App widget created with id: " + appWidgetId); @@ -142,9 +138,8 @@ public class LauncherAppWidgetHostView extends BaseLauncherAppWidgetHostView } @Override - @TargetApi(Build.VERSION_CODES.Q) public void updateAppWidget(RemoteViews remoteViews) { - if (mTrackingWidgetUpdate && remoteViews != null && Utilities.ATLEAST_Q) { + if (mTrackingWidgetUpdate && remoteViews != null) { Log.i(TAG, "App widget with id: " + getAppWidgetId() + " loaded"); Trace.endAsyncSection( TRACE_METHOD_NAME + getAppWidgetInfo().provider, getAppWidgetId()); @@ -288,8 +283,7 @@ public class LauncherAppWidgetHostView extends BaseLauncherAppWidgetHostView super.onLayout(changed, left, top, right, bottom); mIsScrollable = checkScrollableRecursively(this); - if (!mIsInDragMode && getTag() instanceof LauncherAppWidgetInfo) { - LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) getTag(); + if (!mIsInDragMode && getTag() instanceof LauncherAppWidgetInfo info) { mTempRect.set(left, top, right, bottom); mColorExtractor.setWorkspaceLocation(mTempRect, (View) getParent(), info.screenId); } @@ -425,8 +419,7 @@ public class LauncherAppWidgetHostView extends BaseLauncherAppWidgetHostView @Override protected boolean shouldAllowDirectClick() { - if (getTag() instanceof ItemInfo) { - ItemInfo item = (ItemInfo) getTag(); + if (getTag() instanceof ItemInfo item) { return item.spanX == 1 && item.spanY == 1; } return false; diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java b/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java index ef51d152c7..3e4fd8caa8 100644 --- a/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java +++ b/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java @@ -15,7 +15,6 @@ import android.os.UserHandle; import com.android.launcher3.DeviceProfile; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; -import com.android.launcher3.Utilities; import com.android.launcher3.icons.ComponentWithLabelAndIcon; import com.android.launcher3.icons.IconCache; import com.android.launcher3.model.data.LauncherAppWidgetInfo; @@ -206,11 +205,7 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo } public int getWidgetFeatures() { - if (Utilities.ATLEAST_P) { - return widgetFeatures; - } else { - return 0; - } + return widgetFeatures; } public boolean isReconfigurable() { diff --git a/tests/AndroidManifest-common.xml b/tests/AndroidManifest-common.xml index e5e3354a55..7059268954 100644 --- a/tests/AndroidManifest-common.xml +++ b/tests/AndroidManifest-common.xml @@ -88,6 +88,14 @@ android:resource="@xml/appwidget_dynamic_colors"/> + + + + + + diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml index daace8e89f..5cf96c8554 100644 --- a/tests/AndroidManifest.xml +++ b/tests/AndroidManifest.xml @@ -23,14 +23,6 @@ - - - - - - mAlphabeticalAppsList; @Mock @@ -96,6 +98,10 @@ public class AlphabeticalAppsListTest { when(mPrivateProfileManager.addPrivateSpaceHeader(any())) .thenAnswer(answer(this::addPrivateSpaceHeader)); when(mPrivateProfileManager.getCurrentState()).thenReturn(STATE_ENABLED); + when(mPrivateProfileManager.splitIntoUserInstalledAndSystemApps()) + .thenReturn(iteminfo -> iteminfo.componentName == null + || !iteminfo.componentName.getPackageName() + .equals("com.android.launcher3.tests.camera")); mAlphabeticalAppsList.updateItemFilter(info -> info != null && info.user.equals(MAIN_HANDLE)); @@ -111,6 +117,44 @@ public class AlphabeticalAppsListTest { && item.itemInfo.user.equals(PRIVATE_HANDLE)).toList().size()); } + @Test + public void privateProfileEnabled_privateProfileAppsShownWithSeparator() { + mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_PRIVATE_SPACE); + mSetFlagsRule.enableFlags(Flags.FLAG_PRIVATE_SPACE_SYS_APPS_SEPARATION); + when(mAllAppsStore.getApps()).thenReturn(createAppInfoListForMainAndPrivateUser()); + when(mPrivateProfileManager.addPrivateSpaceHeader(any())) + .thenAnswer(answer(this::addPrivateSpaceHeader)); + when(mPrivateProfileManager.addSystemAppsDivider(any())) + .thenAnswer(answer(this::addSystemAppsDivider)); + when(mPrivateProfileManager.getCurrentState()).thenReturn(STATE_ENABLED); + when(mPrivateProfileManager.splitIntoUserInstalledAndSystemApps()) + .thenReturn(iteminfo -> iteminfo.componentName == null + || !iteminfo.componentName.getPackageName() + .equals("com.android.launcher3.tests.camera")); + + mAlphabeticalAppsList.updateItemFilter(info -> info != null + && info.user.equals(MAIN_HANDLE)); + + assertEquals(MAIN_USER_APP_COUNT + PRIVATE_SPACE_HEADER_ITEM_COUNT + + PRIVATE_SPACE_SYS_APP_SEPARATOR_ITEM_COUNT + + PRIVATE_USER_APP_COUNT, mAlphabeticalAppsList.getAdapterItems().size()); + assertEquals(PRIVATE_SPACE_HEADER_ITEM_COUNT, + mAlphabeticalAppsList.getAdapterItems().stream().filter(item -> + item.viewType == VIEW_TYPE_PRIVATE_SPACE_HEADER).toList().size()); + assertEquals(PRIVATE_SPACE_SYS_APP_SEPARATOR_ITEM_COUNT, + mAlphabeticalAppsList.getAdapterItems().stream().filter(item -> + item.viewType == VIEW_TYPE_PRIVATE_SPACE_SYS_APPS_DIVIDER).toList().size()); + List psApps = mAlphabeticalAppsList.getAdapterItems() + .stream() + .filter(item -> item.itemInfo != null && item.itemInfo.user.equals(PRIVATE_HANDLE)) + .toList(); + assertEquals(PRIVATE_USER_APP_COUNT, psApps.size()); + assert psApps.get(0).itemInfo.title != null; + assertEquals("Private Messenger", psApps.get(0).itemInfo.title.toString()); + assert psApps.get(1).itemInfo.title != null; + assertEquals("Private Camera", psApps.get(1).itemInfo.title.toString()); + } + @Test public void privateProfileDisabled_onlyPrivateProfileHeaderViewIsPresent() { mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_PRIVATE_SPACE); @@ -281,6 +325,12 @@ public class AlphabeticalAppsListTest { return adapterItemList.size(); } + private int addSystemAppsDivider(List adapterItemList) { + adapterItemList.add(new BaseAllAppsAdapter + .AdapterItem(VIEW_TYPE_PRIVATE_SPACE_SYS_APPS_DIVIDER)); + return adapterItemList.size(); + } + private AppInfo[] createAppInfoListForMainUser() { ComponentName gmailComponentName = new ComponentName(mContext, "com.android.launcher3.tests.Activity" + "Gmail"); @@ -298,7 +348,11 @@ public class AlphabeticalAppsListTest { "com.android.launcher3.tests.Activity" + "PrivateMessenger"); AppInfo privateMessengerAppInfo = new AppInfo(privateMessengercomponentName, "Private Messenger", PRIVATE_HANDLE, new Intent()); - return new AppInfo[]{privateMessengerAppInfo}; + ComponentName privateCameraComponentName = new ComponentName( + "com.android.launcher3.tests.camera", "CameraActivity"); + AppInfo privateCameraAppInfo = new AppInfo(privateCameraComponentName, + "Private Camera", PRIVATE_HANDLE, new Intent()); + return new AppInfo[]{privateMessengerAppInfo, privateCameraAppInfo}; } private AppInfo[] createAppInfoListForMainAndPrivateUser() { diff --git a/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java b/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java index 69edd0f2a5..fd8739c48a 100644 --- a/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java +++ b/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java @@ -16,6 +16,8 @@ package com.android.launcher3.allapps; +import static androidx.test.core.app.ApplicationProvider.getApplicationContext; + import static com.android.launcher3.allapps.UserProfileManager.STATE_DISABLED; import static com.android.launcher3.allapps.UserProfileManager.STATE_ENABLED; import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_PRIVATE_PROFILE_QUIET_MODE_ENABLED; @@ -31,8 +33,10 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.content.pm.LauncherApps; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Process; @@ -43,6 +47,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.pm.UserCache; +import com.android.launcher3.util.ActivityContextWrapper; import com.android.launcher3.util.UserIconInfo; import com.android.launcher3.util.rule.TestStabilityRule; @@ -56,6 +61,7 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.util.ArrayList; import java.util.Arrays; @RunWith(AndroidJUnit4.class) @@ -89,6 +95,8 @@ public class PrivateProfileManagerTest { private AllAppsStore mAllAppsStore; @Mock private PackageManager mPackageManager; + @Mock + private LauncherApps mLauncherApps; private boolean mRunnableCalled = false; @@ -103,6 +111,13 @@ public class PrivateProfileManagerTest { when(mActivityAllAppsContainerView.getAppsStore()).thenReturn(mAllAppsStore); when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mPackageManager.resolveActivity(any(), any())).thenReturn(new ResolveInfo()); + when(mContext.getSystemService(LauncherApps.class)).thenReturn(mLauncherApps); + when(mLauncherApps.getAppMarketActivityIntent(any(), any())).thenReturn(PendingIntent + .getActivity(new ActivityContextWrapper(getApplicationContext()), 0, + new Intent(), PendingIntent.FLAG_IMMUTABLE).getIntentSender()); + when(mContext.getPackageName()) + .thenReturn("com.android.launcher3.tests.privateProfileManager"); + when(mLauncherApps.getPreInstalledSystemPackages(any())).thenReturn(new ArrayList<>()); mPrivateProfileManager = new PrivateProfileManager(mUserManager, mActivityAllAppsContainerView, mStatsLogManager, mUserCache); } diff --git a/tests/src/com/android/launcher3/compat/TaplPromiseIconUiTest.java b/tests/src/com/android/launcher3/compat/TaplPromiseIconUiTest.java index f1b044129a..7ed0fa5b8f 100644 --- a/tests/src/com/android/launcher3/compat/TaplPromiseIconUiTest.java +++ b/tests/src/com/android/launcher3/compat/TaplPromiseIconUiTest.java @@ -19,9 +19,6 @@ import static com.android.launcher3.Flags.FLAG_ENABLE_SUPPORT_FOR_ARCHIVING; import static com.google.common.truth.Truth.assertThat; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; import android.content.pm.PackageInstaller.SessionParams; import android.content.pm.PackageManager; import android.graphics.Bitmap; @@ -170,13 +167,6 @@ public class TaplPromiseIconUiTest extends AbstractLauncherUiTest { mSessionId = -1; } - // Dummy receiver to fulfill archiving platform requirements, unused in reality. - public static class UnarchiveBroadcastReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - } - } - private void installDummyAppAndWaitForUIUpdate() throws IOException { TestUtil.installDummyApp(); mLauncher.waitForModelQueueCleared();