diff options
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/widget/Toast.java | 2 | ||||
| -rw-r--r-- | core/java/android/widget/ToastPresenter.java | 35 |
2 files changed, 34 insertions, 3 deletions
diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java index 436d6836d11e..7d97a91b7435 100644 --- a/core/java/android/widget/Toast.java +++ b/core/java/android/widget/Toast.java @@ -651,7 +651,7 @@ public class Toast { } }; - presenter.startLayoutParams(mParams); + presenter.startLayoutParams(mParams, packageName); } private List<Callback> getCallbacks() { diff --git a/core/java/android/widget/ToastPresenter.java b/core/java/android/widget/ToastPresenter.java index 654ab50a9ce5..0447b6bb9f11 100644 --- a/core/java/android/widget/ToastPresenter.java +++ b/core/java/android/widget/ToastPresenter.java @@ -18,6 +18,7 @@ package android.widget; import android.content.Context; import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.PixelFormat; import android.os.IBinder; import android.view.Gravity; @@ -28,6 +29,7 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import com.android.internal.R; +import com.android.internal.util.ArrayUtils; /** * Class responsible for toast presentation inside app's process and in system UI. @@ -39,17 +41,19 @@ public class ToastPresenter { private static final long LONG_DURATION_TIMEOUT = 7000; private final Context mContext; + private final Resources mResources; private final AccessibilityManager mAccessibilityManager; public ToastPresenter(Context context, AccessibilityManager accessibilityManager) { mContext = context; + mResources = context.getResources(); mAccessibilityManager = accessibilityManager; } /** * Initializes {@code params} with default values for toasts. */ - public void startLayoutParams(WindowManager.LayoutParams params) { + public void startLayoutParams(WindowManager.LayoutParams params, String packageName) { params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.format = PixelFormat.TRANSLUCENT; @@ -60,6 +64,7 @@ public class ToastPresenter { params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; + setShowForAllUsersIfApplicable(params, packageName); } /** @@ -69,7 +74,7 @@ public class ToastPresenter { public void adjustLayoutParams(WindowManager.LayoutParams params, IBinder windowToken, int duration, int gravity, int xOffset, int yOffset, float horizontalMargin, float verticalMargin) { - Configuration config = mContext.getResources().getConfiguration(); + Configuration config = mResources.getConfiguration(); int absGravity = Gravity.getAbsoluteGravity(gravity, config.getLayoutDirection()); params.gravity = absGravity; if ((absGravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) { @@ -89,6 +94,32 @@ public class ToastPresenter { } /** + * Sets {@link WindowManager.LayoutParams#SYSTEM_FLAG_SHOW_FOR_ALL_USERS} flag if {@code + * packageName} is a cross-user package. + * + * Implementation note: + * This code is safe to be executed in SystemUI and the app's process: + * <li>SystemUI: It's running on a trusted domain so apps can't tamper with it. SystemUI + * has the permission INTERNAL_SYSTEM_WINDOW needed by the flag, so SystemUI can add + * the flag on behalf of those packages, which all contain INTERNAL_SYSTEM_WINDOW + * permission. + * <li>App: The flag being added is protected behind INTERNAL_SYSTEM_WINDOW permission + * and any app can already add that flag via getWindowParams() if it has that + * permission, so we are just doing this automatically for cross-user packages. + */ + private void setShowForAllUsersIfApplicable(WindowManager.LayoutParams params, + String packageName) { + if (isCrossUserPackage(packageName)) { + params.privateFlags = WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS; + } + } + + private boolean isCrossUserPackage(String packageName) { + String[] packages = mResources.getStringArray(R.array.config_toastCrossUserPackages); + return ArrayUtils.contains(packages, packageName); + } + + /** * Returns the default text toast view for message {@code text}. */ public View getTextToastView(CharSequence text) { |
