Loading core/java/android/widget/Toast.java +1 −1 Original line number Diff line number Diff line Loading @@ -651,7 +651,7 @@ public class Toast { } }; presenter.startLayoutParams(mParams); presenter.startLayoutParams(mParams, packageName); } private List<Callback> getCallbacks() { Loading core/java/android/widget/ToastPresenter.java +33 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. Loading @@ -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; Loading @@ -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); } /** Loading @@ -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) { Loading @@ -88,6 +93,32 @@ public class ToastPresenter { params.token = windowToken; } /** * 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}. */ Loading core/res/res/values/config.xml +9 −0 Original line number Diff line number Diff line Loading @@ -4414,4 +4414,13 @@ <!-- Whether to default to an expanded list of users on the lock screen user switcher. --> <bool name="config_expandLockScreenUserSwitcher">false</bool> <!-- Toasts posted from these packages will be shown to the current user, regardless of the user the process belongs to. This is useful for packages that run under a single user but serve multiple users, e.g. the system. These packages MUST be able to add flag SYSTEM_FLAG_SHOW_FOR_ALL_USERS to a window. --> <string-array name="config_toastCrossUserPackages" translatable="false"> <item>android</item> <item>com.android.systemui</item> </string-array> </resources> core/res/res/values/symbols.xml +2 −0 Original line number Diff line number Diff line Loading @@ -3904,4 +3904,6 @@ <java-symbol type="bool" name="config_expandLockScreenUserSwitcher" /> <java-symbol type="string" name="loading" /> <java-symbol type="array" name="config_toastCrossUserPackages" /> </resources> packages/SystemUI/src/com/android/systemui/toast/ToastUI.java +3 −3 Original line number Diff line number Diff line Loading @@ -95,7 +95,7 @@ public class ToastUI extends SystemUI implements CommandQueue.Callbacks { hideCurrentToast(); } View view = mPresenter.getTextToastView(text); LayoutParams params = getLayoutParams(windowToken, duration); LayoutParams params = getLayoutParams(packageName, windowToken, duration); mCurrentToast = new ToastEntry(packageName, token, view, windowToken, callback); try { mWindowManager.addView(view, params); Loading Loading @@ -145,9 +145,9 @@ public class ToastUI extends SystemUI implements CommandQueue.Callbacks { mCurrentToast = null; } private LayoutParams getLayoutParams(IBinder windowToken, int duration) { private LayoutParams getLayoutParams(String packageName, IBinder windowToken, int duration) { WindowManager.LayoutParams params = new WindowManager.LayoutParams(); mPresenter.startLayoutParams(params); mPresenter.startLayoutParams(params, packageName); int gravity = mContext.getResources().getInteger( com.android.internal.R.integer.config_toastDefaultGravity); int yOffset = mContext.getResources().getDimensionPixelSize(R.dimen.toast_y_offset); Loading Loading
core/java/android/widget/Toast.java +1 −1 Original line number Diff line number Diff line Loading @@ -651,7 +651,7 @@ public class Toast { } }; presenter.startLayoutParams(mParams); presenter.startLayoutParams(mParams, packageName); } private List<Callback> getCallbacks() { Loading
core/java/android/widget/ToastPresenter.java +33 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. Loading @@ -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; Loading @@ -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); } /** Loading @@ -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) { Loading @@ -88,6 +93,32 @@ public class ToastPresenter { params.token = windowToken; } /** * 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}. */ Loading
core/res/res/values/config.xml +9 −0 Original line number Diff line number Diff line Loading @@ -4414,4 +4414,13 @@ <!-- Whether to default to an expanded list of users on the lock screen user switcher. --> <bool name="config_expandLockScreenUserSwitcher">false</bool> <!-- Toasts posted from these packages will be shown to the current user, regardless of the user the process belongs to. This is useful for packages that run under a single user but serve multiple users, e.g. the system. These packages MUST be able to add flag SYSTEM_FLAG_SHOW_FOR_ALL_USERS to a window. --> <string-array name="config_toastCrossUserPackages" translatable="false"> <item>android</item> <item>com.android.systemui</item> </string-array> </resources>
core/res/res/values/symbols.xml +2 −0 Original line number Diff line number Diff line Loading @@ -3904,4 +3904,6 @@ <java-symbol type="bool" name="config_expandLockScreenUserSwitcher" /> <java-symbol type="string" name="loading" /> <java-symbol type="array" name="config_toastCrossUserPackages" /> </resources>
packages/SystemUI/src/com/android/systemui/toast/ToastUI.java +3 −3 Original line number Diff line number Diff line Loading @@ -95,7 +95,7 @@ public class ToastUI extends SystemUI implements CommandQueue.Callbacks { hideCurrentToast(); } View view = mPresenter.getTextToastView(text); LayoutParams params = getLayoutParams(windowToken, duration); LayoutParams params = getLayoutParams(packageName, windowToken, duration); mCurrentToast = new ToastEntry(packageName, token, view, windowToken, callback); try { mWindowManager.addView(view, params); Loading Loading @@ -145,9 +145,9 @@ public class ToastUI extends SystemUI implements CommandQueue.Callbacks { mCurrentToast = null; } private LayoutParams getLayoutParams(IBinder windowToken, int duration) { private LayoutParams getLayoutParams(String packageName, IBinder windowToken, int duration) { WindowManager.LayoutParams params = new WindowManager.LayoutParams(); mPresenter.startLayoutParams(params); mPresenter.startLayoutParams(params, packageName); int gravity = mContext.getResources().getInteger( com.android.internal.R.integer.config_toastDefaultGravity); int yOffset = mContext.getResources().getDimensionPixelSize(R.dimen.toast_y_offset); Loading