diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index cf829009d5..68aa277cee 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -21,6 +21,7 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; +import static android.window.SplashScreen.SPLASH_SCREEN_STYLE_UNDEFINED; import static com.android.launcher3.AbstractFloatingView.TYPE_ALL; import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE; @@ -43,6 +44,7 @@ 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; @@ -95,10 +97,13 @@ import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.shared.TestProtocol; import com.android.launcher3.touch.ItemClickHandler; import com.android.launcher3.touch.ItemClickHandler.ItemClickProxy; +import com.android.launcher3.util.ActivityOptionsWrapper; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.DisplayController; +import com.android.launcher3.util.Executors; import com.android.launcher3.util.NavigationMode; import com.android.launcher3.util.PackageManagerHelper; +import com.android.launcher3.util.RunnableList; import com.android.launcher3.util.SettingsCache; import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource; import com.android.launcher3.util.TraceHelper; @@ -567,6 +572,22 @@ 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()); + options.setSplashScreenStyle(splashScreenStyle); + return new ActivityOptionsWrapper(options, callbacks); + } + + @Override + public ActivityOptionsWrapper getActivityLaunchOptions(View v, @Nullable ItemInfo item) { + return makeDefaultActivityOptions(SPLASH_SCREEN_STYLE_UNDEFINED); + } + /** * Sets a new data-source for this taskbar instance */ diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 65f449caba..79a301a88c 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -68,6 +68,7 @@ import android.content.Intent; import android.content.IntentSender; import android.content.SharedPreferences; import android.content.res.Configuration; +import android.graphics.Color; import android.graphics.Rect; import android.graphics.RectF; import android.hardware.SensorManager; @@ -143,6 +144,7 @@ import com.android.launcher3.uioverrides.touchcontrollers.TwoButtonNavbarTouchCo import com.android.launcher3.util.ActivityOptionsWrapper; import com.android.launcher3.util.ComponentKey; 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; @@ -343,14 +345,16 @@ public class QuickstepLauncher extends Launcher { } @Override - public boolean startActivitySafely(View v, Intent intent, ItemInfo item) { + public RunnableList startActivitySafely(View v, Intent intent, ItemInfo item) { // Only pause is taskbar controller is not present mHotseatPredictionController.setPauseUIUpdate(getTaskbarUIController() == null); - boolean started = super.startActivitySafely(v, intent, item); - if (getTaskbarUIController() == null && !started) { + RunnableList result = super.startActivitySafely(v, intent, item); + if (getTaskbarUIController() == null && result == null) { mHotseatPredictionController.setPauseUIUpdate(false); + } else { + result.add(() -> mHotseatPredictionController.setPauseUIUpdate(false)); } - return started; + return result; } @Override @@ -370,11 +374,6 @@ public class QuickstepLauncher extends Launcher { | ACTIVITY_STATE_USER_ACTIVE | ACTIVITY_STATE_TRANSITION_ACTIVE)) != 0) { onStateOrResumeChanging((getActivityFlags() & ACTIVITY_STATE_TRANSITION_ACTIVE) == 0); } - - if (((changeBits & ACTIVITY_STATE_STARTED) != 0 - || (changeBits & getActivityFlags() & ACTIVITY_STATE_DEFERRED_RESUMED) != 0)) { - mHotseatPredictionController.setPauseUIUpdate(false); - } } @Override @@ -1101,6 +1100,17 @@ public class QuickstepLauncher extends Launcher { return activityOptions; } + @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()); + options.setSplashScreenStyle(splashScreenStyle); + return new ActivityOptionsWrapper(options, callbacks); + } + @Override @BinderThread public void enterStageSplitFromRunningApp(boolean leftOrTop) { diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java index 45b03c2816..8876a1ba34 100644 --- a/src/com/android/launcher3/BaseDraggingActivity.java +++ b/src/com/android/launcher3/BaseDraggingActivity.java @@ -155,6 +155,13 @@ public abstract class BaseDraggingActivity extends BaseActivity return wrapper; } + @Override + public ActivityOptionsWrapper makeDefaultActivityOptions(int splashScreenStyle) { + ActivityOptionsWrapper wrapper = super.makeDefaultActivityOptions(splashScreenStyle); + addOnResumeCallback(wrapper.onEndCallback::executeAllAndDestroy); + return wrapper; + } + @Override protected void onStart() { super.onStart(); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index ffd56cc979..faf5c6a420 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2154,30 +2154,38 @@ public class Launcher extends StatefulActivity } @Override - public boolean startActivitySafely(View v, Intent intent, ItemInfo item) { + public RunnableList startActivitySafely(View v, Intent intent, ItemInfo item) { if (!hasBeenResumed()) { + RunnableList result = new RunnableList(); // Workaround an issue where the WM launch animation is clobbered when finishing the // recents animation into launcher. Defer launching the activity until Launcher is // next resumed. - addOnResumeCallback(() -> startActivitySafely(v, intent, item)); + addOnResumeCallback(() -> { + RunnableList actualResult = startActivitySafely(v, intent, item); + if (actualResult != null) { + actualResult.add(result::executeAllAndDestroy); + } else { + result.executeAllAndDestroy(); + } + }); if (mOnDeferredActivityLaunchCallback != null) { mOnDeferredActivityLaunchCallback.run(); mOnDeferredActivityLaunchCallback = null; } - return true; + return result; } - boolean success = super.startActivitySafely(v, intent, item); - if (success && v instanceof BubbleTextView) { + RunnableList result = super.startActivitySafely(v, intent, item); + if (result != null && v instanceof BubbleTextView) { // This is set to the view that launched the activity that navigated the user away // from launcher. Since there is no callback for when the activity has finished // launching, enable the press state and keep this reference to reset the press // state when we return to launcher. BubbleTextView btv = (BubbleTextView) v; btv.setStayPressed(true); - addOnResumeCallback(() -> btv.setStayPressed(false)); + result.add(() -> btv.setStayPressed(false)); } - return success; + return result; } boolean isHotseatLayout(View layout) { diff --git a/src/com/android/launcher3/allapps/search/DefaultSearchAdapterProvider.java b/src/com/android/launcher3/allapps/search/DefaultSearchAdapterProvider.java index 714304be3d..64fd2370cf 100644 --- a/src/com/android/launcher3/allapps/search/DefaultSearchAdapterProvider.java +++ b/src/com/android/launcher3/allapps/search/DefaultSearchAdapterProvider.java @@ -62,7 +62,8 @@ public class DefaultSearchAdapterProvider extends SearchAdapterProvider= 33 - && item != null - && item.animationType == LauncherSettings.Animation.DEFAULT_NO_ICON) { - optsBundle = ActivityOptions.makeBasic() - .setSplashScreenStyle(SplashScreen.SPLASH_SCREEN_STYLE_SOLID_COLOR).toBundle(); - } + ActivityOptionsWrapper options = v != null ? getActivityLaunchOptions(v, item) + : makeDefaultActivityOptions(item != null && item.animationType == DEFAULT_NO_ICON + ? SPLASH_SCREEN_STYLE_SOLID_COLOR : -1 /* SPLASH_SCREEN_STYLE_UNDEFINED */); UserHandle user = item == null ? null : item.user; - + Bundle optsBundle = options.toBundle(); // Prepare intent intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (v != null) { @@ -364,12 +361,12 @@ public interface ActivityContext { InstanceId instanceId = new InstanceIdSequence().newInstanceId(); logAppLaunch(getStatsLogManager(), item, instanceId); } - return true; + return options.onEndCallback; } catch (NullPointerException | ActivityNotFoundException | SecurityException e) { Toast.makeText(context, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); Log.e(TAG, "Unable to launch. tag=" + item + " intent=" + intent, e); } - return false; + return null; } /** Returns {@code true} if an app launch is blocked due to safe mode. */ @@ -416,6 +413,17 @@ public interface ActivityContext { return new ActivityOptionsWrapper(options, callback); } + /** + * Creates a default activity option and we do not want association with any launcher element. + */ + default ActivityOptionsWrapper makeDefaultActivityOptions(int splashScreenStyle) { + ActivityOptions options = ActivityOptions.makeBasic(); + if (Utilities.ATLEAST_T) { + options.setSplashScreenStyle(splashScreenStyle); + } + return new ActivityOptionsWrapper(options, new RunnableList()); + } + /** * Safely launches an intent for a shortcut. * diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index 64ad390f51..ba6165f8d2 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -281,7 +281,7 @@ public class OptionsPopupView extends ArrowPopup if (!TextUtils.isEmpty(pickerPackage)) { intent.setPackage(pickerPackage); } - return launcher.startActivitySafely(v, intent, placeholderInfo(intent)); + return launcher.startActivitySafely(v, intent, placeholderInfo(intent)) != null; } static WorkspaceItemInfo placeholderInfo(Intent intent) {