diff options
573 files changed, 8238 insertions, 4866 deletions
diff --git a/api/current.txt b/api/current.txt index 79469ca1f1ba..dd22a402d362 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5802,6 +5802,7 @@ package android.app.admin { method public void lockNow(); method public void removeActiveAdmin(android.content.ComponentName); method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); + method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); method public boolean removeUser(android.content.ComponentName, android.os.UserHandle); method public boolean resetPassword(java.lang.String, int); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); @@ -9424,6 +9425,8 @@ package android.content.pm { method public abstract int getComponentEnabledSetting(android.content.ComponentName); method public abstract android.graphics.drawable.Drawable getDefaultActivityIcon(); method public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo); + method public abstract byte[] getEphemeralCookie(); + method public abstract int getEphemeralCookieMaxSizeBytes(); method public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int); method public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int); method public abstract java.lang.String getInstallerPackageName(java.lang.String); @@ -9455,6 +9458,7 @@ package android.content.pm { method public abstract java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle); method public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo); method public abstract boolean hasSystemFeature(java.lang.String); + method public abstract boolean isEphemeralApplication(); method public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String); method public abstract boolean isSafeMode(); method public abstract java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int); @@ -9472,6 +9476,7 @@ package android.content.pm { method public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, int); method public abstract void setApplicationEnabledSetting(java.lang.String, int, int); method public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int); + method public abstract boolean setEphemeralCookie(byte[]); method public abstract void setInstallerPackageName(java.lang.String, java.lang.String); method public abstract void verifyPendingInstall(int, int); field public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0; // 0x0 @@ -11536,6 +11541,7 @@ package android.graphics { field public static final int PRIVATE = 34; // 0x22 field public static final int RAW10 = 37; // 0x25 field public static final int RAW12 = 38; // 0x26 + field public static final int RAW_PRIVATE = 36; // 0x24 field public static final int RAW_SENSOR = 32; // 0x20 field public static final int RGB_565 = 4; // 0x4 field public static final int UNKNOWN = 0; // 0x0 @@ -29689,6 +29695,7 @@ package android.provider { field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/email_v2"; field public static final android.net.Uri CONTENT_URI; field public static final java.lang.String DISPLAY_NAME = "data4"; + field public static final android.net.Uri ENTERPRISE_CONTENT_FILTER_URI; field public static final android.net.Uri ENTERPRISE_CONTENT_LOOKUP_URI; field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX"; field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS"; @@ -35210,6 +35217,7 @@ package android.telephony { field public static final java.lang.String KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL = "voicemail_notification_persistent_bool"; field public static final java.lang.String KEY_VOICE_PRIVACY_DISABLE_UI_BOOL = "voice_privacy_disable_ui_bool"; field public static final java.lang.String KEY_VOLTE_REPLACEMENT_RAT_INT = "volte_replacement_rat_int"; + field public static final java.lang.String KEY_VVM_CELLULAR_DATA_REQUIRED_BOOLEAN = "vvm_cellular_data_required"; field public static final java.lang.String KEY_VVM_DESTINATION_NUMBER_STRING = "vvm_destination_number_string"; field public static final java.lang.String KEY_VVM_PORT_NUMBER_INT = "vvm_port_number_int"; field public static final java.lang.String KEY_VVM_TYPE_STRING = "vvm_type_string"; @@ -36413,6 +36421,8 @@ package android.test.mock { method public android.graphics.drawable.Drawable getDefaultActivityIcon(); method public java.lang.String getDefaultBrowserPackageName(int); method public android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo); + method public byte[] getEphemeralCookie(); + method public int getEphemeralCookieMaxSizeBytes(); method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int); method public java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int); method public java.lang.String getInstallerPackageName(java.lang.String); @@ -36443,6 +36453,7 @@ package android.test.mock { method public java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle); method public android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo); method public boolean hasSystemFeature(java.lang.String); + method public boolean isEphemeralApplication(); method public boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String); method public boolean isSafeMode(); method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int); @@ -36461,6 +36472,7 @@ package android.test.mock { method public void setApplicationEnabledSetting(java.lang.String, int, int); method public void setComponentEnabledSetting(android.content.ComponentName, int, int); method public boolean setDefaultBrowserPackageName(java.lang.String, int); + method public boolean setEphemeralCookie(byte[]); method public void setInstallerPackageName(java.lang.String, java.lang.String); method public void verifyPendingInstall(int, int); } @@ -38687,9 +38699,9 @@ package android.util { method public int describeContents(); method public static android.util.LocaleList forLanguageTags(java.lang.String); method public java.util.Locale get(int); - method public java.util.Locale getBestMatch(java.lang.String[]); method public static android.util.LocaleList getDefault(); method public static android.util.LocaleList getEmptyLocaleList(); + method public java.util.Locale getFirstMatch(java.lang.String[]); method public java.util.Locale getPrimary(); method public boolean isEmpty(); method public int size(); @@ -40539,7 +40551,6 @@ package android.view { method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(); method public void createContextMenu(android.view.ContextMenu); method public void destroyDrawingCache(); - method public final boolean didLayoutParamsChange(); method public android.view.WindowInsets dispatchApplyWindowInsets(android.view.WindowInsets); method public void dispatchConfigurationChanged(android.content.res.Configuration); method public void dispatchDisplayHint(int); @@ -40765,7 +40776,6 @@ package android.view { method public boolean isOpaque(); method protected boolean isPaddingOffsetRequired(); method public boolean isPaddingRelative(); - method public final boolean isPartialLayoutRequested(); method public boolean isPressed(); method public boolean isSaveEnabled(); method public boolean isSaveFromParentEnabled(); @@ -41377,7 +41387,6 @@ package android.view { method protected void dispatchThawSelfOnly(android.util.SparseArray<android.os.Parcelable>); method protected boolean drawChild(android.graphics.Canvas, android.view.View, long); method public void endViewTransition(android.view.View); - method public int findDependentLayoutAxes(android.view.View, int); method public android.view.View focusSearch(android.view.View, int); method public void focusableViewAvailable(android.view.View); method public boolean gatherTransparentRegion(android.graphics.Region); @@ -41444,8 +41453,6 @@ package android.view { method public void requestChildFocus(android.view.View, android.view.View); method public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean); method public void requestDisallowInterceptTouchEvent(boolean); - method public void requestLayoutForChild(android.view.View); - method public void requestPartialLayoutForChild(android.view.View); method public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent); method public void requestTransparentRegion(android.view.View); method public void scheduleLayoutAnimation(); @@ -41560,7 +41567,6 @@ package android.view { method public abstract void childHasTransientStateChanged(android.view.View, boolean); method public abstract void clearChildFocus(android.view.View); method public abstract void createContextMenu(android.view.ContextMenu); - method public abstract int findDependentLayoutAxes(android.view.View, int); method public abstract android.view.View focusSearch(android.view.View, int); method public abstract void focusableViewAvailable(android.view.View); method public abstract boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point); @@ -41590,16 +41596,12 @@ package android.view { method public abstract void requestDisallowInterceptTouchEvent(boolean); method public abstract void requestFitSystemWindows(); method public abstract void requestLayout(); - method public abstract void requestLayoutForChild(android.view.View); method public abstract boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent); method public abstract void requestTransparentRegion(android.view.View); method public abstract boolean showContextMenuForChild(android.view.View); method public abstract boolean showContextMenuForChild(android.view.View, float, float); method public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback); method public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback, int); - field public static final int FLAG_LAYOUT_AXIS_ANY = 3; // 0x3 - field public static final int FLAG_LAYOUT_AXIS_HORIZONTAL = 1; // 0x1 - field public static final int FLAG_LAYOUT_AXIS_VERTICAL = 2; // 0x2 } public class ViewPropertyAnimator { @@ -41830,8 +41832,6 @@ package android.view { method public abstract void setContentView(int); method public abstract void setContentView(android.view.View); method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams); - method public abstract void setDecorView(android.view.View); - method public abstract void setDecorView(int); method protected void setDefaultWindowFormat(int); method public void setDimAmount(float); method public void setElevation(float); @@ -49925,7 +49925,6 @@ package java.lang.ref { public abstract class Reference { method public void clear(); method public boolean enqueue(); - method public final synchronized boolean enqueueInternal(); method public T get(); method public boolean isEnqueued(); } diff --git a/api/system-current.txt b/api/system-current.txt index 803e41fd4d78..ee20e5bca9fb 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5935,6 +5935,7 @@ package android.app.admin { method public void notifyPendingSystemUpdate(long); method public void removeActiveAdmin(android.content.ComponentName); method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); + method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); method public boolean removeUser(android.content.ComponentName, android.os.UserHandle); method public boolean resetPassword(java.lang.String, int); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); @@ -9718,6 +9719,8 @@ package android.content.pm { method public abstract int getComponentEnabledSetting(android.content.ComponentName); method public abstract android.graphics.drawable.Drawable getDefaultActivityIcon(); method public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo); + method public abstract byte[] getEphemeralCookie(); + method public abstract int getEphemeralCookieMaxSizeBytes(); method public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int); method public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int); method public abstract java.lang.String getInstallerPackageName(java.lang.String); @@ -9751,6 +9754,7 @@ package android.content.pm { method public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo); method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle); method public abstract boolean hasSystemFeature(java.lang.String); + method public abstract boolean isEphemeralApplication(); method public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String); method public abstract boolean isSafeMode(); method public abstract java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int); @@ -9770,6 +9774,7 @@ package android.content.pm { method public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle); method public abstract void setApplicationEnabledSetting(java.lang.String, int, int); method public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int); + method public abstract boolean setEphemeralCookie(byte[]); method public abstract void setInstallerPackageName(java.lang.String, java.lang.String); method public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle); method public abstract void verifyIntentFilter(int, int, java.util.List<java.lang.String>); @@ -11883,6 +11888,7 @@ package android.graphics { field public static final int PRIVATE = 34; // 0x22 field public static final int RAW10 = 37; // 0x25 field public static final int RAW12 = 38; // 0x26 + field public static final int RAW_PRIVATE = 36; // 0x24 field public static final int RAW_SENSOR = 32; // 0x20 field public static final int RGB_565 = 4; // 0x4 field public static final int UNKNOWN = 0; // 0x0 @@ -21410,7 +21416,6 @@ package android.media { method public void setOnKeyStatusChangeListener(android.media.MediaDrm.OnKeyStatusChangeListener, android.os.Handler); method public void setPropertyByteArray(java.lang.String, byte[]); method public void setPropertyString(java.lang.String, java.lang.String); - method public void unprovisionDevice(); field public static final int EVENT_KEY_EXPIRED = 3; // 0x3 field public static final int EVENT_KEY_REQUIRED = 2; // 0x2 field public static final deprecated int EVENT_PROVISION_REQUIRED = 1; // 0x1 @@ -31684,6 +31689,7 @@ package android.provider { field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/email_v2"; field public static final android.net.Uri CONTENT_URI; field public static final java.lang.String DISPLAY_NAME = "data4"; + field public static final android.net.Uri ENTERPRISE_CONTENT_FILTER_URI; field public static final android.net.Uri ENTERPRISE_CONTENT_LOOKUP_URI; field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX"; field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS"; @@ -37484,6 +37490,7 @@ package android.telephony { field public static final java.lang.String KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL = "voicemail_notification_persistent_bool"; field public static final java.lang.String KEY_VOICE_PRIVACY_DISABLE_UI_BOOL = "voice_privacy_disable_ui_bool"; field public static final java.lang.String KEY_VOLTE_REPLACEMENT_RAT_INT = "volte_replacement_rat_int"; + field public static final java.lang.String KEY_VVM_CELLULAR_DATA_REQUIRED_BOOLEAN = "vvm_cellular_data_required"; field public static final java.lang.String KEY_VVM_DESTINATION_NUMBER_STRING = "vvm_destination_number_string"; field public static final java.lang.String KEY_VVM_PORT_NUMBER_INT = "vvm_port_number_int"; field public static final java.lang.String KEY_VVM_TYPE_STRING = "vvm_type_string"; @@ -38746,6 +38753,8 @@ package android.test.mock { method public android.graphics.drawable.Drawable getDefaultActivityIcon(); method public java.lang.String getDefaultBrowserPackageName(int); method public android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo); + method public byte[] getEphemeralCookie(); + method public int getEphemeralCookieMaxSizeBytes(); method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int); method public java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int); method public java.lang.String getInstallerPackageName(java.lang.String); @@ -38778,6 +38787,7 @@ package android.test.mock { method public android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo); method public void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle); method public boolean hasSystemFeature(java.lang.String); + method public boolean isEphemeralApplication(); method public boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String); method public boolean isSafeMode(); method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int); @@ -38798,6 +38808,7 @@ package android.test.mock { method public void setApplicationEnabledSetting(java.lang.String, int, int); method public void setComponentEnabledSetting(android.content.ComponentName, int, int); method public boolean setDefaultBrowserPackageName(java.lang.String, int); + method public boolean setEphemeralCookie(byte[]); method public void setInstallerPackageName(java.lang.String, java.lang.String); method public void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle); method public void verifyIntentFilter(int, int, java.util.List<java.lang.String>); @@ -41026,9 +41037,9 @@ package android.util { method public int describeContents(); method public static android.util.LocaleList forLanguageTags(java.lang.String); method public java.util.Locale get(int); - method public java.util.Locale getBestMatch(java.lang.String[]); method public static android.util.LocaleList getDefault(); method public static android.util.LocaleList getEmptyLocaleList(); + method public java.util.Locale getFirstMatch(java.lang.String[]); method public java.util.Locale getPrimary(); method public boolean isEmpty(); method public int size(); @@ -42878,7 +42889,6 @@ package android.view { method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(); method public void createContextMenu(android.view.ContextMenu); method public void destroyDrawingCache(); - method public final boolean didLayoutParamsChange(); method public android.view.WindowInsets dispatchApplyWindowInsets(android.view.WindowInsets); method public void dispatchConfigurationChanged(android.content.res.Configuration); method public void dispatchDisplayHint(int); @@ -43104,7 +43114,6 @@ package android.view { method public boolean isOpaque(); method protected boolean isPaddingOffsetRequired(); method public boolean isPaddingRelative(); - method public final boolean isPartialLayoutRequested(); method public boolean isPressed(); method public boolean isSaveEnabled(); method public boolean isSaveFromParentEnabled(); @@ -43716,7 +43725,6 @@ package android.view { method protected void dispatchThawSelfOnly(android.util.SparseArray<android.os.Parcelable>); method protected boolean drawChild(android.graphics.Canvas, android.view.View, long); method public void endViewTransition(android.view.View); - method public int findDependentLayoutAxes(android.view.View, int); method public android.view.View focusSearch(android.view.View, int); method public void focusableViewAvailable(android.view.View); method public boolean gatherTransparentRegion(android.graphics.Region); @@ -43783,8 +43791,6 @@ package android.view { method public void requestChildFocus(android.view.View, android.view.View); method public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean); method public void requestDisallowInterceptTouchEvent(boolean); - method public void requestLayoutForChild(android.view.View); - method public void requestPartialLayoutForChild(android.view.View); method public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent); method public void requestTransparentRegion(android.view.View); method public void scheduleLayoutAnimation(); @@ -43899,7 +43905,6 @@ package android.view { method public abstract void childHasTransientStateChanged(android.view.View, boolean); method public abstract void clearChildFocus(android.view.View); method public abstract void createContextMenu(android.view.ContextMenu); - method public abstract int findDependentLayoutAxes(android.view.View, int); method public abstract android.view.View focusSearch(android.view.View, int); method public abstract void focusableViewAvailable(android.view.View); method public abstract boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point); @@ -43929,16 +43934,12 @@ package android.view { method public abstract void requestDisallowInterceptTouchEvent(boolean); method public abstract void requestFitSystemWindows(); method public abstract void requestLayout(); - method public abstract void requestLayoutForChild(android.view.View); method public abstract boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent); method public abstract void requestTransparentRegion(android.view.View); method public abstract boolean showContextMenuForChild(android.view.View); method public abstract boolean showContextMenuForChild(android.view.View, float, float); method public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback); method public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback, int); - field public static final int FLAG_LAYOUT_AXIS_ANY = 3; // 0x3 - field public static final int FLAG_LAYOUT_AXIS_HORIZONTAL = 1; // 0x1 - field public static final int FLAG_LAYOUT_AXIS_VERTICAL = 2; // 0x2 } public class ViewPropertyAnimator { @@ -44169,8 +44170,6 @@ package android.view { method public abstract void setContentView(int); method public abstract void setContentView(android.view.View); method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams); - method public abstract void setDecorView(android.view.View); - method public abstract void setDecorView(int); method protected void setDefaultWindowFormat(int); method public void setDimAmount(float); method public void setDisableWallpaperTouchEvents(boolean); @@ -52580,7 +52579,6 @@ package java.lang.ref { public abstract class Reference { method public void clear(); method public boolean enqueue(); - method public final synchronized boolean enqueueInternal(); method public T get(); method public boolean isEnqueued(); } diff --git a/api/test-current.txt b/api/test-current.txt index 012c7f40dcf1..032507b122ac 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -5802,6 +5802,7 @@ package android.app.admin { method public void lockNow(); method public void removeActiveAdmin(android.content.ComponentName); method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); + method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); method public boolean removeUser(android.content.ComponentName, android.os.UserHandle); method public boolean resetPassword(java.lang.String, int); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); @@ -9424,6 +9425,8 @@ package android.content.pm { method public abstract int getComponentEnabledSetting(android.content.ComponentName); method public abstract android.graphics.drawable.Drawable getDefaultActivityIcon(); method public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo); + method public abstract byte[] getEphemeralCookie(); + method public abstract int getEphemeralCookieMaxSizeBytes(); method public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int); method public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int); method public abstract java.lang.String getInstallerPackageName(java.lang.String); @@ -9455,6 +9458,7 @@ package android.content.pm { method public abstract java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle); method public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo); method public abstract boolean hasSystemFeature(java.lang.String); + method public abstract boolean isEphemeralApplication(); method public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String); method public abstract boolean isSafeMode(); method public abstract java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int); @@ -9472,6 +9476,7 @@ package android.content.pm { method public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, int); method public abstract void setApplicationEnabledSetting(java.lang.String, int, int); method public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int); + method public abstract boolean setEphemeralCookie(byte[]); method public abstract void setInstallerPackageName(java.lang.String, java.lang.String); method public abstract void verifyPendingInstall(int, int); field public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0; // 0x0 @@ -11536,6 +11541,7 @@ package android.graphics { field public static final int PRIVATE = 34; // 0x22 field public static final int RAW10 = 37; // 0x25 field public static final int RAW12 = 38; // 0x26 + field public static final int RAW_PRIVATE = 36; // 0x24 field public static final int RAW_SENSOR = 32; // 0x20 field public static final int RGB_565 = 4; // 0x4 field public static final int UNKNOWN = 0; // 0x0 @@ -29691,6 +29697,7 @@ package android.provider { field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/email_v2"; field public static final android.net.Uri CONTENT_URI; field public static final java.lang.String DISPLAY_NAME = "data4"; + field public static final android.net.Uri ENTERPRISE_CONTENT_FILTER_URI; field public static final android.net.Uri ENTERPRISE_CONTENT_LOOKUP_URI; field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX = "android.provider.extra.ADDRESS_BOOK_INDEX"; field public static final java.lang.String EXTRA_ADDRESS_BOOK_INDEX_COUNTS = "android.provider.extra.ADDRESS_BOOK_INDEX_COUNTS"; @@ -35212,6 +35219,7 @@ package android.telephony { field public static final java.lang.String KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL = "voicemail_notification_persistent_bool"; field public static final java.lang.String KEY_VOICE_PRIVACY_DISABLE_UI_BOOL = "voice_privacy_disable_ui_bool"; field public static final java.lang.String KEY_VOLTE_REPLACEMENT_RAT_INT = "volte_replacement_rat_int"; + field public static final java.lang.String KEY_VVM_CELLULAR_DATA_REQUIRED_BOOLEAN = "vvm_cellular_data_required"; field public static final java.lang.String KEY_VVM_DESTINATION_NUMBER_STRING = "vvm_destination_number_string"; field public static final java.lang.String KEY_VVM_PORT_NUMBER_INT = "vvm_port_number_int"; field public static final java.lang.String KEY_VVM_TYPE_STRING = "vvm_type_string"; @@ -36415,6 +36423,8 @@ package android.test.mock { method public android.graphics.drawable.Drawable getDefaultActivityIcon(); method public java.lang.String getDefaultBrowserPackageName(int); method public android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo); + method public byte[] getEphemeralCookie(); + method public int getEphemeralCookieMaxSizeBytes(); method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int); method public java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int); method public java.lang.String getInstallerPackageName(java.lang.String); @@ -36445,6 +36455,7 @@ package android.test.mock { method public java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle); method public android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo); method public boolean hasSystemFeature(java.lang.String); + method public boolean isEphemeralApplication(); method public boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String); method public boolean isSafeMode(); method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int); @@ -36463,6 +36474,7 @@ package android.test.mock { method public void setApplicationEnabledSetting(java.lang.String, int, int); method public void setComponentEnabledSetting(android.content.ComponentName, int, int); method public boolean setDefaultBrowserPackageName(java.lang.String, int); + method public boolean setEphemeralCookie(byte[]); method public void setInstallerPackageName(java.lang.String, java.lang.String); method public void verifyPendingInstall(int, int); } @@ -38689,9 +38701,9 @@ package android.util { method public int describeContents(); method public static android.util.LocaleList forLanguageTags(java.lang.String); method public java.util.Locale get(int); - method public java.util.Locale getBestMatch(java.lang.String[]); method public static android.util.LocaleList getDefault(); method public static android.util.LocaleList getEmptyLocaleList(); + method public java.util.Locale getFirstMatch(java.lang.String[]); method public java.util.Locale getPrimary(); method public boolean isEmpty(); method public int size(); @@ -40541,7 +40553,6 @@ package android.view { method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(); method public void createContextMenu(android.view.ContextMenu); method public void destroyDrawingCache(); - method public final boolean didLayoutParamsChange(); method public android.view.WindowInsets dispatchApplyWindowInsets(android.view.WindowInsets); method public void dispatchConfigurationChanged(android.content.res.Configuration); method public void dispatchDisplayHint(int); @@ -40767,7 +40778,6 @@ package android.view { method public boolean isOpaque(); method protected boolean isPaddingOffsetRequired(); method public boolean isPaddingRelative(); - method public final boolean isPartialLayoutRequested(); method public boolean isPressed(); method public boolean isSaveEnabled(); method public boolean isSaveFromParentEnabled(); @@ -41379,7 +41389,6 @@ package android.view { method protected void dispatchThawSelfOnly(android.util.SparseArray<android.os.Parcelable>); method protected boolean drawChild(android.graphics.Canvas, android.view.View, long); method public void endViewTransition(android.view.View); - method public int findDependentLayoutAxes(android.view.View, int); method public android.view.View focusSearch(android.view.View, int); method public void focusableViewAvailable(android.view.View); method public boolean gatherTransparentRegion(android.graphics.Region); @@ -41446,8 +41455,6 @@ package android.view { method public void requestChildFocus(android.view.View, android.view.View); method public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean); method public void requestDisallowInterceptTouchEvent(boolean); - method public void requestLayoutForChild(android.view.View); - method public void requestPartialLayoutForChild(android.view.View); method public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent); method public void requestTransparentRegion(android.view.View); method public void scheduleLayoutAnimation(); @@ -41562,7 +41569,6 @@ package android.view { method public abstract void childHasTransientStateChanged(android.view.View, boolean); method public abstract void clearChildFocus(android.view.View); method public abstract void createContextMenu(android.view.ContextMenu); - method public abstract int findDependentLayoutAxes(android.view.View, int); method public abstract android.view.View focusSearch(android.view.View, int); method public abstract void focusableViewAvailable(android.view.View); method public abstract boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point); @@ -41592,16 +41598,12 @@ package android.view { method public abstract void requestDisallowInterceptTouchEvent(boolean); method public abstract void requestFitSystemWindows(); method public abstract void requestLayout(); - method public abstract void requestLayoutForChild(android.view.View); method public abstract boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent); method public abstract void requestTransparentRegion(android.view.View); method public abstract boolean showContextMenuForChild(android.view.View); method public abstract boolean showContextMenuForChild(android.view.View, float, float); method public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback); method public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback, int); - field public static final int FLAG_LAYOUT_AXIS_ANY = 3; // 0x3 - field public static final int FLAG_LAYOUT_AXIS_HORIZONTAL = 1; // 0x1 - field public static final int FLAG_LAYOUT_AXIS_VERTICAL = 2; // 0x2 } public class ViewPropertyAnimator { @@ -41832,8 +41834,6 @@ package android.view { method public abstract void setContentView(int); method public abstract void setContentView(android.view.View); method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams); - method public abstract void setDecorView(android.view.View); - method public abstract void setDecorView(int); method protected void setDefaultWindowFormat(int); method public void setDimAmount(float); method public void setElevation(float); @@ -49927,7 +49927,6 @@ package java.lang.ref { public abstract class Reference { method public void clear(); method public boolean enqueue(); - method public final synchronized boolean enqueueInternal(); method public T get(); method public boolean isEnqueued(); } diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 544fd6a702cf..ad1b3b5013b7 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -16,11 +16,11 @@ package com.android.commands.pm; -import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; -import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK; +import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER; +import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; import android.accounts.IAccountManager; import android.app.ActivityManager; @@ -139,19 +139,19 @@ public final class Pm { } if ("install-create".equals(op)) { - return runInstallSession(); + return runInstallCreate(); } if ("install-write".equals(op)) { - return runInstallSession(); + return runInstallWrite(); } if ("install-commit".equals(op)) { - return runInstallSession(); + return runInstallCommit(); } if ("install-abandon".equals(op) || "install-destroy".equals(op)) { - return runInstallSession(); + return runInstallAbandon(); } if ("set-installer".equals(op)) { @@ -346,21 +346,203 @@ public final class Pm { throw new IllegalArgumentException("ABI " + abi + " not supported on this device"); } - private void writeSessionFile(int sessionId, String path, long sizeBytes) throws RemoteException { + /* + * Keep this around to support existing users of the "pm install" command that may not be + * able to be updated [or, at least informed the API has changed] such as ddmlib. + * + * Moving the implementation of "pm install" to "cmd package install" changes the executing + * context. Instead of being a stand alone process, "cmd package install" runs in the + * system_server process. Due to SELinux rules, system_server cannot access many directories; + * one of which being the package install staging directory [/data/local/tmp]. + * + * The use of "adb install" or "cmd package install" over "pm install" is highly encouraged. + */ + private int runInstall() throws RemoteException { + final InstallParams params = makeInstallParams(); + final int sessionId = doCreateSession(params.sessionParams, + params.installerPackageName, params.userId); + + try { + final String inPath = nextArg(); + if (inPath == null && params.sessionParams.sizeBytes == 0) { + System.err.println("Error: must either specify a package size or an APK file"); + return 1; + } + if (doWriteSession(sessionId, inPath, params.sessionParams.sizeBytes, "base.apk", + false /*logSuccess*/) != PackageInstaller.STATUS_SUCCESS) { + return 1; + } + if (doCommitSession(sessionId, false /*logSuccess*/) + != PackageInstaller.STATUS_SUCCESS) { + return 1; + } + return 0; + } finally { + try { + mInstaller.abandonSession(sessionId); + } catch (Exception ignore) { + } + } + } + + private int runInstallAbandon() throws RemoteException { + final int sessionId = Integer.parseInt(nextArg()); + return doAbandonSession(sessionId, true /*logSuccess*/); + } + + private int runInstallCommit() throws RemoteException { + final int sessionId = Integer.parseInt(nextArg()); + return doCommitSession(sessionId, true /*logSuccess*/); + } + + private int runInstallCreate() throws RemoteException { + final InstallParams installParams = makeInstallParams(); + final int sessionId = doCreateSession(installParams.sessionParams, + installParams.installerPackageName, installParams.userId); + + // NOTE: adb depends on parsing this string + System.out.println("Success: created install session [" + sessionId + "]"); + return PackageInstaller.STATUS_SUCCESS; + } + + private int runInstallWrite() throws RemoteException { + long sizeBytes = -1; + + String opt; + while ((opt = nextOption()) != null) { + if (opt.equals("-S")) { + sizeBytes = Long.parseLong(nextArg()); + } else { + throw new IllegalArgumentException("Unknown option: " + opt); + } + } + + final int sessionId = Integer.parseInt(nextArg()); + final String splitName = nextArg(); + final String path = nextArg(); + return doWriteSession(sessionId, path, sizeBytes, splitName, true /*logSuccess*/); + } + + private static class InstallParams { + SessionParams sessionParams; + String installerPackageName; + int userId = UserHandle.USER_ALL; + } + + private InstallParams makeInstallParams() { + final SessionParams sessionParams = new SessionParams(SessionParams.MODE_FULL_INSTALL); + final InstallParams params = new InstallParams(); + params.sessionParams = sessionParams; + String opt; + while ((opt = nextOption()) != null) { + switch (opt) { + case "-l": + sessionParams.installFlags |= PackageManager.INSTALL_FORWARD_LOCK; + break; + case "-r": + sessionParams.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; + break; + case "-i": + params.installerPackageName = nextArg(); + if (params.installerPackageName == null) { + throw new IllegalArgumentException("Missing installer package"); + } + break; + case "-t": + sessionParams.installFlags |= PackageManager.INSTALL_ALLOW_TEST; + break; + case "-s": + sessionParams.installFlags |= PackageManager.INSTALL_EXTERNAL; + break; + case "-f": + sessionParams.installFlags |= PackageManager.INSTALL_INTERNAL; + break; + case "-d": + sessionParams.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE; + break; + case "-g": + sessionParams.installFlags |= PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS; + break; + case "--originating-uri": + sessionParams.originatingUri = Uri.parse(nextOptionData()); + break; + case "--referrer": + sessionParams.referrerUri = Uri.parse(nextOptionData()); + break; + case "-p": + sessionParams.mode = SessionParams.MODE_INHERIT_EXISTING; + sessionParams.appPackageName = nextOptionData(); + if (sessionParams.appPackageName == null) { + throw new IllegalArgumentException("Missing inherit package name"); + } + break; + case "-S": + sessionParams.setSize(Long.parseLong(nextOptionData())); + break; + case "--abi": + sessionParams.abiOverride = checkAbiArgument(nextOptionData()); + break; + case "--ephemeral": + sessionParams.installFlags |= PackageManager.INSTALL_EPHEMERAL; + break; + case "--user": + params.userId = UserHandle.parseUserArg(nextOptionData()); + break; + case "--install-location": + sessionParams.installLocation = Integer.parseInt(nextOptionData()); + break; + case "--force-uuid": + sessionParams.installFlags |= PackageManager.INSTALL_FORCE_VOLUME_UUID; + sessionParams.volumeUuid = nextOptionData(); + if ("internal".equals(sessionParams.volumeUuid)) { + sessionParams.volumeUuid = null; + } + break; + default: + throw new IllegalArgumentException("Unknown option " + opt); + } + } + return params; + } + + private int doCreateSession(SessionParams params, String installerPackageName, int userId) + throws RemoteException { + userId = translateUserId(userId, "runInstallCreate"); + if (userId == UserHandle.USER_ALL) { + userId = UserHandle.USER_SYSTEM; + params.installFlags |= PackageManager.INSTALL_ALL_USERS; + } + + final int sessionId = mInstaller.createSession(params, installerPackageName, userId); + return sessionId; + } + + private int doWriteSession(int sessionId, String inPath, long sizeBytes, String splitName, + boolean logSuccess) throws RemoteException { + if ("-".equals(inPath)) { + inPath = null; + } else if (inPath != null) { + final File file = new File(inPath); + if (file.isFile()) { + sizeBytes = file.length(); + } + } + final SessionInfo info = mInstaller.getSessionInfo(sessionId); PackageInstaller.Session session = null; InputStream in = null; OutputStream out = null; try { - session = new PackageInstaller.Session(mInstaller.openSession(sessionId)); + session = new PackageInstaller.Session( + mInstaller.openSession(sessionId)); - if (path == null) { - in = new SizedInputStream(System.in, sizeBytes); + if (inPath != null) { + in = new FileInputStream(inPath); } else { - in = new FileInputStream(path); + in = new SizedInputStream(System.in, sizeBytes); } - out = session.openWrite("base.apk", 0, sizeBytes); + out = session.openWrite(splitName, 0, sizeBytes); int total = 0; byte[] buffer = new byte[65536]; @@ -375,7 +557,14 @@ public final class Pm { } } session.fsync(out); - } catch (IOException ignore) { + + if (logSuccess) { + System.out.println("Success: streamed " + total + " bytes"); + } + return PackageInstaller.STATUS_SUCCESS; + } catch (IOException e) { + System.err.println("Error: failed to write; " + e.getMessage()); + return PackageInstaller.STATUS_FAILURE; } finally { IoUtils.closeQuietly(out); IoUtils.closeQuietly(in); @@ -383,10 +572,11 @@ public final class Pm { } } - private int commitSessionFile(int sessionId) throws RemoteException { + private int doCommitSession(int sessionId, boolean logSuccess) throws RemoteException { PackageInstaller.Session session = null; try { - session = new PackageInstaller.Session(mInstaller.openSession(sessionId)); + session = new PackageInstaller.Session( + mInstaller.openSession(sessionId)); final LocalIntentReceiver receiver = new LocalIntentReceiver(); session.commit(receiver.getIntentSender()); @@ -395,10 +585,13 @@ public final class Pm { final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE); if (status == PackageInstaller.STATUS_SUCCESS) { - System.out.println("Success"); + if (logSuccess) { + System.out.println("Success"); + } } else { System.err.println("Failure [" + result.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + "]"); + System.err.println("Failure details: " + result.getExtras()); } return status; } finally { @@ -406,100 +599,18 @@ public final class Pm { } } - /* - * Keep this around to support existing users of the "pm install" command that may not be - * able to be updated [or, at least informed the API has changed] such as ddmlib. - * - * Moving the implementation of "pm install" to "cmd package install" changes the executing - * context. Instead of being a stand alone process, "cmd package install" runs in the - * system_server process. Due to SELinux rules, system_server cannot access many directories; - * one of which being the package install staging directory [/data/local/tmp]. - * - * The use of "adb install" or "cmd package install" over "pm install" is highly encouraged. - */ - private int runInstall() throws RemoteException { - int userId = UserHandle.USER_ALL; - String installerPackageName = null; - - final SessionParams params = new SessionParams(SessionParams.MODE_FULL_INSTALL); - - String opt; - while ((opt = nextOption()) != null) { - if (opt.equals("-l")) { - params.installFlags |= PackageManager.INSTALL_FORWARD_LOCK; - } else if (opt.equals("-r")) { - params.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; - } else if (opt.equals("-i")) { - installerPackageName = nextArg(); - if (installerPackageName == null) { - throw new IllegalArgumentException("Missing installer package"); - } - } else if (opt.equals("-t")) { - params.installFlags |= PackageManager.INSTALL_ALLOW_TEST; - } else if (opt.equals("-s")) { - params.installFlags |= PackageManager.INSTALL_EXTERNAL; - } else if (opt.equals("-f")) { - params.installFlags |= PackageManager.INSTALL_INTERNAL; - } else if (opt.equals("-d")) { - params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE; - } else if (opt.equals("-g")) { - params.installFlags |= PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS; - } else if (opt.equals("--originating-uri")) { - params.originatingUri = Uri.parse(nextOptionData()); - } else if (opt.equals("--referrer")) { - params.referrerUri = Uri.parse(nextOptionData()); - } else if (opt.equals("-p")) { - params.mode = SessionParams.MODE_INHERIT_EXISTING; - params.appPackageName = nextOptionData(); - if (params.appPackageName == null) { - throw new IllegalArgumentException("Missing inherit package name"); - } - } else if (opt.equals("-S")) { - params.setSize(Long.parseLong(nextOptionData())); - } else if (opt.equals("--abi")) { - params.abiOverride = checkAbiArgument(nextOptionData()); - } else if (opt.equals("--ephemeral")) { - params.installFlags |= PackageManager.INSTALL_EPHEMERAL; - } else if (opt.equals("--user")) { - userId = Integer.parseInt(nextOptionData()); - } else if (opt.equals("--install-location")) { - params.installLocation = Integer.parseInt(nextOptionData()); - } else if (opt.equals("--force-uuid")) { - params.installFlags |= PackageManager.INSTALL_FORCE_VOLUME_UUID; - params.volumeUuid = nextOptionData(); - if ("internal".equals(params.volumeUuid)) { - params.volumeUuid = null; - } - } else { - throw new IllegalArgumentException("Unknown option " + opt); - } - } - - userId = translateUserId(userId, "runInstallCreate"); - if (userId == UserHandle.USER_ALL) { - userId = UserHandle.USER_SYSTEM; - params.installFlags |= PackageManager.INSTALL_ALL_USERS; - } - - long sizeBytes = params.sizeBytes; - String path = nextArg(); - if ("-".equals(path)) { - path = null; - } else if (path != null) { - final File file = new File(path); - if (file.isFile()) { - sizeBytes = file.length(); + private int doAbandonSession(int sessionId, boolean logSuccess) throws RemoteException { + PackageInstaller.Session session = null; + try { + session = new PackageInstaller.Session(mInstaller.openSession(sessionId)); + session.abandon(); + if (logSuccess) { + System.out.println("Success"); } + return PackageInstaller.STATUS_SUCCESS; + } finally { + IoUtils.closeQuietly(session); } - - final int sessionId = mInstaller.createSession(params, installerPackageName, userId); - - writeSessionFile(sessionId, path, sizeBytes); - return commitSessionFile(sessionId); - } - - private int runInstallSession() { - return runShellCommand("package", mArgs); } /** @@ -798,6 +909,10 @@ public final class Pm { flags |= UserInfo.FLAG_MANAGED_PROFILE; } else if ("--restricted".equals(opt)) { flags |= UserInfo.FLAG_RESTRICTED; + } else if ("--ephemeral".equals(opt)) { + flags |= UserInfo.FLAG_EPHEMERAL; + } else if ("--guest".equals(opt)) { + flags |= UserInfo.FLAG_GUEST; } else { System.err.println("Error: unknown option " + opt); return showUsage(); @@ -1356,7 +1471,7 @@ public final class Pm { System.err.println(" pm get-install-location"); System.err.println(" pm set-permission-enforced PERMISSION [true|false]"); System.err.println(" pm trim-caches DESIRED_FREE_SPACE [internal|UUID]"); - System.err.println(" pm create-user [--profileOf USER_ID] [--managed] [--restricted] USER_NAME"); + System.err.println(" pm create-user [--profileOf USER_ID] [--managed] [--restricted] [--ephemeral] [--guest] USER_NAME"); System.err.println(" pm remove-user USER_ID"); System.err.println(" pm get-max-users"); System.err.println(""); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index b11a12f2fd06..81fe23c5aabe 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -559,6 +559,14 @@ public class ActivityManager { public static boolean isAlwaysOnTop(int stackId) { return stackId == PINNED_STACK_ID; } + + /** + * Returns true if the application windows in this stack should be displayed above all + * other application windows, including during the animation. + */ + public static boolean shouldIncreaseApplicationWindowLayer(int stackId) { + return stackId == PINNED_STACK_ID || stackId == DOCKED_STACK_ID; + } } /** diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index e500e1533524..460e68cfb14f 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -30,6 +30,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ComponentInfo; import android.content.pm.ContainerEncryptionParams; +import android.content.pm.EphemeralApplicationInfo; import android.content.pm.FeatureInfo; import android.content.pm.IOnPermissionsChangeListener; import android.content.pm.IPackageDataObserver; @@ -85,9 +86,11 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.os.SomeArgs; import com.android.internal.util.Preconditions; import com.android.internal.util.UserIcons; +import libcore.util.EmptyArray; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -98,6 +101,8 @@ public class ApplicationPackageManager extends PackageManager { private static final String TAG = "ApplicationPackageManager"; private final static boolean DEBUG_ICONS = false; + private static final int DEFAULT_EPHEMERAL_COOKIE_MAX_SIZE_BYTES = 16384; // 16KB + // Default flags to use with PackageManager when no flags are given. private final static int sDefaultFlags = PackageManager.GET_SHARED_LIBRARY_FILES; @@ -626,6 +631,80 @@ public class ApplicationPackageManager extends PackageManager { } } + /** @hide */ + @SuppressWarnings("unchecked") + @Override + public List<EphemeralApplicationInfo> getEphemeralApplications() { + try { + ParceledListSlice<EphemeralApplicationInfo> slice = + mPM.getEphemeralApplications(mContext.getUserId()); + if (slice != null) { + return slice.getList(); + } + return Collections.emptyList(); + } catch (RemoteException e) { + throw new RuntimeException("Package manager has died", e); + } + } + + /** @hide */ + @Override + public Drawable getEphemeralApplicationIcon(String packageName) { + try { + Bitmap bitmap = mPM.getEphemeralApplicationIcon( + packageName, mContext.getUserId()); + if (bitmap != null) { + return new BitmapDrawable(null, bitmap); + } + return null; + } catch (RemoteException e) { + throw new RuntimeException("Package manager has died", e); + } + } + + @Override + public boolean isEphemeralApplication() { + try { + return mPM.isEphemeralApplication( + mContext.getPackageName(), mContext.getUserId()); + } catch (RemoteException e) { + Log.e(TAG, "System server is dead", e); + } + return false; + } + + @Override + public int getEphemeralCookieMaxSizeBytes() { + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.EPHEMERAL_COOKIE_MAX_SIZE_BYTES, + DEFAULT_EPHEMERAL_COOKIE_MAX_SIZE_BYTES); + } + + @Override + public @NonNull byte[] getEphemeralCookie() { + try { + final byte[] cookie = mPM.getEphemeralApplicationCookie( + mContext.getPackageName(), mContext.getUserId()); + if (cookie != null) { + return cookie; + } + } catch (RemoteException e) { + Log.e(TAG, "System server is dead", e); + } + return EmptyArray.BYTE; + } + + @Override + public boolean setEphemeralCookie(@NonNull byte[] cookie) { + try { + return mPM.setEphemeralApplicationCookie( + mContext.getPackageName(), cookie, mContext.getUserId()); + } catch (RemoteException e) { + Log.e(TAG, "System server is dead", e); + } + return false; + } + @Override public ResolveInfo resolveActivity(Intent intent, int flags) { return resolveActivityAsUser(intent, flags, mContext.getUserId()); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 6c0c3e864877..099a5fe9352e 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -48,6 +48,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.TypedValue; import android.view.Gravity; +import android.view.NotificationHeaderView; import android.view.View; import android.widget.ProgressBar; import android.widget.RemoteViews; @@ -3000,6 +3001,7 @@ public class Notification implements Parcelable */ private void resetNotificationHeader(RemoteViews contentView) { contentView.setImageViewResource(R.id.icon, 0); + contentView.setBoolean(R.id.notification_header, "setExpanded", false); contentView.setTextViewText(R.id.app_name_text, null); contentView.setViewVisibility(R.id.chronometer, View.GONE); contentView.setViewVisibility(R.id.header_sub_text, View.GONE); @@ -3134,6 +3136,8 @@ public class Notification implements Parcelable private void bindExpandButton(RemoteViews contentView) { contentView.setDrawableParameters(R.id.expand_button, false, -1, resolveColor(), PorterDuff.Mode.SRC_ATOP, -1); + contentView.setInt(R.id.notification_header, "setOriginalNotificationColor", + resolveColor()); } private void bindHeaderChronometerAndTime(RemoteViews contentView) { @@ -3197,7 +3201,6 @@ public class Notification implements Parcelable private void resetStandardTemplateWithActions(RemoteViews big) { big.setViewVisibility(R.id.actions, View.GONE); - big.setViewVisibility(R.id.action_divider, View.GONE); big.removeAllViews(R.id.actions); } @@ -3209,7 +3212,6 @@ public class Notification implements Parcelable int N = mActions.size(); if (N > 0) { big.setViewVisibility(R.id.actions, View.VISIBLE); - big.setViewVisibility(R.id.action_divider, View.VISIBLE); if (N>MAX_ACTION_BUTTONS) N=MAX_ACTION_BUTTONS; for (int i=0; i<N; i++) { final RemoteViews button = generateActionButton(mActions.get(i)); @@ -3276,11 +3278,7 @@ public class Notification implements Parcelable } private void adaptNotificationHeaderForBigContentView(RemoteViews result) { - // We have to set the collapse button instead - result.setImageViewResource(R.id.expand_button, R.drawable.ic_arrow_up_14dp); - // Apply the color again - result.setDrawableParameters(R.id.expand_button, false, -1, resolveColor(), - PorterDuff.Mode.SRC_ATOP, -1); + result.setBoolean(R.id.notification_header, "setExpanded", true); } /** @@ -3352,10 +3350,14 @@ public class Notification implements Parcelable * Apply any necessariy colors to the small icon */ private void processSmallIconColor(Icon smallIcon, RemoteViews contentView) { - if (!isLegacy() || getColorUtil().isGrayscaleIcon(mContext, smallIcon)) { + boolean colorable = !isLegacy() || getColorUtil().isGrayscaleIcon(mContext, smallIcon); + if (colorable) { contentView.setDrawableParameters(R.id.icon, false, -1, resolveColor(), PorterDuff.Mode.SRC_ATOP, -1); + } + contentView.setInt(R.id.notification_header, "setOriginalIconColor", + colorable ? resolveColor() : NotificationHeaderView.NO_COLOR); } /** diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 471750eda0cf..6b900a8ab36d 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -2325,8 +2325,8 @@ public class DevicePolicyManager { * with that alias already exists, it will be overwritten. * @return {@code true} if the keys were installed, {@code false} otherwise. */ - public boolean installKeyPair(@Nullable ComponentName admin, PrivateKey privKey, Certificate cert, - String alias) { + public boolean installKeyPair(@Nullable ComponentName admin, @NonNull PrivateKey privKey, + @NonNull Certificate cert, @NonNull String alias) { try { final byte[] pemCert = Credentials.convertToPem(cert); final byte[] pkcs8Key = KeyFactory.getInstance(privKey.getAlgorithm()) @@ -2343,6 +2343,24 @@ public class DevicePolicyManager { } /** + * Called by a device or profile owner to remove all user credentials installed under a given + * alias. + * + * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or + * {@code null} if calling from a delegated certificate installer. + * @param alias The private key alias under which the certificate is installed. + * @return {@code true} if the keys were both removed, {@code false} otherwise. + */ + public boolean removeKeyPair(@Nullable ComponentName admin, @NonNull String alias) { + try { + return mService.removeKeyPair(admin, alias); + } catch (RemoteException e) { + Log.w(TAG, "Failed talking with device policy service", e); + } + return false; + } + + /** * @return the alias of a given CA certificate in the certificate store, or {@code null} if it * doesn't exist. */ diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 6b4567c297c5..1708ee3c73e3 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -135,6 +135,7 @@ interface IDevicePolicyManager { void enforceCanManageCaCerts(in ComponentName admin); boolean installKeyPair(in ComponentName who, in byte[] privKeyBuffer, in byte[] certBuffer, String alias); + boolean removeKeyPair(in ComponentName who, String alias); void choosePrivateKeyAlias(int uid, in Uri uri, in String alias, IBinder aliasCallback); void setCertInstallerPackage(in ComponentName who, String installerPackage); diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index bc7620cee3f9..a27d1cb845c8 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -4471,6 +4471,22 @@ public class Intent implements Parcelable, Cloneable { * @hide */ public static final int FLAG_RECEIVER_BOOT_UPGRADE = 0x02000000; + /** + * If set, the broadcast will always go to manifest receivers in background (cached + * or not running) apps, regardless of whether that would be done by default. By + * default they will only receive broadcasts if the broadcast has specified an + * explicit component or package name. + * @hide + */ + public static final int FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000; + /** + * If set, the broadcast will never go to manifest receivers in background (cached + * or not running) apps, regardless of whether that would be done by default. By + * default they will receive broadcasts if the broadcast has specified an + * explicit component or package name. + * @hide + */ + public static final int FLAG_RECEIVER_EXCLUDE_BACKGROUND = 0x00800000; /** * @hide Flags that can't be changed with PendingIntent. diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index 4a3c59bd8426..0cb0e9fce251 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -756,13 +756,20 @@ public class ActivityInfo extends ComponentInfo } public void dump(Printer pw, String prefix) { + dump(pw, prefix, DUMP_FLAG_ALL); + } + + /** @hide */ + public void dump(Printer pw, String prefix, int flags) { super.dumpFront(pw, prefix); if (permission != null) { pw.println(prefix + "permission=" + permission); } - pw.println(prefix + "taskAffinity=" + taskAffinity - + " targetActivity=" + targetActivity - + " persistableMode=" + persistableModeToString()); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + pw.println(prefix + "taskAffinity=" + taskAffinity + + " targetActivity=" + targetActivity + + " persistableMode=" + persistableModeToString()); + } if (launchMode != 0 || flags != 0 || theme != 0) { pw.println(prefix + "launchMode=" + launchMode + " flags=0x" + Integer.toHexString(flags) @@ -777,14 +784,17 @@ public class ActivityInfo extends ComponentInfo if (uiOptions != 0) { pw.println(prefix + " uiOptions=0x" + Integer.toHexString(uiOptions)); } - pw.println(prefix + "resizeable=" + resizeable + " supportsPip=" + supportsPip); - pw.println(prefix + "lockTaskLaunchMode=" + lockTaskLaunchModeToString(lockTaskLaunchMode)); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + pw.println(prefix + "resizeable=" + resizeable + " supportsPip=" + supportsPip); + pw.println(prefix + "lockTaskLaunchMode=" + + lockTaskLaunchModeToString(lockTaskLaunchMode)); + } if (layout != null) { pw.println(prefix + "initialLayout=" + layout.width + "|" + layout.widthFraction + ", " + layout.height + "|" + layout.heightFraction + ", " + layout.gravity); } - super.dumpBack(pw, prefix); + super.dumpBack(pw, prefix, flags); } public String toString() { diff --git a/core/java/android/content/pm/ApplicationInfo.aidl b/core/java/android/content/pm/ApplicationInfo.aidl index 006d1bdfc139..59b0a89f3668 100644 --- a/core/java/android/content/pm/ApplicationInfo.aidl +++ b/core/java/android/content/pm/ApplicationInfo.aidl @@ -1,17 +1,17 @@ -/* //device/java/android/android/view/WindowManager.aidl +/* ** ** Copyright 2007, The Android Open Source Project ** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at +** Licensed under the Apache License, Version 2.0 (the "License") +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at ** -** http://www.apache.org/licenses/LICENSE-2.0 +** http://www.apache.org/licenses/LICENSE-2.0 ** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and ** limitations under the License. */ diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 4816734a0b0a..0633bff7a286 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -22,7 +22,6 @@ import android.graphics.drawable.Drawable; import android.os.Environment; import android.os.Parcel; import android.os.Parcelable; -import android.os.SystemProperties; import android.os.UserHandle; import android.os.storage.StorageManager; import android.text.TextUtils; @@ -383,13 +382,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int FLAG_HARDWARE_ACCELERATED = 1<<29; /** - * Value for {@link #flags}: {@code true} if the application is blocked via restrictions - * and for most purposes is considered as not installed. - * {@hide} - */ - public static final int FLAG_EPHEMERAL = 1<<30; - - /** * Value for {@link #flags}: true if code from this application will need to be * loaded into other applications' processes. On devices that support multiple * instruction sets, this implies the code might be loaded into a process that's @@ -462,8 +454,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int PRIVATE_FLAG_PRIVILEGED = 1<<3; /** - * Value for {@link #flags}: {@code true} if the application has any IntentFiler with some - * data URI using HTTP or HTTPS with an associated VIEW action. + * Value for {@link #privateFlags}: {@code true} if the application has any IntentFiler + * with some data URI using HTTP or HTTPS with an associated VIEW action. * * {@hide} */ @@ -494,6 +486,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int PRIVATE_FLAG_AUTOPLAY = 1 << 7; /** + * Value for {@link #flags}: {@code true} if the application is blocked via restrictions + * and for most purposes is considered as not installed. + * {@hide} + */ + public static final int PRIVATE_FLAG_EPHEMERAL = 1<<8; + + /** * When set, at least one component inside this application is encryption aware. * * @hide @@ -711,21 +710,30 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public int installLocation = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; public void dump(Printer pw, String prefix) { + dump(pw, prefix, DUMP_FLAG_ALL); + } + + /** @hide */ + public void dump(Printer pw, String prefix, int flags) { super.dumpFront(pw, prefix); - if (className != null) { + if ((flags&DUMP_FLAG_DETAILS) != 0 && className != null) { pw.println(prefix + "className=" + className); } if (permission != null) { pw.println(prefix + "permission=" + permission); } pw.println(prefix + "processName=" + processName); - pw.println(prefix + "taskAffinity=" + taskAffinity); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + pw.println(prefix + "taskAffinity=" + taskAffinity); + } pw.println(prefix + "uid=" + uid + " flags=0x" + Integer.toHexString(flags) + " privateFlags=0x" + Integer.toHexString(privateFlags) + " theme=0x" + Integer.toHexString(theme)); - pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp - + " compatibleWidthLimitDp=" + compatibleWidthLimitDp - + " largestWidthLimitDp=" + largestWidthLimitDp); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp + + " compatibleWidthLimitDp=" + compatibleWidthLimitDp + + " largestWidthLimitDp=" + largestWidthLimitDp); + } pw.println(prefix + "sourceDir=" + sourceDir); if (!Objects.equals(sourceDir, publicSourceDir)) { pw.println(prefix + "publicSourceDir=" + publicSourceDir); @@ -740,31 +748,36 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { if (resourceDirs != null) { pw.println(prefix + "resourceDirs=" + resourceDirs); } - if (seinfo != null) { + if ((flags&DUMP_FLAG_DETAILS) != 0 && seinfo != null) { pw.println(prefix + "seinfo=" + seinfo); } pw.println(prefix + "dataDir=" + dataDir); - pw.println(prefix + "deviceEncryptedDataDir=" + deviceEncryptedDataDir); - pw.println(prefix + "credentialEncryptedDataDir=" + credentialEncryptedDataDir); - if (sharedLibraryFiles != null) { - pw.println(prefix + "sharedLibraryFiles=" + Arrays.toString(sharedLibraryFiles)); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + pw.println(prefix + "deviceEncryptedDataDir=" + deviceEncryptedDataDir); + pw.println(prefix + "credentialEncryptedDataDir=" + credentialEncryptedDataDir); + if (sharedLibraryFiles != null) { + pw.println(prefix + "sharedLibraryFiles=" + Arrays.toString(sharedLibraryFiles)); + } } pw.println(prefix + "enabled=" + enabled + " targetSdkVersion=" + targetSdkVersion + " versionCode=" + versionCode); - if (manageSpaceActivityName != null) { - pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName); - } - if (descriptionRes != 0) { - pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes)); - } - if (uiOptions != 0) { - pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions)); - } - pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false")); - if (fullBackupContent > 0) { - pw.println(prefix + "fullBackupContent=@xml/" + fullBackupContent); - } else { - pw.println(prefix + "fullBackupContent=" + (fullBackupContent < 0 ? "false" : "true")); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + if (manageSpaceActivityName != null) { + pw.println(prefix + "manageSpaceActivityName=" + manageSpaceActivityName); + } + if (descriptionRes != 0) { + pw.println(prefix + "description=0x" + Integer.toHexString(descriptionRes)); + } + if (uiOptions != 0) { + pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions)); + } + pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false")); + if (fullBackupContent > 0) { + pw.println(prefix + "fullBackupContent=@xml/" + fullBackupContent); + } else { + pw.println(prefix + "fullBackupContent=" + + (fullBackupContent < 0 ? "false" : "true")); + } } super.dumpBack(pw, prefix); } @@ -1091,6 +1104,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { /** * @hide */ + public boolean isEphemeralApp() { + return (privateFlags & ApplicationInfo.PRIVATE_FLAG_EPHEMERAL) != 0; + } + + /** + * @hide + */ @Override protected ApplicationInfo getApplicationInfo() { return this; } diff --git a/core/java/android/content/pm/ComponentInfo.java b/core/java/android/content/pm/ComponentInfo.java index ad7ebe5e7fd9..a295cc55b00a 100644 --- a/core/java/android/content/pm/ComponentInfo.java +++ b/core/java/android/content/pm/ComponentInfo.java @@ -150,23 +150,32 @@ public class ComponentInfo extends PackageItemInfo { protected void dumpFront(Printer pw, String prefix) { super.dumpFront(pw, prefix); + if (processName != null && !packageName.equals(processName)) { + pw.println(prefix + "processName=" + processName); + } pw.println(prefix + "enabled=" + enabled + " exported=" + exported - + " encryptionAware=" + encryptionAware + " processName=" + processName); + + " encryptionAware=" + encryptionAware); if (descriptionRes != 0) { pw.println(prefix + "description=" + descriptionRes); } } - + protected void dumpBack(Printer pw, String prefix) { - if (applicationInfo != null) { - pw.println(prefix + "ApplicationInfo:"); - applicationInfo.dump(pw, prefix + " "); - } else { - pw.println(prefix + "ApplicationInfo: null"); + dumpBack(pw, prefix, DUMP_FLAG_ALL); + } + + void dumpBack(Printer pw, String prefix, int flags) { + if ((flags&DUMP_FLAG_APPLICATION) != 0) { + if (applicationInfo != null) { + pw.println(prefix + "ApplicationInfo:"); + applicationInfo.dump(pw, prefix + " ", flags); + } else { + pw.println(prefix + "ApplicationInfo: null"); + } } super.dumpBack(pw, prefix); } - + public void writeToParcel(Parcel dest, int parcelableFlags) { super.writeToParcel(dest, parcelableFlags); if ((parcelableFlags & Parcelable.PARCELABLE_ELIDE_DUPLICATES) != 0) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QRotationLockTile.java b/core/java/android/content/pm/EphemeralApplicationInfo.aidl index 5f5cab503d4a..5aaae7847c7e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QRotationLockTile.java +++ b/core/java/android/content/pm/EphemeralApplicationInfo.aidl @@ -14,27 +14,6 @@ * limitations under the License. */ -package com.android.systemui.qs.tiles; +package android.content.pm; -import android.content.Context; -import com.android.systemui.QSQuickTileView; -import com.android.systemui.qs.QSTileBaseView; -import com.android.systemui.qs.QSTileView; - -/** Quick settings tile: Rotation **/ -public class QRotationLockTile extends RotationLockTile { - - public QRotationLockTile(Host host) { - super(host); - } - - @Override - public QSTileBaseView createTileView(Context context) { - return new QSQuickTileView(context); - } - - @Override - public int getTileType() { - return QSTileView.QS_TYPE_QUICK; - } -} +parcelable EphemeralApplicationInfo; diff --git a/core/java/android/content/pm/EphemeralApplicationInfo.java b/core/java/android/content/pm/EphemeralApplicationInfo.java new file mode 100644 index 000000000000..87663f12e637 --- /dev/null +++ b/core/java/android/content/pm/EphemeralApplicationInfo.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.graphics.drawable.Drawable; +import android.os.Parcel; +import android.os.Parcelable; + +/** + * This class represents the state of an ephemeral app. + * + * @hide + */ +public final class EphemeralApplicationInfo implements Parcelable { + private final ApplicationInfo mApplicationInfo; + + private final String mPackageName; + private final CharSequence mLabelText; + + private final String[] mRequestedPermissions; + private final String[] mGrantedPermissions; + + public EphemeralApplicationInfo(ApplicationInfo appInfo, + String[] requestedPermissions, String[] grantedPermissions) { + mApplicationInfo = appInfo; + mPackageName = null; + mLabelText = null; + mRequestedPermissions = requestedPermissions; + mGrantedPermissions = grantedPermissions; + } + + public EphemeralApplicationInfo(String packageName, CharSequence label, + String[] requestedPermissions, String[] grantedPermissions) { + mApplicationInfo = null; + mPackageName = packageName; + mLabelText = label; + mRequestedPermissions = requestedPermissions; + mGrantedPermissions = grantedPermissions; + } + + private EphemeralApplicationInfo(Parcel parcel) { + mPackageName = parcel.readString(); + mLabelText = parcel.readCharSequence(); + mRequestedPermissions = parcel.readStringArray(); + mGrantedPermissions = parcel.createStringArray(); + mApplicationInfo = parcel.readParcelable(null); + } + + public @NonNull String getPackageName() { + if (mApplicationInfo != null) { + return mApplicationInfo.packageName; + } + return mPackageName; + } + + public @NonNull CharSequence loadLabel(@NonNull PackageManager packageManager) { + if (mApplicationInfo != null) { + return mApplicationInfo.loadLabel(packageManager); + } + return mLabelText; + } + + public @NonNull Drawable loadIcon(@NonNull PackageManager packageManager) { + if (mApplicationInfo != null) { + return mApplicationInfo.loadIcon(packageManager); + } + return packageManager.getEphemeralApplicationIcon(mPackageName); + } + + public @Nullable String[] getRequestedPermissions() { + return mRequestedPermissions; + } + + public @Nullable String[] getGrantedPermissions() { + return mGrantedPermissions; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeString(mPackageName); + parcel.writeCharSequence(mLabelText); + parcel.writeStringArray(mRequestedPermissions); + parcel.writeStringArray(mGrantedPermissions); + parcel.writeParcelable(mApplicationInfo, flags); + } + + public static final Creator<EphemeralApplicationInfo> CREATOR = + new Creator<EphemeralApplicationInfo>() { + @Override + public EphemeralApplicationInfo createFromParcel(Parcel parcel) { + return new EphemeralApplicationInfo(parcel); + } + + @Override + public EphemeralApplicationInfo[] newArray(int size) { + return new EphemeralApplicationInfo[0]; + } + }; +} diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index b9a42eb21eee..b947a2bdd653 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -23,6 +23,7 @@ import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ContainerEncryptionParams; +import android.content.pm.EphemeralApplicationInfo; import android.content.pm.FeatureInfo; import android.content.pm.IPackageInstallObserver2; import android.content.pm.IPackageInstaller; @@ -47,6 +48,7 @@ import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; import android.content.pm.VerificationParams; import android.content.pm.VerifierDeviceIdentity; +import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.ParcelFileDescriptor; @@ -513,4 +515,10 @@ interface IPackageManager { boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId); String getPermissionControllerPackageName(); + + ParceledListSlice getEphemeralApplications(int userId); + byte[] getEphemeralApplicationCookie(String packageName, int userId); + boolean setEphemeralApplicationCookie(String packageName, in byte[] cookie, int userId); + Bitmap getEphemeralApplicationIcon(String packageName, int userId); + boolean isEphemeralApplication(String packageName, int userId); } diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index 22a899cda05b..4df83036daaf 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -282,6 +282,21 @@ public class PackageItemInfo { return null; } + /** + * @hide Flag for dumping: include all details. + */ + public static final int DUMP_FLAG_DETAILS = 1<<0; + + /** + * @hide Flag for dumping: include nested ApplicationInfo. + */ + public static final int DUMP_FLAG_APPLICATION = 1<<1; + + /** + * @hide Flag for dumping: all flags to dump everything. + */ + public static final int DUMP_FLAG_ALL = DUMP_FLAG_DETAILS | DUMP_FLAG_APPLICATION; + protected void dumpFront(Printer pw, String prefix) { if (name != null) { pw.println(prefix + "name=" + name); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 9b80a1673c9f..a82215027e58 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -47,8 +47,10 @@ import android.os.Handler; import android.os.RemoteException; import android.os.UserHandle; import android.os.storage.VolumeInfo; +import android.provider.Settings; import android.util.AndroidException; +import android.util.Log; import com.android.internal.util.ArrayUtils; import java.io.File; @@ -2860,6 +2862,83 @@ public abstract class PackageManager { public abstract List<ApplicationInfo> getInstalledApplications(int flags); /** + * Gets the ephemeral applications the user recently used. Requires + * holding "android.permission.ACCESS_EPHEMERAL_APPS". + * + * @return The ephemeral app list. + * + * @hide + */ + @RequiresPermission(Manifest.permission.ACCESS_EPHEMERAL_APPS) + public abstract List<EphemeralApplicationInfo> getEphemeralApplications(); + + /** + * Gets the icon for an ephemeral application. + * + * @param packageName The app package name. + * + * @hide + */ + public abstract Drawable getEphemeralApplicationIcon(String packageName); + + /** + * Gets whether the caller is an ephemeral app. + * + * @return Whether caller is an ephemeral app. + * + * @see #setEphemeralCookie(byte[]) + * @see #getEphemeralCookie() + * @see #getEphemeralCookieMaxSizeBytes() + */ + public abstract boolean isEphemeralApplication(); + + /** + * Gets the maximum size in bytes of the cookie data an ephemeral app + * can store on the device. + * + * @return The max cookie size in bytes. + * + * @see #isEphemeralApplication() + * @see #setEphemeralCookie(byte[]) + * @see #getEphemeralCookie() + */ + public abstract int getEphemeralCookieMaxSizeBytes(); + + /** + * Gets the ephemeral application cookie for this app. Non + * ephemeral apps and apps that were ephemeral but were upgraded + * to non-ephemeral can still access this API. For ephemeral apps + * this cooke is cached for some time after uninstall while for + * normal apps the cookie is deleted after the app is uninstalled. + * The cookie is always present while the app is installed. + * + * @return The cookie. + * + * @see #isEphemeralApplication() + * @see #setEphemeralCookie(byte[]) + * @see #getEphemeralCookieMaxSizeBytes() + */ + public abstract @NonNull byte[] getEphemeralCookie(); + + /** + * Sets the ephemeral application cookie for the calling app. Non + * ephemeral apps and apps that were ephemeral but were upgraded + * to non-ephemeral can still access this API. For ephemeral apps + * this cooke is cached for some time after uninstall while for + * normal apps the cookie is deleted after the app is uninstalled. + * The cookie is always present while the app is installed. The + * cookie size is limited by {@link #getEphemeralCookieMaxSizeBytes()}. + * + * @param cookie The cookie data. + * @return True if the cookie was set. + * + * @see #isEphemeralApplication() + * @see #getEphemeralCookieMaxSizeBytes() + * @see #getEphemeralCookie(); + */ + public abstract boolean setEphemeralCookie(@NonNull byte[] cookie); + + /** * Get a list of shared libraries that are available on the * system. * diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 03071087e7d4..b79b6b6dc958 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1470,6 +1470,10 @@ public class PackageParser { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE; } + if ((flags & PARSE_IS_EPHEMERAL) != 0) { + pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_EPHEMERAL; + } + // Resource boolean are -1, so 1 means we don't know the value. int supportsSmallScreens = 1; int supportsNormalScreens = 1; diff --git a/core/java/android/content/pm/ProviderInfo.java b/core/java/android/content/pm/ProviderInfo.java index f6ea058b526f..7e7b32f03fd1 100644 --- a/core/java/android/content/pm/ProviderInfo.java +++ b/core/java/android/content/pm/ProviderInfo.java @@ -115,9 +115,15 @@ public final class ProviderInfo extends ComponentInfo } public void dump(Printer pw, String prefix) { + dump(pw, prefix, DUMP_FLAG_ALL); + } + + /** @hide */ + public void dump(Printer pw, String prefix, int flags) { super.dumpFront(pw, prefix); pw.println(prefix + "authority=" + authority); pw.println(prefix + "flags=0x" + Integer.toHexString(flags)); + super.dumpBack(pw, prefix, flags); } public int describeContents() { diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java index 7bab35ce7e8e..a5fb451db61d 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -260,6 +260,11 @@ public class ResolveInfo implements Parcelable { } public void dump(Printer pw, String prefix) { + dump(pw, prefix, PackageItemInfo.DUMP_FLAG_ALL); + } + + /** @hide */ + public void dump(Printer pw, String prefix, int flags) { if (filter != null) { pw.println(prefix + "Filter:"); filter.dump(pw, prefix + " "); @@ -279,16 +284,16 @@ public class ResolveInfo implements Parcelable { } if (activityInfo != null) { pw.println(prefix + "ActivityInfo:"); - activityInfo.dump(pw, prefix + " "); + activityInfo.dump(pw, prefix + " ", flags); } else if (serviceInfo != null) { pw.println(prefix + "ServiceInfo:"); - serviceInfo.dump(pw, prefix + " "); + serviceInfo.dump(pw, prefix + " ", flags); } else if (providerInfo != null) { pw.println(prefix + "ProviderInfo:"); - providerInfo.dump(pw, prefix + " "); + providerInfo.dump(pw, prefix + " ", flags); } } - + public ResolveInfo() { targetUserId = UserHandle.USER_CURRENT; } diff --git a/core/java/android/content/pm/ServiceInfo.java b/core/java/android/content/pm/ServiceInfo.java index 796c2a422921..74e5c2a65982 100644 --- a/core/java/android/content/pm/ServiceInfo.java +++ b/core/java/android/content/pm/ServiceInfo.java @@ -74,9 +74,15 @@ public class ServiceInfo extends ComponentInfo } public void dump(Printer pw, String prefix) { + dump(pw, prefix, DUMP_FLAG_ALL); + } + + /** @hide */ + void dump(Printer pw, String prefix, int flags) { super.dumpFront(pw, prefix); pw.println(prefix + "permission=" + permission); pw.println(prefix + "flags=0x" + Integer.toHexString(flags)); + super.dumpBack(pw, prefix, flags); } public String toString() { diff --git a/core/java/android/content/pm/UserInfo.java b/core/java/android/content/pm/UserInfo.java index 6e095959e162..e3050fee6dca 100644 --- a/core/java/android/content/pm/UserInfo.java +++ b/core/java/android/content/pm/UserInfo.java @@ -78,6 +78,12 @@ public class UserInfo implements Parcelable { public static final int FLAG_QUIET_MODE = 0x00000080; + /** + * Indicates that this user is ephemeral. I.e. the user will be removed after leaving + * the foreground. + */ + public static final int FLAG_EPHEMERAL = 0x00000100; + public static final int NO_PROFILE_GROUP_ID = UserHandle.USER_NULL; public int id; @@ -134,6 +140,11 @@ public class UserInfo implements Parcelable { public boolean isQuietModeEnabled() { return (flags & FLAG_QUIET_MODE) == FLAG_QUIET_MODE; } + + public boolean isEphemeral() { + return (flags & FLAG_EPHEMERAL) == FLAG_EPHEMERAL; + } + /** * Returns true if the user is a split system user. * <p>If {@link UserManager#isSplitSystemUser split system user mode} is not enabled, diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 1a19a585cd89..7db5a0889a35 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -724,9 +724,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration fontScale = o.fontScale; mcc = o.mcc; mnc = o.mnc; - if (o.locale != null) { - locale = (Locale) o.locale.clone(); - } + locale = o.locale == null ? null : (Locale) o.locale.clone(); o.fixUpLocaleList(); mLocaleList = o.mLocaleList; userSetLocale = o.userSetLocale; diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index 7b3dde4262f4..cdca8698a96f 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -1988,7 +1988,7 @@ public class Resources { } synchronized (sSync) { if (mPluralRule != null) { - mPluralRule = PluralRules.forLocale(config.getLocales().getPrimary()); + mPluralRule = PluralRules.forLocale(mConfiguration.getLocales().getPrimary()); } } } @@ -2421,75 +2421,93 @@ public class Resources { @Nullable Drawable loadDrawable(TypedValue value, int id, Theme theme) throws NotFoundException { - if (TRACE_FOR_PRELOAD) { - // Log only framework resources - if ((id >>> 24) == 0x1) { - final String name = getResourceName(id); - if (name != null) { - Log.d("PreloadDrawable", name); + try { + if (TRACE_FOR_PRELOAD) { + // Log only framework resources + if ((id >>> 24) == 0x1) { + final String name = getResourceName(id); + if (name != null) { + Log.d("PreloadDrawable", name); + } } } - } - final boolean isColorDrawable; - final DrawableCache caches; - final long key; - if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT - && value.type <= TypedValue.TYPE_LAST_COLOR_INT) { - isColorDrawable = true; - caches = mColorDrawableCache; - key = value.data; - } else { - isColorDrawable = false; - caches = mDrawableCache; - key = (((long) value.assetCookie) << 32) | value.data; - } + final boolean isColorDrawable; + final DrawableCache caches; + final long key; + if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT + && value.type <= TypedValue.TYPE_LAST_COLOR_INT) { + isColorDrawable = true; + caches = mColorDrawableCache; + key = value.data; + } else { + isColorDrawable = false; + caches = mDrawableCache; + key = (((long) value.assetCookie) << 32) | value.data; + } - // First, check whether we have a cached version of this drawable - // that was inflated against the specified theme. - if (!mPreloading) { - final Drawable cachedDrawable = caches.getInstance(key, theme); - if (cachedDrawable != null) { - return cachedDrawable; + // First, check whether we have a cached version of this drawable + // that was inflated against the specified theme. + if (!mPreloading) { + final Drawable cachedDrawable = caches.getInstance(key, theme); + if (cachedDrawable != null) { + return cachedDrawable; + } } - } - // Next, check preloaded drawables. These may contain unresolved theme - // attributes. - final ConstantState cs; - if (isColorDrawable) { - cs = sPreloadedColorDrawables.get(key); - } else { - cs = sPreloadedDrawables[mConfiguration.getLayoutDirection()].get(key); - } + // Next, check preloaded drawables. These may contain unresolved theme + // attributes. + final ConstantState cs; + if (isColorDrawable) { + cs = sPreloadedColorDrawables.get(key); + } else { + cs = sPreloadedDrawables[mConfiguration.getLayoutDirection()].get(key); + } - Drawable dr; - if (cs != null) { - dr = cs.newDrawable(this); - } else if (isColorDrawable) { - dr = new ColorDrawable(value.data); - } else { - dr = loadDrawableForCookie(value, id, null); - } + Drawable dr; + if (cs != null) { + dr = cs.newDrawable(this); + } else if (isColorDrawable) { + dr = new ColorDrawable(value.data); + } else { + dr = loadDrawableForCookie(value, id, null); + } - // Determine if the drawable has unresolved theme attributes. If it - // does, we'll need to apply a theme and store it in a theme-specific - // cache. - final boolean canApplyTheme = dr != null && dr.canApplyTheme(); - if (canApplyTheme && theme != null) { - dr = dr.mutate(); - dr.applyTheme(theme); - dr.clearMutated(); - } + // Determine if the drawable has unresolved theme attributes. If it + // does, we'll need to apply a theme and store it in a theme-specific + // cache. + final boolean canApplyTheme = dr != null && dr.canApplyTheme(); + if (canApplyTheme && theme != null) { + dr = dr.mutate(); + dr.applyTheme(theme); + dr.clearMutated(); + } - // If we were able to obtain a drawable, store it in the appropriate - // cache: preload, not themed, null theme, or theme-specific. - if (dr != null) { - dr.setChangingConfigurations(value.changingConfigurations); - cacheDrawable(value, isColorDrawable, caches, theme, canApplyTheme, key, dr); - } + // If we were able to obtain a drawable, store it in the appropriate + // cache: preload, not themed, null theme, or theme-specific. + if (dr != null) { + dr.setChangingConfigurations(value.changingConfigurations); + cacheDrawable(value, isColorDrawable, caches, theme, canApplyTheme, key, dr); + } - return dr; + return dr; + } catch (Exception e) { + String name; + try { + name = getResourceName(id); + } catch (NotFoundException e2) { + name = "(missing name)"; + } + + // The target drawable might fail to load for any number of + // reasons, but we always want to include the resource name. + // Since the client already expects this method to throw a + // NotFoundException, just throw one of those. + final NotFoundException nfe = new NotFoundException("Drawable " + name + + " with resource ID #0x" + Integer.toHexString(id), e); + nfe.setStackTrace(new StackTraceElement[0]); + throw nfe; + } } private void cacheDrawable(TypedValue value, boolean isColorDrawable, DrawableCache caches, diff --git a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java index b8d69601976e..8be49e8f3ccf 100644 --- a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java +++ b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java @@ -834,6 +834,7 @@ public final class StreamConfigurationMap { * <ul> * <li>{@link ImageFormat#JPEG JPEG} * <li>{@link ImageFormat#RAW_SENSOR RAW16} + * <li>{@link ImageFormat#RAW_PRIVATE RAW_PRIVATE} * </ul> * </p> * @@ -1328,9 +1329,7 @@ public final class StreamConfigurationMap { SparseIntArray map = getFormatsMap(output); for (int j = 0; j < map.size(); j++) { int format = map.keyAt(j); - if (format != HAL_PIXEL_FORMAT_RAW_OPAQUE) { - formats[i++] = imageFormatToPublic(format); - } + formats[i++] = imageFormatToPublic(format); } if (output) { for (int j = 0; j < mDepthOutputFormats.size(); j++) { @@ -1392,9 +1391,6 @@ public final class StreamConfigurationMap { private int getPublicFormatCount(boolean output) { SparseIntArray formatsMap = getFormatsMap(output); int size = formatsMap.size(); - if (formatsMap.indexOfKey(HAL_PIXEL_FORMAT_RAW_OPAQUE) >= 0) { - size -= 1; - } if (output) { size += mDepthOutputFormats.size(); } @@ -1603,6 +1599,8 @@ public final class StreamConfigurationMap { return "Y16"; case ImageFormat.RAW_SENSOR: return "RAW_SENSOR"; + case ImageFormat.RAW_PRIVATE: + return "RAW_PRIVATE"; case ImageFormat.RAW10: return "RAW10"; case ImageFormat.DEPTH16: diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java index a23a6cbe71fe..1e3bcd0fc796 100644 --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -23,6 +23,7 @@ import android.app.PendingIntent; import android.content.Context; import android.os.Bundle; import android.os.ParcelFileDescriptor; +import android.os.Process; import android.os.RemoteException; import android.util.Log; @@ -455,6 +456,21 @@ public class UsbManager { } /** + * Grants permission for USB device without showing system dialog. + * Only system components can call this function. + * @param device to request permissions for + * + * {@hide} + */ + public void grantPermission(UsbDevice device) { + try { + mService.grantDevicePermission(device, Process.myUid()); + } catch (RemoteException e) { + Log.e(TAG, "RemoteException in grantPermission", e); + } + } + + /** * Returns true if the specified USB function is currently enabled when in device mode. * <p> * USB functions represent interfaces which are published to the host to access diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl index 4af89c9fdcb2..9ee6228f4064 100644 --- a/core/java/android/os/IUserManager.aidl +++ b/core/java/android/os/IUserManager.aidl @@ -48,12 +48,15 @@ interface IUserManager { UserInfo getProfileParent(int userHandle); boolean isSameProfileGroup(int userId, int otherUserId); UserInfo getUserInfo(int userHandle); + String getUserAccount(int userId); + void setUserAccount(int userId, String accountName); long getUserCreationTime(int userHandle); boolean isRestricted(); boolean canHaveRestrictedProfile(int userId); int getUserSerialNumber(int userHandle); int getUserHandle(int userSerialNumber); Bundle getUserRestrictions(int userHandle); + boolean hasBaseUserRestriction(String restrictionKey, int userHandle); boolean hasUserRestriction(in String restrictionKey, int userHandle); void setUserRestriction(String key, boolean value, int userId); void setApplicationRestrictions(in String packageName, in Bundle restrictions, diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index f2aea08a91ec..9b68f90aa28b 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -61,12 +61,12 @@ import dalvik.system.VMRuntime; * appropriate to place any Parcel data in to persistent storage: changes * in the underlying implementation of any of the data in the Parcel can * render older data unreadable.</p> - * + * * <p>The bulk of the Parcel API revolves around reading and writing data * of various types. There are six major classes of such functions available.</p> - * + * * <h3>Primitives</h3> - * + * * <p>The most basic data functions are for writing and reading primitive * data types: {@link #writeByte}, {@link #readByte}, {@link #writeDouble}, * {@link #readDouble}, {@link #writeFloat}, {@link #readFloat}, {@link #writeInt}, @@ -74,15 +74,15 @@ import dalvik.system.VMRuntime; * {@link #writeString}, {@link #readString}. Most other * data operations are built on top of these. The given data is written and * read using the endianess of the host CPU.</p> - * + * * <h3>Primitive Arrays</h3> - * + * * <p>There are a variety of methods for reading and writing raw arrays * of primitive objects, which generally result in writing a 4-byte length * followed by the primitive data items. The methods for reading can either * read the data into an existing array, or create and return a new array. * These available types are:</p> - * + * * <ul> * <li> {@link #writeBooleanArray(boolean[])}, * {@link #readBooleanArray(boolean[])}, {@link #createBooleanArray()} @@ -104,9 +104,9 @@ import dalvik.system.VMRuntime; * <li> {@link #writeSparseBooleanArray(SparseBooleanArray)}, * {@link #readSparseBooleanArray()}. * </ul> - * + * * <h3>Parcelables</h3> - * + * * <p>The {@link Parcelable} protocol provides an extremely efficient (but * low-level) protocol for objects to write and read themselves from Parcels. * You can use the direct methods {@link #writeParcelable(Parcelable, int)} @@ -116,7 +116,7 @@ import dalvik.system.VMRuntime; * methods write both the class type and its data to the Parcel, allowing * that class to be reconstructed from the appropriate class loader when * later reading.</p> - * + * * <p>There are also some methods that provide a more efficient way to work * with Parcelables: {@link #writeTypedObject}, {@link #writeTypedArray}, * {@link #writeTypedList}, {@link #readTypedObject}, @@ -129,9 +129,9 @@ import dalvik.system.VMRuntime; * call {@link Parcelable#writeToParcel Parcelable.writeToParcel} and * {@link Parcelable.Creator#createFromParcel Parcelable.Creator.createFromParcel} * yourself.)</p> - * + * * <h3>Bundles</h3> - * + * * <p>A special type-safe container, called {@link Bundle}, is available * for key/value maps of heterogeneous values. This has many optimizations * for improved performance when reading and writing data, and its type-safe @@ -139,16 +139,16 @@ import dalvik.system.VMRuntime; * data contents into a Parcel. The methods to use are * {@link #writeBundle(Bundle)}, {@link #readBundle()}, and * {@link #readBundle(ClassLoader)}. - * + * * <h3>Active Objects</h3> - * + * * <p>An unusual feature of Parcel is the ability to read and write active * objects. For these objects the actual contents of the object is not * written, rather a special token referencing the object is written. When * reading the object back from the Parcel, you do not get a new instance of * the object, but rather a handle that operates on the exact same object that * was originally written. There are two forms of active objects available.</p> - * + * * <p>{@link Binder} objects are a core facility of Android's general cross-process * communication system. The {@link IBinder} interface describes an abstract * protocol with a Binder object. Any such interface can be written in to @@ -161,7 +161,7 @@ import dalvik.system.VMRuntime; * {@link #createBinderArray()}, * {@link #writeBinderList(List)}, {@link #readBinderList(List)}, * {@link #createBinderArrayList()}.</p> - * + * * <p>FileDescriptor objects, representing raw Linux file descriptor identifiers, * can be written and {@link ParcelFileDescriptor} objects returned to operate * on the original file descriptor. The returned file descriptor is a dup @@ -169,9 +169,9 @@ import dalvik.system.VMRuntime; * operating on the same underlying file stream, with the same position, etc. * The methods to use are {@link #writeFileDescriptor(FileDescriptor)}, * {@link #readFileDescriptor()}. - * + * * <h3>Untyped Containers</h3> - * + * * <p>A final class of methods are for writing and reading standard Java * containers of arbitrary types. These all revolve around the * {@link #writeValue(Object)} and {@link #readValue(ClassLoader)} methods @@ -233,8 +233,10 @@ public final class Parcel { private static final int VAL_PERSISTABLEBUNDLE = 25; private static final int VAL_SIZE = 26; private static final int VAL_SIZEF = 27; + private static final int VAL_DOUBLEARRAY = 28; // The initial int32 in a Binder call's reply Parcel header: + // Keep these in sync with libbinder's binder/Status.h. private static final int EX_SECURITY = -1; private static final int EX_BAD_PARCELABLE = -2; private static final int EX_ILLEGAL_ARGUMENT = -3; @@ -242,7 +244,11 @@ public final class Parcel { private static final int EX_ILLEGAL_STATE = -5; private static final int EX_NETWORK_MAIN_THREAD = -6; private static final int EX_UNSUPPORTED_OPERATION = -7; + private static final int EX_SERVICE_SPECIFIC = -8; private static final int EX_HAS_REPLY_HEADER = -128; // special; see below + // EX_TRANSACTION_FAILED is used exclusively in native code. + // see libbinder's binder/Status.h + private static final int EX_TRANSACTION_FAILED = -129; private static native int nativeDataSize(long nativePtr); private static native int nativeDataAvail(long nativePtr); @@ -663,7 +669,7 @@ public final class Parcel { * growing dataCapacity() if needed. The Map keys must be String objects. * The Map values are written using {@link #writeValue} and must follow * the specification there. - * + * * <p>It is strongly recommended to use {@link #writeBundle} instead of * this method, since the Bundle class provides a type-safe API that * allows you to avoid mysterious type errors at the point of marshalling. @@ -1429,6 +1435,9 @@ public final class Parcel { } else if (v instanceof SizeF) { writeInt(VAL_SIZEF); writeSizeF((SizeF) v); + } else if (v instanceof double[]) { + writeInt(VAL_DOUBLEARRAY); + writeDoubleArray((double[]) v); } else { Class<?> clazz = v.getClass(); if (clazz.isArray() && clazz.getComponentType() == Object.class) { @@ -1504,7 +1513,7 @@ public final class Parcel { * exception will be re-thrown by this function as a RuntimeException * (to be caught by the system's last-resort exception handling when * dispatching a transaction). - * + * * <p>The supported exception types are: * <ul> * <li>{@link BadParcelableException} @@ -1514,7 +1523,7 @@ public final class Parcel { * <li>{@link SecurityException} * <li>{@link NetworkOnMainThreadException} * </ul> - * + * * @param e The Exception to be written. * * @see #writeNoException @@ -1536,6 +1545,8 @@ public final class Parcel { code = EX_NETWORK_MAIN_THREAD; } else if (e instanceof UnsupportedOperationException) { code = EX_UNSUPPORTED_OPERATION; + } else if (e instanceof ServiceSpecificException) { + code = EX_SERVICE_SPECIFIC; } writeInt(code); StrictMode.clearGatheredViolations(); @@ -1546,6 +1557,9 @@ public final class Parcel { throw new RuntimeException(e); } writeString(e.getMessage()); + if (e instanceof ServiceSpecificException) { + writeInt(((ServiceSpecificException)e).errorCode); + } } /** @@ -1656,6 +1670,8 @@ public final class Parcel { throw new NetworkOnMainThreadException(); case EX_UNSUPPORTED_OPERATION: throw new UnsupportedOperationException(msg); + case EX_SERVICE_SPECIFIC: + throw new ServiceSpecificException(readInt(), msg); } throw new RuntimeException("Unknown exception code: " + code + " msg " + msg); @@ -1835,7 +1851,7 @@ public final class Parcel { if (Bundle.DEBUG) Log.d(TAG, "null bundle: length=" + length); return null; } - + final Bundle bundle = new Bundle(this, length); if (loader != null) { bundle.setClassLoader(loader); @@ -2346,7 +2362,7 @@ public final class Parcel { return readArrayList(loader); case VAL_BOOLEANARRAY: - return createBooleanArray(); + return createBooleanArray(); case VAL_BYTEARRAY: return createByteArray(); @@ -2396,6 +2412,9 @@ public final class Parcel { case VAL_SIZEF: return readSizeF(); + case VAL_DOUBLEARRAY: + return createDoubleArray(); + default: int off = dataPosition() - 4; throw new RuntimeException( diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QFlashlightTile.java b/core/java/android/os/ServiceSpecificException.java index e115755e98ed..20f237a58ae1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QFlashlightTile.java +++ b/core/java/android/os/ServiceSpecificException.java @@ -13,28 +13,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package android.os; -package com.android.systemui.qs.tiles; - -import android.content.Context; -import com.android.systemui.QSQuickTileView; -import com.android.systemui.qs.QSTileBaseView; -import com.android.systemui.qs.QSTileView; - -/** Quick settings tile: Flashlight **/ -public class QFlashlightTile extends FlashlightTile { - - public QFlashlightTile(Host host) { - super(host); - } +/** + * An exception specific to a service. + * + * <p>This exception includes an error code specific to the throwing + * service. This is mostly used by system services to indicate + * domain specific error conditions. + * + * @hide + */ +public class ServiceSpecificException extends RuntimeException { + public final int errorCode; - @Override - public QSTileBaseView createTileView(Context context) { - return new QSQuickTileView(context); + ServiceSpecificException(int errorCode, String message) { + super(message); + this.errorCode = errorCode; } - @Override - public int getTileType() { - return QSTileView.QS_TYPE_QUICK; + ServiceSpecificException(int errorCode) { + this.errorCode = errorCode; } } + diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 6333442be661..00a874b2d6fe 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -15,8 +15,10 @@ */ package android.os; +import android.Manifest; import android.accounts.AccountManager; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.app.ActivityManager; import android.app.ActivityManagerNative; @@ -721,6 +723,25 @@ public class UserManager { } /** + * Checks if the calling app is running as an ephemeral user. + * + * @return whether the caller is an ephemeral user. + * @hide + */ + public boolean isEphemeralUser() { + return isUserEphemeral(UserHandle.myUserId()); + } + + /** + * Returns whether the specified user is ephemeral. + * @hide + */ + public boolean isUserEphemeral(int userId) { + final UserInfo user = getUserInfo(userId); + return user != null && user.isEphemeral(); + } + + /** * Return whether the given user is actively running. This means that * the user is in the "started" state, not "stopped" -- it is currently * allowed to run code through scheduled alarms, receiving broadcasts, @@ -846,6 +867,24 @@ public class UserManager { } } + /** + * @hide + * Returns whether the given user has been disallowed from performing certain actions + * or setting certain settings through UserManager. This method disregards restrictions + * set by device policy. + * @param restrictionKey the string key representing the restriction + * @param userHandle the UserHandle of the user for whom to retrieve the restrictions. + */ + public boolean hasBaseUserRestriction(String restrictionKey, UserHandle userHandle) { + try { + return mService.hasBaseUserRestriction(restrictionKey, userHandle.getIdentifier()); + } catch (RemoteException re) { + Log.w(TAG, "Could not get base user restrictions for user " + + userHandle.getIdentifier(), re); + return false; + } + } + /** * This will no longer work. Device owners and profile owners should use * {@link DevicePolicyManager#addUserRestriction(ComponentName, String)} instead. @@ -1104,6 +1143,39 @@ public class UserManager { } /** + * @return the user's account name, null if not found. + * @hide + */ + @RequiresPermission( allOf = { + Manifest.permission.INTERACT_ACROSS_USERS_FULL, + Manifest.permission.MANAGE_USERS + }) + public @Nullable String getUserAccount(int userHandle) { + try { + return mService.getUserAccount(userHandle); + } catch (RemoteException re) { + Log.w(TAG, "Could not get user account", re); + return null; + } + } + + /** + * Set account name for the given user. + * @hide + */ + @RequiresPermission( allOf = { + Manifest.permission.INTERACT_ACROSS_USERS_FULL, + Manifest.permission.MANAGE_USERS + }) + public void setUserAccount(int userHandle, @Nullable String accountName) { + try { + mService.setUserAccount(userHandle, accountName); + } catch (RemoteException re) { + Log.w(TAG, "Could not set user account", re); + } + } + + /** * Returns information for Primary user. * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. * diff --git a/core/java/android/os/storage/IMountService.java b/core/java/android/os/storage/IMountService.java index c6510f0d1d79..9b3f02d69e9f 100644 --- a/core/java/android/os/storage/IMountService.java +++ b/core/java/android/os/storage/IMountService.java @@ -25,8 +25,6 @@ import android.os.ParcelFileDescriptor; import android.os.Parcelable; import android.os.RemoteException; -import java.io.FileDescriptor; - /** * WARNING! Update IMountService.h and IMountService.cpp if you change this * file. In particular, the ordering of the methods below must match the @@ -1202,13 +1200,15 @@ public interface IMountService extends IInterface { } @Override - public void createUserKey(int userId, int serialNumber) throws RemoteException { + public void createUserKey(int userId, int serialNumber, boolean ephemeral) + throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); try { _data.writeInterfaceToken(DESCRIPTOR); _data.writeInt(userId); _data.writeInt(serialNumber); + _data.writeInt(ephemeral ? 1 : 0); mRemote.transact(Stub.TRANSACTION_createUserKey, _data, _reply, 0); _reply.readException(); } finally { @@ -1283,7 +1283,8 @@ public interface IMountService extends IInterface { } @Override - public void prepareUserStorage(String volumeUuid, int userId, int serialNumber) + public void prepareUserStorage( + String volumeUuid, int userId, int serialNumber, boolean ephemeral) throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); @@ -1292,6 +1293,7 @@ public interface IMountService extends IInterface { _data.writeString(volumeUuid); _data.writeInt(userId); _data.writeInt(serialNumber); + _data.writeInt(ephemeral ? 1 : 0); mRemote.transact(Stub.TRANSACTION_prepareUserStorage, _data, _reply, 0); _reply.readException(); } finally { @@ -2012,7 +2014,8 @@ public interface IMountService extends IInterface { data.enforceInterface(DESCRIPTOR); int userId = data.readInt(); int serialNumber = data.readInt(); - createUserKey(userId, serialNumber); + boolean ephemeral = data.readInt() != 0; + createUserKey(userId, serialNumber, ephemeral); reply.writeNoException(); return true; } @@ -2052,7 +2055,8 @@ public interface IMountService extends IInterface { String volumeUuid = data.readString(); int userId = data.readInt(); int serialNumber = data.readInt(); - prepareUserStorage(volumeUuid, userId, serialNumber); + boolean ephemeral = data.readInt() != 0; + prepareUserStorage(volumeUuid, userId, serialNumber, ephemeral); reply.writeNoException(); return true; } @@ -2376,15 +2380,16 @@ public interface IMountService extends IInterface { public void setPrimaryStorageUuid(String volumeUuid, IPackageMoveObserver callback) throws RemoteException; - public void createUserKey(int userId, int serialNumber) throws RemoteException; + public void createUserKey(int userId, int serialNumber, boolean ephemeral) + throws RemoteException; public void destroyUserKey(int userId) throws RemoteException; public void unlockUserKey(int userId, int serialNumber, byte[] token) throws RemoteException; public void lockUserKey(int userId) throws RemoteException; public boolean isUserKeyUnlocked(int userId) throws RemoteException; - public void prepareUserStorage(String volumeUuid, int userId, int serialNumber) - throws RemoteException; + public void prepareUserStorage(String volumeUuid, int userId, int serialNumber, + boolean ephemeral) throws RemoteException; public ParcelFileDescriptor mountAppFuse(String name) throws RemoteException; } diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 7f36a9866eb7..beda16996e0e 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -966,9 +966,9 @@ public class StorageManager { } /** {@hide} */ - public void createUserKey(int userId, int serialNumber) { + public void createUserKey(int userId, int serialNumber, boolean ephemeral) { try { - mMountService.createUserKey(userId, serialNumber); + mMountService.createUserKey(userId, serialNumber, ephemeral); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } @@ -1002,9 +1002,10 @@ public class StorageManager { } /** {@hide} */ - public void prepareUserStorage(String volumeUuid, int userId, int serialNumber) { + public void prepareUserStorage( + String volumeUuid, int userId, int serialNumber, boolean ephemeral) { try { - mMountService.prepareUserStorage(volumeUuid, userId, serialNumber); + mMountService.prepareUserStorage(volumeUuid, userId, serialNumber, ephemeral); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index c0d95a10a271..10432b548c27 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -6194,6 +6194,14 @@ public final class ContactsContract { "filter"); /** + * It supports the similar semantics as {@link #CONTENT_FILTER_URI} and returns the same + * columns. This URI requires {@link ContactsContract#DIRECTORY_PARAM_KEY} in + * parameters, otherwise it will throw UnsupportedOperationException. + */ + public static final Uri ENTERPRISE_CONTENT_FILTER_URI = Uri.withAppendedPath( + CONTENT_URI, "filter_enterprise"); + + /** * The email address. * <P>Type: TEXT</P> */ diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index dad3c67967b8..381ca4c3a36e 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4912,6 +4912,15 @@ public final class Settings { "accessibility_display_daltonizer"; /** + * Float list that specifies the color matrix to apply to + * the display. Valid values are defined in AccessibilityManager. + * + * @hide + */ + public static final String ACCESSIBILITY_DISPLAY_COLOR_MATRIX = + "accessibility_display_color_matrix"; + + /** * Setting that specifies whether automatic click when the mouse pointer stops moving is * enabled. * @@ -7792,6 +7801,24 @@ public final class Settings { public static final String LTE_SERVICE_FORCED = "lte_service_forced"; /** + * Ephemeral app cookie max size in bytes. + * <p> + * Type: int + * @hide + */ + public static final String EPHEMERAL_COOKIE_MAX_SIZE_BYTES = + "ephemeral_cookie_max_size_bytes"; + + /** + * The duration for caching uninstalled ephemeral apps. + * <p> + * Type: long + * @hide + */ + public static final String UNINSTALLED_EPHEMERAL_APP_CACHE_DURATION_MILLIS = + "uninstalled_ephemeral_app_cache_duration_millis"; + + /** * Settings to backup. This is here so that it's in the same place as the settings * keys and easy to update. * diff --git a/core/java/android/security/FrameworkNetworkSecurityPolicy.java b/core/java/android/security/FrameworkNetworkSecurityPolicy.java new file mode 100644 index 000000000000..e3dac5ee4a5e --- /dev/null +++ b/core/java/android/security/FrameworkNetworkSecurityPolicy.java @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security; + +/** + * Android framework's implementation of {@link libcore.net.NetworkSecurityPolicy}. + * + * @hide + */ +public class FrameworkNetworkSecurityPolicy extends libcore.net.NetworkSecurityPolicy { + private final boolean mCleartextTrafficPermitted; + + public FrameworkNetworkSecurityPolicy(boolean cleartextTrafficPermitted) { + mCleartextTrafficPermitted = cleartextTrafficPermitted; + } + + @Override + public boolean isCleartextTrafficPermitted() { + return mCleartextTrafficPermitted; + } +} diff --git a/core/java/android/security/NetworkSecurityPolicy.java b/core/java/android/security/NetworkSecurityPolicy.java index 7e8771707b70..7991d373b49f 100644 --- a/core/java/android/security/NetworkSecurityPolicy.java +++ b/core/java/android/security/NetworkSecurityPolicy.java @@ -60,7 +60,7 @@ public class NetworkSecurityPolicy { * <p>NOTE: {@link android.webkit.WebView} does not honor this flag. */ public boolean isCleartextTrafficPermitted() { - return libcore.net.NetworkSecurityPolicy.isCleartextTrafficPermitted(); + return libcore.net.NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(); } /** @@ -72,6 +72,7 @@ public class NetworkSecurityPolicy { * @hide */ public void setCleartextTrafficPermitted(boolean permitted) { - libcore.net.NetworkSecurityPolicy.setCleartextTrafficPermitted(permitted); + FrameworkNetworkSecurityPolicy policy = new FrameworkNetworkSecurityPolicy(permitted); + libcore.net.NetworkSecurityPolicy.setInstance(policy); } } diff --git a/core/java/android/speech/tts/FileSynthesisCallback.java b/core/java/android/speech/tts/FileSynthesisCallback.java index c7a4ccc183e8..dea766b4c057 100644 --- a/core/java/android/speech/tts/FileSynthesisCallback.java +++ b/core/java/android/speech/tts/FileSynthesisCallback.java @@ -104,8 +104,8 @@ class FileSynthesisCallback extends AbstractSynthesisCallback { Log.d(TAG, "FileSynthesisRequest.start(" + sampleRateInHz + "," + audioFormat + "," + channelCount + ")"); } - if (audioFormat != AudioFormat.ENCODING_PCM_8BIT || - audioFormat != AudioFormat.ENCODING_PCM_16BIT || + if (audioFormat != AudioFormat.ENCODING_PCM_8BIT && + audioFormat != AudioFormat.ENCODING_PCM_16BIT && audioFormat != AudioFormat.ENCODING_PCM_FLOAT) { Log.e(TAG, "Audio format encoding " + audioFormat + " not supported. Please use one " + "of AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT or " + diff --git a/core/java/android/speech/tts/PlaybackSynthesisCallback.java b/core/java/android/speech/tts/PlaybackSynthesisCallback.java index a6fb5434cdb4..dcc00955c656 100644 --- a/core/java/android/speech/tts/PlaybackSynthesisCallback.java +++ b/core/java/android/speech/tts/PlaybackSynthesisCallback.java @@ -123,8 +123,8 @@ class PlaybackSynthesisCallback extends AbstractSynthesisCallback { public int start(int sampleRateInHz, int audioFormat, int channelCount) { if (DBG) Log.d(TAG, "start(" + sampleRateInHz + "," + audioFormat + "," + channelCount + ")"); - if (audioFormat != AudioFormat.ENCODING_PCM_8BIT || - audioFormat != AudioFormat.ENCODING_PCM_16BIT || + if (audioFormat != AudioFormat.ENCODING_PCM_8BIT && + audioFormat != AudioFormat.ENCODING_PCM_16BIT && audioFormat != AudioFormat.ENCODING_PCM_FLOAT) { Log.w(TAG, "Audio format encoding " + audioFormat + " not supported. Please use one " + "of AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT or " + diff --git a/core/java/android/util/ArrayMap.java b/core/java/android/util/ArrayMap.java index 4ee9807da850..bdb1fdcb9ff8 100644 --- a/core/java/android/util/ArrayMap.java +++ b/core/java/android/util/ArrayMap.java @@ -60,6 +60,11 @@ public final class ArrayMap<K, V> implements Map<K, V> { private static final int CACHE_SIZE = 10; /** + * Special hash array value that indicates the container is immutable. + */ + static final int[] EMPTY_IMMUTABLE_INTS = new int[0]; + + /** * @hide Special immutable empty ArrayMap. */ public static final ArrayMap EMPTY = new ArrayMap(true); @@ -75,11 +80,6 @@ public final class ArrayMap<K, V> implements Map<K, V> { static Object[] mTwiceBaseCache; static int mTwiceBaseCacheSize; - /** - * Special hash array value that indicates the container is immutable. - */ - static final int[] EMPTY_IMMUTABLE_INTS = new int[0]; - int[] mHashes; Object[] mArray; int mSize; diff --git a/core/java/android/util/LocaleList.java b/core/java/android/util/LocaleList.java index b2ee045db451..1becfb4a0e23 100644 --- a/core/java/android/util/LocaleList.java +++ b/core/java/android/util/LocaleList.java @@ -19,6 +19,7 @@ package android.util; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Size; +import android.icu.util.ULocale; import android.os.Parcel; import android.os.Parcelable; @@ -208,10 +209,66 @@ public final class LocaleList implements Parcelable { } } + private static String getLikelyScript(Locale locale) { + final String script = locale.getScript(); + if (!script.isEmpty()) { + return script; + } else { + // TODO: Cache the results if this proves to be too slow + return ULocale.addLikelySubtags(ULocale.forLocale(locale)).getScript(); + } + } + + private static int matchScore(Locale supported, Locale desired) { + if (supported.equals(desired)) { + return 1; // return early so we don't do unnecessary computation + } + if (!supported.getLanguage().equals(desired.getLanguage())) { + return 0; + } + // There is no match if the two locales use different scripts. This will most imporantly + // take care of traditional vs simplified Chinese. + final String supportedScr = getLikelyScript(supported); + final String desiredScr = getLikelyScript(desired); + return supportedScr.equals(desiredScr) ? 1 : 0; + } + + /** + * Returns the first match in the locale list given an unordered array of supported locales + * in BCP47 format. + * + * If the locale list is empty, null would be returned. + */ @Nullable - public Locale getBestMatch(String[] locales) { - // TODO: Fix this to actually do locale negotiation and choose the best match - return getPrimary(); + public Locale getFirstMatch(String[] supportedLocales) { + if (mList.length == 1) { // just one locale, perhaps the most common scenario + return mList[0]; + } + if (mList.length == 0) { // empty locale list + return null; + } + // TODO: Figure out what to if en-XA or ar-XB are in the locale list + int bestIndex = Integer.MAX_VALUE; + for (String tag : supportedLocales) { + final Locale supportedLocale = Locale.forLanguageTag(tag); + // We expect the average length of locale lists used for locale resolution to be + // smaller than three, so it's OK to do this as an O(mn) algorithm. + for (int idx = 0; idx < mList.length; idx++) { + final int score = matchScore(supportedLocale, mList[idx]); + if (score > 0) { + if (idx == 0) { // We have a match on the first locale, which is good enough + return mList[0]; + } else if (idx < bestIndex) { + bestIndex = idx; + } + } + } + } + if (bestIndex == Integer.MAX_VALUE) { // no match was found + return mList[0]; + } else { + return mList[bestIndex]; + } } private final static Object sLock = new Object(); diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java index bae51d3b9d1f..46b9a4694d9d 100644 --- a/core/java/android/view/InputDevice.java +++ b/core/java/android/view/InputDevice.java @@ -256,6 +256,15 @@ public final class InputDevice implements Parcelable { public static final int SOURCE_TOUCH_NAVIGATION = 0x00200000 | SOURCE_CLASS_NONE; /** + * The input source is a rotating encoder device whose motions should be interpreted as akin to + * those of a scroll wheel. + * + * @see #SOURCE_CLASS_NONE + * {@hide} + */ + public static final int SOURCE_ROTARY_ENCODER = 0x00400000 | SOURCE_CLASS_NONE; + + /** * The input source is a joystick. * (It may also be a {@link #SOURCE_GAMEPAD}). * diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java index 6026d04a1f21..527d7e51c3e3 100644 --- a/core/java/android/view/MotionEvent.java +++ b/core/java/android/view/MotionEvent.java @@ -962,6 +962,22 @@ public final class MotionEvent extends InputEvent implements Parcelable { public static final int AXIS_TILT = 25; /** + * Axis constant: Generic scroll axis of a motion event. + * <p> + * <ul> + * <li>Reports the relative movement of the generic scrolling device. + * </ul> + * </p><p> + * This axis should be used for scroll events that are neither strictly vertical nor horizontal. + * A good example would be the rotation of a rotary encoder input device. + * </p> + * + * @see #getAxisValue(int, int) + * {@hide} + */ + public static final int AXIS_SCROLL = 26; + + /** * Axis constant: Generic 1 axis of a motion event. * The interpretation of a generic axis is device-specific. * @@ -1171,6 +1187,7 @@ public final class MotionEvent extends InputEvent implements Parcelable { names.append(AXIS_BRAKE, "AXIS_BRAKE"); names.append(AXIS_DISTANCE, "AXIS_DISTANCE"); names.append(AXIS_TILT, "AXIS_TILT"); + names.append(AXIS_SCROLL, "AXIS_SCROLL"); names.append(AXIS_GENERIC_1, "AXIS_GENERIC_1"); names.append(AXIS_GENERIC_2, "AXIS_GENERIC_2"); names.append(AXIS_GENERIC_3, "AXIS_GENERIC_3"); diff --git a/core/java/android/view/NotificationHeaderView.java b/core/java/android/view/NotificationHeaderView.java index 82f6c7f8ce44..54fa7644ade9 100644 --- a/core/java/android/view/NotificationHeaderView.java +++ b/core/java/android/view/NotificationHeaderView.java @@ -17,10 +17,10 @@ package android.view; import android.annotation.Nullable; -import android.app.Notification; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RemoteViews; import android.widget.TextView; @@ -34,14 +34,20 @@ import java.util.ArrayList; */ @RemoteViews.RemoteView public class NotificationHeaderView extends LinearLayout { + public static final int NO_COLOR = -1; private final int mHeaderMinWidth; + private final int mExpandTopPadding; private View mAppName; private View mSubTextView; private OnClickListener mExpandClickListener; private HeaderTouchListener mTouchListener = new HeaderTouchListener(); - private View mExpandButton; + private ImageView mExpandButton; private View mIcon; private TextView mChildCount; + private int mIconColor; + private int mOriginalNotificationColor; + private boolean mGroupHeader; + private boolean mExpanded; public NotificationHeaderView(Context context) { this(context, null); @@ -59,6 +65,7 @@ public class NotificationHeaderView extends LinearLayout { super(context, attrs, defStyleAttr, defStyleRes); mHeaderMinWidth = getResources().getDimensionPixelSize( com.android.internal.R.dimen.notification_header_shrink_min_width); + mExpandTopPadding = (int) (1 * getResources().getDisplayMetrics().density); } @Override @@ -66,7 +73,7 @@ public class NotificationHeaderView extends LinearLayout { super.onFinishInflate(); mAppName = findViewById(com.android.internal.R.id.app_name_text); mSubTextView = findViewById(com.android.internal.R.id.header_sub_text); - mExpandButton = findViewById(com.android.internal.R.id.expand_button); + mExpandButton = (ImageView) findViewById(com.android.internal.R.id.expand_button); mIcon = findViewById(com.android.internal.R.id.icon); mChildCount = (TextView) findViewById(com.android.internal.R.id.number_of_children); } @@ -98,7 +105,7 @@ public class NotificationHeaderView extends LinearLayout { int overFlow = totalWidth - givenWidth; // We are overflowing, lets shrink final int appWidth = mAppName.getMeasuredWidth(); - if (appWidth > mHeaderMinWidth) { + if (mAppName.getVisibility() != GONE && appWidth > mHeaderMinWidth) { int newSize = appWidth - Math.min(appWidth - mHeaderMinWidth, overFlow); int childWidthSpec = MeasureSpec.makeMeasureSpec(newSize, MeasureSpec.AT_MOST); mAppName.measure(childWidthSpec, wrapContentHeightSpec); @@ -146,6 +153,57 @@ public class NotificationHeaderView extends LinearLayout { } } + @RemotableViewMethod + public void setOriginalIconColor(int color) { + mIconColor = color; + } + + public int getOriginalIconColor() { + return mIconColor; + } + + @RemotableViewMethod + public void setOriginalNotificationColor(int color) { + mOriginalNotificationColor = color; + } + + public int getOriginalNotificationColor() { + return mOriginalNotificationColor; + } + + public void setIsGroupHeader(boolean isGroupHeader) { + mGroupHeader = isGroupHeader; + updateExpandButton(); + } + + @RemotableViewMethod + public void setExpanded(boolean expanded) { + mExpanded = expanded; + updateExpandButton(); + } + + private void updateExpandButton() { + int drawableId; + int paddingTop = 0; + if (mGroupHeader) { + if (mExpanded) { + drawableId = com.android.internal.R.drawable.ic_collapse_bundle; + } else { + drawableId =com.android.internal.R.drawable.ic_expand_bundle; + } + } else { + if (mExpanded) { + drawableId = com.android.internal.R.drawable.ic_collapse_notification; + } else { + drawableId = com.android.internal.R.drawable.ic_expand_notification; + } + paddingTop = mExpandTopPadding; + } + mExpandButton.setImageDrawable(getContext().getDrawable(drawableId)); + mExpandButton.setColorFilter(mOriginalNotificationColor); + mExpandButton.setPadding(0, paddingTop, 0, 0); + } + public class HeaderTouchListener implements View.OnTouchListener { private final ArrayList<Rect> mTouchRects = new ArrayList<>(); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 6dd87a035d23..183ccf3f63a9 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -83,7 +83,6 @@ import android.view.AccessibilityIterators.TextSegmentIterator; import android.view.AccessibilityIterators.CharacterTextSegmentIterator; import android.view.AccessibilityIterators.WordTextSegmentIterator; import android.view.AccessibilityIterators.ParagraphTextSegmentIterator; -import android.view.ViewGroup.LayoutParams; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEventSource; import android.view.accessibility.AccessibilityManager; @@ -2423,8 +2422,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * 1 PFLAG3_SCROLL_INDICATOR_END * 1 PFLAG3_ASSIST_BLOCKED * 1111111 PFLAG3_POINTER_ICON_MASK - * 1 PFLAG3_PARTIAL_LAYOUT_REQUESTED - * 1 PFLAG3_LAYOUT_PARAMS_CHANGED * |-------|-------|-------|-------| */ @@ -2513,7 +2510,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ static final int PFLAG3_SCROLL_INDICATOR_END = 0x2000; - /* End of masks for mPrivateFlags3 */ static final int DRAG_MASK = PFLAG2_DRAG_CAN_ACCEPT | PFLAG2_DRAG_HOVERED; @@ -2652,19 +2648,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static final int PFLAG3_POINTER_ICON_VALUE_START = 3 << PFLAG3_POINTER_ICON_LSHIFT; /** - * Flag indicating that this view has requested a partial layout and - * is added to the AttachInfo's list of views that need a partial layout - * request handled on the next traversal. - */ - static final int PFLAG3_PARTIAL_LAYOUT_REQUESTED = 0x800000; - - /** - * Flag indicating that this view's LayoutParams have been explicitly changed - * since the last layout pass. - */ - static final int PFLAG3_LAYOUT_PARAMS_CHANGED = 0x1000000; - - /** * Always allow a user to over-scroll this view, provided it is a * view that can scroll. * @@ -12671,14 +12654,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * ViewGroup.LayoutParams, and these correspond to the different subclasses * of ViewGroup that are responsible for arranging their children. * - * <p>This method may return null if this View is not attached to a parent + * This method may return null if this View is not attached to a parent * ViewGroup or {@link #setLayoutParams(android.view.ViewGroup.LayoutParams)} * was not invoked successfully. When a View is attached to a parent - * ViewGroup, this method must not return null.</p> - * - * <p>Callers that modify the returned LayoutParams object should call - * {@link #setLayoutParams(LayoutParams)} to explicitly inform the view that - * LayoutParams have changed.</p> + * ViewGroup, this method must not return null. * * @return The LayoutParams associated with this view, or null if no * parameters have been set yet @@ -12695,9 +12674,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * correspond to the different subclasses of ViewGroup that are responsible * for arranging their children. * - * <p>If the View's existing LayoutParams object as obtained by {@link #getLayoutParams()} is - * modified, you should call this method to inform the view that it has changed.</p> - * * @param params The layout parameters for this view, cannot be null */ public void setLayoutParams(ViewGroup.LayoutParams params) { @@ -12705,7 +12681,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, throw new NullPointerException("Layout parameters cannot be null"); } mLayoutParams = params; - mPrivateFlags3 |= PFLAG3_LAYOUT_PARAMS_CHANGED; resolveLayoutParams(); if (mParent instanceof ViewGroup) { ((ViewGroup) mParent).onSetLayoutParams(this, params); @@ -14381,12 +14356,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mParent.requestTransparentRegion(this); } - if ((mPrivateFlags & PFLAG_AWAKEN_SCROLL_BARS_ON_ATTACH) != 0) { - initialAwakenScrollBars(); - mPrivateFlags &= ~PFLAG_AWAKEN_SCROLL_BARS_ON_ATTACH; - } - - mPrivateFlags3 &= ~(PFLAG3_IS_LAID_OUT | PFLAG3_PARTIAL_LAYOUT_REQUESTED); + mPrivateFlags3 &= ~PFLAG3_IS_LAID_OUT; jumpDrawablesToCurrentState(); @@ -14724,13 +14694,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ @CallSuper protected void onDetachedFromWindowInternal() { - if (mAttachInfo != null && isPartialLayoutRequested()) { - mAttachInfo.mPartialLayoutViews.remove(this); - } - mPrivateFlags &= ~PFLAG_CANCEL_NEXT_UP_EVENT; - mPrivateFlags3 &= ~(PFLAG3_IS_LAID_OUT | PFLAG3_PARTIAL_LAYOUT_REQUESTED - | PFLAG3_LAYOUT_PARAMS_CHANGED); + mPrivateFlags3 &= ~PFLAG3_IS_LAID_OUT; removeUnsetPressCallback(); removeLongPressCallback(); @@ -16917,32 +16882,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * Indicates whether or not this view has requested a partial layout that - * may not affect its size or position within its parent. This state will be reset - * the next time this view is laid out. - * - * @return true if partial layout has been requested - */ - public final boolean isPartialLayoutRequested() { - return (mPrivateFlags3 & PFLAG3_PARTIAL_LAYOUT_REQUESTED) - == PFLAG3_PARTIAL_LAYOUT_REQUESTED; - } - - /** - * Returns true if this view's {@link ViewGroup.LayoutParams LayoutParams} changed - * since the last time this view was successfully laid out. Typically this happens as a - * result of a call to {@link #setLayoutParams(LayoutParams)}. - * - * @return true if this view's LayoutParams changed since last layout. - */ - public final boolean didLayoutParamsChange() { - if (sLayoutParamsAlwaysChanged) { - return true; - } - return (mPrivateFlags3 & PFLAG3_LAYOUT_PARAMS_CHANGED) == PFLAG3_LAYOUT_PARAMS_CHANGED; - } - - /** * Return true if o is a ViewGroup that is laying out using optical bounds. * @hide */ @@ -16999,7 +16938,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (changed || (mPrivateFlags & PFLAG_LAYOUT_REQUIRED) == PFLAG_LAYOUT_REQUIRED) { onLayout(changed, l, t, r, b); mPrivateFlags &= ~PFLAG_LAYOUT_REQUIRED; - mPrivateFlags3 &= ~PFLAG3_LAYOUT_PARAMS_CHANGED; ListenerInfo li = mListenerInfo; if (li != null && li.mOnLayoutChangeListeners != null) { @@ -17013,7 +16951,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } mPrivateFlags &= ~PFLAG_FORCE_LAYOUT; - mPrivateFlags3 &= ~PFLAG3_PARTIAL_LAYOUT_REQUESTED; mPrivateFlags3 |= PFLAG3_IS_LAID_OUT; } @@ -19111,7 +19048,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mPrivateFlags |= PFLAG_INVALIDATED; if (mParent != null && !mParent.isLayoutRequested()) { - mParent.requestLayoutForChild(this); + mParent.requestLayout(); } if (mAttachInfo != null && mAttachInfo.mViewRequestingLayout == this) { mAttachInfo.mViewRequestingLayout = null; @@ -19130,11 +19067,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mPrivateFlags |= PFLAG_INVALIDATED; } - void forcePartialLayout() { - forceLayout(); - mPrivateFlags3 |= PFLAG3_PARTIAL_LAYOUT_REQUESTED; - } - /** * <p> * This is called to find out how big a view should be. The parent @@ -22021,7 +21953,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, interface Callbacks { void playSoundEffect(int effectId); boolean performHapticFeedback(int effectId, boolean always); - void schedulePartialLayout(); } /** diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 488063b31ea0..0f7d296a1555 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -60,8 +60,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1; -import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; -import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; /** * <p> @@ -5531,172 +5529,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager int l, int t, int r, int b); /** - * {@inheritDoc} - * - * <p>Most subclasses should not need to override this method. The default implementation - * will call {@link #findDependentLayoutAxes(View, int)} to determine how - * to optimally proceed. If neither horizontal nor vertical layout depends on the given - * child, this method will call {@link #requestPartialLayoutForChild(View)}. If one or both - * do, it will call {@link #requestLayout()}.</p> - * - * @param child Child requesting a layout - */ - @Override - public void requestLayoutForChild(View child) { - if (child == null || child.getParent() != this) { - throw new IllegalArgumentException( - "child parameter must be a direct child view of this ViewGroup"); - } - - // If we don't have a parent ourselves, record that we need a full layout. - // Our whole subtree is detached. - final ViewParent parent = getParent(); - if (parent == null) { - requestLayout(); - return; - } - - // We can optimize the layout request for this child into a partial layout - // if the child has already been laid out at least once and neither horizontal nor - // vertical layout within ourselves is dependent on pending layout changes within - // this child. Otherwise we need to request a full layout for ourselves and continue - // to recurse up the view hierarchy. - if (child.isLaidOut() && findDependentLayoutAxes(child, FLAG_LAYOUT_AXIS_ANY) == 0) { - requestPartialLayoutForChild(child); - } else { - requestLayout(); - } - } - - /** - * {@inheritDoc} - * - * <p>The default implementation returns {@link #FLAG_LAYOUT_AXIS_ANY}. - * Optimized implementations for specific ViewGroup subclasses may check if the child's - * {@link View#didLayoutParamsChange() LayoutParams changed} and in what ways.</p> - * - * @param child Direct child of this ViewParent to check - * @param axisFilter Which axes to check for dependencies. Can be - * {@link #FLAG_LAYOUT_AXIS_HORIZONTAL}, {@link #FLAG_LAYOUT_AXIS_VERTICAL} - * or {@link #FLAG_LAYOUT_AXIS_ANY}. - * @return Axes of this ViewParent that depend on the given child's layout changes - */ - @Override - public int findDependentLayoutAxes(View child, int axisFilter) { - return FLAG_LAYOUT_AXIS_ANY; - } - - /** - * This is a helper implementation for {@link #findDependentLayoutAxes(View, int)} that - * is not the default implementation in ViewGroup. This is to preserve compatibility with - * existing app-side ViewGroup subclasses that existed before the partial layout system was - * added to Android. It explicitly checks that the LayoutParams of the child are of the - * expected type so that subclasses of standard framework layouts do not erroneously - * start believing that it's safe to do a partial layout when that assertion can't - * reasonably be confirmed. - * - * <p>If you're reading this as an author of a custom ViewGroup's findDependentLayoutAxes - * method you might be frustrated to discover that it is not a part of the Android public API. - * Many ViewGroup implementations will need to make small but important modifications - * to an implementation like this one in order to be correct. Instead of encouraging - * view authors to call this method, then make their own redundant recursive calls to - * <code>getParent().findDependentLayoutAxes(...)</code> in addition to the one - * that can happen here, this method is hidden and only used internally.</p> - * - * <p>Do feel free to copy this implementation and adapt it to suit your own purposes.</p> - * - * @hide - */ - protected final int findDependentLayoutAxesHelper(View child, int axisFilter, - Class<?> layoutParamsClass) { - if (!checkPartialLayoutParams(child, layoutParamsClass)) return axisFilter; - if (child.didLayoutParamsChange()) { - // Anything could have changed about our previous assumptions. - return axisFilter; - } - - final LayoutParams lp = child.getLayoutParams(); - - // Our layout can always end up depending on a WRAP_CONTENT child. - final int wrapAxisFilter = ((lp.width == WRAP_CONTENT ? FLAG_LAYOUT_AXIS_HORIZONTAL : 0) - | (lp.height == WRAP_CONTENT ? FLAG_LAYOUT_AXIS_VERTICAL : 0)) & axisFilter; - - if (wrapAxisFilter == axisFilter) { - // We know all queried axes are affected, just return early. - return wrapAxisFilter; - } - - // Our layout *may* depend on a MATCH_PARENT child, depending on whether we can determine - // that our layout will remain stable within our parent. We need to ask. - final int matchAxisFilter = ((lp.width == MATCH_PARENT ? FLAG_LAYOUT_AXIS_HORIZONTAL : 0) - | (lp.height == MATCH_PARENT ? FLAG_LAYOUT_AXIS_VERTICAL : 0)) & axisFilter; - - if (matchAxisFilter != 0 || wrapAxisFilter != 0) { - final ViewParent parent = getParent(); - if (parent != null) { - // If our parent depends on us for an axis, then our layout can also be affected - // by a MATCH_PARENT child along that axis. - return getParent().findDependentLayoutAxes(this, matchAxisFilter) - | wrapAxisFilter; - } - - // If we don't have a parent, assume we're affected - // in any determined affected direction. - return matchAxisFilter | wrapAxisFilter; - } - - // Two exact sizes and LayoutParams didn't change. We're safe. - return 0; - } - - /** - * Throw an IllegalArgumentException if the supplied view is not a direct child of - * this ViewGroup and return false if this view's LayoutParams is not of class lpClass. - * Implementations of {@link ViewGroup#findDependentLayoutAxes(View, int)} use this - * to check input parameters and defensively return the full axis filter mask themselves - * if the LayoutParams class is not of the exact expected type; e.g. it is a subclass - * of one of the standard framework layouts and we can't make assumptions. - * @hide - */ - protected final boolean checkPartialLayoutParams(View child, Class<?> lpClass) { - if (child.getParent() != this) { - throw new IllegalArgumentException("View " + child - + " is not a direct child of " + this); - } - final ViewGroup.LayoutParams lp = child.getLayoutParams(); - return lp != null || lp.getClass() == lpClass; - } - - /** - * Called when a child of this ViewParent requires a relayout before the next frame - * is drawn, but the caller can guarantee that the size of the child will not change - * during a measure and layout pass. - * - * <p>A call to this method will schedule a partial layout for the supplied view as long as - * it is a direct child of this ViewGroup and this ViewGroup is attached to a window. - * On the next scheduled view hierarchy traversal the given child view will be re-measured - * at its current measured size and re-laid out at its current position within its parent.</p> - * - * @param child Child that requires a partial layout - */ - public void requestPartialLayoutForChild(View child) { - if (!child.isPartialLayoutRequested()) { - child.forcePartialLayout(); - if (mAttachInfo != null) { - final List<View> partialLayoutViews = mAttachInfo.mPartialLayoutViews; - final boolean schedule = partialLayoutViews.isEmpty(); - partialLayoutViews.add(child); - if (schedule) { - mAttachInfo.mRootCallbacks.schedulePartialLayout(); - } - child.invalidate(); - } else { - requestLayout(); - } - } - } - - /** * Indicates whether the view group has the ability to animate its children * after the first layout. * @@ -6042,7 +5874,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * of its descendants */ protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { - return new LayoutParams(p); + return p; } /** diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java index f2ab35e90c17..e9b123b5b9be 100644 --- a/core/java/android/view/ViewParent.java +++ b/core/java/android/view/ViewParent.java @@ -26,11 +26,6 @@ import android.view.accessibility.AccessibilityEvent; * */ public interface ViewParent { - public static final int FLAG_LAYOUT_AXIS_HORIZONTAL = 1; - public static final int FLAG_LAYOUT_AXIS_VERTICAL = 2; - public static final int FLAG_LAYOUT_AXIS_ANY - = FLAG_LAYOUT_AXIS_HORIZONTAL | FLAG_LAYOUT_AXIS_VERTICAL; - /** * Called when something has changed which has invalidated the layout of a * child of this view parent. This will schedule a layout pass of the view @@ -618,48 +613,4 @@ public interface ViewParent { * @return true if the action was consumed by this ViewParent */ public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle arguments); - - /** - * Called when a child of this ViewParent requires a relayout before - * the next frame is drawn. A call to {@link View#requestLayout() child.requestLayout()} - * will implicitly result in a call to - * <code>child.getParent().requestLayoutForChild(child)</code>. App code should not call this - * method directly. Call <code>child.requestLayout()</code> instead. - * - * <p>On versions of Android from API 23 and older, a call to {@link View#requestLayout()} - * would cause a matching call to <code>requestLayout</code> on each parent view up to - * the root. With the addition of <code>requestLayoutForChild</code> a view's parent may - * explicitly decide how to handle a layout request. This allows for optimizations when - * a view parent knows that a layout-altering change in a child will not affect its own - * measurement.</p> - * - * @param child Child requesting a layout - */ - public void requestLayoutForChild(View child); - - /** - * Determine which axes of this ViewParent's layout are dependent on the given - * direct child view. The returned value is a flag set that may contain - * {@link #FLAG_LAYOUT_AXIS_HORIZONTAL} and/or {@link #FLAG_LAYOUT_AXIS_VERTICAL}. - * {@link #FLAG_LAYOUT_AXIS_ANY} is provided as a shortcut for - * <code>FLAG_LAYOUT_AXIS_HORIZONTAL | FLAG_LAYOUT_AXIS_VERTICAL</code>. - * - * <p>The given child must be a direct child view. Implementations should throw - * {@link IllegalArgumentException} otherwise.</p> - * - * <p>The caller may specify which axes it cares about. This should be treated as a filter. - * Implementations should never return a result that would be different from - * <code>result & axisFilter</code>.</p> - * - * @param child Direct child of this ViewParent to check - * @param axisFilter Which axes to check for dependencies. Can be - * {@link #FLAG_LAYOUT_AXIS_HORIZONTAL}, {@link #FLAG_LAYOUT_AXIS_VERTICAL} - * or {@link #FLAG_LAYOUT_AXIS_ANY}. - * @return Axes of this ViewParent that depend on the given child's layout changes - * - * @see #FLAG_LAYOUT_AXIS_HORIZONTAL - * @see #FLAG_LAYOUT_AXIS_VERTICAL - * @see #FLAG_LAYOUT_AXIS_ANY - */ - public int findDependentLayoutAxes(View child, int axisFilter); } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b7bb9a3b983f..12cf66ed3b3a 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -91,7 +91,6 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.concurrent.CountDownLatch; import java.util.HashSet; -import java.util.List; /** * The top of a view hierarchy, implementing the needed protocol between View @@ -953,25 +952,6 @@ public final class ViewRootImpl implements ViewParent, } @Override - public void requestLayoutForChild(View child) { - requestLayout(); - } - - @Override - public int findDependentLayoutAxes(View child, int axisFilter) { - if (child != mView) { - return 0; - } - - final WindowManager.LayoutParams lp = (WindowManager.LayoutParams) child.getLayoutParams(); - final int horizontal = (lp.width == WindowManager.LayoutParams.WRAP_CONTENT - || lp.horizontalWeight != 0) ? FLAG_LAYOUT_AXIS_HORIZONTAL : 0; - final int vertical = (lp.height == WindowManager.LayoutParams.WRAP_CONTENT - || lp.verticalWeight != 0) ? FLAG_LAYOUT_AXIS_VERTICAL : 0; - return (horizontal | vertical) & axisFilter; - } - - @Override public boolean isLayoutRequested() { return mLayoutRequested; } @@ -1115,10 +1095,6 @@ public final class ViewRootImpl implements ViewParent, } } - public void schedulePartialLayout() { - scheduleTraversals(); - } - /** * Notifies the HardwareRenderer that a new frame will be coming soon. * Currently only {@link ThreadedRenderer} cares about this, and uses @@ -1958,60 +1934,7 @@ public final class ViewRootImpl implements ViewParent, || mAttachInfo.mRecomputeGlobalAttributes; if (didLayout) { performLayout(lp, desiredWindowWidth, desiredWindowHeight); - } - - /* - * Handle partial layouts. - * - * Views that have requested partial layouts will not change size or position - * within their parent view, therefore we will re-measure and re-layout each one - * after any regularly scheduled layout pass. Any view that already had its - * isLayoutRequested bit cleared will be skipped, since this means the view has already - * been measured and laid out on this traversal pass naturally. Views won't be added - * to this list if layout was already requested when a partial layout is requested - * for a view, so there should not be duplicates in the list. - */ - final List<View> partialLayoutViews = mAttachInfo.mPartialLayoutViews; - final boolean didPartialLayout; - if (!partialLayoutViews.isEmpty()) { - // Measurement or layout of views may result in changes to the list - // of partial-layout views. Swap in an "empty" list to prevent - // concurrent modification of the list being traversed. - if (mAttachInfo.mEmptyPartialLayoutViews == null) { - mAttachInfo.mPartialLayoutViews = new ArrayList<>(); - } else { - mAttachInfo.mPartialLayoutViews = mAttachInfo.mEmptyPartialLayoutViews; - } - - final int count = partialLayoutViews.size(); - mInLayout = true; - for (int i = 0; i < count; i++) { - final View view = partialLayoutViews.get(i); - - // Make sure the view is still attached and that it still has layout requested. - // We might have already serviced the layout request through the standard full-tree - // layout pass above or even through a previous partial layout view in this list. - if (view.isAttachedToWindow() && view.isLayoutRequested()) { - final int widthSpec = MeasureSpec.makeMeasureSpec(view.getMeasuredWidth(), - MeasureSpec.EXACTLY); - final int heightSpec = MeasureSpec.makeMeasureSpec(view.getMeasuredHeight(), - MeasureSpec.EXACTLY); - view.measure(widthSpec, heightSpec); - view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); - } - } - mInLayout = false; - didPartialLayout = true; - triggerGlobalLayoutListener = true; - - // The traversal list becomes the new empty list. - partialLayoutViews.clear(); - mAttachInfo.mEmptyPartialLayoutViews = partialLayoutViews; - } else { - didPartialLayout = false; - } - if (didLayout || didPartialLayout) { // By this point all views have been sized and positioned // We can compute the transparent area @@ -2041,7 +1964,7 @@ public final class ViewRootImpl implements ViewParent, if (DBG) { System.out.println("======================================"); - System.out.println("performTraversals -- after performLayout/partial layout"); + System.out.println("performTraversals -- after setFrame"); host.debug(); } } diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index 3c4d45a244b9..7a359e79d4c5 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -1158,27 +1158,6 @@ public abstract class Window { public abstract void setContentView(View view); /** - * Install a view in the decoration (title) area, to be shown when - * the window is in multi-window mode. This view will be placed - * next to the window controls. - * - * The view may be restored to defaults by passing null. - * - * @param view The desired view to display in window decorations. - */ - public abstract void setDecorView(View view); - - /** - * Convenience for - * {@link #setDecorView(View)} - * to set the custom window decoration from a layout resource. The layout will be inflated - * adding all top level views to the decoration - * - * @param layoutResID Resource ID to be inflated. - */ - public abstract void setDecorView(@LayoutRes int layoutResID); - - /** * Set the screen content to an explicit view. This view is placed * directly into the screen's view hierarchy. It can itself be a complex * view hierarchy. @@ -2060,4 +2039,6 @@ public abstract class Window { public boolean getOverlayDecorCaption() { return mOverlayWithDecorCaption; } + + } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 7e45bbb82e96..b1a8479868bc 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -431,6 +431,11 @@ public interface WindowManagerPolicy { public int getLidState(); /** + * Lock the device now. + */ + public void lockDeviceNow(); + + /** * Returns a code that descripbes whether the camera lens is covered or not. */ public int getCameraLensCoverState(); diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index f050e49f0b05..e1ce9fe7c039 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -2109,11 +2109,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } @Override - public int findDependentLayoutAxes(View child, int axisFilter) { - return findDependentLayoutAxesHelper(child, axisFilter, LayoutParams.class); - } - - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mSelector == null) { useDefaultSelector(); diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java index 10aefe4eb714..cf4587d30373 100644 --- a/core/java/android/widget/AbsSeekBar.java +++ b/core/java/android/widget/AbsSeekBar.java @@ -16,6 +16,8 @@ package android.widget; +import com.android.internal.R; + import android.annotation.Nullable; import android.content.Context; import android.content.res.ColorStateList; @@ -33,8 +35,6 @@ import android.view.MotionEvent; import android.view.ViewConfiguration; import android.view.accessibility.AccessibilityNodeInfo; -import com.android.internal.R; - public abstract class AbsSeekBar extends ProgressBar { private final Rect mTempRect = new Rect(); @@ -424,10 +424,10 @@ public abstract class AbsSeekBar extends ProgressBar { if (thumbHeight > trackHeight) { final int offsetHeight = (paddedHeight - thumbHeight) / 2; trackOffset = offsetHeight + (thumbHeight - trackHeight) / 2; - thumbOffset = offsetHeight + 0; + thumbOffset = offsetHeight; } else { final int offsetHeight = (paddedHeight - trackHeight) / 2; - trackOffset = offsetHeight + 0; + trackOffset = offsetHeight; thumbOffset = offsetHeight + (trackHeight - thumbHeight) / 2; } @@ -574,13 +574,7 @@ public abstract class AbsSeekBar extends ProgressBar { if (isInScrollingContainer()) { mTouchDownX = event.getX(); } else { - setPressed(true); - if (mThumb != null) { - invalidate(mThumb.getBounds()); // This may be within the padding region - } - onStartTrackingTouch(); - trackTouchEvent(event); - attemptClaimDrag(); + startDrag(event); } break; @@ -590,13 +584,7 @@ public abstract class AbsSeekBar extends ProgressBar { } else { final float x = event.getX(); if (Math.abs(x - mTouchDownX) > mScaledTouchSlop) { - setPressed(true); - if (mThumb != null) { - invalidate(mThumb.getBounds()); // This may be within the padding region - } - onStartTrackingTouch(); - trackTouchEvent(event); - attemptClaimDrag(); + startDrag(event); } } break; @@ -630,6 +618,19 @@ public abstract class AbsSeekBar extends ProgressBar { return true; } + private void startDrag(MotionEvent event) { + setPressed(true); + + if (mThumb != null) { + // This may be within the padding region. + invalidate(mThumb.getBounds()); + } + + onStartTrackingTouch(); + trackTouchEvent(event); + attemptClaimDrag(); + } + private void setHotspot(float x, float y) { final Drawable bg = getBackground(); if (bg != null) { @@ -638,18 +639,20 @@ public abstract class AbsSeekBar extends ProgressBar { } private void trackTouchEvent(MotionEvent event) { + final int x = Math.round(event.getX()); + final int y = Math.round(event.getY()); final int width = getWidth(); - final int available = width - mPaddingLeft - mPaddingRight; - final int x = (int) event.getX(); - float scale; - float progress = 0; + final int availableWidth = width - mPaddingLeft - mPaddingRight; + + final float scale; + float progress = 0.0f; if (isLayoutRtl() && mMirrorForRtl) { if (x > width - mPaddingRight) { scale = 0.0f; } else if (x < mPaddingLeft) { scale = 1.0f; } else { - scale = (float)(available - x + mPaddingLeft) / (float)available; + scale = (availableWidth - x + mPaddingLeft) / (float) availableWidth; progress = mTouchProgressOffset; } } else { @@ -658,15 +661,16 @@ public abstract class AbsSeekBar extends ProgressBar { } else if (x > width - mPaddingRight) { scale = 1.0f; } else { - scale = (float)(x - mPaddingLeft) / (float)available; + scale = (x - mPaddingLeft) / (float) availableWidth; progress = mTouchProgressOffset; } } + final int max = getMax(); progress += scale * max; - setHotspot(x, (int) event.getY()); - setProgressInternal((int) progress, true, false); + setHotspot(x, y); + setProgressInternal(Math.round(progress), true, false); } /** diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java index 4d9f55c2c074..280ff151cd6d 100644 --- a/core/java/android/widget/FrameLayout.java +++ b/core/java/android/widget/FrameLayout.java @@ -21,8 +21,12 @@ import java.util.ArrayList; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; +import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.PorterDuff; import android.graphics.Rect; +import android.graphics.Region; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.Gravity; @@ -32,6 +36,9 @@ import android.view.ViewGroup; import android.view.ViewHierarchyEncoder; import android.widget.RemoteViews.RemoteView; +import com.android.internal.R; + + /** * FrameLayout is designed to block out an area on the screen to display * a single item. Generally, FrameLayout should be used to hold a single child view, because it can @@ -164,10 +171,6 @@ public class FrameLayout extends ViewGroup { mPaddingBottom + mForegroundPaddingBottom; } - @Override - public int findDependentLayoutAxes(View child, int axisFilter) { - return findDependentLayoutAxesHelper(child, axisFilter, LayoutParams.class); - } /** * {@inheritDoc} diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java index bdb1e83438c5..ad939be13a44 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -16,7 +16,6 @@ package android.widget; -import android.view.ViewParent; import com.android.internal.R; import android.annotation.IntDef; @@ -38,8 +37,6 @@ import android.widget.RemoteViews.RemoteView; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; -import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; /** * A Layout that arranges its children in a single column or a single row. The direction of @@ -647,60 +644,6 @@ public class LinearLayout extends ViewGroup { } } - @Override - public int findDependentLayoutAxes(View child, int axisFilter) { - // This implementation is almost exactly equivalent to the default implementation - // offered to the rest of the framework in ViewGroup, but we treat weight to be - // functionally equivalent to MATCH_PARENT along the orientation axis. - - if (!checkPartialLayoutParams(child, LayoutParams.class)) return axisFilter; - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (child.didLayoutParamsChange()) { - // Anything could have changed about our previous assumptions. - return axisFilter; - } - - // Our layout can always end up depending on a WRAP_CONTENT child. - final int wrapAxisFilter = ((lp.width == WRAP_CONTENT ? FLAG_LAYOUT_AXIS_HORIZONTAL : 0) - | (lp.height == WRAP_CONTENT ? FLAG_LAYOUT_AXIS_VERTICAL : 0)) & axisFilter; - - if (wrapAxisFilter == axisFilter) { - // We know all queried axes are affected, just return early. - return wrapAxisFilter; - } - - // Our layout *may* depend on a MATCH_PARENT child, depending on whether we can determine - // that our layout will remain stable within our parent. We need to ask. - int matchAxisFilter = ((lp.width == MATCH_PARENT ? FLAG_LAYOUT_AXIS_HORIZONTAL : 0) - | (lp.height == MATCH_PARENT ? FLAG_LAYOUT_AXIS_VERTICAL : 0)) & axisFilter; - - // For LinearLayout, a nonzero weight is equivalent to MATCH_PARENT for this purpose. - if (lp.weight > 0) { - if (mOrientation == HORIZONTAL) { - matchAxisFilter |= FLAG_LAYOUT_AXIS_HORIZONTAL & axisFilter; - } else { - matchAxisFilter |= FLAG_LAYOUT_AXIS_VERTICAL & axisFilter; - } - } - - if (matchAxisFilter != 0 || wrapAxisFilter != 0) { - final ViewParent parent = getParent(); - if (parent != null) { - // If our parent depends on us for an axis, then our layout can also be affected - // by a MATCH_PARENT child along that axis. - return getParent().findDependentLayoutAxes(this, matchAxisFilter) - | wrapAxisFilter; - } - - // If we don't have a parent, assume we're affected - // in any determined affected direction. - return matchAxisFilter | wrapAxisFilter; - } - - // Two exact sizes and LayoutParams didn't change. We're safe. - return 0; - } - /** * Determines where to position dividers between children. * diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index b43ea76976e1..53ca6d1ba3b1 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -1158,7 +1158,7 @@ public class ListView extends AbsListView { final View child = obtainView(0, mIsScrap); // Lay out child directly against the parent measure spec so that - // we can obtain expected minimum width and height. + // we can obtain exected minimum width and height. measureScrapChild(child, 0, widthMeasureSpec, heightSize); childWidth = child.getMeasuredWidth(); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 56513a3d997e..94b75b73bb7d 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -6814,11 +6814,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mEllipsize == TextUtils.TruncateAt.MARQUEE) { if (!compressText(ellipsisWidth)) { + final int height = mLayoutParams.height; // If the size of the view does not depend on the size of the text, try to // start the marquee immediately - final ViewParent parent = getParent(); - if (parent != null && parent.findDependentLayoutAxes(this, - ViewParent.FLAG_LAYOUT_AXIS_VERTICAL) == 0) { + if (height != LayoutParams.WRAP_CONTENT && height != LayoutParams.MATCH_PARENT) { startMarquee(); } else { // Defer the start of the marquee until we know our width (see setFrame()) @@ -7217,9 +7216,37 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * new view layout. */ private void checkForResize() { - // Always request a layout. The parent will perform the correct version - // of the intended optimizations as part of requestLayoutForChild. - requestLayout(); + boolean sizeChanged = false; + + if (mLayout != null) { + // Check if our width changed + if (mLayoutParams.width == LayoutParams.WRAP_CONTENT) { + sizeChanged = true; + invalidate(); + } + + // Check if our height changed + if (mLayoutParams.height == LayoutParams.WRAP_CONTENT) { + int desiredHeight = getDesiredHeight(); + + if (desiredHeight != this.getHeight()) { + sizeChanged = true; + } + } else if (mLayoutParams.height == LayoutParams.MATCH_PARENT) { + if (mDesiredHeightAtMeasure >= 0) { + int desiredHeight = getDesiredHeight(); + + if (desiredHeight != mDesiredHeightAtMeasure) { + sizeChanged = true; + } + } + } + } + + if (sizeChanged) { + requestLayout(); + // caller will have already invalidated + } } /** @@ -7227,11 +7254,56 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * or merely a new text layout. */ private void checkForRelayout() { - // Always request a layout. The parent will perform the correct version - // of the intended optimizations as part of requestLayoutForChild. - nullLayouts(); - requestLayout(); - invalidate(); + // If we have a fixed width, we can just swap in a new text layout + // if the text height stays the same or if the view height is fixed. + + if ((mLayoutParams.width != LayoutParams.WRAP_CONTENT || + (mMaxWidthMode == mMinWidthMode && mMaxWidth == mMinWidth)) && + (mHint == null || mHintLayout != null) && + (mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight() > 0)) { + // Static width, so try making a new text layout. + + int oldht = mLayout.getHeight(); + int want = mLayout.getWidth(); + int hintWant = mHintLayout == null ? 0 : mHintLayout.getWidth(); + + /* + * No need to bring the text into view, since the size is not + * changing (unless we do the requestLayout(), in which case it + * will happen at measure). + */ + makeNewLayout(want, hintWant, UNKNOWN_BORING, UNKNOWN_BORING, + mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight(), + false); + + if (mEllipsize != TextUtils.TruncateAt.MARQUEE) { + // In a fixed-height view, so use our new text layout. + if (mLayoutParams.height != LayoutParams.WRAP_CONTENT && + mLayoutParams.height != LayoutParams.MATCH_PARENT) { + invalidate(); + return; + } + + // Dynamic height, but height has stayed the same, + // so use our new text layout. + if (mLayout.getHeight() == oldht && + (mHintLayout == null || mHintLayout.getHeight() == oldht)) { + invalidate(); + return; + } + } + + // We lose: the height has changed and we have a dynamic height. + // Request a new view layout using our new text layout. + requestLayout(); + invalidate(); + } else { + // Dynamic width, so we have no choice but to request a new + // view layout with a new text layout. + nullLayouts(); + requestLayout(); + invalidate(); + } } @Override diff --git a/core/java/android/widget/Toolbar.java b/core/java/android/widget/Toolbar.java index 6e565138eff9..acbf5eb8d699 100644 --- a/core/java/android/widget/Toolbar.java +++ b/core/java/android/widget/Toolbar.java @@ -1368,11 +1368,6 @@ public class Toolbar extends ViewGroup { } @Override - public int findDependentLayoutAxes(View child, int axisFilter) { - return findDependentLayoutAxesHelper(child, axisFilter, LayoutParams.class); - } - - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = 0; int height = 0; diff --git a/core/java/com/android/internal/logging/MetricsConstants.java b/core/java/com/android/internal/logging/MetricsConstants.java index bb4ca3da2654..37bf71c190a6 100644 --- a/core/java/com/android/internal/logging/MetricsConstants.java +++ b/core/java/com/android/internal/logging/MetricsConstants.java @@ -281,6 +281,7 @@ public interface MetricsConstants { public static final int ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE = 255; public static final int ACTION_WIGGLE_CAMERA_GESTURE = 256; public static final int QS_WORKMODE = 257; + public static final int BACKGROUND_CHECK_SUMMARY = 258; // These constants must match those in the analytic pipeline, do not edit. // Add temporary values to the top of MetricsLogger instead. diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 2178344e8351..337bb693561e 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -423,30 +423,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } @Override - public void setDecorView(int layoutResID) { - View v = mLayoutInflater.inflate(layoutResID, null); - setDecorView(v); - } - - @Override - public void setDecorView(View view) { - if (mContentParent == null) { - installDecor(); - } - - LinearLayout clientDecorPlaceholder = - (LinearLayout) findViewById(R.id.client_decor_placeholder); - - if (clientDecorPlaceholder != null) { - clientDecorPlaceholder.removeAllViews(); - - if (view != null) { - clientDecorPlaceholder.addView(view); - } - } - } - - @Override public void addContentView(View view, ViewGroup.LayoutParams params) { if (mContentParent == null) { installDecor(); diff --git a/core/java/com/android/internal/util/StateMachine.java b/core/java/com/android/internal/util/StateMachine.java index 68166467c3a9..554d367f6cea 100644 --- a/core/java/com/android/internal/util/StateMachine.java +++ b/core/java/com/android/internal/util/StateMachine.java @@ -1879,6 +1879,33 @@ public class StateMachine { } /** + * Check if there are any pending messages with code 'what' in deferred messages queue. + */ + protected final boolean hasDeferredMessages(int what) { + SmHandler smh = mSmHandler; + if (smh == null) return false; + + Iterator<Message> iterator = smh.mDeferredMessages.iterator(); + while (iterator.hasNext()) { + Message msg = iterator.next(); + if (msg.what == what) return true; + } + + return false; + } + + /** + * Check if there are any pending posts of messages with code 'what' in + * the message queue. This does NOT check messages in deferred message queue. + */ + protected final boolean hasMessages(int what) { + SmHandler smh = mSmHandler; + if (smh == null) return false; + + return smh.hasMessages(what); + } + + /** * Validate that the message was sent by * {@link StateMachine#quit} or {@link StateMachine#quitNow}. * */ diff --git a/core/java/com/android/internal/util/WakeupMessage.java b/core/java/com/android/internal/util/WakeupMessage.java new file mode 100644 index 000000000000..77859b8bb6a0 --- /dev/null +++ b/core/java/com/android/internal/util/WakeupMessage.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.util; + +import android.app.AlarmManager; +import android.content.Context; +import android.os.Handler; +import android.os.Message; + + /** + * An AlarmListener that sends the specified message to a Handler and keeps the system awake until + * the message is processed. + * + * This is useful when using the AlarmManager direct callback interface to wake up the system and + * request that an object whose API consists of messages (such as a StateMachine) perform some + * action. + * + * In this situation, using AlarmManager.onAlarmListener by itself will wake up the system to send + * the message, but does not guarantee that the system will be awake until the target object has + * processed it. This is because as soon as the onAlarmListener sends the message and returns, the + * AlarmManager releases its wakelock and the system is free to go to sleep again. + * + */ +public class WakeupMessage implements AlarmManager.OnAlarmListener { + private static AlarmManager sAlarmManager; + private final Handler mHandler; + private final String mCmdName; + private final int mCmd, mArg1, mArg2; + + public WakeupMessage(Context context, Handler handler, + String cmdName, int cmd, int arg1, int arg2) { + if (sAlarmManager == null) { + sAlarmManager = context.getSystemService(AlarmManager.class); + } + mHandler = handler; + mCmdName = cmdName; + mCmd = cmd; + mArg1 = arg1; + mArg2 = arg2; + } + + public WakeupMessage(Context context, Handler handler, String cmdName, int cmd, int arg1) { + this(context, handler, cmdName, cmd, arg1, 0); + } + + public WakeupMessage(Context context, Handler handler, String cmdName, int cmd) { + this(context, handler, cmdName, cmd, 0, 0); + } + + public void schedule(long when) { + sAlarmManager.setExact( + AlarmManager.ELAPSED_REALTIME_WAKEUP, when, mCmdName, this, mHandler); + } + + public void cancel() { + sAlarmManager.cancel(this); + } + + @Override + public void onAlarm() { + Message msg = mHandler.obtainMessage(mCmd, mArg1, mArg2); + mHandler.handleMessage(msg); + msg.recycle(); + } +} diff --git a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java index 3e65320d3372..c3a7460e5752 100644 --- a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java +++ b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java @@ -360,11 +360,6 @@ public class ActionBarOverlayLayout extends ViewGroup implements DecorContentPar } @Override - public int findDependentLayoutAxes(View child, int axisFilter) { - return findDependentLayoutAxesHelper(child, axisFilter, LayoutParams.class); - } - - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { pullChildren(); diff --git a/core/jni/android/graphics/MinikinUtils.cpp b/core/jni/android/graphics/MinikinUtils.cpp index 9b774b3cfc53..0597d3f37a71 100644 --- a/core/jni/android/graphics/MinikinUtils.cpp +++ b/core/jni/android/graphics/MinikinUtils.cpp @@ -33,11 +33,10 @@ FontStyle MinikinUtils::prepareMinikinPaint(MinikinPaint* minikinPaint, FontColl FontStyle resolved = resolvedFace->fStyle; /* Prepare minikin FontStyle */ - const std::string& langs = paint->getTextLocales(); - FontLanguages minikinLangs(langs.c_str(), langs.size()); FontVariant minikinVariant = (paint->getFontVariant() == VARIANT_ELEGANT) ? VARIANT_ELEGANT : VARIANT_COMPACT; - FontStyle minikinStyle(minikinLangs, minikinVariant, resolved.getWeight(), resolved.getItalic()); + const uint32_t langListId = paint->getMinikinLangListId(); + FontStyle minikinStyle(langListId, minikinVariant, resolved.getWeight(), resolved.getItalic()); /* Prepare minikin Paint */ // Note: it would be nice to handle fractional size values (it would improve smooth zoom diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp index 9c11dd153871..654d148e2029 100644 --- a/core/jni/android/graphics/Paint.cpp +++ b/core/jni/android/graphics/Paint.cpp @@ -71,13 +71,6 @@ static void defaultSettingsForAndroid(Paint* paint) { paint->setTextEncoding(Paint::kGlyphID_TextEncoding); } -struct LocalesCacheEntry { - std::string javaLocales; - std::string languageTags; -}; - -static thread_local LocalesCacheEntry sSingleEntryLocalesCache; - namespace PaintGlue { enum MoveOpt { AFTER, AT_OR_AFTER, BEFORE, AT_OR_BEFORE, AT @@ -402,15 +395,20 @@ namespace PaintGlue { } } - static void setTextLocales(JNIEnv* env, jobject clazz, jlong objHandle, jstring locales) { + static jint setTextLocales(JNIEnv* env, jobject clazz, jlong objHandle, jstring locales) { Paint* obj = reinterpret_cast<Paint*>(objHandle); ScopedUtfChars localesChars(env, locales); - if (sSingleEntryLocalesCache.javaLocales != localesChars.c_str()) { - sSingleEntryLocalesCache.javaLocales = localesChars.c_str(); - toLanguageTags(&sSingleEntryLocalesCache.languageTags, localesChars.c_str()); - } + std::string buf; + toLanguageTags(&buf, localesChars.c_str()); + jint minikinLangListId = FontStyle::registerLanguageList(buf); + obj->setMinikinLangListId(minikinLangListId); + return minikinLangListId; + } - obj->setTextLocales(sSingleEntryLocalesCache.languageTags); + static void setTextLocalesByMinikinLangListId(JNIEnv* env, jobject clazz, jlong objHandle, + jint minikinLangListId) { + Paint* obj = reinterpret_cast<Paint*>(objHandle); + obj->setMinikinLangListId(minikinLangListId); } static jboolean isElegantTextHeight(JNIEnv* env, jobject, jlong paintHandle) { @@ -991,7 +989,9 @@ static const JNINativeMethod methods[] = { {"nSetRasterizer","!(JJ)J", (void*) PaintGlue::setRasterizer}, {"nGetTextAlign","!(J)I", (void*) PaintGlue::getTextAlign}, {"nSetTextAlign","!(JI)V", (void*) PaintGlue::setTextAlign}, - {"nSetTextLocales","!(JLjava/lang/String;)V", (void*) PaintGlue::setTextLocales}, + {"nSetTextLocales","!(JLjava/lang/String;)I", (void*) PaintGlue::setTextLocales}, + {"nSetTextLocalesByMinikinLangListId","!(JI)V", + (void*) PaintGlue::setTextLocalesByMinikinLangListId}, {"nIsElegantTextHeight","!(J)Z", (void*) PaintGlue::isElegantTextHeight}, {"nSetElegantTextHeight","!(JZ)V", (void*) PaintGlue::setElegantTextHeight}, {"nGetTextSize","!(J)F", (void*) PaintGlue::getTextSize}, diff --git a/core/jni/android/graphics/Paint.h b/core/jni/android/graphics/Paint.h index 7a34bc291ee4..cb6e622ccced 100644 --- a/core/jni/android/graphics/Paint.h +++ b/core/jni/android/graphics/Paint.h @@ -53,12 +53,12 @@ public: return mFontFeatureSettings; } - void setTextLocales(const std::string &textLocales) { - mTextLocales = textLocales; + void setMinikinLangListId(uint32_t minikinLangListId) { + mMinikinLangListId = minikinLangListId; } - const std::string& getTextLocales() const { - return mTextLocales; + uint32_t getMinikinLangListId() const { + return mMinikinLangListId; } void setFontVariant(FontVariant variant) { @@ -80,7 +80,7 @@ public: private: float mLetterSpacing = 0; std::string mFontFeatureSettings; - std::string mTextLocales; + uint32_t mMinikinLangListId; FontVariant mFontVariant; uint32_t mHyphenEdit = 0; }; diff --git a/core/jni/android/graphics/PaintImpl.cpp b/core/jni/android/graphics/PaintImpl.cpp index d5a0972d35e3..bd513ae60823 100644 --- a/core/jni/android/graphics/PaintImpl.cpp +++ b/core/jni/android/graphics/PaintImpl.cpp @@ -22,13 +22,14 @@ namespace android { -Paint::Paint() : SkPaint(), - mLetterSpacing(0), mFontFeatureSettings(), mTextLocales(), mFontVariant(VARIANT_DEFAULT) { +Paint::Paint() : + SkPaint(), mLetterSpacing(0), mFontFeatureSettings(), mMinikinLangListId(0), + mFontVariant(VARIANT_DEFAULT) { } Paint::Paint(const Paint& paint) : SkPaint(paint), mLetterSpacing(paint.mLetterSpacing), mFontFeatureSettings(paint.mFontFeatureSettings), - mTextLocales(paint.mTextLocales), mFontVariant(paint.mFontVariant), + mMinikinLangListId(paint.mMinikinLangListId), mFontVariant(paint.mFontVariant), mHyphenEdit(paint.mHyphenEdit) { } @@ -39,7 +40,7 @@ Paint& Paint::operator=(const Paint& other) { SkPaint::operator=(other); mLetterSpacing = other.mLetterSpacing; mFontFeatureSettings = other.mFontFeatureSettings; - mTextLocales = other.mTextLocales; + mMinikinLangListId = other.mMinikinLangListId; mFontVariant = other.mFontVariant; mHyphenEdit = other.mHyphenEdit; return *this; @@ -49,7 +50,7 @@ bool operator==(const Paint& a, const Paint& b) { return static_cast<const SkPaint&>(a) == static_cast<const SkPaint&>(b) && a.mLetterSpacing == b.mLetterSpacing && a.mFontFeatureSettings == b.mFontFeatureSettings - && a.mTextLocales == b.mTextLocales + && a.mMinikinLangListId == b.mMinikinLangListId && a.mFontVariant == b.mFontVariant && a.mHyphenEdit == b.mHyphenEdit; } diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index ff51e4ee1263..f6e68c48e881 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -149,7 +149,9 @@ android_dataspace android_view_Surface_mapPublicFormatToHalDataspace( case PublicFormat::DEPTH16: return HAL_DATASPACE_DEPTH; case PublicFormat::RAW_SENSOR: + case PublicFormat::RAW_PRIVATE: case PublicFormat::RAW10: + case PublicFormat::RAW12: return HAL_DATASPACE_ARBITRARY; case PublicFormat::YUV_420_888: case PublicFormat::NV21: @@ -170,6 +172,7 @@ PublicFormat android_view_Surface_mapHalFormatDataspaceToPublicFormat( case HAL_PIXEL_FORMAT_RGB_565: case HAL_PIXEL_FORMAT_Y8: case HAL_PIXEL_FORMAT_RAW10: + case HAL_PIXEL_FORMAT_RAW12: case HAL_PIXEL_FORMAT_YCbCr_420_888: case HAL_PIXEL_FORMAT_YV12: // Enums overlap in both name and value @@ -177,6 +180,9 @@ PublicFormat android_view_Surface_mapHalFormatDataspaceToPublicFormat( case HAL_PIXEL_FORMAT_RAW16: // Name differs, though value is the same return PublicFormat::RAW_SENSOR; + case HAL_PIXEL_FORMAT_RAW_OPAQUE: + // Name differs, though value is the same + return PublicFormat::RAW_PRIVATE; case HAL_PIXEL_FORMAT_YCbCr_422_SP: // Name differs, though the value is the same return PublicFormat::NV16; @@ -212,7 +218,6 @@ PublicFormat android_view_Surface_mapHalFormatDataspaceToPublicFormat( } break; case HAL_PIXEL_FORMAT_BGRA_8888: - case HAL_PIXEL_FORMAT_RAW_OPAQUE: // Not defined in public API return PublicFormat::UNKNOWN; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4fda222bb2f6..5251b20811c3 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2777,6 +2777,12 @@ confirmation UI for full backup/restore --> <uses-permission android:name="android.permission.CONFIRM_FULL_BACKUP"/> + + <!-- Allows the holder to access the ephemeral applications on the device. + @hide --> + <permission android:name="android.permission.ACCESS_EPHEMERAL_APPS" + android:protectionLevel="signature" /> + <application android:process="system" android:persistent="true" android:hasCode="false" diff --git a/core/res/res/drawable/ic_arrow_drop_down.xml b/core/res/res/drawable/ic_collapse_bundle.xml index c8bb411a1f60..26c839d0c697 100644 --- a/core/res/res/drawable/ic_arrow_drop_down.xml +++ b/core/res/res/drawable/ic_collapse_bundle.xml @@ -15,11 +15,11 @@ Copyright (C) 2015 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="14.0dp" - android:height="14.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> + android:width="14.0dp" + android:height="14.0dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> <path - android:pathData="M16.600000,8.600000l-4.600000,4.599999 -4.600000,-4.599999 -1.400000,1.400000 6.000000,6.000000 6.000000,-6.000000z" - android:fillColor="#FF000000"/> + android:fillColor="#FF000000" + android:pathData="M12.0,10.0l5.3,-5.2l-1.4,-1.4L12.0,7.2L8.2,3.4L6.8,4.8L12.0,10.0zM6.8,19.2l1.4,1.4l3.8,-3.8l3.9,3.8l1.4,-1.4L12.0,14.0L6.8,19.2z"/> </vector> diff --git a/core/res/res/drawable/ic_collapse_notification.xml b/core/res/res/drawable/ic_collapse_notification.xml new file mode 100644 index 000000000000..603c159c0abc --- /dev/null +++ b/core/res/res/drawable/ic_collapse_notification.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="14.0dp" + android:height="14.0dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M12.0,8.0l-6.0,6.0l1.4,1.4l4.6,-4.6l4.6,4.6L18.0,14.0L12.0,8.0z"/> + <path + android:pathData="M0,0h24v24H0V0z" + android:fillColor="#00000000"/> +</vector> diff --git a/core/res/res/drawable/ic_expand_bundle.xml b/core/res/res/drawable/ic_expand_bundle.xml new file mode 100644 index 000000000000..2cc50055fe5f --- /dev/null +++ b/core/res/res/drawable/ic_expand_bundle.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="14.0dp" + android:height="14.0dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M6.8,8.6L8.2,10.0L12.0,6.2l3.9,3.8l1.4,-1.4L12.0,3.4L6.8,8.6zM12.0,20.6l5.3,-5.2L15.8,14.0L12.0,17.8L8.2,14.0l-1.4,1.4L12.0,20.6z"/> +</vector> diff --git a/core/res/res/drawable/ic_expand_notification.xml b/core/res/res/drawable/ic_expand_notification.xml new file mode 100644 index 000000000000..db7d3ebbbc21 --- /dev/null +++ b/core/res/res/drawable/ic_expand_notification.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="14.0dp" + android:height="14.0dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M16.6,8.6L12.0,13.2L7.4,8.6L6.0,10.0l6.0,6.0l6.0,-6.0L16.6,8.6z"/> + <path + android:pathData="M0,0h24v24H0V0z" + android:fillColor="#00000000"/> +</vector> diff --git a/core/res/res/layout/decor_caption_dark.xml b/core/res/res/layout/decor_caption_dark.xml index 273264d3d85f..95d228971a06 100644 --- a/core/res/res/layout/decor_caption_dark.xml +++ b/core/res/res/layout/decor_caption_dark.xml @@ -25,16 +25,11 @@ <LinearLayout android:id="@+id/caption" android:layout_width="match_parent" - android:layout_gravity="end" android:layout_height="wrap_content" + android:gravity="end" android:background="@drawable/decor_caption_title" android:focusable="false" android:descendantFocusability="blocksDescendants" > - <LinearLayout - android:id="@+id/client_decor_placeholder" - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_weight="1"/> <Button android:id="@+id/maximize_window" android:layout_width="32dp" diff --git a/core/res/res/layout/decor_caption_light.xml b/core/res/res/layout/decor_caption_light.xml index fd9198ece271..f0f661e0fef0 100644 --- a/core/res/res/layout/decor_caption_light.xml +++ b/core/res/res/layout/decor_caption_light.xml @@ -25,16 +25,11 @@ <LinearLayout android:id="@+id/caption" android:layout_width="match_parent" - android:layout_gravity="end" android:layout_height="wrap_content" + android:gravity="end" android:background="@drawable/decor_caption_title" android:focusable="false" android:descendantFocusability="blocksDescendants" > - <LinearLayout - android:id="@+id/client_decor_placeholder" - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_weight="1"/> <Button android:id="@+id/maximize_window" android:layout_width="32dp" diff --git a/core/res/res/layout/notification_template_header.xml b/core/res/res/layout/notification_template_header.xml index aceae9f41a71..e45f52b12132 100644 --- a/core/res/res/layout/notification_template_header.xml +++ b/core/res/res/layout/notification_template_header.xml @@ -125,7 +125,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="1dp" - android:src="@drawable/ic_arrow_drop_down" android:visibility="gone" /> </NotificationHeaderView> diff --git a/core/res/res/layout/notification_template_material_big_base.xml b/core/res/res/layout/notification_template_material_big_base.xml index 8c78b8d2d671..eb02e8b8cf74 100644 --- a/core/res/res/layout/notification_template_material_big_base.xml +++ b/core/res/res/layout/notification_template_material_big_base.xml @@ -55,12 +55,6 @@ </FrameLayout> <include layout="@layout/notification_template_right_icon" /> </FrameLayout> - <ImageView - android:layout_width="match_parent" - android:layout_height="1dp" - android:id="@+id/action_divider" - android:visibility="gone" - android:background="@drawable/notification_template_divider" /> <include layout="@layout/notification_material_action_list" android:layout_width="match_parent" diff --git a/core/res/res/layout/notification_template_material_big_picture.xml b/core/res/res/layout/notification_template_material_big_picture.xml index 74e7775d62a8..58e3d1b2612e 100644 --- a/core/res/res/layout/notification_template_material_big_picture.xml +++ b/core/res/res/layout/notification_template_material_big_picture.xml @@ -52,14 +52,6 @@ android:layout_marginBottom="16dp" android:scaleType="centerCrop" /> - <ImageView - android:layout_width="match_parent" - android:layout_height="1dp" - android:layout_marginStart="-16dp" - android:layout_marginEnd="-16dp" - android:id="@+id/action_divider" - android:visibility="gone" - android:background="@drawable/notification_template_divider" /> <include layout="@layout/notification_material_action_list" /> </LinearLayout> </FrameLayout> diff --git a/core/res/res/layout/notification_template_material_big_text.xml b/core/res/res/layout/notification_template_material_big_text.xml index 354c0fb88234..9e010f20b0ca 100644 --- a/core/res/res/layout/notification_template_material_big_text.xml +++ b/core/res/res/layout/notification_template_material_big_text.xml @@ -62,14 +62,6 @@ android:contentDescription="@string/notification_work_profile_content_description" /> </LinearLayout> - <ImageView - android:layout_width="match_parent" - android:layout_height="1dp" - android:layout_marginStart="-16dp" - android:layout_marginEnd="-16dp" - android:id="@+id/action_divider" - android:visibility="gone" - android:background="@drawable/notification_template_divider" /> <include layout="@layout/notification_material_action_list" /> </LinearLayout> <include layout="@layout/notification_template_right_icon" /> diff --git a/core/res/res/layout/notification_template_material_inbox.xml b/core/res/res/layout/notification_template_material_inbox.xml index 4f12d766e638..8c0abc909ea7 100644 --- a/core/res/res/layout/notification_template_material_inbox.xml +++ b/core/res/res/layout/notification_template_material_inbox.xml @@ -130,14 +130,6 @@ android:visibility="gone" android:layout_weight="0" /> - <ImageView - android:layout_width="match_parent" - android:layout_height="1dip" - android:id="@+id/action_divider" - android:visibility="gone" - android:layout_marginStart="-16dp" - android:layout_marginEnd="-16dp" - android:background="@drawable/notification_template_divider" /> <include layout="@layout/notification_material_action_list" /> </LinearLayout> <include layout="@layout/notification_template_right_icon" /> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index b5ba695c5593..eaf82fb8753a 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Opgedateer deur jou administrateur"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Deur jou administrateur uitgevee"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Om batterylewe te help verbeter, verminder batterybespaarder jou toestel se werkverrigting en beperk vibrasie, liggingdienste en die meeste agtergronddata. E-pos, boodskappe en ander programme wat op sinkronisering staatmaak, sal dalk nie opdateer tensy jy hulle oopmaak nie.\n\nBatterybespaarder skakel outomaties af wanneer jou toestel besig is om te laai."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Geblokkeer: Moet nooit hierdie kennisgewings wys nie"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Laag: Wys sonder klank aan die onderkant van die kennisgewinglys"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normaal: Wys hierdie kennisgewings sonder klank"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Hoog: Wys aan die bokant van die kennisgewingslys en maak \'n geluid"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Dringend: Verskyn vlugtig op die skerm en maak \'n geluid"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d minute lank (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">Een minuut lank (tot <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index 3f0c97728acb..91244e6e138c 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"আপনার প্রশাসক দ্বারা আপডেট করা হয়েছে"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"আপনার প্রশাসক দ্বারা মুছে ফেলা হয়েছে"</string> <string name="battery_saver_description" msgid="1960431123816253034">"ব্যাটরির লাইফ উন্নত করতে সহায়তা করতে, ব্যাটারি সাশ্রয়কারী আপনার ডিভাইসের কার্যসম্পাদনা হ্রাস করে এবং কম্পন, অবস্থান পরিষেবাসমূহ এবং অধিকাংশ ব্যাকগ্রাউন্ড ডেটা সীমিত করে৷ ইমেল, বার্তাপ্রেরণ এবং অন্যান্য অ্যাপ্লিকেশানগুলিকে যেগুলি সিঙ্কের উপর নির্ভর করে সেগুলিকে আপনি না খোলা পর্যন্ত নাও আপডেট হতে পারে৷\n\nআপনার ডিভাইসটিকে যখন চার্জ করা হয় তখন ব্যাটারি সাশ্রয়কারী স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়৷"</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"অবরুদ্ধ: এই বিজ্ঞপ্তিগুলি কখনই দেখানো হবে না"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"নিম্ন: বিজ্ঞপ্তি তালিকার নীচের অংশে নিঃশব্দে প্রদর্শন করা হয়"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"সাধারন: এই বিজ্ঞপ্তিগুলি নিঃশব্দে প্রদর্শন করা হয়"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"উচ্চ: বিজ্ঞপ্তি তালিকার শীর্ষে দেখানো হয় এবং শব্দ করে"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"জরুরী: স্ক্রীনের উপরে প্রদর্শিত হয় এবং শব্দ করে"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">%1$d মিনিটের জন্য (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item> <item quantity="other">%1$d মিনিটের জন্য (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index d3bb98746b1f..0d2b46cbc039 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"L\'administrador l\'ha actualitzat"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"L\'administrador ho ha suprimit"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Per tal d\'augmentar la durada de la bateria, la funció d\'estalvi de bateria redueix el rendiment del dispositiu i en limita la vibració i la majoria de dades en segon pla. És possible que el correu electrònic, la missatgeria i la resta d\'aplicacions que se sincronitzen amb freqüència no s\'actualitzin llevat que les obris.\n\nL\'estalvi de bateria es desactiva automàticament mentre el dispositiu s\'està carregant."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Bloquejada: no mostra mai aquestes notificacions"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Baixa: mostra de manera silenciosa a la part inferior de la llista de notificacions"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normal: mostra aquestes notificacions de manera silenciosa"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Alta: mostra a la part superior de la llista de notificacions i emet un so"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Urgent: mostra a la pantalla i emet un so"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">Durant %1$d minuts (fins a les <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">Durant 1 minut (fins a les <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index e803ae4f2985..4c554bc5d658 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1458,16 +1458,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Aktualizováno administrátorem"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Smazáno administrátorem"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Spořič baterie za účelem prodloužení výdrže baterie snižuje výkon zařízení a omezuje vibrace, služby určování polohy a většinu dat na pozadí. E-mail, aplikace pro zasílání zpráv a další aplikace, které používají synchronizaci, se nemusejí aktualizovat, dokud je neotevřete.\n\nPři nabíjení zařízení se spořič baterie automaticky vypne."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Blokováno: Tato oznámení nikdy nezobrazovat"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Nízká: Tato oznámení zobrazovat na konci seznamu bez zvukového upozornění"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normální: Tato oznámení zobrazovat bez zvukového upozornění"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Vysoká: Tato oznámení zobrazovat na začátku seznamu a upozornit na ně zvukem"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Urgentní: Tato oznámení zobrazovat přímo na obrazovce a upozornit na ně zvukem"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="few">%1$d minuty (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="many">%1$d minuty (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index cba5494d3bd2..ab455042ec27 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Von Ihrem Administrator aktualisiert"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Von Ihrem Administrator gelöscht"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Der Energiesparmodus schont den Akku, indem er die Leistung des Geräts reduziert und die Vibrationsfunktion sowie die meisten Hintergrunddatenaktivitäten einschränkt. E-Mail, SMS/MMS und andere Apps, die auf Ihrem Gerät synchronisiert werden, werden möglicherweise erst nach dem Öffnen aktualisiert.\n\nDer Energiesparmodus wird automatisch deaktiviert, wenn Ihr Gerät aufgeladen wird."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Blockiert: Keine Benachrichtigungen anzeigen"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Niedrig: Benachrichtigungen ganz unten in der Benachrichtigungsliste und ohne Ton anzeigen"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normal: Benachrichtigungen ohne Ton anzeigen"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Hoch: Benachrichtigungen ganz oben in der Benachrichtigungsliste und mit Ton anzeigen"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Dringend: Mit Ton auf dem Display einblenden"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d Minuten (bis <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">1 Minute (bis <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index e3842b26673e..d5fdd2993609 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Ενημερώθηκε από το διαχειριστή σας"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Διαγράφηκε από το διαχειριστή σας"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Προκειμένου να βελτιώσει τη διάρκεια ζωής της μπαταρίας σας, η Εξοικονόμηση μπαταρίας μειώνει την απόδοση της συσκευής σας και περιορίζει λειτουργίες όπως η δόνηση, οι υπηρεσίες τοποθεσίας και τα περισσότερα δεδομένα παρασκηνίου. Το ηλεκτρονικό ταχυδρομείο, η ανταλλαγή μηνυμάτων και άλλες εφαρμογές που βασίζονται στο συγχρονισμό ενδέχεται να μην ενημερώνονται έως ότου τις ανοίξετε.\n\nΗ Εξοικονόμηση μπαταρίας απενεργοποιείται αυτόματα όταν η συσκευή σας φορτίζει."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Αποκλεισμένες: Να μην εμφανίζονται ποτέ αυτές οι ειδοποιήσεις"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Χαμηλής βαρύτητας: Να εμφανίζονται στο κάτω τμήμα της λίστας ειδοποιήσεων χωρίς τη συνοδεία ήχου"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Κανονική βαρύτητα: Να εμφανίζονται αυτές οι ειδοποιήσεις χωρίς ήχο"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Υψηλής βαρύτητας: Να εμφανίζονται στην κορυφή της λίστας ειδοποιήσεων συνοδευόμενες από κάποιον ήχο"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Επείγουσες: Να προβάλλονται στην οθόνη και να συνοδεύονται από κάποιον ήχο"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">Για %1$d λεπτά (έως τις <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">Για ένα λεπτό (έως τις <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 807e36f792bd..4e2029f7c7d9 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Actualizado por el administrador"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Lo eliminó el administrador."</string> <string name="battery_saver_description" msgid="1960431123816253034">"Para ayudar a mejorar la duración de la batería, el ahorro de batería reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayoría de los datos en segundo plano. Es posible que el correo electrónico, la mensajería y otras aplicaciones que se basan en la sincronización no puedan actualizarse, a menos que los abras.\n\nEl ahorro de batería se desactiva de forma automática cuando el dispositivo se está cargando."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Bloqueada: no mostrar nunca estas notificaciones"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Baja: mostrar en la parte inferior de la lista de notificación sin emitir sonido"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normal: mostrar estas notificaciones de manera silenciosa"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Alta: mostrar en la parte superior de la lista de notificaciones y emitir sonido"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Urgente: mostrar en la pantalla y emitir sonido"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">Durante %1$d minutos hasta la(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item> <item quantity="one">Durante 1 minuto; hasta la(s) <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g></item> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index c209669fa144..3bbdcdf4570d 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Värskendas administraator"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Kustutas teie administraator"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Aku kestuse parandamiseks vähendab akusäästja teie seadme toimivust ning piirab vibratsiooni, asukohateenuseid ja suuremat osa taustaandmetest. E-posti, sõnumsidet ja muid sünkroonimisele tuginevaid rakendusi võidakse värskendada ainult siis, kui te need avate.\n\nAkusäästja lülitatakse seadme laadimise ajal automaatselt välja."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Blokeeritud: ära kunagi näita neid märguandeid"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Madal: kuva vaikselt märguannete loendi allosas"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Tavaline: kuva need märguanded vaikselt"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Kõrge: kuva märguannete loendi ülaosas koos heliga"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Kiireloomuline: kuva ekraani servas koos heliga"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d minutiks (kuni <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">Üheks minutiks (kuni <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 7b11238a0b50..9cbb29b3c9a6 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"توسط سرپرست شما بهروزرسانی شد"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"توسط سرپرستتان حذف شد"</string> <string name="battery_saver_description" msgid="1960431123816253034">"برای کمک به بهبود عمر باتری، بهینهسازی باتری عملکرد دستگاهتان را کاهش میدهد و لرزش، سرویسهای مبتنی بر مکان، و دسترسی به اکثر دادهها در پسزمینه را محدود میکند. ایمیل، پیامرسانی و برنامههای دیگری که به همگامسازی وابستهاند، تا زمانیکه آنها را باز نکنید نمیتوانند بهروز شوند.\n\nبهینهسازی باتری بهصورت خودکار در هنگام شارژ شدن دستگاه خاموش میشود."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"مسدود: هرگز این اعلانها نشان داده نشود"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"پایین: بدون صدا در پایین فهرست اعلان نشان داده شود"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"عادی: این اعلانها بدون صدا نشان داده شود"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"بالا: در بالای فهرست اعلانها و به همراه صدا نشان داده شود"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"ضروری: نمای کلی به همراه صدا در صفحه نشان داده شود"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">به مدت %1$d دقیقه (تا <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">به مدت %1$d دقیقه (تا <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 87ad95a0b75b..9dad4c056d9c 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Mis à jour par votre administrateur"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Supprimé par votre administrateur"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Pour améliorer l\'autonomie de la pile, la fonction d\'économie d\'énergie réduit les performances de votre appareil et limite la vibration, les services de localisation ainsi que la plupart des données en arrière-plan. Les applications Courriel, Messages et d\'autres qui reposent sur la synchronisation ne peuvent pas se mettre à jour, sauf si vous les ouvrez. \n\n L\'économiseur d\'énergie se désactive automatiquement lorsque votre appareil est en charge."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Bloquée : ne jamais afficher ces notifications"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Faible : afficher en mode silencieux au bas de la liste de notifications"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normale : afficher ces notifications en mode silencieux"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Élevée : afficher en haut de la liste des notifications et émettre un son"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Urgent : afficher sur l\'écran et émettre un son"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index b478c8523b22..dc08738e2c2a 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Mis à jour par votre administrateur"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Supprimé par votre administrateur"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Pour améliorer l\'autonomie de la batterie, l\'économiseur de batterie réduit les performances et désactive le vibreur, les services de localisation et la plupart des données en arrière-plan. Les messageries électroniques ou autres applications utilisant la synchronisation pourraient ne pas se mettre à jour, sauf si vous les ouvrez.\n\nL\'économiseur de batterie s\'éteint automatiquement lorsque l\'appareil est en charge."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Bloquée : ne jamais afficher ces notifications"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Faible : afficher en mode silencieux au bas de la liste de notifications"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normale : afficher ces notifications en mode silencieux"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Élevée : afficher en haut de la liste des notifications et émettre un son"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Urgent : afficher sur l\'écran et émettre un son"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index 1d6cf41c20bf..02ee7b45f4b8 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Actualizado polo administrador"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Eliminado polo administrador"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Para axudar a mellorar a duración da batería, a función aforro de batería reduce o rendemento do teu dispositivo e limita a vibración, os servizos de localización e a maioría dos datos en segundo plano. É posible que o correo electrónico, as mensaxes e outras aplicacións que dependen da sincronización non se actualicen a menos que os abras. \n\nA función aforro de batería desactívase automaticamente cando pos a cargar o teu dispositivo."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Bloqueada: non mostrar nunca estas notificacións"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Baixa: mostrar de forma silenciosa na parte inferior da lista de notificacións"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normal: mostrar estas notificacións de forma silenciosa"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Alta: mostrar na parte superior da lista de notificacións e emitir son"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Urxente: mostrar na pantalla e emitir son"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">Durante %1$d minutos (ata as <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">Durante un minuto (ata as <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 679419c682fc..f53625e5d52f 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1449,16 +1449,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Ažurira vaš administrator"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Izbrisao administrator"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Da bi se produljilo trajanje baterije, ušteda baterije smanjuje rad uređaja i ograničava vibraciju, usluge lokacije i većinu pozadinskih podataka. Aplikacije za e-poštu, slanje poruka i druge aplikacije koje se oslanjaju na sinkronizaciju možda se neće ažurirati ako ih ne otvorite.\n\nUšteda baterije isključuje se automatski dok se uređaj puni."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Blokirano: nikad ne prikazuj te obavijesti"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Nisko: tiho prikaži na dnu popisa obavijesti"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Uobičajeno: prikazuj te obavijesti tiho"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Visoko: prikaži na vrhu popisa obavijesti i emitiraj zvučni signal"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Hitno: prikaži na zaslonu i emitiraj zvučni signal"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">%1$d minutu (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="few">%1$d minute (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 8f65256396c8..257d435368ae 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Ադմինիստրատորը թարմացրել է այն"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Ադմինիստրատորը ջնջել է այն"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Մարտկոցի աշխատանքի ժամկետը երկարացնելու նպատակով, մարտկոցի էներգիայի խնայման գործառույթը սահմանափակում է սարքի աշխատանքը, թրթռոցը, տեղադրության ծառայությունները և հետնաշերտում աշխատող շատ գործընթացներ: Էլփոստը, հաղորդագրությունների փոխանակումը և տվյալների համաժամեցումից կախված այլ հավելվածները կարող են չթարմացվել, եթե դուք դրանք չգործարկեք:\n\nԵրբ ձեր սարքը լիցքավորվում է, մարտկոցի էներգիայի խնայման գործառույթն ինքնաշխատորեն անջատվում է:"</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Արգելափակված է. Երբեք չցուցադրել այս ծանուցումները"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Ցածր. Ցուցադրել ծանուցումների ցանկի ներքևում առանց ձայնային ազդանշանի"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Նորմալ. Ցուցադրել այս ծանուցումներն առանց ձայնային ազդանշանի"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Բարձր. Ցուցադրել ծանուցումների ցանկի վերևում և հնչեցնել ձայնային ազդանշան"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Հրատապ. Ցուցադրել էկրանին և հնչեցնել ձայնային ազդանշան"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">%1$d րոպե (մինչև <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">%1$d րոպե (մինչև <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index cee6af25f2e9..c2b8a8c36ead 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Uppfært af kerfisstjóranum"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Eytt af kerfisstjóra"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Til að auka endingu rafhlöðunnar mun orkusparnaður draga úr afköstum tækisins og takmarka titring, staðsetningarþjónustu og megnið af bakgrunnsgögnum. Ekki er víst að tölvupóstur, skilaboð og önnur forrit sem reiða sig á samstillingu uppfærist nema þú opnir þau.\n\nSjálfkrafa er slökkt á orkusparnaði þegar tækið er í hleðslu."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Útilokaðar: Aldrei sýna þessar tilkynningar"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Léttvægar: Sýna neðst á tilkynningalistanum án hljóðs"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Venjulegar: Sýna þessar tilkynningar án hljóðs"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Mikilvægar: Sýna efst á tilkynningalistanum og spila hljóð"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Áríðandi: Birta á skjánum og spila hljóð"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">Í %1$d mínútu (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Í %1$d mínútur (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 3dc224068d82..6dd4e9a6900d 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"管理者によって更新されています"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"管理者によって削除されました"</string> <string name="battery_saver_description" msgid="1960431123816253034">"バッテリーを長持ちさせるため、バッテリーセーバーは端末のパフォーマンスを抑え、バイブレーション、位置情報サービス、大半のバックグラウンドデータを制限します。メール、SMSや、同期を使用するその他のアプリは、起動しても更新されないことがあります。\n\nバッテリーセーバーは端末の充電中は自動的にOFFになります。"</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"ブロック: 今後はこの通知を表示しない"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"低: 通知リストの下にマナーモードで表示する"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"標準: この通知をマナーモードで表示する"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"高: 通知リストの上に表示し、音声でも知らせる"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"緊急: 画面にプレビューを表示し、音声でも知らせる"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d分間(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>まで)</item> <item quantity="one">1分間(<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>まで)</item> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index e43607c64b52..6709d92188ec 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"განახლებულია თქვენი ადმინისტრატორის მიერ"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"თქვენი ადმინისტრატორის მიერ წაშლილი"</string> <string name="battery_saver_description" msgid="1960431123816253034">"ელემენტის მოქმედების ვადის გაუმჯობესებისათვის, ელემენტის დამზოგი ამცირებს თქვენი მოწყობილობის შესრულებას და ზღუდავს ვიბრაციას, ადგილმდებარეობის მომსახურებებს და ძირითად ფონურ მონაცემებს. ელ-ფოსტა, შეტყობინებები და სხვა სინქრონიზაციაზე დაყრდნობილი აპლიკაციების განახლება არ მოხდება მათ გახსნეამდე. \n\n ელემენტის დამზოგველი ავტომატურად გამოირთვება, როდესაც თქვენს მოწყობილობას დამტენთან შეაერთებთ."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"დაბლოკილი: ეს შეტყობინებები აღარასოდეს გამოჩნდება"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"დაბალი: ეს შეტყობინებები სიის ბოლოში, უხმოდ გამოჩნდება"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"ნორმალური: ეს შეტყობინებები უხმოდ გამოჩნდება"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"მაღალი: ეს შეტყობინებები სიის თავში, ხმოვან სიგნალთან ერთად გამოჩნდება"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"გადაუდებელი: შეტყობინებები პირდაპირ ეკრანზე, ხმოვან სიგნალთან ერთად გამოჩნდება"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d წუთის განმავლობაში (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>-მდე)</item> <item quantity="one">ერთი წუთის განმავლობაში (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>-მდე)</item> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 9a9b78105169..85f46d1ec862 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"관리자에 의해 업데이트됨"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"관리자가 삭제함"</string> <string name="battery_saver_description" msgid="1960431123816253034">"배터리 수명 개선을 위해, 배터리 세이버는 기기의 성능을 줄이고 진동, 위치 서비스 및 대부분의 백그라운드 데이터를 제한합니다. 이메일, 메시지 및 동기화에 의존하는 기타 앱은 앱을 열 때까지 업데이트되지 않을 수 있습니다.\n\n배터리 세이버는 기기를 충전 중일 때는 자동으로 사용 중지됩니다."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"차단: 알림 다시 표시 안함"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"낮음: 알림 목록 하단에 무음으로 표시"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"일반: 무음으로 알림 표시"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"높음: 알림 목록 상단에 표시하고 소리로 알림"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"긴급: 화면에 표시하고 소리로 알림"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d분 동안(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>까지)</item> <item quantity="one">1분 동안(<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>까지)</item> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 4b77fbf05357..bb1cd7f125be 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -1441,16 +1441,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Администраторуңуз жаңырткан"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Администраторуңуз тарабынан жок кылынган"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Батареянын өмүрүн узартуу үчүн, батареяны үнөмдөгүч түзмөгүңүздүн ишинин майнаптуулугун азайтып, дирилдөө, жайгашкан жерди аныктоо кызматтары жана фондук дайындардын көпчүлүгүн чектеп коёт. Электрондук почта, билдирүү жазышуу жана башка шайкештештирүүгө байланыштуу колдонмолор ачылмайынча жаңыртылбай калышы мүмкүн.\n\nБатарея үнөмдөгүч түзмөгүңүз кубатталып жатканда автоматтык түрдө өчүп калат."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Бөгөттөлгөн: Бул эскертмелер эч качан көрсөтүлбөсүн"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Төмөн: Эскертмелер тизмесинин эң ылдыйында көрсөтүлсүн"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Кадимки: Бул эскертмелер акырын көрсөтүлсүн"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Жогору: Эскертмелер тизмесинин эң жогорусунда үн чыгарып көрсөтүлсүн"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Шашылыш: Үн менен коштолуп, экранга чыгарылсын"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d мүнөткө (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> чейин)</item> <item quantity="one">Бир мүнөткө (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> чейин)</item> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index ec7d45a61adc..9cfa6cf2840f 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -1442,16 +1442,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Ажурирано од администраторот"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Избришано од администраторот"</string> <string name="battery_saver_description" msgid="1960431123816253034">"За да ви помогне да ја подобрите трајноста на батеријата, штедачот на батеријата ја намалува изведбата на уредот и го ограничува вибрирањето, услугите за локација и повеќето податоци од заднина. Е-поштата, испраќањето пораки и другите апликации кои се потпираат на синхронизација можеби нема да се ажурираат доколку не ги отворите.\n\nШтедачот на батеријата автоматски се исклучува кога уредот се полни."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Блокирано: никогаш не покажувај ги овие известувања"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Ниско: покажувај ги тивко на дното на списокот со известувања"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Нормално: покажувај ги овие известувања тивко"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Високо: покажувај ги на врв на списокот со известувања и дај звук"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Итно: нека се појават на екранот и дај им звук"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">За %1$d минута (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">За %1$d минути (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index a29179a0e96c..3a3ec411beea 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -1444,7 +1444,7 @@ <string name="notification_importance_low" msgid="6447640449918427187">"താഴ്ന്നത്: അറിയിപ്പ് ലിസ്റ്റിന്റെ താഴെ ശബ്ദമുണ്ടാക്കാതെ കാണിക്കുക"</string> <string name="notification_importance_default" msgid="7991157697609575271">"സാധാരണം: ഈ അറിയിപ്പുകൾ നിശബ്ദമായി കാണിക്കുക"</string> <string name="notification_importance_high" msgid="3152238637737215654">"ഉയർന്നത്: അറിയിപ്പ് ലിസ്റ്റിന്റെ ഏറ്റവും മുകളിൽ കാണിക്കുക, ശബ്ദമുണ്ടാക്കുക"</string> - <string name="notification_importance_max" msgid="1153693080467904474">"അടിയന്തിരം: സ്ക്രീനിൽ ദൃശ്യമാക്കുക, ശബ്ദമുണ്ടാക്കുക"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"അടിയന്തരം: സ്ക്രീനിൽ ദൃശ്യമാക്കുക, ശബ്ദമുണ്ടാക്കുക"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d മിനിറ്റ് സമയത്തേക്ക് (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> വരെ)</item> <item quantity="one">ഒരു മിനിറ്റ് സമയത്തേക്ക് (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> വരെ)</item> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 941729fb14ee..ab2285b344fa 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Танай админ шинэчилсэн"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Таны админ устгасан байна"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Батарей хадгалах функц нь таны төхөөрөмжийн цэнэгийг хадгалахын тулд гүйцэтгэлийг багасгаж, чичрэлтийг бууруулж, байршлын үйлчилгээнүүд болон бусад өгөгдлийн хэмжээг багасгадаг юм. И-мэйл, мессеж болон бусад синхрон хийдэг апликейшнүүд дараа дахин нээгдэх хүртлээ автоматаар шинэчлэлт хийхгүй.\n\nМөн батарей хадгалах функц нь таныг төхөөрөмжөө цэнэглэх үед автоматаар унтрах юм."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Блоклосон: Эдгээр мэдэгдлийг хэзээ ч харуулахгүй"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Бага: Мэдэгдлийг жагсаалтын доод хэсэгт дуугүй харуулах"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Ердийн: Эдгээр мэдэгдлийг дуугүй харуулах"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Өндөр: мэдэгдлийг жагсаалтын эхэнд дуутай харуулах"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Яаралтай: Дэлгэцэнд яаралтай, дуутай гаргах"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other"> %1$d минутын турш ( <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> хүртэл)</item> <item quantity="one">нэг минутын турш (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> хүртэл)</item> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 98c2f6d85652..ab683fcb0add 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Dikemas kini oleh pentadbir anda"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Dipadamkan oleh pentadbir anda"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Untuk membantu memperbaik hayat bateri, penjimat bateri mengurangkan prestasi peranti anda dan mengehadkan getaran, perkhidmatan lokasi dan kebanyakan data latar belakang. E-mel, pemesejan dan apl lain yang bergantung kepada penyegerakan mungkin tidak mengemas kini, melainkan anda membuka apl itu.\n\nPenjimat bateri dimatikan secara automatik semasa peranti anda sedang dicas."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Disekat: Jangan sekali-kali tunjukkan pemberitahuan ini"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Rendah: Tunjukkan pada bahagian bawah senarai pemberitahuan secara senyap"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Biasa: Tunjukkan pemberitahuan ini secara senyap"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Tinggi: Tunjukkan pada bahagian atas senarai pemberitahuan dan bunyikan"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Segera: Intai pada skrin dan bunyikan"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">Selama %1$d minit (sehingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">Selama satu minit (sehingga <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index c92b3101e636..c966e3834705 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Oppdatert av administratoren"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Slettet av administratoren"</string> <string name="battery_saver_description" msgid="1960431123816253034">"For å forlenge batterilevetiden reduserer batterispareren ytelsen til enheten din og begrenser vibrering, posisjonstjenester og mesteparten av bakgrunnsdataene. E-post, sending av meldinger og andre apper som er avhengig av synkronisering, oppdateres kanskje ikke med mindre du åpner dem.\n\nBatterisparing slås av automatisk når enheten lader."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Blokkert: Aldri vis disse varslene"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Lavt: Vis nederst i varsellisten uten lyd"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normalt: Vis disse varslene uten lyd"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Høyt: Vis øverst i varsellisten med lyd"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Haster: Vises fort på skjermen med lyd"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">I %1$d minutter (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">I 1 minutt (til <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index fa8ade14983d..ee4f63a67e44 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Geüpdatet door je beheerder"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Verwijderd door je beheerder"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Accubesparing beperkt de prestaties van je apparaat, de trilstand, locatieservices en de meeste achtergrondgegevens om de gebruiksduur van de accu te verlengen.\n\nAccubesparing wordt automatisch uitgeschakeld terwijl je apparaat wordt opgeladen."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Geblokkeerd: deze meldingen nooit weergeven"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Laag: zonder geluid onder aan de lijst met meldingen weergeven"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normaal: deze meldingen zonder geluid weergeven"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Hoog: boven aan de lijst met meldingen weergeven en geluid laten horen"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Urgent: op het scherm weergeven en geluid laten horen"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d minuten (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">Eén minuut (tot <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 4ccd4f93781a..7430d547b56c 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1458,16 +1458,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Zaktualizowane przez administratora"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Usunięty przez administratora"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Aby wydłużyć czas pracy baterii, Oszczędzanie baterii ogranicza aktywność urządzenia, w tym wibracje, usługi lokalizacyjne i przetwarzanie większości danych w tle. Poczta, czat i inne synchronizowane aplikacje mogą nie aktualizować swojej zawartości, dopóki ich nie otworzysz.\n\nOszczędzanie baterii wyłącza się automatycznie podczas ładowania urządzenia."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Zablokowana: nigdy nie pokazuj tych powiadomień"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Niska: pokazuj na dole listy powiadomień bez sygnału dźwiękowego"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normalna: pokazuj te powiadomienia bez sygnału dźwiękowego"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Wysoka: pokazuj na początku listy powiadomień i odtwarzaj dźwięk"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Pilna: wyświetlaj na ekranie i odtwarzaj dźwięk"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="few">Przez %1$d minuty (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="many">Przez %1$d minut (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 471c1ad57a4f..826771e6f5de 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Atualizado pelo administrador"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Eliminado pelo administrador"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Para ajudar a melhorar a autonomia da bateria, a poupança de bateria reduz o desempenho do seu dispositivo e limita a vibração, os serviços de localização e a maioria dos dados em segundo plano. O email, as mensagens e outras aplicações que dependem da sincronização não podem ser atualizados exceto se os abrir.\n\nA poupança de bateria desliga-se automaticamente quando o dispositivo está a carregar."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Bloqueado: nunca mostrar estas notificações"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Baixo: mostrar na parte inferior da lista de notificações sem som"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normal: mostrar estas notificações sem som"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Elevado: mostrar na parte superior da lista de notificações com som"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Urgente: mostrar no ecrã com som"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">Durante %1$d minutos (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">Durante um minuto (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 8bb2d3b2f2b2..f49d6a12d5b0 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1449,16 +1449,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Actualizat de un administrator"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Șters de administrator"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Pentru a îmbunătăți autonomia bateriei, funcția de economisire a energiei reduce performanțele dispozitivului și limitează vibrațiile, serviciile de localizare și majoritatea datelor de fundal. Este posibil ca e-mailurile, mesageria și alte aplicații care depind de sincronizare să nu se actualizeze dacă nu le deschideți.\n\nFuncția de economisire a energiei se dezactivează automat când dispozitivul se încarcă."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Blocate: aceste notificări nu se afișează niciodată"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Redusă: se afișează în partea de jos a listei cu notificări fără a se emite un sunet"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normală: aceste notificări se afișează fără a se emite un sunet"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Ridicată: se afișează în partea de sus a listei cu notificări și se emite un sunet"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Urgente: se afișează pentru o scurtă durată pe ecran și se emite un sunet"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="few">Timp de %1$d minute (până la <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Timp de %1$d de minute (până la <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 7d7e6ca9e0f7..3f6769c06ea6 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1458,16 +1458,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Posodobil skrbnik"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Izbrisal skrbnik"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Varčevanje z energijo akumulatorja podaljša čas njegovega delovanja tako, da zmanjša zmogljivost delovanja naprave in omeji vibriranje, lokacijske storitve ter prenos večine podatkov v ozadju. Aplikacije za e-pošto, sporočanje in drugo, ki uporabljajo sinhroniziranje, se morda ne posodabljajo, razen če jih odprete.\n\nVarčevanje z energijo akumulatorja se samodejno izklopi med polnjenjem akumulatorja naprave."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Blokirano: nikoli ne prikaži teh obvestil"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Manj pomembno: prikaži na dnu seznama obvestil brez zvoka"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Običajno: prikaži ta obvestila brez zvoka"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Pomembno: prikaži na vrhu seznama obvestil in predvajaj zvok"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Nujno: za hip pokaži predogled na zaslonu in predvajaj zvok"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">%d minuto (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="two">%d minuti (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 071d023c1b56..2653c71aba32 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Përditësuar nga administratori"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"U fshi nga administratori yt"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Për të përmirësuar jetëgjatësinë e baterisë, opsioni i kursimit të baterisë ul rendimentin e pajisjes tënde si dhe kufizon dridhjet dhe shumicën e të dhënave në sfond. Mail-i, mesazhet dhe aplikacionet e tjera që sinkronizohen automatikisht mund të mos përditësohen pa i hapur.\n\nKursimi i baterisë çaktivizohet automatikisht kur pajisja vihet në ngarkim."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Të bllokuara: Mos i shfaq asnjëherë këto njoftime"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Të ulëta: Shfaqi në heshtje në fund të listës së njoftimeve"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normale: Shfaqi këto njoftime në heshtje"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Të larta: Shfaqi në krye të listës së njoftimeve dhe lësho tingull"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Urgjente: Shfaq një vështrim të shpejtë në ekran dhe lësho tingull"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">Për %1$d minuta (deri në <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">Për një minutë (deri në <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index dd714b70fb8b..069d71770c05 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1449,16 +1449,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Ажурирао је администратор"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Избрисао је ваш адмиистратор"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Да би продужила време трајања батерије, уштеда батерије смањује перформансе уређаја и ограничава вибрацију, услуге локације и већину позадинских података. Имејл, размена порука и друге апликације које се ослањају на синхронизацију можда неће да се ажурирају ако их не отворите.\n\nУштеда батерије се аутоматски искључује када се уређај пуни."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Блокирана: Ова обавештења се никада не приказују"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Ниска: Приказују се у дну листе обавештења без звука"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Уобичајена: Ова обавештења се приказују без звука"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Висока: Приказују се у врху листе обавештења и активира се звучни сигнал"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Хитна: Накратко се приказују на екрану и активира се звучни сигнал"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">%1$d минут (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="few">%1$d минута (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 0229153a7b58..748257a7955b 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Uppdaterat av administratören"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Paketet har raderats av administratören"</string> <string name="battery_saver_description" msgid="1960431123816253034">"I batterisparläget reduceras enhetens prestanda så att batteriet ska räcka längre och vibration, platstjänster samt den mesta användningen av bakgrundsdata begränsas. Det kan hända att appar för e-post, sms och annat som kräver synkronisering inte uppdateras förrän du öppnar dem.\n\nBatterisparläget inaktiveras automatiskt när enheten laddas."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Blockerad: Visa aldrig dessa aviseringar"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Låg: Visa längst ned i aviseringslistan – utan ljud"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normal: Visa aviseringarna – utan ljud"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Hög: Visa högst upp i aviseringslistan – med ljud"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Brådskande: Visa på skärmen – med ljud"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">I %1$d minuter (till kl. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">I en minut (till kl. <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 8ea3463a3fed..cdb86ae96923 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1442,7 +1442,7 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Kimesasiswa na msimamizi wako"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Kilifutwa na msimamizi wako"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Kusaidia kuboresha muda wa matumizi ya betri, inayookoa betri hupunguza utendaji wa kifaa chako na kupunguza mtetemo, huduma za utambuzi wa mahali, na data nyingi ya chini chini. Barua pepe, ujumbe na programu nyingine zinazotege,ea usawazishaji huenda zisisasishwe usipozifungua.\n\nInayookoa betri hujizima kiotomatiki kifaa chako kinapokuwa kinachaji."</string> - <string name="notification_importance_blocked" msgid="7118826900767047125">"Imezuiwa: Usionyeshe kamwe arifa hizi"</string> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Imezuiwa: Usionyeshe arifa hizi kamwe"</string> <string name="notification_importance_low" msgid="6447640449918427187">"Chini: Onyesha katika sehemu ya chini ya orodha ya arifa bila kutoa sauti"</string> <string name="notification_importance_default" msgid="7991157697609575271">"Kawaida: Onyesha arifa hizi bila sauti"</string> <string name="notification_importance_high" msgid="3152238637737215654">"Juu: Onyesha katika sehemu ya juu ya orodha ya arifa na itoe sauti"</string> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index a8adc7312fda..245f1cacaba9 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"உங்கள் நிர்வாகி புதுப்பித்துள்ளார்"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"நிர்வாகி நீக்கிவிட்டார்"</string> <string name="battery_saver_description" msgid="1960431123816253034">"பேட்டரி ஆயுளை மேம்படுத்த, பேட்டரி சேமிப்பான் உங்கள் சாதனத்தின் செயல்திறனைக் குறைத்து, அதிர்வு, இடச் சேவைகள் மற்றும் பெரும்பாலான பின்புலத் தரவு போன்றவற்றைக் கட்டுப்படுத்துகிறது. ஒத்திசைவைச் சார்ந்துள்ள மின்னஞ்சல், செய்தியிடல் மற்றும் பிற பயன்பாடுகள் திறக்கும்வரை, அவை புதுப்பிக்கப்படாமல் இருக்கலாம்.\n\nஉங்கள் ஃபோன் சார்ஜ் செய்யப்படும்போது, பேட்டரி சேமிப்பான் தானாகவே முடங்கும்."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"தடுக்கப்பட்டது: இந்த அறிவிப்புகளை ஒருபோதும் காட்டாது"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"குறைவு: ஒலியின்றி அறிவிப்புப் பட்டியலின் கீழே காட்டும்"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"இயல்பு: ஒலியின்றி இந்த அறிவிப்புகளைக் காட்டும்"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"அதிகம்: அறிவிப்புகள் பட்டியலின் மேல் பகுதியில் ஒலியுடன் காட்டும்"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"அவசரம்: ஒலியுடன் திரையில் தோன்றும்"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d நிமிடங்களுக்கு (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> வரை)</item> <item quantity="one">ஒரு நிமிடத்திற்கு (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> வரை)</item> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index c9db65fb39ad..57b95980006b 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"อัปเดตโดยผู้ดูแลระบบ"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"ลบโดยผู้ดูแลระบบของคุณ"</string> <string name="battery_saver_description" msgid="1960431123816253034">"เพื่อช่วยปรับปรุงอายุการใช้งานแบตเตอรี่ โหมดประหยัดแบตเตอรี่จะลดการทำงานของอุปกรณ์และจำกัดการสั่น บริการตำแหน่ง และข้อมูลแบ็กกราวด์ส่วนใหญ่ สำหรับอีเมล การรับส่งข้อความ และแอปอื่นๆ ที่ใช้การซิงค์จะไม่อัปเดตหากคุณไม่เปิดขึ้นมา\n\nโหมดประหยัดแบตเตอรี่จะปิดโดยอัตโนมัติขณะชาร์จอุปกรณ์"</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"บล็อก: อย่าแสดงการแจ้งเตือนเหล่านี้"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"ต่ำ: แสดงที่ด้านล่างของรายการแจ้งเตือนโดยไม่ส่งเสียง"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"ปกติ: แสดงการแจ้งเตือนเหล่านี้โดยไม่ส่งเสียง"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"สูง: แสดงที่ด้านบนของรายการแจ้งเตือนและส่งเสียง"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"ด่วน: แสดงบนหน้าจอในช่วงเวลาสั้นๆ และส่งเสียง"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">ระยะเวลา %1$d นาที (จนถึงเวลา <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">ระยะเวลา 1 นาที (จนถึงเวลา <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 6ea63b8234fb..8cca6761fccd 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Na-update ng iyong administrator"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Na-delete ng iyong administrator"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Upang matulungang pagbutihin ang tagal ng baterya, binabawasan ng pangtipid ng baterya ang pagganap ng iyong device at nililimitahan ang pag-vibrate, mga serbisyo ng lokasyon at karamihan sa data ng background. Maaaring hindi mag-update ang email, pagmemensahe at iba pang mga app na umaasa sa pagsi-sync maliban kung buksan mo ang mga iyon.\n\nAwtomatikong nag-o-off ang pangtipid ng baterya kapag nagcha-charge ang iyong device."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Naka-block: Huwag kailanman ipakita ang mga notification na ito"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Mababa: Tahimik na ipakita sa ibaba ng listahan ng mga notification"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normal: Tahimik na ipakita ang mga notification na ito"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Mataas: Ipakita sa taas ng listahan ng mga notification at mag-play ng tunog"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Agaran: Ipasilip sa screen at mag-play ng tunog"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">Sa loob ng %1$d minuto (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Sa loob ng %1$d na minuto (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 996e93f98ae9..60eee129bedb 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Yöneticiniz tarafından güncellendi"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Yöneticiniz tarafından silindi"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Pil tasarrufu özelliği, pil ömrünü iyileştirmeye yardımcı olmak için cihazın performansını düşürür, titreşimi, konum hizmetlerini ve arka plan verilerinin çoğunu sınırlar. Senkronizasyona dayalı olarak çalışan e-posta, mesajlaşma uygulamaları ve diğer uygulamalar, bunları açmadığınız sürece güncellenmeyebilir.\n\nCihazınız şarj olurken pil tasarrufu otomatik olarak kapatılır."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Engellendi: Bu bildirimleri hiçbir zaman gösterme"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Düşük: Bildirim listesinin altında sessizce göster"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Normal: Bu bildirimleri sessizce göster"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Yüksek: Bildirim listesinin üstünde göster ve ses çıkar"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Acil: Ekrana getir ve ses çıkar"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d dakika için (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">Bir dakika için (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 378037427773..adf6234d599b 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1458,16 +1458,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Оновлено адміністратором"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Видалив адміністратор"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Щоб подовжити час роботи акумулятора, функція заощадження заряду акумулятора знижує продуктивність пристрою, а також обмежує вібрацію, функції служб локації та передавання більшості фонових даних. Електронна пошта, чати й інші додатки, які синхронізуються, можуть не оновлюватися, доки ви їх не відкриєте.\n\nФункція заощадження заряду акумулятора автоматично вимикається під час заряджання пристрою."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Заблоковано: не показувати ці сповіщення"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Низький пріоритет: показувати ці сповіщення внизу списку без звукового сигналу"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Стандартний пріоритет: показувати ці сповіщення без звукового сигналу"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Високий пріоритет: показувати ці сповіщення вгорі списку зі звуковим сигналом"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Терміново: показувати ці сповіщення на екрані зі звуковим сигналом"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="one">%1$d хвилину (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="few">%1$d хвилини (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index d3e294353a17..54af31e26e5a 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"آپ کے منتظم نے اپ ڈيٹ کر دیا"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"آپ کے منتظم کی جانب سے حذف کر دیا گیا"</string> <string name="battery_saver_description" msgid="1960431123816253034">"بیٹری کی میعاد بہتر کرنے میں مدد کرنے کیلئے، بیٹری سیور آپ کے آلہ کی کارکردگی کم کر دیتی ہے اور وائبریشن، مقام کی سروسز اور پس منظر کا بیشتر ڈیٹا محدود کر دیتی ہے۔ ای میل، پیغام رسانی اور مطابقت پذیری پر منحصر دیگر ایپس ممکن ہے اس وقت تک اپ ڈیٹ نہ ہوں جب تک آپ انہیں نہ کھولیں۔\n\nآپ کا آلہ چارج ہوتے وقت بیٹری سیور خود بخود آف ہو جاتی ہے۔"</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"مسدود کردہ: یہ اطلاعات کبھی مت دکھائیں"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"پست: اطلاعات کی فہرست کے نیچے خاموشی سے دکھائیں"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"عام: خاموشی سے یہ اطلاعات دکھائیں"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"اعلی: اطلاعات کی فہرست پر سب سے اوپر دکھائیں اور آواز چلائیں"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"ارجنٹ: اسکرین پر دکھائیں اور آواز چلائیں"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d منٹ کیلئے (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> تک)</item> <item quantity="one">ایک منٹ کیلئے (تک <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index 39c35b06aa41..c4701b6f97a8 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Administratoringiz tomonidan yangilandi"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Administratoringiz tomonidan o‘chirilgan"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Batareya quvvatini uzoqroq vaqtga yetkazish uchun quvvat tejash funksiyasi qurilmangiz unumdorligini kamaytiradi hamda uning tebranishi va orqa fonda internetdan foydalanishini cheklaydi. Sinxronlanishni talab qiladigan e-pochta, xabar almashinuv va boshqa ilovalar esa qachonki ularni ishga tushirganingizda yangilanadi.\n\nQurilma quvvat olayotganda quvvat tejash funksiyasi avtomatik tarzda o‘chadi."</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"Bloklangan: bildirishnomalar hech qachon ko‘rsatilmasin"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"Past: bildirishnomalar ro‘yxatining pastida ovozsiz ko‘rsatilsin"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"Oddiy: bildirishnomalar ovozsiz ko‘rsatilsin"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"Yuqori: bildirishnomalar ro‘yxatining yuqorisida ovoz bilan ko‘rsatilsin"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"Shoshilinch: barcha oynalar ustida signal ovozi bilan ko‘rsatilsin"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d daqiqa (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> gacha)</item> <item quantity="one">Bir daqiqa (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> gacha)</item> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 01326670a174..d54eb1e603b3 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1440,16 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"由您单位的管理员更新"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"已被管理员删除"</string> <string name="battery_saver_description" msgid="1960431123816253034">"为了延长电池的续航时间,节电助手会降低设备的性能,并限制振动、位置信息服务和大部分后台流量。对于电子邮件、聊天工具等依赖于同步功能的应用,可能要打开这类应用时才能收到新信息。\n\n节电助手会在设备充电时自动关闭。"</string> - <!-- no translation found for notification_importance_blocked (7118826900767047125) --> - <skip /> - <!-- no translation found for notification_importance_low (6447640449918427187) --> - <skip /> - <!-- no translation found for notification_importance_default (7991157697609575271) --> - <skip /> - <!-- no translation found for notification_importance_high (3152238637737215654) --> - <skip /> - <!-- no translation found for notification_importance_max (1153693080467904474) --> - <skip /> + <string name="notification_importance_blocked" msgid="7118826900767047125">"屏蔽:一律不显示这些通知"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"低:在通知列表底部显示,不发出提示音"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"一般:显示这些通知,但不发出提示音"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"高:在通知列表顶部显示,并发出提示音"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"紧急:在屏幕上持续显示,并发出提示音"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d 分钟(到<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">1 分钟(到<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 8b30283a0410..a583e378e914 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1440,11 +1440,11 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"已由您的管理員更新"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"已由管理員刪除"</string> <string name="battery_saver_description" msgid="1960431123816253034">"節約電池用量模式有助於延長電池壽命,但這會降低裝置效能,並限制震動、定位服務及大部分背景數據傳輸。除非您啟用,否則電郵、短訊及其他需要使用同步功能的應用程式均不會更新。\n\n當裝置充電時,節約電池用量模式會自動關閉。"</string> - <string name="notification_importance_blocked" msgid="7118826900767047125">"封鎖:一律不顯示這些通知"</string> - <string name="notification_importance_low" msgid="6447640449918427187">"低:顯示在通知清單底部且不發出任何音效"</string> - <string name="notification_importance_default" msgid="7991157697609575271">"一般:顯示這些通知且不發出任何音效"</string> - <string name="notification_importance_high" msgid="3152238637737215654">"高:顯示在通知清單頂端並發出音效"</string> - <string name="notification_importance_max" msgid="1153693080467904474">"緊急:持續顯示在螢幕上並發出音效"</string> + <string name="notification_importance_blocked" msgid="7118826900767047125">"已封鎖:永不顯示這些通知"</string> + <string name="notification_importance_low" msgid="6447640449918427187">"低:以靜音方式顯示在通知清單底部"</string> + <string name="notification_importance_default" msgid="7991157697609575271">"一般:以靜音方式顯示這些通知"</string> + <string name="notification_importance_high" msgid="3152238637737215654">"高:顯示在通知清單頂部並發出音效"</string> + <string name="notification_importance_max" msgid="1153693080467904474">"緊急:不時於螢幕出現並發出音效"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">需時 %1$d 分鐘 (完成時間:<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="one">需時 1 分鐘 (完成時間:<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index decb1effca4a..97c0e07186e0 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -673,6 +673,10 @@ closed. The default is 0. --> <integer name="config_lidNavigationAccessibility">0</integer> + <!-- Indicate whether closing the lid causes the lockscreen to appear. + The default is false. --> + <bool name="config_lidControlsScreenLock">false</bool> + <!-- Indicate whether closing the lid causes the device to go to sleep and opening it causes the device to wake up. The default is false. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index d92adc2e7994..eadcae0fb322 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -198,7 +198,6 @@ <java-symbol type="id" name="inbox_text5" /> <java-symbol type="id" name="inbox_text6" /> <java-symbol type="id" name="status_bar_latest_event_content" /> - <java-symbol type="id" name="action_divider" /> <java-symbol type="id" name="notification_main_column" /> <java-symbol type="id" name="sms_short_code_confirm_message" /> <java-symbol type="id" name="sms_short_code_detail_layout" /> @@ -1480,6 +1479,7 @@ <java-symbol type="bool" name="config_enableLockScreenRotation" /> <java-symbol type="bool" name="config_enableLockScreenTranslucentDecor" /> <java-symbol type="bool" name="config_enableTranslucentDecor" /> + <java-symbol type="bool" name="config_lidControlsScreenLock" /> <java-symbol type="bool" name="config_lidControlsSleep" /> <java-symbol type="bool" name="config_lockDayNightMode" /> <java-symbol type="bool" name="config_lockUiMode" /> @@ -1958,7 +1958,6 @@ <java-symbol type="bool" name="config_built_in_sip_phone" /> <java-symbol type="id" name="maximize_window" /> <java-symbol type="id" name="close_window" /> - <java-symbol type="id" name="client_decor_placeholder" /> <java-symbol type="layout" name="decor_caption_light" /> <java-symbol type="layout" name="decor_caption_dark" /> <java-symbol type="drawable" name="decor_caption_title_focused" /> @@ -2370,7 +2369,10 @@ <java-symbol type="id" name="sub_text_divider" /> <java-symbol type="id" name="content_info_divider" /> <java-symbol type="id" name="text_line_1" /> - <java-symbol type="drawable" name="ic_arrow_up_14dp" /> + <java-symbol type="drawable" name="ic_expand_notification" /> + <java-symbol type="drawable" name="ic_collapse_notification" /> + <java-symbol type="drawable" name="ic_expand_bundle" /> + <java-symbol type="drawable" name="ic_collapse_bundle" /> <java-symbol type="dimen" name="notification_header_height" /> <java-symbol type="dimen" name="notification_big_picture_content_min_height_with_picture" /> <java-symbol type="dimen" name="notification_header_shrink_min_width" /> diff --git a/core/tests/benchmarks/Android.mk b/core/tests/benchmarks/Android.mk new file mode 100644 index 000000000000..25181b5f930a --- /dev/null +++ b/core/tests/benchmarks/Android.mk @@ -0,0 +1,30 @@ +# -*- mode: makefile -*- +# Copyright (C) 2015 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH:= $(call my-dir) + +# build framework base core benchmarks +# ============================================================ + +include $(CLEAR_VARS) +LOCAL_MODULE := frameworks-base-core-benchmarks +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := JAVA_LIBRARIES +LOCAL_SRC_FILES := $(call all-java-files-under, src/) + +LOCAL_JAVA_LIBRARIES := \ + caliper-api-target + +include $(BUILD_JAVA_LIBRARY) diff --git a/core/tests/benchmarks/src/android/content/res/ResourcesBenchmark.java b/core/tests/benchmarks/src/android/content/res/ResourcesBenchmark.java index 3638473aac03..426b0dc62e83 100644 --- a/core/tests/benchmarks/src/android/content/res/ResourcesBenchmark.java +++ b/core/tests/benchmarks/src/android/content/res/ResourcesBenchmark.java @@ -20,11 +20,13 @@ import android.util.AttributeSet; import android.util.Xml; import com.android.internal.R; -import com.google.caliper.SimpleBenchmark; import org.xmlpull.v1.XmlPullParser; -public class ResourcesBenchmark extends SimpleBenchmark { +import com.google.caliper.AfterExperiment; +import com.google.caliper.BeforeExperiment; + +public class ResourcesBenchmark { private AssetManager mAsset; private Resources mRes; @@ -34,7 +36,7 @@ public class ResourcesBenchmark extends SimpleBenchmark { private int mIntegerId; private int mLayoutId; - @Override + @BeforeExperiment protected void setUp() { mAsset = new AssetManager(); mAsset.addAssetPath("/system/framework/framework-res.apk"); @@ -46,7 +48,7 @@ public class ResourcesBenchmark extends SimpleBenchmark { mLayoutId = mRes.getIdentifier("two_line_list_item", "layout", "android"); } - @Override + @AfterExperiment protected void tearDown() { mAsset.close(); } diff --git a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java index 1a5043254e09..1b6560322a13 100644 --- a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java +++ b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java @@ -16,10 +16,10 @@ package android.net; +import com.google.caliper.BeforeExperiment; import com.google.caliper.Param; -import com.google.caliper.SimpleBenchmark; -public class NetworkStatsBenchmark extends SimpleBenchmark { +public class NetworkStatsBenchmark { private static final String UNDERLYING_IFACE = "wlan0"; private static final String TUN_IFACE = "tun0"; private static final int TUN_UID = 999999999; @@ -28,10 +28,8 @@ public class NetworkStatsBenchmark extends SimpleBenchmark { private int mSize; private NetworkStats mNetworkStats; - @Override + @BeforeExperiment protected void setUp() throws Exception { - super.setUp(); - mNetworkStats = new NetworkStats(0, mSize + 2); int uid = 0; NetworkStats.Entry recycle = new NetworkStats.Entry(); diff --git a/core/tests/benchmarks/src/android/net/TrafficStatsBenchmark.java b/core/tests/benchmarks/src/android/net/TrafficStatsBenchmark.java index 5a29adc9b000..09de412b5560 100644 --- a/core/tests/benchmarks/src/android/net/TrafficStatsBenchmark.java +++ b/core/tests/benchmarks/src/android/net/TrafficStatsBenchmark.java @@ -16,9 +16,7 @@ package android.net; -import com.google.caliper.SimpleBenchmark; - -public class TrafficStatsBenchmark extends SimpleBenchmark { +public class TrafficStatsBenchmark { public void timeGetUidRxBytes(int reps) { for (int i = 0; i < reps; i++) { TrafficStats.getUidRxBytes(android.os.Process.myUid()); diff --git a/core/tests/benchmarks/src/android/os/ParcelArrayBenchmark.java b/core/tests/benchmarks/src/android/os/ParcelArrayBenchmark.java index 21cfb0988ebd..eff8c8e4abdf 100644 --- a/core/tests/benchmarks/src/android/os/ParcelArrayBenchmark.java +++ b/core/tests/benchmarks/src/android/os/ParcelArrayBenchmark.java @@ -16,10 +16,11 @@ package android.os; +import com.google.caliper.AfterExperiment; +import com.google.caliper.BeforeExperiment; import com.google.caliper.Param; -import com.google.caliper.SimpleBenchmark; -public class ParcelArrayBenchmark extends SimpleBenchmark { +public class ParcelArrayBenchmark { @Param({ "1", "10", "100", "1000" }) private int mSize; @@ -34,7 +35,7 @@ public class ParcelArrayBenchmark extends SimpleBenchmark { private Parcel mIntParcel; private Parcel mLongParcel; - @Override + @BeforeExperiment protected void setUp() { mWriteParcel = Parcel.obtain(); @@ -50,7 +51,7 @@ public class ParcelArrayBenchmark extends SimpleBenchmark { mLongParcel.writeLongArray(mLongArray); } - @Override + @AfterExperiment protected void tearDown() { mWriteParcel.recycle(); mWriteParcel = null; @@ -118,5 +119,4 @@ public class ParcelArrayBenchmark extends SimpleBenchmark { mLongParcel.readLongArray(mLongArray); } } - } diff --git a/core/tests/benchmarks/src/android/os/ParcelBenchmark.java b/core/tests/benchmarks/src/android/os/ParcelBenchmark.java index 6a7b7c890edb..4bd2d009dcf3 100644 --- a/core/tests/benchmarks/src/android/os/ParcelBenchmark.java +++ b/core/tests/benchmarks/src/android/os/ParcelBenchmark.java @@ -16,18 +16,19 @@ package android.os; -import com.google.caliper.SimpleBenchmark; +import com.google.caliper.AfterExperiment; +import com.google.caliper.BeforeExperiment; -public class ParcelBenchmark extends SimpleBenchmark { +public class ParcelBenchmark { private Parcel mParcel; - @Override + @BeforeExperiment protected void setUp() { mParcel = Parcel.obtain(); } - @Override + @AfterExperiment protected void tearDown() { mParcel.recycle(); mParcel = null; diff --git a/core/tests/benchmarks/src/android/os/StrictModeBenchmark.java b/core/tests/benchmarks/src/android/os/StrictModeBenchmark.java index 41af382071ca..a1109062303b 100644 --- a/core/tests/benchmarks/src/android/os/StrictModeBenchmark.java +++ b/core/tests/benchmarks/src/android/os/StrictModeBenchmark.java @@ -18,9 +18,7 @@ package android.os; import android.os.StrictMode.ThreadPolicy; -import com.google.caliper.SimpleBenchmark; - -public class StrictModeBenchmark extends SimpleBenchmark { +public class StrictModeBenchmark { private ThreadPolicy mOff = new ThreadPolicy.Builder().build(); private ThreadPolicy mOn = new ThreadPolicy.Builder().detectAll().build(); diff --git a/core/tests/benchmarks/src/android/util/FloatMathBenchmark.java b/core/tests/benchmarks/src/android/util/FloatMathBenchmark.java index 2858128b3c8d..028dd1d14a18 100644 --- a/core/tests/benchmarks/src/android/util/FloatMathBenchmark.java +++ b/core/tests/benchmarks/src/android/util/FloatMathBenchmark.java @@ -15,13 +15,9 @@ */ package android.util; -import com.google.caliper.Param; -import com.google.caliper.Runner; -import com.google.caliper.SimpleBenchmark; - import android.util.FloatMath; -public class FloatMathBenchmark extends SimpleBenchmark { +public class FloatMathBenchmark { public float timeFloatMathCeil(int reps) { // Keep an answer so we don't optimize the method call away. @@ -112,5 +108,4 @@ public class FloatMathBenchmark extends SimpleBenchmark { } return f; } - } diff --git a/core/tests/benchmarks/src/com/android/internal/net/NetworkStatsFactoryBenchmark.java b/core/tests/benchmarks/src/com/android/internal/net/NetworkStatsFactoryBenchmark.java index 2174be5dc0a3..e62fbd6568f7 100644 --- a/core/tests/benchmarks/src/com/android/internal/net/NetworkStatsFactoryBenchmark.java +++ b/core/tests/benchmarks/src/com/android/internal/net/NetworkStatsFactoryBenchmark.java @@ -18,29 +18,31 @@ package com.android.internal.net; import android.net.NetworkStats; import android.os.SystemClock; - -import com.google.caliper.SimpleBenchmark; - +import com.google.caliper.AfterExperiment; +import com.google.caliper.BeforeExperiment; import java.io.File; -public class NetworkStatsFactoryBenchmark extends SimpleBenchmark { +public class NetworkStatsFactoryBenchmark { private File mStats; // TODO: consider staging stats file with different number of rows - @Override + @BeforeExperiment protected void setUp() { mStats = new File("/proc/net/xt_qtaguid/stats"); } - @Override + @AfterExperiment protected void tearDown() { mStats = null; } public void timeReadNetworkStatsDetailJava(int reps) throws Exception { for (int i = 0; i < reps; i++) { - NetworkStatsFactory.javaReadNetworkStatsDetail(mStats, NetworkStats.UID_ALL); + NetworkStatsFactory.javaReadNetworkStatsDetail(mStats, NetworkStats.UID_ALL, + // Looks like this was broken by change d0c5b9abed60b7bc056d026bf0f2b2235410fb70 + // Fixed compilation problem but needs addressing properly. + new String[0], 999); } } @@ -48,7 +50,10 @@ public class NetworkStatsFactoryBenchmark extends SimpleBenchmark { for (int i = 0; i < reps; i++) { final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0); NetworkStatsFactory.nativeReadNetworkStatsDetail( - stats, mStats.getAbsolutePath(), NetworkStats.UID_ALL); + stats, mStats.getAbsolutePath(), NetworkStats.UID_ALL, + // Looks like this was broken by change d0c5b9abed60b7bc056d026bf0f2b2235410fb70 + // Fixed compilation problem but needs addressing properly. + new String[0], 999); } } } diff --git a/core/tests/benchmarks/src/com/android/internal/util/IndentingPrintWriterBenchmark.java b/core/tests/benchmarks/src/com/android/internal/util/IndentingPrintWriterBenchmark.java index 34c73e831923..1112d5c40e95 100644 --- a/core/tests/benchmarks/src/com/android/internal/util/IndentingPrintWriterBenchmark.java +++ b/core/tests/benchmarks/src/com/android/internal/util/IndentingPrintWriterBenchmark.java @@ -17,15 +17,15 @@ package com.android.internal.util; import com.google.android.collect.Lists; -import com.google.caliper.SimpleBenchmark; - +import com.google.caliper.AfterExperiment; +import com.google.caliper.BeforeExperiment; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; -public class IndentingPrintWriterBenchmark extends SimpleBenchmark { +public class IndentingPrintWriterBenchmark { private PrintWriter mDirect; private IndentingPrintWriter mIndenting; @@ -33,7 +33,7 @@ public class IndentingPrintWriterBenchmark extends SimpleBenchmark { private Node mSimple; private Node mComplex; - @Override + @BeforeExperiment protected void setUp() throws IOException { final FileOutputStream os = new FileOutputStream(new File("/dev/null")); mDirect = new PrintWriter(os); @@ -49,7 +49,7 @@ public class IndentingPrintWriterBenchmark extends SimpleBenchmark { manyChildren); } - @Override + @AfterExperiment protected void tearDown() { mIndenting.close(); mIndenting = null; diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml index 1b97b658943c..0e663747eb04 100644 --- a/data/fonts/fonts.xml +++ b/data/fonts/fonts.xml @@ -344,7 +344,7 @@ <family> <font weight="400" style="normal">NanumGothic.ttf</font> </family> - <family> + <family lang="und-Qaae"> <font weight="400" style="normal">NotoColorEmoji.ttf</font> </family> <family> diff --git a/graphics/java/android/graphics/ImageFormat.java b/graphics/java/android/graphics/ImageFormat.java index 7aa0aef2d06b..a226e85618e8 100644 --- a/graphics/java/android/graphics/ImageFormat.java +++ b/graphics/java/android/graphics/ImageFormat.java @@ -361,6 +361,17 @@ public class ImageFormat { public static final int RAW_SENSOR = 0x20; /** + * <p>Private raw camera sensor image format, a single channel image with + * implementation depedent pixel layout.</p> + * + * <p>RAW_PRIVATE is a format for unprocessed raw image buffers coming from an + * image sensor. The actual structure of buffers of this format is + * implementation-dependent.</p> + * + */ + public static final int RAW_PRIVATE = 0x24; + + /** * <p> * Android 10-bit raw format * </p> @@ -748,6 +759,7 @@ public class ImageFormat { case FLEX_RGB_888: case FLEX_RGBA_8888: case RAW_SENSOR: + case RAW_PRIVATE: case RAW10: case RAW12: case DEPTH16: diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index 35182f9d05a6..90522f71a845 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -25,6 +25,9 @@ import android.text.SpannedString; import android.text.TextUtils; import android.util.LocaleList; +import com.android.internal.annotations.GuardedBy; + +import java.util.HashMap; import java.util.Locale; /** @@ -56,6 +59,16 @@ public class Paint { private LocaleList mLocales; private String mFontFeatureSettings; + private static final Object sCacheLock = new Object(); + + /** + * Cache for the Minikin language list ID. + * + * A map from a string representation of the LocaleList to Minikin's language list ID. + */ + @GuardedBy("sCacheLock") + private static final HashMap<String, Integer> sMinikinLangListIdCache = new HashMap<>(); + /** * @hide */ @@ -1335,7 +1348,7 @@ public class Paint { return; } mLocales = new LocaleList(locale); - nSetTextLocales(mNativePaint, locale.toString()); + syncTextLocalesWithMinikin(); } /** @@ -1372,7 +1385,21 @@ public class Paint { } if (locales.equals(mLocales)) return; mLocales = locales; - nSetTextLocales(mNativePaint, locales.toLanguageTags()); + syncTextLocalesWithMinikin(); + } + + private void syncTextLocalesWithMinikin() { + final String languageTags = mLocales.toLanguageTags(); + final Integer minikinLangListId; + synchronized (sCacheLock) { + minikinLangListId = sMinikinLangListIdCache.get(languageTags); + if (minikinLangListId == null) { + final int newID = nSetTextLocales(mNativePaint, languageTags); + sMinikinLangListIdCache.put(languageTags, newID); + return; + } + } + nSetTextLocalesByMinikinLangListId(mNativePaint, minikinLangListId.intValue()); } /** @@ -2714,8 +2741,9 @@ public class Paint { private static native void nSetTextAlign(long paintPtr, int align); - private static native void nSetTextLocales(long paintPtr, - String locales); + private static native int nSetTextLocales(long paintPtr, String locales); + private static native void nSetTextLocalesByMinikinLangListId(long paintPtr, + int mMinikinLangListId); private static native float nGetTextAdvances(long paintPtr, long typefacePtr, char[] text, int index, int count, int contextIndex, int contextCount, diff --git a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java index 971a3a295ca2..d714ca830976 100644 --- a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java @@ -153,7 +153,7 @@ public class AnimatedRotateDrawable extends DrawableWrapper implements Animatabl updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index 4d2037bf04a5..daf25815d1ac 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -829,7 +829,7 @@ public class BitmapDrawable extends Drawable { try { updateStateFromTypedArray(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/ClipDrawable.java b/graphics/java/android/graphics/drawable/ClipDrawable.java index cdd336dded0a..d925b6b95c66 100644 --- a/graphics/java/android/graphics/drawable/ClipDrawable.java +++ b/graphics/java/android/graphics/drawable/ClipDrawable.java @@ -111,7 +111,7 @@ public class ClipDrawable extends DrawableWrapper { updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index 0ee877e28c2c..3d8437d66848 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -1430,6 +1430,20 @@ public abstract class Drawable { } /** + * Re-throws an exception as a {@link RuntimeException} with an empty stack + * trace to avoid cluttering the log. The original exception's stack trace + * will still be included. + * + * @param cause the exception to re-throw + * @throws RuntimeException + */ + static void rethrowAsRuntimeException(Exception cause) throws RuntimeException { + final RuntimeException e = new RuntimeException(cause); + e.setStackTrace(new StackTraceElement[0]); + throw e; + } + + /** * Parses a {@link android.graphics.PorterDuff.Mode} from a tintMode * attribute's enum value. * diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java index 719297a7668c..f9208cd6c256 100644 --- a/graphics/java/android/graphics/drawable/GradientDrawable.java +++ b/graphics/java/android/graphics/drawable/GradientDrawable.java @@ -23,7 +23,6 @@ import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.Resources.Theme; import android.content.res.TypedArray; -import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; @@ -1268,7 +1267,7 @@ public class GradientDrawable extends Drawable { try { updateGradientDrawableGradient(t.getResources(), a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java index d800acbe805e..0de4c2cffa17 100644 --- a/graphics/java/android/graphics/drawable/Icon.java +++ b/graphics/java/android/graphics/drawable/Icon.java @@ -44,6 +44,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Objects; /** * An umbrella container for several serializable graphics representations, including Bitmaps, @@ -459,6 +460,37 @@ public final class Icon implements Parcelable { } /** + * Compares if this icon is constructed from the same resources as another icon. + * Note that this is an inexpensive operation and doesn't do deep Bitmap equality comparisons. + * + * @param otherIcon the other icon + * @return whether this icon is the same as the another one + * @hide + */ + public boolean sameAs(Icon otherIcon) { + if (otherIcon == this) { + return true; + } + if (mType != otherIcon.getType()) { + return false; + } + switch (mType) { + case TYPE_BITMAP: + return getBitmap() == otherIcon.getBitmap(); + case TYPE_DATA: + return getDataLength() == otherIcon.getDataLength() + && getDataOffset() == otherIcon.getDataOffset() + && getDataBytes() == otherIcon.getDataBytes(); + case TYPE_RESOURCE: + return getResId() == otherIcon.getResId() + && Objects.equals(getResPackage(), otherIcon.getResPackage()); + case TYPE_URI: + return Objects.equals(getUriString(), otherIcon.getUriString()); + } + return false; + } + + /** * Create an Icon pointing to a drawable resource. * @param context The context for the application whose resources should be used to resolve the * given resource ID. diff --git a/graphics/java/android/graphics/drawable/InsetDrawable.java b/graphics/java/android/graphics/drawable/InsetDrawable.java index 36d4272166af..d47cb561a116 100644 --- a/graphics/java/android/graphics/drawable/InsetDrawable.java +++ b/graphics/java/android/graphics/drawable/InsetDrawable.java @@ -124,7 +124,7 @@ public class InsetDrawable extends DrawableWrapper { updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index 4d51d63fa603..bfbdfa5f5255 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -510,7 +510,7 @@ public class NinePatchDrawable extends Drawable { try { updateStateFromTypedArray(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index aaab5290bec5..5213e10332c4 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -40,7 +40,6 @@ import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.Shader; import android.util.AttributeSet; -import android.util.DisplayMetrics; import java.io.IOException; import java.util.Arrays; @@ -505,7 +504,7 @@ public class RippleDrawable extends LayerDrawable { updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/RotateDrawable.java b/graphics/java/android/graphics/drawable/RotateDrawable.java index 1531ba2380fb..78424e3663de 100644 --- a/graphics/java/android/graphics/drawable/RotateDrawable.java +++ b/graphics/java/android/graphics/drawable/RotateDrawable.java @@ -92,7 +92,7 @@ public class RotateDrawable extends DrawableWrapper { updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/ScaleDrawable.java b/graphics/java/android/graphics/drawable/ScaleDrawable.java index 330266fe1fb4..51e143baeac4 100644 --- a/graphics/java/android/graphics/drawable/ScaleDrawable.java +++ b/graphics/java/android/graphics/drawable/ScaleDrawable.java @@ -125,7 +125,7 @@ public class ScaleDrawable extends DrawableWrapper { updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java index f630055e2a48..3761a99759c1 100644 --- a/graphics/java/android/graphics/drawable/VectorDrawable.java +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java @@ -511,7 +511,7 @@ public class VectorDrawable extends Drawable { state.mCacheDirty = true; updateStateFromTypedArray(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/include/android_runtime/android_view_Surface.h b/include/android_runtime/android_view_Surface.h index ed8331410fee..b1e552a810e8 100644 --- a/include/android_runtime/android_view_Surface.h +++ b/include/android_runtime/android_view_Surface.h @@ -45,7 +45,9 @@ enum class PublicFormat { RAW_SENSOR = 0x20, PRIVATE = 0x22, YUV_420_888 = 0x23, + RAW_PRIVATE = 0x24, RAW10 = 0x25, + RAW12 = 0x26, JPEG = 0x100, DEPTH_POINT_CLOUD = 0x101, YV12 = 0x32315659, diff --git a/keystore/java/android/security/IKeyChainService.aidl b/keystore/java/android/security/IKeyChainService.aidl index 20c94c5946d7..cfcb4e0c16e1 100644 --- a/keystore/java/android/security/IKeyChainService.aidl +++ b/keystore/java/android/security/IKeyChainService.aidl @@ -33,6 +33,7 @@ interface IKeyChainService { // APIs used by DevicePolicyManager boolean installKeyPair(in byte[] privateKey, in byte[] userCert, String alias); + boolean removeKeyPair(String alias); // APIs used by Settings boolean deleteCaCertificate(String alias); diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index d98497bc046b..0d1ee46712ee 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -90,6 +90,9 @@ hwui_src_files := \ protos/hwui.proto hwui_test_common_src_files := \ + $(call all-cpp-files-under, tests/common/scenes) \ + tests/common/TestContext.cpp \ + tests/common/TestScene.cpp \ tests/common/TestUtils.cpp hwui_cflags := \ @@ -259,12 +262,9 @@ LOCAL_WHOLE_STATIC_LIBRARIES := libhwui_static LOCAL_SRC_FILES += \ $(hwui_test_common_src_files) \ - tests/macrobench/TestContext.cpp \ tests/macrobench/TestSceneRunner.cpp \ tests/macrobench/main.cpp -LOCAL_SRC_FILES += $(call all-cpp-files-under, tests/common/scenes) - include $(BUILD_EXECUTABLE) # ------------------------ diff --git a/libs/hwui/BakedOpDispatcher.cpp b/libs/hwui/BakedOpDispatcher.cpp index fde12dd261f5..3d35dd5b1fe8 100644 --- a/libs/hwui/BakedOpDispatcher.cpp +++ b/libs/hwui/BakedOpDispatcher.cpp @@ -20,6 +20,7 @@ #include "Caches.h" #include "Glop.h" #include "GlopBuilder.h" +#include "PathTessellator.h" #include "renderstate/OffscreenBufferPool.h" #include "renderstate/RenderState.h" #include "utils/GLUtils.h" @@ -27,6 +28,7 @@ #include <algorithm> #include <math.h> +#include <SkPaintDefaults.h> namespace android { namespace uirenderer { @@ -206,6 +208,90 @@ void BakedOpDispatcher::onEndLayerOp(BakedOpRenderer&, const EndLayerOp&, const LOG_ALWAYS_FATAL("unsupported operation"); } +namespace VertexBufferRenderFlags { + enum { + Offset = 0x1, + ShadowInterp = 0x2, + }; +} + +static void renderVertexBuffer(BakedOpRenderer& renderer, const BakedOpState& state, + const VertexBuffer& vertexBuffer, float translateX, float translateY, + const SkPaint& paint, int vertexBufferRenderFlags) { + if (CC_LIKELY(vertexBuffer.getVertexCount())) { + bool shadowInterp = vertexBufferRenderFlags & VertexBufferRenderFlags::ShadowInterp; + const int transformFlags = TransformFlags::OffsetByFudgeFactor; + Glop glop; + GlopBuilder(renderer.renderState(), renderer.caches(), &glop) + .setRoundRectClipState(state.roundRectClipState) + .setMeshVertexBuffer(vertexBuffer, shadowInterp) + .setFillPaint(paint, state.alpha) + .setTransform(state.computedState.transform, transformFlags) + .setModelViewOffsetRect(translateX, translateY, vertexBuffer.getBounds()) + .build(); + renderer.renderGlop(state, glop); + } +} + +static void renderConvexPath(BakedOpRenderer& renderer, const BakedOpState& state, + const SkPath& path, const SkPaint& paint) { + VertexBuffer vertexBuffer; + // TODO: try clipping large paths to viewport + PathTessellator::tessellatePath(path, &paint, state.computedState.transform, vertexBuffer); + renderVertexBuffer(renderer, state, vertexBuffer, 0.0f, 0.0f, paint, 0); +} + +static void renderPathTexture(BakedOpRenderer& renderer, const BakedOpState& state, + PathTexture& texture, const RecordedOp& op) { + Rect dest(texture.width, texture.height); + dest.translate(texture.left + op.unmappedBounds.left - texture.offset, + texture.top + op.unmappedBounds.top - texture.offset); + Glop glop; + GlopBuilder(renderer.renderState(), renderer.caches(), &glop) + .setRoundRectClipState(state.roundRectClipState) + .setMeshTexturedUnitQuad(nullptr) + .setFillPathTexturePaint(texture, *(op.paint), state.alpha) + .setTransform(state.computedState.transform, TransformFlags::None) + .setModelViewMapUnitToRect(dest) + .build(); + renderer.renderGlop(state, glop); +} + +SkRect getBoundsOfFill(const RecordedOp& op) { + SkRect bounds = op.unmappedBounds.toSkRect(); + if (op.paint->getStyle() == SkPaint::kStrokeAndFill_Style) { + float outsetDistance = op.paint->getStrokeWidth() / 2; + bounds.outset(outsetDistance, outsetDistance); + } + return bounds; +} + +void BakedOpDispatcher::onArcOp(BakedOpRenderer& renderer, const ArcOp& op, const BakedOpState& state) { + // TODO: support fills (accounting for concavity if useCenter && sweepAngle > 180) + if (op.paint->getStyle() != SkPaint::kStroke_Style + || op.paint->getPathEffect() != nullptr + || op.useCenter) { + PathTexture* texture = renderer.caches().pathCache.getArc( + op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), + op.startAngle, op.sweepAngle, op.useCenter, op.paint); + const AutoTexture holder(texture); + if (CC_LIKELY(holder.texture)) { + renderPathTexture(renderer, state, *texture, op); + } + } else { + SkRect rect = getBoundsOfFill(op); + SkPath path; + if (op.useCenter) { + path.moveTo(rect.centerX(), rect.centerY()); + } + path.arcTo(rect, op.startAngle, op.sweepAngle, !op.useCenter); + if (op.useCenter) { + path.close(); + } + renderConvexPath(renderer, state, path, *(op.paint)); + } +} + void BakedOpDispatcher::onBitmapOp(BakedOpRenderer& renderer, const BitmapOp& op, const BakedOpState& state) { Texture* texture = renderer.getTexture(op.bitmap); if (!texture) return; @@ -225,43 +311,101 @@ void BakedOpDispatcher::onBitmapOp(BakedOpRenderer& renderer, const BitmapOp& op } void BakedOpDispatcher::onLinesOp(BakedOpRenderer& renderer, const LinesOp& op, const BakedOpState& state) { - LOG_ALWAYS_FATAL("todo"); + VertexBuffer buffer; + PathTessellator::tessellateLines(op.points, op.floatCount, op.paint, + state.computedState.transform, buffer); + int displayFlags = op.paint->isAntiAlias() ? 0 : VertexBufferRenderFlags::Offset; + renderVertexBuffer(renderer, state, buffer, 0, 0, *(op.paint), displayFlags); } -void BakedOpDispatcher::onRectOp(BakedOpRenderer& renderer, const RectOp& op, const BakedOpState& state) { - Glop glop; - GlopBuilder(renderer.renderState(), renderer.caches(), &glop) - .setRoundRectClipState(state.roundRectClipState) - .setMeshUnitQuad() - .setFillPaint(*op.paint, state.alpha) - .setTransform(state.computedState.transform, TransformFlags::None) - .setModelViewMapUnitToRect(op.unmappedBounds) - .build(); - renderer.renderGlop(state, glop); +void BakedOpDispatcher::onOvalOp(BakedOpRenderer& renderer, const OvalOp& op, const BakedOpState& state) { + if (op.paint->getPathEffect() != nullptr) { + PathTexture* texture = renderer.caches().pathCache.getOval( + op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), op.paint); + const AutoTexture holder(texture); + if (CC_LIKELY(holder.texture)) { + renderPathTexture(renderer, state, *texture, op); + } + } else { + SkPath path; + SkRect rect = getBoundsOfFill(op); + path.addOval(rect); + renderConvexPath(renderer, state, path, *(op.paint)); + } } -namespace VertexBufferRenderFlags { - enum { - Offset = 0x1, - ShadowInterp = 0x2, - }; +void BakedOpDispatcher::onPathOp(BakedOpRenderer& renderer, const PathOp& op, const BakedOpState& state) { + PathTexture* texture = renderer.caches().pathCache.get(op.path, op.paint); + const AutoTexture holder(texture); + if (CC_LIKELY(holder.texture)) { + renderPathTexture(renderer, state, *texture, op); + } } -static void renderVertexBuffer(BakedOpRenderer& renderer, const BakedOpState& state, - const VertexBuffer& vertexBuffer, float translateX, float translateY, - SkPaint& paint, int vertexBufferRenderFlags) { - if (CC_LIKELY(vertexBuffer.getVertexCount())) { - bool shadowInterp = vertexBufferRenderFlags & VertexBufferRenderFlags::ShadowInterp; - const int transformFlags = TransformFlags::OffsetByFudgeFactor; - Glop glop; - GlopBuilder(renderer.renderState(), renderer.caches(), &glop) - .setRoundRectClipState(state.roundRectClipState) - .setMeshVertexBuffer(vertexBuffer, shadowInterp) - .setFillPaint(paint, state.alpha) - .setTransform(state.computedState.transform, transformFlags) - .setModelViewOffsetRect(translateX, translateY, vertexBuffer.getBounds()) - .build(); - renderer.renderGlop(state, glop); +void BakedOpDispatcher::onPointsOp(BakedOpRenderer& renderer, const PointsOp& op, const BakedOpState& state) { + VertexBuffer buffer; + PathTessellator::tessellatePoints(op.points, op.floatCount, op.paint, + state.computedState.transform, buffer); + int displayFlags = op.paint->isAntiAlias() ? 0 : VertexBufferRenderFlags::Offset; + renderVertexBuffer(renderer, state, buffer, 0, 0, *(op.paint), displayFlags); +} + +// See SkPaintDefaults.h +#define SkPaintDefaults_MiterLimit SkIntToScalar(4) + +void BakedOpDispatcher::onRectOp(BakedOpRenderer& renderer, const RectOp& op, const BakedOpState& state) { + if (op.paint->getStyle() != SkPaint::kFill_Style) { + // only fill + default miter is supported by drawConvexPath, since others must handle joins + static_assert(SkPaintDefaults_MiterLimit == 4.0f, "Miter limit has changed"); + if (CC_UNLIKELY(op.paint->getPathEffect() != nullptr + || op.paint->getStrokeJoin() != SkPaint::kMiter_Join + || op.paint->getStrokeMiter() != SkPaintDefaults_MiterLimit)) { + PathTexture* texture = renderer.caches().pathCache.getRect( + op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), op.paint); + const AutoTexture holder(texture); + if (CC_LIKELY(holder.texture)) { + renderPathTexture(renderer, state, *texture, op); + } + } else { + SkPath path; + path.addRect(getBoundsOfFill(op)); + renderConvexPath(renderer, state, path, *(op.paint)); + } + } else { + if (op.paint->isAntiAlias() && !state.computedState.transform.isSimple()) { + SkPath path; + path.addRect(op.unmappedBounds.toSkRect()); + renderConvexPath(renderer, state, path, *(op.paint)); + } else { + // render simple unit quad, no tessellation required + Glop glop; + GlopBuilder(renderer.renderState(), renderer.caches(), &glop) + .setRoundRectClipState(state.roundRectClipState) + .setMeshUnitQuad() + .setFillPaint(*op.paint, state.alpha) + .setTransform(state.computedState.transform, TransformFlags::None) + .setModelViewMapUnitToRect(op.unmappedBounds) + .build(); + renderer.renderGlop(state, glop); + } + } +} + +void BakedOpDispatcher::onRoundRectOp(BakedOpRenderer& renderer, const RoundRectOp& op, const BakedOpState& state) { + if (op.paint->getPathEffect() != nullptr) { + PathTexture* texture = renderer.caches().pathCache.getRoundRect( + op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), + op.rx, op.ry, op.paint); + const AutoTexture holder(texture); + if (CC_LIKELY(holder.texture)) { + renderPathTexture(renderer, state, *texture, op); + } + } else { + const VertexBuffer* buffer = renderer.caches().tessellationCache.getRoundRect( + state.computedState.transform, *(op.paint), + op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), op.rx, op.ry); + renderVertexBuffer(renderer, state, *buffer, + op.unmappedBounds.left, op.unmappedBounds.top, *(op.paint), 0); } } @@ -323,8 +467,6 @@ void BakedOpDispatcher::onTextOp(BakedOpRenderer& renderer, const TextOp& op, co void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state) { OffscreenBuffer* buffer = *op.layerHandle; - // TODO: extend this to handle HW layers & paint properties which - // reside in node.properties().layerProperties() float layerAlpha = op.alpha * state.alpha; Glop glop; GlopBuilder(renderer.renderState(), renderer.caches(), &glop) diff --git a/libs/hwui/BakedOpDispatcher.h b/libs/hwui/BakedOpDispatcher.h index 0e763d9c660b..ed34ada90272 100644 --- a/libs/hwui/BakedOpDispatcher.h +++ b/libs/hwui/BakedOpDispatcher.h @@ -26,6 +26,10 @@ namespace uirenderer { /** * Provides all "onBitmapOp(...)" style static methods for every op type, which convert the * RecordedOps and their state to Glops, and renders them with the provided BakedOpRenderer. + * + * onXXXOp methods must either render directly with the renderer, or call a static renderYYY + * method to render content. There should never be draw content rejection in BakedOpDispatcher - + * it must happen at a higher level (except in error-ish cases, like texture-too-big). */ class BakedOpDispatcher { public: diff --git a/libs/hwui/BakedOpState.h b/libs/hwui/BakedOpState.h index 983c27b4a511..9c836a00bfea 100644 --- a/libs/hwui/BakedOpState.h +++ b/libs/hwui/BakedOpState.h @@ -53,7 +53,7 @@ struct MergedBakedOpList { class ResolvedRenderState { public: // TODO: remove the mapRects/matrix multiply when snapshot & recorded transforms are translates - ResolvedRenderState(const Snapshot& snapshot, const RecordedOp& recordedOp) { + ResolvedRenderState(const Snapshot& snapshot, const RecordedOp& recordedOp, bool expandForStroke) { /* TODO: benchmark a fast path for translate-only matrices, such as: if (CC_LIKELY(snapshot.transform->getType() == Matrix4::kTypeTranslate && recordedOp.localMatrix.getType() == Matrix4::kTypeTranslate)) { @@ -83,7 +83,17 @@ public: // resolvedClippedBounds = intersect(resolvedMatrix * opBounds, resolvedClipRect) clippedBounds = recordedOp.unmappedBounds; + if (CC_UNLIKELY(expandForStroke)) { + // account for non-hairline stroke + clippedBounds.outset(recordedOp.paint->getStrokeWidth() * 0.5f); + } transform.mapRect(clippedBounds); + if (CC_UNLIKELY(expandForStroke + && (!transform.isPureTranslate() || recordedOp.paint->getStrokeWidth() < 1.0f))) { + // account for hairline stroke when stroke may be < 1 scaled pixel + // Non translate || strokeWidth < 1 is conservative, but will cover all cases + clippedBounds.outset(0.5f); + } if (clipRect.left > clippedBounds.left) clipSideFlags |= OpClipSideFlags::Left; if (clipRect.top > clippedBounds.top) clipSideFlags |= OpClipSideFlags::Top; @@ -129,13 +139,36 @@ class BakedOpState { public: static BakedOpState* tryConstruct(LinearAllocator& allocator, const Snapshot& snapshot, const RecordedOp& recordedOp) { - BakedOpState* bakedOp = new (allocator) BakedOpState(snapshot, recordedOp); - if (bakedOp->computedState.clippedBounds.isEmpty()) { + BakedOpState* bakedState = new (allocator) BakedOpState(snapshot, recordedOp, false); + if (bakedState->computedState.clippedBounds.isEmpty()) { + // bounds are empty, so op is rejected + allocator.rewindIfLastAlloc(bakedState); + return nullptr; + } + return bakedState; + } + + enum class StrokeBehavior { + // stroking is forced, regardless of style on paint + Forced, + // stroking is defined by style on paint + StyleDefined, + }; + + static BakedOpState* tryStrokeableOpConstruct(LinearAllocator& allocator, + const Snapshot& snapshot, const RecordedOp& recordedOp, StrokeBehavior strokeBehavior) { + bool expandForStroke = (strokeBehavior == StrokeBehavior::StyleDefined) + ? (recordedOp.paint && recordedOp.paint->getStyle() != SkPaint::kFill_Style) + : true; + + BakedOpState* bakedState = new (allocator) BakedOpState( + snapshot, recordedOp, expandForStroke); + if (bakedState->computedState.clippedBounds.isEmpty()) { // bounds are empty, so op is rejected - allocator.rewindIfLastAlloc(bakedOp); + allocator.rewindIfLastAlloc(bakedState); return nullptr; } - return bakedOp; + return bakedState; } static BakedOpState* tryShadowOpConstruct(LinearAllocator& allocator, @@ -160,8 +193,8 @@ public: const RecordedOp* op; private: - BakedOpState(const Snapshot& snapshot, const RecordedOp& recordedOp) - : computedState(snapshot, recordedOp) + BakedOpState(const Snapshot& snapshot, const RecordedOp& recordedOp, bool expandForStroke) + : computedState(snapshot, recordedOp, expandForStroke) , alpha(snapshot.alpha) , roundRectClipState(snapshot.roundRectClipState) , projectionPathMask(snapshot.projectionPathMask) diff --git a/libs/hwui/Canvas.h b/libs/hwui/Canvas.h index b585a2799cad..0643a54c88c5 100644 --- a/libs/hwui/Canvas.h +++ b/libs/hwui/Canvas.h @@ -113,10 +113,10 @@ public: // Geometry virtual void drawPoint(float x, float y, const SkPaint& paint) = 0; - virtual void drawPoints(const float* points, int count, const SkPaint& paint) = 0; + virtual void drawPoints(const float* points, int floatCount, const SkPaint& paint) = 0; virtual void drawLine(float startX, float startY, float stopX, float stopY, const SkPaint& paint) = 0; - virtual void drawLines(const float* points, int count, const SkPaint& paint) = 0; + virtual void drawLines(const float* points, int floatCount, const SkPaint& paint) = 0; virtual void drawRect(float left, float top, float right, float bottom, const SkPaint& paint) = 0; virtual void drawRegion(const SkRegion& region, const SkPaint& paint) = 0; diff --git a/libs/hwui/OpReorderer.cpp b/libs/hwui/OpReorderer.cpp index 9460361f9451..f948f187451d 100644 --- a/libs/hwui/OpReorderer.cpp +++ b/libs/hwui/OpReorderer.cpp @@ -708,12 +708,36 @@ void OpReorderer::onRenderNodeOp(const RenderNodeOp& op) { } } -static batchid_t tessellatedBatchId(const SkPaint& paint) { +/** + * Defers an unmergeable, strokeable op, accounting correctly + * for paint's style on the bounds being computed. + */ +void OpReorderer::onStrokeableOp(const RecordedOp& op, batchid_t batchId, + BakedOpState::StrokeBehavior strokeBehavior) { + // Note: here we account for stroke when baking the op + BakedOpState* bakedState = BakedOpState::tryStrokeableOpConstruct( + mAllocator, *mCanvasState.currentSnapshot(), op, strokeBehavior); + if (!bakedState) return; // quick rejected + currentLayer().deferUnmergeableOp(mAllocator, bakedState, batchId); +} + +/** + * Returns batch id for tessellatable shapes, based on paint. Checks to see if path effect/AA will + * be used, since they trigger significantly different rendering paths. + * + * Note: not used for lines/points, since they don't currently support path effects. + */ +static batchid_t tessBatchId(const RecordedOp& op) { + const SkPaint& paint = *(op.paint); return paint.getPathEffect() ? OpBatchType::AlphaMaskTexture : (paint.isAntiAlias() ? OpBatchType::AlphaVertices : OpBatchType::Vertices); } +void OpReorderer::onArcOp(const ArcOp& op) { + onStrokeableOp(op, tessBatchId(op)); +} + void OpReorderer::onBitmapOp(const BitmapOp& op) { BakedOpState* bakedState = tryBakeOpState(op); if (!bakedState) return; // quick rejected @@ -734,15 +758,29 @@ void OpReorderer::onBitmapOp(const BitmapOp& op) { } void OpReorderer::onLinesOp(const LinesOp& op) { - BakedOpState* bakedState = tryBakeOpState(op); - if (!bakedState) return; // quick rejected - currentLayer().deferUnmergeableOp(mAllocator, bakedState, tessellatedBatchId(*op.paint)); + batchid_t batch = op.paint->isAntiAlias() ? OpBatchType::AlphaVertices : OpBatchType::Vertices; + onStrokeableOp(op, batch, BakedOpState::StrokeBehavior::Forced); +} + +void OpReorderer::onOvalOp(const OvalOp& op) { + onStrokeableOp(op, tessBatchId(op)); +} + +void OpReorderer::onPathOp(const PathOp& op) { + onStrokeableOp(op, OpBatchType::Bitmap); +} + +void OpReorderer::onPointsOp(const PointsOp& op) { + batchid_t batch = op.paint->isAntiAlias() ? OpBatchType::AlphaVertices : OpBatchType::Vertices; + onStrokeableOp(op, batch, BakedOpState::StrokeBehavior::Forced); } void OpReorderer::onRectOp(const RectOp& op) { - BakedOpState* bakedState = tryBakeOpState(op); - if (!bakedState) return; // quick rejected - currentLayer().deferUnmergeableOp(mAllocator, bakedState, tessellatedBatchId(*op.paint)); + onStrokeableOp(op, tessBatchId(op)); +} + +void OpReorderer::onRoundRectOp(const RoundRectOp& op) { + onStrokeableOp(op, tessBatchId(op)); } void OpReorderer::onSimpleRectsOp(const SimpleRectsOp& op) { diff --git a/libs/hwui/OpReorderer.h b/libs/hwui/OpReorderer.h index fc77c617fd89..58b607cb9182 100644 --- a/libs/hwui/OpReorderer.h +++ b/libs/hwui/OpReorderer.h @@ -245,6 +245,10 @@ private: mFrameAllocatedPaths.emplace_back(new SkPath); return mFrameAllocatedPaths.back().get(); } + + void onStrokeableOp(const RecordedOp& op, batchid_t batchId, + BakedOpState::StrokeBehavior strokeBehavior = BakedOpState::StrokeBehavior::StyleDefined); + /** * Declares all OpReorderer::onXXXXOp() methods for every RecordedOp type. * diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 2cb32c404525..f49237c9c069 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -40,6 +40,7 @@ #include <SkCanvas.h> #include <SkColor.h> +#include <SkPaintDefaults.h> #include <SkPathOps.h> #include <SkShader.h> #include <SkTypeface.h> @@ -1908,9 +1909,6 @@ void OpenGLRenderer::drawArc(float left, float top, float right, float bottom, drawConvexPath(path, p); } -// See SkPaintDefaults.h -#define SkPaintDefaults_MiterLimit SkIntToScalar(4) - void OpenGLRenderer::drawRect(float left, float top, float right, float bottom, const SkPaint* p) { if (mState.currentlyIgnored() @@ -1921,6 +1919,7 @@ void OpenGLRenderer::drawRect(float left, float top, float right, float bottom, if (p->getStyle() != SkPaint::kFill_Style) { // only fill style is supported by drawConvexPath, since others have to handle joins + static_assert(SkPaintDefaults_MiterLimit == 4.0f, "Miter limit has changed"); if (p->getPathEffect() != nullptr || p->getStrokeJoin() != SkPaint::kMiter_Join || p->getStrokeMiter() != SkPaintDefaults_MiterLimit) { mCaches.textureState().activateTexture(0); diff --git a/libs/hwui/RecordedOp.h b/libs/hwui/RecordedOp.h index b96640144657..8ce5473aeb4f 100644 --- a/libs/hwui/RecordedOp.h +++ b/libs/hwui/RecordedOp.h @@ -43,10 +43,15 @@ struct Vertex; * This serves as the authoritative list of ops, used for generating ID enum, and ID based LUTs. */ #define MAP_OPS_BASED_ON_MERGEABILITY(U_OP_FN, M_OP_FN) \ + U_OP_FN(ArcOp) \ M_OP_FN(BitmapOp) \ U_OP_FN(LinesOp) \ + U_OP_FN(OvalOp) \ + U_OP_FN(PathOp) \ + U_OP_FN(PointsOp) \ U_OP_FN(RectOp) \ U_OP_FN(RenderNodeOp) \ + U_OP_FN(RoundRectOp) \ U_OP_FN(ShadowOp) \ U_OP_FN(SimpleRectsOp) \ M_OP_FN(TextOp) \ @@ -74,7 +79,7 @@ namespace RecordedOpId { Count, }; } -static_assert(RecordedOpId::BitmapOp == 0, +static_assert(RecordedOpId::ArcOp == 0, "First index must be zero for LUTs to work"); #define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect, const SkPaint* paint @@ -86,7 +91,7 @@ struct RecordedOp { /* ID from RecordedOpId - generally used for jumping into function tables */ const int opId; - /* bounds in *local* space, without accounting for DisplayList transformation */ + /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */ const Rect unmappedBounds; /* transform in recording space (vs DisplayList origin) */ @@ -128,6 +133,17 @@ struct RenderNodeOp : RecordedOp { // Standard Ops //////////////////////////////////////////////////////////////////////////////////////////////////// +struct ArcOp : RecordedOp { + ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter) + : SUPER(ArcOp) + , startAngle(startAngle) + , sweepAngle(sweepAngle) + , useCenter(useCenter) {} + const float startAngle; + const float sweepAngle; + const bool useCenter; +}; + struct BitmapOp : RecordedOp { BitmapOp(BASE_PARAMS, const SkBitmap* bitmap) : SUPER(BitmapOp) @@ -145,11 +161,41 @@ struct LinesOp : RecordedOp { const int floatCount; }; +struct OvalOp : RecordedOp { + OvalOp(BASE_PARAMS) + : SUPER(OvalOp) {} +}; + +struct PathOp : RecordedOp { + PathOp(BASE_PARAMS, const SkPath* path) + : SUPER(PathOp) + , path(path) {} + const SkPath* path; +}; + +struct PointsOp : RecordedOp { + PointsOp(BASE_PARAMS, const float* points, const int floatCount) + : SUPER(PointsOp) + , points(points) + , floatCount(floatCount) {} + const float* points; + const int floatCount; +}; + struct RectOp : RecordedOp { RectOp(BASE_PARAMS) : SUPER(RectOp) {} }; +struct RoundRectOp : RecordedOp { + RoundRectOp(BASE_PARAMS, float rx, float ry) + : SUPER(RoundRectOp) + , rx(rx) + , ry(ry) {} + const float rx; + const float ry; +}; + /** * Real-time, dynamic-lit shadow. * diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index e6020cdba266..148c94083047 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -237,26 +237,32 @@ void RecordingCanvas::drawPaint(const SkPaint& paint) { refPaint(&paint))); } +static Rect calcBoundsOfPoints(const float* points, int floatCount) { + Rect unmappedBounds(points[0], points[1], points[0], points[1]); + for (int i = 2; i < floatCount; i += 2) { + unmappedBounds.expandToCover(points[i], points[i + 1]); + } + return unmappedBounds; +} + // Geometry -void RecordingCanvas::drawPoints(const float* points, int count, const SkPaint& paint) { - LOG_ALWAYS_FATAL("TODO!"); +void RecordingCanvas::drawPoints(const float* points, int floatCount, const SkPaint& paint) { + if (floatCount < 2) return; + floatCount &= ~0x1; // round down to nearest two + + addOp(new (alloc()) PointsOp( + calcBoundsOfPoints(points, floatCount), + *mState.currentSnapshot()->transform, + mState.getRenderTargetClipBounds(), + refPaint(&paint), refBuffer<float>(points, floatCount), floatCount)); } void RecordingCanvas::drawLines(const float* points, int floatCount, const SkPaint& paint) { if (floatCount < 4) return; floatCount &= ~0x3; // round down to nearest four - Rect unmappedBounds(points[0], points[1], points[0], points[1]); - for (int i = 2; i < floatCount; i += 2) { - unmappedBounds.expandToCover(points[i], points[i + 1]); - } - - // since anything AA stroke with less than 1.0 pixel width is drawn with an alpha-reduced - // 1.0 stroke, treat 1.0 as minimum. - unmappedBounds.outset(std::max(paint.getStrokeWidth(), 1.0f) * 0.5f); - addOp(new (alloc()) LinesOp( - unmappedBounds, + calcBoundsOfPoints(points, floatCount), *mState.currentSnapshot()->transform, mState.getRenderTargetClipBounds(), refPaint(&paint), refBuffer<float>(points, floatCount), floatCount)); @@ -330,20 +336,42 @@ void RecordingCanvas::drawRegion(const SkRegion& region, const SkPaint& paint) { } void RecordingCanvas::drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, const SkPaint& paint) { - LOG_ALWAYS_FATAL("TODO!"); + addOp(new (alloc()) RoundRectOp( + Rect(left, top, right, bottom), + *(mState.currentSnapshot()->transform), + mState.getRenderTargetClipBounds(), + refPaint(&paint), rx, ry)); } + void RecordingCanvas::drawCircle(float x, float y, float radius, const SkPaint& paint) { - LOG_ALWAYS_FATAL("TODO!"); + if (radius <= 0) return; + drawOval(x - radius, y - radius, x + radius, y + radius, paint); } + void RecordingCanvas::drawOval(float left, float top, float right, float bottom, const SkPaint& paint) { - LOG_ALWAYS_FATAL("TODO!"); + addOp(new (alloc()) OvalOp( + Rect(left, top, right, bottom), + *(mState.currentSnapshot()->transform), + mState.getRenderTargetClipBounds(), + refPaint(&paint))); } + void RecordingCanvas::drawArc(float left, float top, float right, float bottom, - float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint) { - LOG_ALWAYS_FATAL("TODO!"); + float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint) { + addOp(new (alloc()) ArcOp( + Rect(left, top, right, bottom), + *(mState.currentSnapshot()->transform), + mState.getRenderTargetClipBounds(), + refPaint(&paint), + startAngle, sweepAngle, useCenter)); } + void RecordingCanvas::drawPath(const SkPath& path, const SkPaint& paint) { - LOG_ALWAYS_FATAL("TODO!"); + addOp(new (alloc()) PathOp( + Rect(path.getBounds()), + *(mState.currentSnapshot()->transform), + mState.getRenderTargetClipBounds(), + refPaint(&paint), refPath(&path))); } // Bitmap-based @@ -375,6 +403,7 @@ void RecordingCanvas::drawBitmap(const SkBitmap& bitmap, const SkMatrix& matrix, restore(); } } + void RecordingCanvas::drawBitmap(const SkBitmap& bitmap, float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, const SkPaint* paint) { @@ -392,10 +421,12 @@ void RecordingCanvas::drawBitmap(const SkBitmap& bitmap, float srcLeft, float sr LOG_ALWAYS_FATAL("TODO!"); } } + void RecordingCanvas::drawBitmapMesh(const SkBitmap& bitmap, int meshWidth, int meshHeight, const float* vertices, const int* colors, const SkPaint* paint) { LOG_ALWAYS_FATAL("TODO!"); } + void RecordingCanvas::drawNinePatch(const SkBitmap& bitmap, const android::Res_png_9patch& chunk, float dstLeft, float dstTop, float dstRight, float dstBottom, const SkPaint* paint) { diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h index 6d0e9e0e0f7a..16a277162738 100644 --- a/libs/hwui/RecordingCanvas.h +++ b/libs/hwui/RecordingCanvas.h @@ -140,13 +140,13 @@ public: float points[2] = { x, y }; drawPoints(points, 2, paint); } - virtual void drawPoints(const float* points, int count, const SkPaint& paint) override; + virtual void drawPoints(const float* points, int floatCount, const SkPaint& paint) override; virtual void drawLine(float startX, float startY, float stopX, float stopY, const SkPaint& paint) override { float points[4] = { startX, startY, stopX, stopY }; drawLines(points, 4, paint); } - virtual void drawLines(const float* points, int count, const SkPaint& paint) override; + virtual void drawLines(const float* points, int floatCount, const SkPaint& paint) override; virtual void drawRect(float left, float top, float right, float bottom, const SkPaint& paint) override; virtual void drawRegion(const SkRegion& region, const SkPaint& paint) override; virtual void drawRoundRect(float left, float top, float right, float bottom, diff --git a/libs/hwui/Texture.h b/libs/hwui/Texture.h index 4bcd96dd32f7..1c544b929e64 100644 --- a/libs/hwui/Texture.h +++ b/libs/hwui/Texture.h @@ -120,16 +120,16 @@ private: class AutoTexture { public: - AutoTexture(const Texture* texture): mTexture(texture) { } + AutoTexture(const Texture* texture) + : texture(texture) {} ~AutoTexture() { - if (mTexture && mTexture->cleanup) { - mTexture->deleteTexture(); - delete mTexture; + if (texture && texture->cleanup) { + texture->deleteTexture(); + delete texture; } } -private: - const Texture* mTexture; + const Texture *const texture; }; // class AutoTexture }; // namespace uirenderer diff --git a/libs/hwui/tests/macrobench/TestContext.cpp b/libs/hwui/tests/common/TestContext.cpp index ba763a8def62..146e735839d1 100644 --- a/libs/hwui/tests/macrobench/TestContext.cpp +++ b/libs/hwui/tests/common/TestContext.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "TestContext.h" +#include "tests/common/TestContext.h" namespace android { namespace uirenderer { diff --git a/libs/hwui/tests/macrobench/TestContext.h b/libs/hwui/tests/common/TestContext.h index 2bbe5dffd9b8..2bbe5dffd9b8 100644 --- a/libs/hwui/tests/macrobench/TestContext.h +++ b/libs/hwui/tests/common/TestContext.h diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QAirplaneTile.java b/libs/hwui/tests/common/TestScene.cpp index b77191eeb83c..02bcd4768a65 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QAirplaneTile.java +++ b/libs/hwui/tests/common/TestScene.cpp @@ -14,27 +14,23 @@ * limitations under the License. */ -package com.android.systemui.qs.tiles; +#include "tests/common/TestScene.h" -import android.content.Context; -import com.android.systemui.QSQuickTileView; -import com.android.systemui.qs.QSTileBaseView; -import com.android.systemui.qs.QSTileView; +namespace android { +namespace uirenderer { +namespace test { -/** Quick settings tile: Airplane mode **/ -public class QAirplaneTile extends AirplaneModeTile { - - public QAirplaneTile(Host host) { - super(host); - } - - @Override - public QSTileBaseView createTileView(Context context) { - return new QSQuickTileView(context); - } +// Not a static global because we need to force the map to be constructed +// before we try to add things to it. +std::unordered_map<std::string, TestScene::Info>& TestScene::testMap() { + static std::unordered_map<std::string, TestScene::Info> testMap; + return testMap; +} - @Override - public int getTileType() { - return QSTileView.QS_TYPE_QUICK; - } +void TestScene::registerScene(const TestScene::Info& info) { + testMap()[info.name] = info; } + +} /* namespace test */ +} /* namespace uirenderer */ +} /* namespace android */ diff --git a/libs/hwui/tests/common/TestScene.h b/libs/hwui/tests/common/TestScene.h index b5d8954652a3..df8d194f641b 100644 --- a/libs/hwui/tests/common/TestScene.h +++ b/libs/hwui/tests/common/TestScene.h @@ -16,6 +16,9 @@ #ifndef TESTS_TESTSCENE_H #define TESTS_TESTSCENE_H +#include <string> +#include <unordered_map> + namespace android { namespace uirenderer { class RenderNode; @@ -32,9 +35,40 @@ namespace test { class TestScene { public: + struct Options { + int count = 0; + }; + + template <class T> + static test::TestScene* simpleCreateScene(const TestScene::Options&) { + return new T(); + } + + typedef test::TestScene* (*CreateScene)(const TestScene::Options&); + + struct Info { + std::string name; + std::string description; + CreateScene createScene; + }; + + class Registrar { + public: + Registrar(const TestScene::Info& info) { + TestScene::registerScene(info); + } + private: + Registrar() = delete; + Registrar(const Registrar&) = delete; + Registrar& operator=(const Registrar&) = delete; + }; + virtual ~TestScene() {} virtual void createContent(int width, int height, TestCanvas& renderer) = 0; virtual void doFrame(int frameNr) = 0; + + static std::unordered_map<std::string, Info>& testMap(); + static void registerScene(const Info& info); }; } // namespace test diff --git a/libs/hwui/tests/common/scenes/HwLayerAnimation.cpp b/libs/hwui/tests/common/scenes/HwLayerAnimation.cpp index e316eca79be8..c212df4f978d 100644 --- a/libs/hwui/tests/common/scenes/HwLayerAnimation.cpp +++ b/libs/hwui/tests/common/scenes/HwLayerAnimation.cpp @@ -18,11 +18,11 @@ class HwLayerAnimation; -static Benchmark _HwLayer(BenchmarkInfo{ +static TestScene::Registrar _HwLayer(TestScene::Info{ "hwlayer", "A nested pair of nodes with LAYER_TYPE_HARDWARE set on each. " "Tests the hardware layer codepath.", - simpleCreateScene<HwLayerAnimation> + TestScene::simpleCreateScene<HwLayerAnimation> }); class HwLayerAnimation : public TestScene { diff --git a/libs/hwui/tests/common/scenes/ListViewAnimation.cpp b/libs/hwui/tests/common/scenes/ListViewAnimation.cpp index 6c64a327013e..43e247e68bc0 100644 --- a/libs/hwui/tests/common/scenes/ListViewAnimation.cpp +++ b/libs/hwui/tests/common/scenes/ListViewAnimation.cpp @@ -21,11 +21,11 @@ class ListViewAnimation; -static Benchmark _ListView(BenchmarkInfo{ +static TestScene::Registrar _ListView(TestScene::Info{ "listview", "A mock ListView of scrolling content. Doesn't re-bind/re-record views as they are recycled, so" "won't upload much content (either glyphs, or bitmaps).", - simpleCreateScene<ListViewAnimation> + TestScene::simpleCreateScene<ListViewAnimation> }); class ListViewAnimation : public TestScene { diff --git a/libs/hwui/tests/common/scenes/OvalAnimation.cpp b/libs/hwui/tests/common/scenes/OvalAnimation.cpp index 936aba184c88..082c6287e86f 100644 --- a/libs/hwui/tests/common/scenes/OvalAnimation.cpp +++ b/libs/hwui/tests/common/scenes/OvalAnimation.cpp @@ -18,10 +18,10 @@ class OvalAnimation; -static Benchmark _Oval(BenchmarkInfo{ +static TestScene::Registrar _Oval(TestScene::Info{ "oval", "Draws 1 oval.", - simpleCreateScene<OvalAnimation> + TestScene::simpleCreateScene<OvalAnimation> }); class OvalAnimation : public TestScene { diff --git a/libs/hwui/tests/common/scenes/PartialDamageAnimation.cpp b/libs/hwui/tests/common/scenes/PartialDamageAnimation.cpp index c31ddd1d531b..84265a4774a5 100644 --- a/libs/hwui/tests/common/scenes/PartialDamageAnimation.cpp +++ b/libs/hwui/tests/common/scenes/PartialDamageAnimation.cpp @@ -18,12 +18,12 @@ class PartialDamageAnimation; -static Benchmark _PartialDamage(BenchmarkInfo{ +static TestScene::Registrar _PartialDamage(TestScene::Info{ "partialdamage", "Tests the partial invalidation path. Draws a grid of rects and animates 1 " "of them, should be low CPU & GPU load if EGL_EXT_buffer_age or " "EGL_KHR_partial_update is supported by the device & are enabled in hwui.", - simpleCreateScene<PartialDamageAnimation> + TestScene::simpleCreateScene<PartialDamageAnimation> }); class PartialDamageAnimation : public TestScene { diff --git a/libs/hwui/tests/common/scenes/RecentsAnimation.cpp b/libs/hwui/tests/common/scenes/RecentsAnimation.cpp index 5d4ef9663d34..6509edd4077f 100644 --- a/libs/hwui/tests/common/scenes/RecentsAnimation.cpp +++ b/libs/hwui/tests/common/scenes/RecentsAnimation.cpp @@ -19,11 +19,11 @@ class RecentsAnimation; -static Benchmark _Recents(BenchmarkInfo{ +static TestScene::Registrar _Recents(TestScene::Info{ "recents", "A recents-like scrolling list of textures. " "Consists of updating a texture every frame", - simpleCreateScene<RecentsAnimation> + TestScene::simpleCreateScene<RecentsAnimation> }); class RecentsAnimation : public TestScene { diff --git a/libs/hwui/tests/common/scenes/RectGridAnimation.cpp b/libs/hwui/tests/common/scenes/RectGridAnimation.cpp index a1f04d67c785..a9293ab244dd 100644 --- a/libs/hwui/tests/common/scenes/RectGridAnimation.cpp +++ b/libs/hwui/tests/common/scenes/RectGridAnimation.cpp @@ -19,11 +19,11 @@ class RectGridAnimation; -static Benchmark _RectGrid(BenchmarkInfo{ +static TestScene::Registrar _RectGrid(TestScene::Info{ "rectgrid", "A dense grid of 1x1 rects that should visually look like a single rect. " "Low CPU/GPU load.", - simpleCreateScene<RectGridAnimation> + TestScene::simpleCreateScene<RectGridAnimation> }); class RectGridAnimation : public TestScene { diff --git a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp index c73e97ba003c..78fcd8bf30ac 100644 --- a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp +++ b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp @@ -18,11 +18,11 @@ class SaveLayerAnimation; -static Benchmark _SaveLayer(BenchmarkInfo{ +static TestScene::Registrar _SaveLayer(TestScene::Info{ "savelayer", "A nested pair of clipped saveLayer operations. " "Tests the clipped saveLayer codepath. Draws content into offscreen buffers and back again.", - simpleCreateScene<SaveLayerAnimation> + TestScene::simpleCreateScene<SaveLayerAnimation> }); class SaveLayerAnimation : public TestScene { diff --git a/libs/hwui/tests/common/scenes/ShadowGrid2Animation.cpp b/libs/hwui/tests/common/scenes/ShadowGrid2Animation.cpp index 26c86aa6f9d5..d3249b8f585a 100644 --- a/libs/hwui/tests/common/scenes/ShadowGrid2Animation.cpp +++ b/libs/hwui/tests/common/scenes/ShadowGrid2Animation.cpp @@ -18,11 +18,11 @@ class ShadowGrid2Animation; -static Benchmark _ShadowGrid2(BenchmarkInfo{ +static TestScene::Registrar _ShadowGrid2(TestScene::Info{ "shadowgrid2", "A dense grid of rounded rects that cast a shadow. This is a higher CPU load " "variant of shadowgrid. Very high CPU load, high GPU load.", - simpleCreateScene<ShadowGrid2Animation> + TestScene::simpleCreateScene<ShadowGrid2Animation> }); class ShadowGrid2Animation : public TestScene { diff --git a/libs/hwui/tests/common/scenes/ShadowGridAnimation.cpp b/libs/hwui/tests/common/scenes/ShadowGridAnimation.cpp index ee3c590c4e0d..5ffedf09bc70 100644 --- a/libs/hwui/tests/common/scenes/ShadowGridAnimation.cpp +++ b/libs/hwui/tests/common/scenes/ShadowGridAnimation.cpp @@ -18,11 +18,11 @@ class ShadowGridAnimation; -static Benchmark _ShadowGrid(BenchmarkInfo{ +static TestScene::Registrar _ShadowGrid(TestScene::Info{ "shadowgrid", "A grid of rounded rects that cast a shadow. Simplified scenario of an " "Android TV-style launcher interface. High CPU/GPU load.", - simpleCreateScene<ShadowGridAnimation> + TestScene::simpleCreateScene<ShadowGridAnimation> }); class ShadowGridAnimation : public TestScene { diff --git a/libs/hwui/tests/common/scenes/ShapeAnimation.cpp b/libs/hwui/tests/common/scenes/ShapeAnimation.cpp new file mode 100644 index 000000000000..0cba34479a3c --- /dev/null +++ b/libs/hwui/tests/common/scenes/ShapeAnimation.cpp @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TestSceneBase.h" +#include "utils/Color.h" + +#include <cstdio> + +class ShapeAnimation; + +static TestScene::Registrar _Shapes(TestScene::Info{ + "shapes", + "A grid of shape drawing test cases.", + TestScene::simpleCreateScene<ShapeAnimation> +}); + +class ShapeAnimation : public TestScene { +public: + sp<RenderNode> card; + void createContent(int width, int height, TestCanvas& canvas) override { + card = TestUtils::createNode(0, 0, width, height, + [width](RenderProperties& props, TestCanvas& canvas) { + std::function<void(TestCanvas&, float, const SkPaint&)> ops[] = { + [](TestCanvas& canvas, float size, const SkPaint& paint) { + canvas.drawArc(0, 0, size, size, 50, 189, true, paint); + }, + [](TestCanvas& canvas, float size, const SkPaint& paint) { + canvas.drawOval(0, 0, size, size, paint); + }, + [](TestCanvas& canvas, float size, const SkPaint& paint) { + SkPath diamondPath; + diamondPath.moveTo(size / 2, 0); + diamondPath.lineTo(size, size / 2); + diamondPath.lineTo(size / 2, size); + diamondPath.lineTo(0, size / 2); + diamondPath.close(); + canvas.drawPath(diamondPath, paint); + }, + [](TestCanvas& canvas, float size, const SkPaint& paint) { + float data[] = {0, 0, size, size, 0, size, size, 0 }; + canvas.drawLines(data, sizeof(data) / sizeof(float), paint); + }, + [](TestCanvas& canvas, float size, const SkPaint& paint) { + float data[] = {0, 0, size, size, 0, size, size, 0 }; + canvas.drawPoints(data, sizeof(data) / sizeof(float), paint); + }, + [](TestCanvas& canvas, float size, const SkPaint& paint) { + canvas.drawRect(0, 0, size, size, paint); + }, + [](TestCanvas& canvas, float size, const SkPaint& paint) { + float rad = size / 4; + canvas.drawRoundRect(0, 0, size, size, rad, rad, paint); + } + }; + float cellSpace = dp(4); + float cellSize = floorf(width / 7 - cellSpace); + + // each combination of strokeWidth + style gets a column + int outerCount = canvas.save(SkCanvas::kMatrixClip_SaveFlag); + SkPaint paint; + paint.setAntiAlias(true); + SkPaint::Style styles[] = { + SkPaint::kStroke_Style, SkPaint::kFill_Style, SkPaint::kStrokeAndFill_Style }; + for (auto style : styles) { + paint.setStyle(style); + for (auto strokeWidth : { 0.0f, 0.5f, 8.0f }) { + paint.setStrokeWidth(strokeWidth); + // fill column with each op + int middleCount = canvas.save(SkCanvas::kMatrixClip_SaveFlag); + for (auto op : ops) { + int innerCount = canvas.save(SkCanvas::kMatrixClip_SaveFlag); + canvas.clipRect(0, 0, cellSize, cellSize, SkRegion::kIntersect_Op); + canvas.drawColor(Color::White, SkXfermode::Mode::kSrcOver_Mode); + op(canvas, cellSize, paint); + canvas.restoreToCount(innerCount); + canvas.translate(cellSize + cellSpace, 0); + } + canvas.restoreToCount(middleCount); + canvas.translate(0, cellSize + cellSpace); + } + } + canvas.restoreToCount(outerCount); + }); + canvas.drawColor(Color::Grey_500, SkXfermode::Mode::kSrcOver_Mode); + canvas.drawRenderNode(card.get()); + } + + void doFrame(int frameNr) override { + card->mutateStagingProperties().setTranslationY(frameNr % 150); + card->setPropertyFieldsDirty(RenderNode::Y); + } +}; diff --git a/libs/hwui/tests/common/scenes/TestSceneBase.h b/libs/hwui/tests/common/scenes/TestSceneBase.h index 8a2414971515..ac781243c25e 100644 --- a/libs/hwui/tests/common/scenes/TestSceneBase.h +++ b/libs/hwui/tests/common/scenes/TestSceneBase.h @@ -19,8 +19,7 @@ #include "DisplayListCanvas.h" #include "RecordingCanvas.h" #include "RenderNode.h" -#include "tests/macrobench/Benchmark.h" -#include "tests/macrobench/TestContext.h" +#include "tests/common/TestContext.h" #include "tests/common/TestScene.h" #include "tests/common/TestUtils.h" diff --git a/libs/hwui/tests/macrobench/Benchmark.h b/libs/hwui/tests/macrobench/Benchmark.h deleted file mode 100644 index aad8eb3716a6..000000000000 --- a/libs/hwui/tests/macrobench/Benchmark.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef TESTS_BENCHMARK_H -#define TESTS_BENCHMARK_H - -#include "tests/common/TestScene.h" - -#include <string> -#include <vector> - -namespace android { -namespace uirenderer { - -struct BenchmarkOptions { - int count; -}; - -typedef test::TestScene* (*CreateScene)(const BenchmarkOptions&); - -template <class T> -test::TestScene* simpleCreateScene(const BenchmarkOptions&) { - return new T(); -} - -struct BenchmarkInfo { - std::string name; - std::string description; - CreateScene createScene; -}; - -class Benchmark { -public: - Benchmark(const BenchmarkInfo& info) { - registerBenchmark(info); - } - -private: - Benchmark() = delete; - Benchmark(const Benchmark&) = delete; - Benchmark& operator=(const Benchmark&) = delete; - - static void registerBenchmark(const BenchmarkInfo& info); -}; - -} /* namespace uirenderer */ -} /* namespace android */ - -#endif /* TESTS_BENCHMARK_H */ diff --git a/libs/hwui/tests/macrobench/TestSceneRunner.cpp b/libs/hwui/tests/macrobench/TestSceneRunner.cpp index 1e1c6a1e318a..82612206cac8 100644 --- a/libs/hwui/tests/macrobench/TestSceneRunner.cpp +++ b/libs/hwui/tests/macrobench/TestSceneRunner.cpp @@ -15,9 +15,9 @@ */ #include "AnimationContext.h" -#include "Benchmark.h" #include "RenderNode.h" -#include "TestContext.h" +#include "tests/common/TestContext.h" +#include "tests/common/TestScene.h" #include "tests/common/scenes/TestSceneBase.h" #include "renderthread/RenderProxy.h" #include "renderthread/RenderTask.h" @@ -38,7 +38,7 @@ public: } }; -void run(const BenchmarkInfo& info, const BenchmarkOptions& opts) { +void run(const TestScene::Info& info, const TestScene::Options& opts) { // Switch to the real display gDisplay = getBuiltInDisplay(); diff --git a/libs/hwui/tests/macrobench/main.cpp b/libs/hwui/tests/macrobench/main.cpp index 48566e8f6ecd..619713c58c9a 100644 --- a/libs/hwui/tests/macrobench/main.cpp +++ b/libs/hwui/tests/macrobench/main.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "Benchmark.h" +#include "tests/common/TestScene.h" #include "protos/hwui.pb.h" @@ -27,23 +27,13 @@ using namespace android; using namespace android::uirenderer; - -// Not a static global because we need to force the map to be constructed -// before we try to add things to it. -std::unordered_map<std::string, BenchmarkInfo>& testMap() { - static std::unordered_map<std::string, BenchmarkInfo> testMap; - return testMap; -} - -void Benchmark::registerBenchmark(const BenchmarkInfo& info) { - testMap()[info.name] = info; -} +using namespace android::uirenderer::test; static int gFrameCount = 150; static int gRepeatCount = 1; -static std::vector<BenchmarkInfo> gRunTests; +static std::vector<TestScene::Info> gRunTests; -void run(const BenchmarkInfo& info, const BenchmarkOptions& opts); +void run(const TestScene::Info& info, const TestScene::Options& opts); static void printHelp() { printf("\ @@ -59,7 +49,7 @@ OPTIONS:\n\ static void listTests() { printf("Tests: \n"); - for (auto&& test : testMap()) { + for (auto&& test : TestScene::testMap()) { auto&& info = test.second; const char* col1 = info.name.c_str(); int dlen = info.description.length(); @@ -168,8 +158,8 @@ void parseOptions(int argc, char* argv[]) { if (optind < argc) { do { const char* test = argv[optind++]; - auto pos = testMap().find(test); - if (pos == testMap().end()) { + auto pos = TestScene::testMap().find(test); + if (pos == TestScene::testMap().end()) { fprintf(stderr, "Unknown test '%s'\n", test); exit(EXIT_FAILURE); } else { @@ -177,14 +167,14 @@ void parseOptions(int argc, char* argv[]) { } } while (optind < argc); } else { - gRunTests.push_back(testMap()["shadowgrid"]); + gRunTests.push_back(TestScene::testMap()["shadowgrid"]); } } int main(int argc, char* argv[]) { parseOptions(argc, argv); - BenchmarkOptions opts; + TestScene::Options opts; opts.count = gFrameCount; for (int i = 0; i < gRepeatCount; i++) { for (auto&& test : gRunTests) { diff --git a/libs/hwui/tests/microbench/OpReordererBench.cpp b/libs/hwui/tests/microbench/OpReordererBench.cpp index ac2b15cc620a..6bfe5a9a1028 100644 --- a/libs/hwui/tests/microbench/OpReordererBench.cpp +++ b/libs/hwui/tests/microbench/OpReordererBench.cpp @@ -23,6 +23,8 @@ #include "OpReorderer.h" #include "RecordedOp.h" #include "RecordingCanvas.h" +#include "tests/common/TestContext.h" +#include "tests/common/TestScene.h" #include "tests/common/TestUtils.h" #include "Vector.h" #include "tests/microbench/MicroBench.h" @@ -31,6 +33,8 @@ using namespace android; using namespace android::uirenderer; +using namespace android::uirenderer::renderthread; +using namespace android::uirenderer::test; const LayerUpdateQueue sEmptyLayerUpdateQueue; const Vector3 sLightCenter = {100, 100, 100}; @@ -71,7 +75,7 @@ void BM_OpReorderer_defer::Run(int iters) { BENCHMARK_NO_ARG(BM_OpReorderer_deferAndRender); void BM_OpReorderer_deferAndRender::Run(int iters) { - TestUtils::runOnRenderThread([this, iters](renderthread::RenderThread& thread) { + TestUtils::runOnRenderThread([this, iters](RenderThread& thread) { auto nodes = createTestNodeList(); BakedOpRenderer::LightInfo lightInfo = {50.0f, 128, 128 }; @@ -90,3 +94,67 @@ void BM_OpReorderer_deferAndRender::Run(int iters) { StopBenchmarkTiming(); }); } + +static std::vector<sp<RenderNode>> getSyncedSceneNodes(const char* sceneName) { + gDisplay = getBuiltInDisplay(); // switch to real display if present + + TestContext testContext; + TestScene::Options opts; + std::unique_ptr<TestScene> scene(TestScene::testMap()[sceneName].createScene(opts)); + + sp<RenderNode> rootNode = TestUtils::createNode(0, 0, gDisplay.w, gDisplay.h, + [&scene](RenderProperties& props, TestCanvas& canvas) { + scene->createContent(gDisplay.w, gDisplay.h, canvas); + }); + + TestUtils::syncHierarchyPropertiesAndDisplayList(rootNode); + std::vector<sp<RenderNode>> nodes; + nodes.emplace_back(rootNode); + return nodes; +} + +static void benchDeferScene(testing::Benchmark& benchmark, int iters, const char* sceneName) { + auto nodes = getSyncedSceneNodes(sceneName); + benchmark.StartBenchmarkTiming(); + for (int i = 0; i < iters; i++) { + OpReorderer reorderer(sEmptyLayerUpdateQueue, + SkRect::MakeWH(gDisplay.w, gDisplay.h), gDisplay.w, gDisplay.h, + nodes, sLightCenter); + MicroBench::DoNotOptimize(&reorderer); + } + benchmark.StopBenchmarkTiming(); +} + +static void benchDeferAndRenderScene(testing::Benchmark& benchmark, + int iters, const char* sceneName) { + TestUtils::runOnRenderThread([&benchmark, iters, sceneName](RenderThread& thread) { + auto nodes = getSyncedSceneNodes(sceneName); + BakedOpRenderer::LightInfo lightInfo = {50.0f, 128, 128 }; // TODO! + + RenderState& renderState = thread.renderState(); + Caches& caches = Caches::getInstance(); + + benchmark.StartBenchmarkTiming(); + for (int i = 0; i < iters; i++) { + OpReorderer reorderer(sEmptyLayerUpdateQueue, + SkRect::MakeWH(gDisplay.w, gDisplay.h), gDisplay.w, gDisplay.h, + nodes, sLightCenter); + + BakedOpRenderer renderer(caches, renderState, true, lightInfo); + reorderer.replayBakedOps<BakedOpDispatcher>(renderer); + MicroBench::DoNotOptimize(&renderer); + } + benchmark.StopBenchmarkTiming(); + }); +} + +BENCHMARK_NO_ARG(BM_OpReorderer_listview_defer); +void BM_OpReorderer_listview_defer::Run(int iters) { + benchDeferScene(*this, iters, "listview"); +} + +BENCHMARK_NO_ARG(BM_OpReorderer_listview_deferAndRender); +void BM_OpReorderer_listview_deferAndRender::Run(int iters) { + benchDeferAndRenderScene(*this, iters, "listview"); +} + diff --git a/libs/hwui/tests/unit/BakedOpStateTests.cpp b/libs/hwui/tests/unit/BakedOpStateTests.cpp index de14abf6a89b..8321ff92268c 100644 --- a/libs/hwui/tests/unit/BakedOpStateTests.cpp +++ b/libs/hwui/tests/unit/BakedOpStateTests.cpp @@ -23,41 +23,130 @@ namespace android { namespace uirenderer { -TEST(ResolvedRenderState, resolution) { - Matrix4 identity; - identity.loadIdentity(); - +TEST(ResolvedRenderState, construct) { Matrix4 translate10x20; translate10x20.loadTranslate(10, 20, 0); SkPaint paint; - RectOp recordedOp(Rect(30, 40, 100, 200), translate10x20, Rect(0, 0, 100, 200), &paint); + RectOp recordedOp(Rect(30, 40, 100, 200), translate10x20, Rect(100, 200), &paint); { // recorded with transform, no parent transform - auto parentSnapshot = TestUtils::makeSnapshot(identity, Rect(0, 0, 100, 200)); - ResolvedRenderState state(*parentSnapshot, recordedOp); + auto parentSnapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 200)); + ResolvedRenderState state(*parentSnapshot, recordedOp, false); EXPECT_MATRIX_APPROX_EQ(state.transform, translate10x20); - EXPECT_EQ(state.clipRect, Rect(0, 0, 100, 200)); - EXPECT_EQ(state.clippedBounds, Rect(40, 60, 100, 200)); // translated and also clipped + EXPECT_EQ(Rect(0, 0, 100, 200), state.clipRect); + EXPECT_EQ(Rect(40, 60, 100, 200), state.clippedBounds); // translated and also clipped + EXPECT_EQ(OpClipSideFlags::Right | OpClipSideFlags::Bottom, state.clipSideFlags); } { // recorded with transform and parent transform - auto parentSnapshot = TestUtils::makeSnapshot(translate10x20, Rect(0, 0, 100, 200)); - ResolvedRenderState state(*parentSnapshot, recordedOp); + auto parentSnapshot = TestUtils::makeSnapshot(translate10x20, Rect(100, 200)); + ResolvedRenderState state(*parentSnapshot, recordedOp, false); Matrix4 expectedTranslate; expectedTranslate.loadTranslate(20, 40, 0); - EXPECT_MATRIX_APPROX_EQ(state.transform, expectedTranslate); + EXPECT_MATRIX_APPROX_EQ(expectedTranslate, state.transform); // intersection of parent & transformed child clip - EXPECT_EQ(state.clipRect, Rect(10, 20, 100, 200)); + EXPECT_EQ(Rect(10, 20, 100, 200), state.clipRect); // translated and also clipped - EXPECT_EQ(state.clippedBounds, Rect(50, 80, 100, 200)); + EXPECT_EQ(Rect(50, 80, 100, 200), state.clippedBounds); + EXPECT_EQ(OpClipSideFlags::Right | OpClipSideFlags::Bottom, state.clipSideFlags); + } +} + +const float HAIRLINE = 0.0f; + +// Note: bounds will be conservative, but not precise for non-hairline +// - use approx bounds checks for these +const float SEMI_HAIRLINE = 0.3f; + +struct StrokeTestCase { + float scale; + float strokeWidth; + const std::function<void(const ResolvedRenderState&)> validator; +}; + +const static StrokeTestCase sStrokeTestCases[] = { + { + 1, HAIRLINE, [](const ResolvedRenderState& state) { + EXPECT_EQ(Rect(49.5f, 49.5f, 150.5f, 150.5f), state.clippedBounds); + } + }, + { + 1, SEMI_HAIRLINE, [](const ResolvedRenderState& state) { + EXPECT_TRUE(state.clippedBounds.contains(49.5f, 49.5f, 150.5f, 150.5f)); + EXPECT_TRUE(Rect(49, 49, 151, 151).contains(state.clippedBounds)); + } + }, + { + 1, 20, [](const ResolvedRenderState& state) { + EXPECT_EQ(Rect(40, 40, 160, 160), state.clippedBounds); + } + }, + + // 3x3 scale: + { + 3, HAIRLINE, [](const ResolvedRenderState& state) { + EXPECT_EQ(Rect(149.5f, 149.5f, 200, 200), state.clippedBounds); + EXPECT_EQ(OpClipSideFlags::Right | OpClipSideFlags::Bottom, state.clipSideFlags); + } + }, + { + 3, SEMI_HAIRLINE, [](const ResolvedRenderState& state) { + EXPECT_TRUE(state.clippedBounds.contains(149.5f, 149.5f, 200, 200)); + EXPECT_TRUE(Rect(149, 149, 200, 200).contains(state.clippedBounds)); + } + }, + { + 3, 20, [](const ResolvedRenderState& state) { + EXPECT_TRUE(state.clippedBounds.contains(120, 120, 200, 200)); + EXPECT_TRUE(Rect(119, 119, 200, 200).contains(state.clippedBounds)); + } + }, + + // 0.5f x 0.5f scale + { + 0.5f, HAIRLINE, [](const ResolvedRenderState& state) { + EXPECT_EQ(Rect(24.5f, 24.5f, 75.5f, 75.5f), state.clippedBounds); + } + }, + { + 0.5f, SEMI_HAIRLINE, [](const ResolvedRenderState& state) { + EXPECT_TRUE(state.clippedBounds.contains(24.5f, 24.5f, 75.5f, 75.5f)); + EXPECT_TRUE(Rect(24, 24, 76, 76).contains(state.clippedBounds)); + } + }, + { + 0.5f, 20, [](const ResolvedRenderState& state) { + EXPECT_TRUE(state.clippedBounds.contains(19.5f, 19.5f, 80.5f, 80.5f)); + EXPECT_TRUE(Rect(19, 19, 81, 81).contains(state.clippedBounds)); + } + } +}; + +TEST(ResolvedRenderState, construct_expandForStroke) { + // Loop over table of test cases and verify different combinations of stroke width and transform + for (auto&& testCase : sStrokeTestCases) { + SkPaint strokedPaint; + strokedPaint.setAntiAlias(true); + strokedPaint.setStyle(SkPaint::kStroke_Style); + strokedPaint.setStrokeWidth(testCase.strokeWidth); + + RectOp recordedOp(Rect(50, 50, 150, 150), + Matrix4::identity(), Rect(200, 200), &strokedPaint); + + Matrix4 snapshotMatrix; + snapshotMatrix.loadScale(testCase.scale, testCase.scale, 1); + auto parentSnapshot = TestUtils::makeSnapshot(snapshotMatrix, Rect(200, 200)); + + ResolvedRenderState state(*parentSnapshot, recordedOp, true); + testCase.validator(state); } } -TEST(BakedOpState, constructAndReject) { +TEST(BakedOpState, tryConstruct) { LinearAllocator allocator; Matrix4 translate100x0; @@ -65,41 +154,85 @@ TEST(BakedOpState, constructAndReject) { SkPaint paint; { - RectOp rejectOp(Rect(30, 40, 100, 200), translate100x0, Rect(0, 0, 100, 200), &paint); - auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(0, 0, 100, 200)); - BakedOpState* bakedOp = BakedOpState::tryConstruct(allocator, *snapshot, rejectOp); + RectOp rejectOp(Rect(30, 40, 100, 200), translate100x0, Rect(100, 200), &paint); + auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 200)); + BakedOpState* bakedState = BakedOpState::tryConstruct(allocator, *snapshot, rejectOp); - EXPECT_EQ(bakedOp, nullptr); // rejected by clip, so not constructed - EXPECT_LE(allocator.usedSize(), 8u); // no significant allocation space used for rejected op + EXPECT_EQ(nullptr, bakedState); // rejected by clip, so not constructed + EXPECT_GT(8u, allocator.usedSize()); // no significant allocation space used for rejected op } { - RectOp successOp(Rect(30, 40, 100, 200), Matrix4::identity(), Rect(0, 0, 100, 200), &paint); - auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(0, 0, 100, 200)); - BakedOpState* bakedOp = BakedOpState::tryConstruct(allocator, *snapshot, successOp); + RectOp successOp(Rect(30, 40, 100, 200), Matrix4::identity(), Rect(100, 200), &paint); + auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 200)); + BakedOpState* bakedState = BakedOpState::tryConstruct(allocator, *snapshot, successOp); - EXPECT_NE(bakedOp, nullptr); // NOT rejected by clip, so will be constructed - EXPECT_GT(allocator.usedSize(), 64u); // relatively large alloc for non-rejected op + EXPECT_NE(nullptr, bakedState); // NOT rejected by clip, so will be constructed + EXPECT_LE(64u, allocator.usedSize()); // relatively large alloc for non-rejected op } } -TEST(BakedOpState, oplessConstructAndReject) { +TEST(BakedOpState, tryShadowOpConstruct) { LinearAllocator allocator; { - auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(0, 0, 0, 0)); // empty - BakedOpState* bakedOp = BakedOpState::tryShadowOpConstruct(allocator, *snapshot, (ShadowOp*)0x1234); + auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect()); // Note: empty clip + BakedOpState* bakedState = BakedOpState::tryShadowOpConstruct(allocator, *snapshot, (ShadowOp*)0x1234); - EXPECT_EQ(bakedOp, nullptr); // rejected by clip, so not constructed - EXPECT_LE(allocator.usedSize(), 8u); // no significant allocation space used for rejected op + EXPECT_EQ(nullptr, bakedState); // rejected by clip, so not constructed + EXPECT_GT(8u, allocator.usedSize()); // no significant allocation space used for rejected op } { - auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(0, 0, 100, 200)); - BakedOpState* bakedOp = BakedOpState::tryShadowOpConstruct(allocator, *snapshot, (ShadowOp*)0x1234); + auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 200)); + BakedOpState* bakedState = BakedOpState::tryShadowOpConstruct(allocator, *snapshot, (ShadowOp*)0x1234); - EXPECT_NE(bakedOp, nullptr); // NOT rejected by clip, so will be constructed - EXPECT_GT(allocator.usedSize(), 64u); // relatively large alloc for non-rejected op - EXPECT_EQ((ShadowOp*)0x1234, bakedOp->op); + ASSERT_NE(nullptr, bakedState); // NOT rejected by clip, so will be constructed + EXPECT_LE(64u, allocator.usedSize()); // relatively large alloc for non-rejected op } } +TEST(BakedOpState, tryStrokeableOpConstruct) { + LinearAllocator allocator; + { + // check regular rejection + SkPaint paint; + paint.setStyle(SkPaint::kStrokeAndFill_Style); + paint.setStrokeWidth(0.0f); + RectOp rejectOp(Rect(0, 0, 100, 200), Matrix4::identity(), Rect(100, 200), &paint); + auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect()); // Note: empty clip + auto bakedState = BakedOpState::tryStrokeableOpConstruct(allocator, *snapshot, rejectOp, + BakedOpState::StrokeBehavior::StyleDefined); + + EXPECT_EQ(nullptr, bakedState); + EXPECT_GT(8u, allocator.usedSize()); // no significant allocation space used for rejected op + } + { + // check simple unscaled expansion + SkPaint paint; + paint.setStyle(SkPaint::kStrokeAndFill_Style); + paint.setStrokeWidth(10.0f); + RectOp rejectOp(Rect(50, 50, 150, 150), Matrix4::identity(), Rect(200, 200), &paint); + auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(200, 200)); + auto bakedState = BakedOpState::tryStrokeableOpConstruct(allocator, *snapshot, rejectOp, + BakedOpState::StrokeBehavior::StyleDefined); + + ASSERT_NE(nullptr, bakedState); + EXPECT_EQ(Rect(45, 45, 155, 155), bakedState->computedState.clippedBounds); + EXPECT_EQ(0, bakedState->computedState.clipSideFlags); + } + { + // check simple unscaled expansion, and fill style with stroke forced + SkPaint paint; + paint.setStyle(SkPaint::kFill_Style); + paint.setStrokeWidth(10.0f); + RectOp rejectOp(Rect(50, 50, 150, 150), Matrix4::identity(), Rect(200, 200), &paint); + auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(200, 200)); + auto bakedState = BakedOpState::tryStrokeableOpConstruct(allocator, *snapshot, rejectOp, + BakedOpState::StrokeBehavior::Forced); + + ASSERT_NE(nullptr, bakedState); + EXPECT_EQ(Rect(45, 45, 155, 155), bakedState->computedState.clippedBounds); + EXPECT_EQ(0, bakedState->computedState.clipSideFlags); + } } -} + +} // namespace uirenderer +} // namespace android diff --git a/libs/hwui/tests/unit/ClipAreaTests.cpp b/libs/hwui/tests/unit/ClipAreaTests.cpp index d6192df08bc3..c4d305e5de18 100644 --- a/libs/hwui/tests/unit/ClipAreaTests.cpp +++ b/libs/hwui/tests/unit/ClipAreaTests.cpp @@ -92,12 +92,10 @@ TEST(ClipArea, basics) { TEST(ClipArea, paths) { ClipArea area(createClipArea()); - Matrix4 transform; - transform.loadIdentity(); SkPath path; SkScalar r = 100; path.addCircle(r, r, r); - area.clipPathWithTransform(path, &transform, SkRegion::kIntersect_Op); + area.clipPathWithTransform(path, &Matrix4::identity(), SkRegion::kIntersect_Op); EXPECT_FALSE(area.isEmpty()); EXPECT_FALSE(area.isSimple()); EXPECT_FALSE(area.isRectangleList()); @@ -116,11 +114,10 @@ TEST(ClipArea, replaceNegative) { ClipArea area(createClipArea()); area.setClip(0, 0, 100, 100); - Matrix4 transform; - transform.loadIdentity(); Rect expected(-50, -50, 50, 50); - area.clipRectWithTransform(expected, &transform, SkRegion::kReplace_Op); + area.clipRectWithTransform(expected, &Matrix4::identity(), SkRegion::kReplace_Op); EXPECT_EQ(expected, area.getClipRect()); } + } } diff --git a/libs/hwui/tests/unit/DamageAccumulatorTests.cpp b/libs/hwui/tests/unit/DamageAccumulatorTests.cpp index 29354a79efbd..77001382115a 100644 --- a/libs/hwui/tests/unit/DamageAccumulatorTests.cpp +++ b/libs/hwui/tests/unit/DamageAccumulatorTests.cpp @@ -31,13 +31,11 @@ using namespace android::uirenderer; // as the output. TEST(DamageAccumulator, identity) { DamageAccumulator da; - Matrix4 identity; SkRect curDirty; - identity.loadIdentity(); - da.pushTransform(&identity); + da.pushTransform(&Matrix4::identity()); da.dirty(50, 50, 100, 100); { - da.pushTransform(&identity); + da.pushTransform(&Matrix4::identity()); da.peekAtDirty(&curDirty); ASSERT_EQ(SkRect(), curDirty); da.popTransform(); @@ -68,15 +66,13 @@ TEST(DamageAccumulator, translate) { // Test that dirty rectangles are being unioned across "siblings TEST(DamageAccumulator, union) { DamageAccumulator da; - Matrix4 identity; SkRect curDirty; - identity.loadIdentity(); - da.pushTransform(&identity); + da.pushTransform(&Matrix4::identity()); { - da.pushTransform(&identity); + da.pushTransform(&Matrix4::identity()); da.dirty(50, 50, 100, 100); da.popTransform(); - da.pushTransform(&identity); + da.pushTransform(&Matrix4::identity()); da.dirty(150, 50, 200, 125); da.popTransform(); } diff --git a/libs/hwui/tests/unit/OpReordererTests.cpp b/libs/hwui/tests/unit/OpReordererTests.cpp index 068e832bac5c..5eac498a3816 100644 --- a/libs/hwui/tests/unit/OpReordererTests.cpp +++ b/libs/hwui/tests/unit/OpReordererTests.cpp @@ -144,6 +144,32 @@ TEST(OpReorderer, simple) { EXPECT_EQ(4, renderer.getIndex()); // 2 ops + start + end } +TEST(OpReorderer, simpleStroke) { + class SimpleStrokeTestRenderer : public TestRendererBase { + public: + void onPointsOp(const PointsOp& op, const BakedOpState& state) override { + EXPECT_EQ(0, mIndex++); + // even though initial bounds are empty... + EXPECT_TRUE(op.unmappedBounds.isEmpty()) + << "initial bounds should be empty, since they're unstroked"; + EXPECT_EQ(Rect(45, 45, 55, 55), state.computedState.clippedBounds) + << "final bounds should account for stroke"; + } + }; + + auto node = TestUtils::createNode(0, 0, 100, 200, + [](RenderProperties& props, RecordingCanvas& canvas) { + SkPaint strokedPaint; + strokedPaint.setStrokeWidth(10); + canvas.drawPoint(50, 50, strokedPaint); + }); + OpReorderer reorderer(sEmptyLayerUpdateQueue, SkRect::MakeWH(100, 200), 100, 200, + createSyncedNodeList(node), sLightCenter); + SimpleStrokeTestRenderer renderer; + reorderer.replayBakedOps<TestDispatcher>(renderer); + EXPECT_EQ(1, renderer.getIndex()); +} + TEST(OpReorderer, simpleRejection) { auto node = TestUtils::createNode(0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) { diff --git a/libs/hwui/tests/unit/RecordingCanvasTests.cpp b/libs/hwui/tests/unit/RecordingCanvasTests.cpp index 2449ce870b95..ba9d18559d73 100644 --- a/libs/hwui/tests/unit/RecordingCanvasTests.cpp +++ b/libs/hwui/tests/unit/RecordingCanvasTests.cpp @@ -44,7 +44,7 @@ TEST(RecordingCanvas, emptyPlayback) { TEST(RecordingCanvas, drawLines) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) { SkPaint paint; - paint.setStrokeWidth(20); + paint.setStrokeWidth(20); // doesn't affect recorded bounds - would be resolved at bake time float points[] = { 0, 0, 20, 10, 30, 40, 90 }; // NB: only 1 valid line canvas.drawLines(&points[0], 7, paint); }); @@ -54,8 +54,8 @@ TEST(RecordingCanvas, drawLines) { ASSERT_EQ(RecordedOpId::LinesOp, op->opId); EXPECT_EQ(4, ((LinesOp*)op)->floatCount) << "float count must be rounded down to closest multiple of 4"; - EXPECT_EQ(Rect(-10, -10, 30, 20), op->unmappedBounds) - << "unmapped bounds must be size of line, outset by 1/2 stroke width"; + EXPECT_EQ(Rect(0, 0, 20, 10), op->unmappedBounds) + << "unmapped bounds must be size of line, and not outset for stroke width"; } TEST(RecordingCanvas, drawRect) { diff --git a/media/java/android/media/Image.java b/media/java/android/media/Image.java index 045216b8a734..3e75759bdfce 100644 --- a/media/java/android/media/Image.java +++ b/media/java/android/media/Image.java @@ -141,6 +141,16 @@ public abstract class Image implements AutoCloseable { * {@link android.hardware.camera2.CameraDevice CameraDevice}. * </td> * </tr> + * <tr> + * <td>{@link android.graphics.ImageFormat#RAW_PRIVATE RAW_PRIVATE}</td> + * <td>1</td> + * <td>A single plane of raw sensor image data of private layout. + * The details of the layout is implementation specific. Row stride and + * pixel stride are undefined for this format. Calling {@link Plane#getRowStride()} + * or {@link Plane#getPixelStride()} on RAW_PRIVATE image will cause + * UnSupportedOperationException being thrown. + * </td> + * </tr> * </table> * * @see android.graphics.ImageFormat @@ -341,7 +351,13 @@ public abstract class Image implements AutoCloseable { * <p>The row stride for this color plane, in bytes.</p> * * <p>This is the distance between the start of two consecutive rows of - * pixels in the image. The row stride is always greater than 0.</p> + * pixels in the image. Note that row stried is undefined for some formats + * such as + * {@link android.graphics.ImageFormat#RAW_PRIVATE RAW_PRIVATE}, + * and calling getRowStride on images of these formats will + * cause an UnsupportedOperationException being thrown. + * For formats where row stride is well defined, the row stride + * is always greater than 0.</p> */ public abstract int getRowStride(); /** @@ -350,7 +366,12 @@ public abstract class Image implements AutoCloseable { * <p>This is the distance between two consecutive pixel values in a row * of pixels. It may be larger than the size of a single pixel to * account for interleaved image data or padded formats. - * The pixel stride is always greater than 0.</p> + * Note that pixel stride is undefined for some formats such as + * {@link android.graphics.ImageFormat#RAW_PRIVATE RAW_PRIVATE}, + * and calling getPixelStride on images of these formats will + * cause an UnsupportedOperationException being thrown. + * For formats where pixel stride is well defined, the pixel stride + * is always greater than 0.</p> */ public abstract int getPixelStride(); /** diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java index 2164eec48705..397ab15c5aba 100644 --- a/media/java/android/media/ImageReader.java +++ b/media/java/android/media/ImageReader.java @@ -17,10 +17,10 @@ package android.media; import android.graphics.ImageFormat; -import android.graphics.PixelFormat; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.util.Log; import android.view.Surface; import dalvik.system.VMRuntime; @@ -29,6 +29,8 @@ import java.lang.ref.WeakReference; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.NioUtils; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -145,7 +147,7 @@ public class ImageReader implements AutoCloseable { "NV21 format is not supported"); } - mNumPlanes = getNumPlanesFromFormat(); + mNumPlanes = ImageUtils.getNumPlanesForFormat(mFormat); nativeInit(new WeakReference<ImageReader>(this), width, height, format, maxImages); @@ -323,21 +325,27 @@ public class ImageReader implements AutoCloseable { * @see #ACQUIRE_SUCCESS */ private int acquireNextSurfaceImage(SurfaceImage si) { + synchronized (mCloseLock) { + int status = nativeImageSetup(si); + + switch (status) { + case ACQUIRE_SUCCESS: + si.createSurfacePlanes(); + si.mIsImageValid = true; + case ACQUIRE_NO_BUFS: + case ACQUIRE_MAX_IMAGES: + break; + default: + throw new AssertionError("Unknown nativeImageSetup return code " + status); + } - int status = nativeImageSetup(si); - - switch (status) { - case ACQUIRE_SUCCESS: - si.createSurfacePlanes(); - si.mIsImageValid = true; - case ACQUIRE_NO_BUFS: - case ACQUIRE_MAX_IMAGES: - break; - default: - throw new AssertionError("Unknown nativeImageSetup return code " + status); + // Only keep track the successfully acquired image, as the native buffer is only mapped + // for such case. + if (status == ACQUIRE_SUCCESS) { + mAcquiredImages.add(si); + } + return status; } - - return status; } /** @@ -398,7 +406,11 @@ public class ImageReader implements AutoCloseable { "This image was not produced by an ImageReader"); } SurfaceImage si = (SurfaceImage) i; - if (si.getReader() != this) { + if (si.mIsImageValid == false) { + return; + } + + if (si.getReader() != this || !mAcquiredImages.contains(i)) { throw new IllegalArgumentException( "This image was not produced by this ImageReader"); } @@ -406,6 +418,7 @@ public class ImageReader implements AutoCloseable { si.clearSurfacePlanes(); nativeReleaseImage(i); si.mIsImageValid = false; + mAcquiredImages.remove(i); } /** @@ -475,7 +488,24 @@ public class ImageReader implements AutoCloseable { public void close() { setOnImageAvailableListener(null, null); if (mSurface != null) mSurface.release(); - nativeClose(); + + /** + * Close all outstanding acquired images before closing the ImageReader. It is a good + * practice to close all the images as soon as it is not used to reduce system instantaneous + * memory pressure. CopyOnWrite list will use a copy of current list content. For the images + * being closed by other thread (e.g., GC thread), doubling the close call is harmless. For + * the image being acquired by other threads, mCloseLock is used to synchronize close and + * acquire operations. + */ + synchronized (mCloseLock) { + for (Image image : mAcquiredImages) { + image.close(); + } + mAcquiredImages.clear(); + + nativeClose(); + } + if (mEstimatedNativeAllocBytes > 0) { VMRuntime.getRuntime().registerNativeFree(mEstimatedNativeAllocBytes); mEstimatedNativeAllocBytes = 0; @@ -540,45 +570,6 @@ public class ImageReader implements AutoCloseable { nativeDetachImage(image); si.setDetached(true); - } - - /** - * Only a subset of the formats defined in - * {@link android.graphics.ImageFormat ImageFormat} and - * {@link android.graphics.PixelFormat PixelFormat} are supported by - * ImageReader. When reading RGB data from a surface, the formats defined in - * {@link android.graphics.PixelFormat PixelFormat} can be used, when - * reading YUV, JPEG or raw sensor data (for example, from camera or video - * decoder), formats from {@link android.graphics.ImageFormat ImageFormat} - * are used. - */ - private int getNumPlanesFromFormat() { - switch (mFormat) { - case ImageFormat.YV12: - case ImageFormat.YUV_420_888: - case ImageFormat.NV21: - return 3; - case ImageFormat.NV16: - return 2; - case PixelFormat.RGB_565: - case PixelFormat.RGBA_8888: - case PixelFormat.RGBX_8888: - case PixelFormat.RGB_888: - case ImageFormat.JPEG: - case ImageFormat.YUY2: - case ImageFormat.Y8: - case ImageFormat.Y16: - case ImageFormat.RAW_SENSOR: - case ImageFormat.RAW10: - case ImageFormat.DEPTH16: - case ImageFormat.DEPTH_POINT_CLOUD: - return 1; - case ImageFormat.PRIVATE: - return 0; - default: - throw new UnsupportedOperationException( - String.format("Invalid format specified %d", mFormat)); - } } private boolean isImageOwnedbyMe(Image image) { @@ -612,7 +603,6 @@ public class ImageReader implements AutoCloseable { } } - private final int mWidth; private final int mHeight; private final int mFormat; @@ -622,8 +612,12 @@ public class ImageReader implements AutoCloseable { private int mEstimatedNativeAllocBytes; private final Object mListenerLock = new Object(); + private final Object mCloseLock = new Object(); private OnImageAvailableListener mListener; private ListenerHandler mListenerHandler; + // Keep track of the successfully acquired Images. This need to be thread safe as the images + // could be closed by different threads (e.g., application thread and GC thread). + private List<Image> mAcquiredImages = new CopyOnWriteArrayList<Image>(); /** * This field is used by native code, do not access or modify. @@ -657,9 +651,7 @@ public class ImageReader implements AutoCloseable { @Override public void close() { - if (mIsImageValid) { - ImageReader.this.releaseImage(this); - } + ImageReader.this.releaseImage(this); } public ImageReader getReader() { @@ -683,6 +675,7 @@ public class ImageReader implements AutoCloseable { switch(getFormat()) { case ImageFormat.JPEG: case ImageFormat.DEPTH_POINT_CLOUD: + case ImageFormat.RAW_PRIVATE: width = ImageReader.this.getWidth(); break; default: @@ -698,6 +691,7 @@ public class ImageReader implements AutoCloseable { switch(getFormat()) { case ImageFormat.JPEG: case ImageFormat.DEPTH_POINT_CLOUD: + case ImageFormat.RAW_PRIVATE: height = ImageReader.this.getHeight(); break; default: @@ -799,12 +793,20 @@ public class ImageReader implements AutoCloseable { @Override public int getPixelStride() { SurfaceImage.this.throwISEIfImageIsInvalid(); + if (ImageReader.this.mFormat == ImageFormat.RAW_PRIVATE) { + throw new UnsupportedOperationException( + "getPixelStride is not supported for RAW_PRIVATE plane"); + } return mPixelStride; } @Override public int getRowStride() { SurfaceImage.this.throwISEIfImageIsInvalid(); + if (ImageReader.this.mFormat == ImageFormat.RAW_PRIVATE) { + throw new UnsupportedOperationException( + "getRowStride is not supported for RAW_PRIVATE plane"); + } return mRowStride; } diff --git a/media/java/android/media/ImageUtils.java b/media/java/android/media/ImageUtils.java index ba3949a64e23..abf6b203daaf 100644 --- a/media/java/android/media/ImageUtils.java +++ b/media/java/android/media/ImageUtils.java @@ -57,7 +57,11 @@ class ImageUtils { case ImageFormat.Y8: case ImageFormat.Y16: case ImageFormat.RAW_SENSOR: + case ImageFormat.RAW_PRIVATE: case ImageFormat.RAW10: + case ImageFormat.RAW12: + case ImageFormat.DEPTH16: + case ImageFormat.DEPTH_POINT_CLOUD: return 1; case ImageFormat.PRIVATE: return 0; @@ -95,6 +99,10 @@ class ImageUtils { dst.getFormat() == ImageFormat.PRIVATE) { throw new IllegalArgumentException("PRIVATE format images are not copyable"); } + if (src.getFormat() == ImageFormat.RAW_PRIVATE) { + throw new IllegalArgumentException( + "Copy of RAW_OPAQUE format has not been implemented"); + } if (!(dst.getOwner() instanceof ImageWriter)) { throw new IllegalArgumentException("Destination image is not from ImageWriter. Only" + " the images from ImageWriter are writable"); @@ -190,7 +198,8 @@ class ImageUtils { case ImageFormat.YV12: case ImageFormat.YUV_420_888: case ImageFormat.NV21: - case ImageFormat.PRIVATE: // A really rough estimate because the real size is unknown. + case ImageFormat.RAW12: + case ImageFormat.PRIVATE: // A rough estimate because the real size is unknown. estimatedBytePerPixel = 1.5; break; case ImageFormat.NV16: @@ -198,6 +207,7 @@ class ImageUtils { case ImageFormat.YUY2: case ImageFormat.Y16: case ImageFormat.RAW_SENSOR: + case ImageFormat.RAW_PRIVATE: // round estimate, real size is unknown case ImageFormat.DEPTH16: estimatedBytePerPixel = 2.0; break; @@ -242,6 +252,7 @@ class ImageUtils { case ImageFormat.Y16: case ImageFormat.RAW_SENSOR: case ImageFormat.RAW10: + case ImageFormat.RAW12: return new Size(image.getWidth(), image.getHeight()); case ImageFormat.PRIVATE: return new Size(0, 0); diff --git a/media/java/android/media/ImageWriter.java b/media/java/android/media/ImageWriter.java index 9fb328627612..851d43674458 100644 --- a/media/java/android/media/ImageWriter.java +++ b/media/java/android/media/ImageWriter.java @@ -18,17 +18,21 @@ package android.media; import android.graphics.ImageFormat; import android.graphics.Rect; +import android.hardware.camera2.utils.SurfaceUtils; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.util.Size; import android.view.Surface; +import dalvik.system.VMRuntime; + import java.lang.ref.WeakReference; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.NioUtils; -import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; /** * <p> @@ -83,8 +87,10 @@ public class ImageWriter implements AutoCloseable { private int mWriterFormat; private final int mMaxImages; - // Keep track of the currently dequeued Image. - private List<Image> mDequeuedImages = new ArrayList<Image>(); + // Keep track of the currently dequeued Image. This need to be thread safe as the images + // could be closed by different threads (e.g., application thread and GC thread). + private List<Image> mDequeuedImages = new CopyOnWriteArrayList<Image>(); + private int mEstimatedNativeAllocBytes; /** * <p> @@ -128,6 +134,16 @@ public class ImageWriter implements AutoCloseable { // Note that the underlying BufferQueue is working in synchronous mode // to avoid dropping any buffers. mNativeContext = nativeInit(new WeakReference<ImageWriter>(this), surface, maxImages); + + // Estimate the native buffer allocation size and register it so it gets accounted for + // during GC. Note that this doesn't include the buffers required by the buffer queue + // itself and the buffers requested by the producer. + Size surfSize = SurfaceUtils.getSurfaceSize(surface); + int format = SurfaceUtils.getSurfaceFormat(surface); + mEstimatedNativeAllocBytes = + ImageUtils.getEstimatedNativeAllocBytes(surfSize.getWidth(),surfSize.getHeight(), + format, maxImages); + VMRuntime.getRuntime().registerNativeAllocation(mEstimatedNativeAllocBytes); } /** @@ -432,6 +448,11 @@ public class ImageWriter implements AutoCloseable { mDequeuedImages.clear(); nativeClose(mNativeContext); mNativeContext = 0; + + if (mEstimatedNativeAllocBytes > 0) { + VMRuntime.getRuntime().registerNativeFree(mEstimatedNativeAllocBytes); + mEstimatedNativeAllocBytes = 0; + } } @Override @@ -569,9 +590,8 @@ public class ImageWriter implements AutoCloseable { } WriterSurfaceImage wi = (WriterSurfaceImage) image; - if (!wi.mIsImageValid) { - throw new IllegalStateException("Image is invalid"); + return; } /** diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java index ab61e2bfcbd3..db0c5bbf42d8 100644 --- a/media/java/android/media/MediaDrm.java +++ b/media/java/android/media/MediaDrm.java @@ -906,18 +906,6 @@ public final class MediaDrm { throws DeniedByServerException; /** - * Remove provisioning from a device. Only system apps may unprovision a - * device. Note that removing provisioning will invalidate any keys saved - * for offline use (KEY_TYPE_OFFLINE), which may render downloaded content - * unplayable until new licenses are acquired. Since provisioning is global - * to the device, license invalidation will apply to all content downloaded - * by any app, so appropriate warnings should be given to the user. - * @hide - */ - @SystemApi - public native void unprovisionDevice(); - - /** * A means of enforcing limits on the number of concurrent streams per subscriber * across devices is provided via SecureStop. This is achieved by securely * monitoring the lifetime of sessions. diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp index 3ffdb17f4ec0..1c043e070681 100644 --- a/media/jni/android_media_ImageReader.cpp +++ b/media/jni/android_media_ImageReader.cpp @@ -101,6 +101,8 @@ public: void setOpaqueConsumer(const sp<BufferItemConsumer>& consumer) { mOpaqueConsumer = consumer; } BufferItemConsumer* getOpaqueConsumer() { return mOpaqueConsumer.get(); } // This is the only opaque format exposed in the ImageFormat public API. + // Note that we do support CPU access for HAL_PIXEL_FORMAT_RAW_OPAQUE + // (ImageFormat#RAW_PRIVATE) so it doesn't count as opaque here. bool isOpaque() { return mFormat == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; } void setProducer(const sp<IGraphicBufferProducer>& producer) { mProducer = producer; } @@ -470,7 +472,8 @@ static void Image_getLockedBufferInfo(JNIEnv* env, CpuConsumer::LockedBuffer* bu case HAL_PIXEL_FORMAT_BLOB: // Used for JPEG data, height must be 1, width == size, single plane. ALOG_ASSERT(idx == 0, "Wrong index: %d", idx); - ALOG_ASSERT(buffer->height == 1, "JPEG should has height value %d", buffer->height); + ALOG_ASSERT(buffer->height == 1, + "JPEG should has height value one but got %d", buffer->height); pData = buffer->data; dataSize = Image_getJpegSize(buffer, usingRGBAOverride); @@ -482,6 +485,14 @@ static void Image_getLockedBufferInfo(JNIEnv* env, CpuConsumer::LockedBuffer* bu pData = buffer->data; dataSize = buffer->stride * buffer->height * bytesPerPixel; break; + case HAL_PIXEL_FORMAT_RAW_OPAQUE: + // Used for RAW_OPAQUE data, height must be 1, width == size, single plane. + ALOG_ASSERT(idx == 0, "Wrong index: %d", idx); + ALOG_ASSERT(buffer->height == 1, + "RAW_PRIVATE should has height value one but got %d", buffer->height); + pData = buffer->data; + dataSize = buffer->width; + break; case HAL_PIXEL_FORMAT_RAW10: // Single plane 10bpp bayer data. ALOG_ASSERT(idx == 0, "Wrong index: %d", idx); @@ -593,6 +604,10 @@ static jint Image_imageGetPixelStride(JNIEnv* env, CpuConsumer::LockedBuffer* bu ALOG_ASSERT(idx == 0, "Wrong index: %d", idx); pixelStride = 3; break; + case HAL_PIXEL_FORMAT_RAW_OPAQUE: + ALOG_ASSERT(idx == 0, "Wrong index: %d", idx); + pixelStride = 0; // RAW OPAQUE doesn't have pixel stride + break; default: jniThrowExceptionFmt(env, "java/lang/UnsupportedOperationException", "Pixel format: 0x%x is unsupported", fmt); @@ -669,6 +684,10 @@ static jint Image_imageGetRowStride(JNIEnv* env, CpuConsumer::LockedBuffer* buff ALOG_ASSERT(idx == 0, "Wrong index: %d", idx); rowStride = buffer->stride * 3; break; + case HAL_PIXEL_FORMAT_RAW_OPAQUE: + ALOG_ASSERT(idx == 0, "Wrong index: %d", idx); + rowStride = 0; // RAW OPAQUE doesn't have row stride + break; default: ALOGE("%s Pixel format: 0x%x is unsupported", __FUNCTION__, fmt); jniThrowException(env, "java/lang/UnsupportedOperationException", @@ -933,7 +952,7 @@ static void ImageReader_imageRelease(JNIEnv* env, jobject thiz, jobject image) CpuConsumer* consumer = ctx->getCpuConsumer(); CpuConsumer::LockedBuffer* buffer = Image_getLockedBuffer(env, image); if (!buffer) { - ALOGW("Image already released!!!"); + // Release an already closed image is harmless. return; } consumer->unlockBuffer(*buffer); @@ -1078,7 +1097,8 @@ static jint ImageReader_imageSetup(JNIEnv* env, jobject thiz, jobject image) { ALOGV("%s:", __FUNCTION__); JNIImageReaderContext* ctx = ImageReader_getContext(env, thiz); if (ctx == NULL) { - jniThrowRuntimeException(env, "ImageReaderContext is not initialized"); + jniThrowException(env, "java/lang/IllegalStateException", + "ImageReader is not initialized or was already closed"); return -1; } diff --git a/media/jni/android_media_ImageWriter.cpp b/media/jni/android_media_ImageWriter.cpp index f92a8eff3919..f50da8547af2 100644 --- a/media/jni/android_media_ImageWriter.cpp +++ b/media/jni/android_media_ImageWriter.cpp @@ -403,8 +403,7 @@ static void ImageWriter_cancelImage(JNIEnv* env, jobject thiz, jlong nativeCtx, ALOGV("%s", __FUNCTION__); JNIImageWriterContext* const ctx = reinterpret_cast<JNIImageWriterContext *>(nativeCtx); if (ctx == NULL || thiz == NULL) { - jniThrowException(env, "java/lang/IllegalStateException", - "ImageWriterContext is not initialized"); + ALOGW("ImageWriter#close called before Image#close, consider calling Image#close first"); return; } @@ -414,8 +413,7 @@ static void ImageWriter_cancelImage(JNIEnv* env, jobject thiz, jlong nativeCtx, int fenceFd = -1; Image_getNativeContext(env, image, &buffer, &fenceFd); if (buffer == NULL) { - jniThrowException(env, "java/lang/IllegalStateException", - "Image is not initialized"); + // Cancel an already cancelled image is harmless. return; } diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp index 275de1ad5ccb..b8849c6e1879 100644 --- a/media/jni/android_media_MediaDrm.cpp +++ b/media/jni/android_media_MediaDrm.cpp @@ -1048,22 +1048,6 @@ static jobject android_media_MediaDrm_provideProvisionResponseNative( return certificateObj; } -static void android_media_MediaDrm_unprovisionDeviceNative( - JNIEnv *env, jobject thiz) { - sp<IDrm> drm = GetDrm(env, thiz); - - if (drm == NULL) { - jniThrowException(env, "java/lang/IllegalStateException", - "MediaDrm obj is null"); - return; - } - - status_t err = drm->unprovisionDevice(); - - throwExceptionAsNecessary(env, err, "Failed to handle provision response"); - return; -} - static jobject android_media_MediaDrm_getSecureStops( JNIEnv *env, jobject thiz) { sp<IDrm> drm = GetDrm(env, thiz); @@ -1496,9 +1480,6 @@ static const JNINativeMethod gMethods[] = { { "provideProvisionResponseNative", "([B)Landroid/media/MediaDrm$Certificate;", (void *)android_media_MediaDrm_provideProvisionResponseNative }, - { "unprovisionDevice", "()V", - (void *)android_media_MediaDrm_unprovisionDeviceNative }, - { "getSecureStops", "()Ljava/util/List;", (void *)android_media_MediaDrm_getSecureStops }, diff --git a/packages/DocumentsUI/res/values-af/strings.xml b/packages/DocumentsUI/res/values-af/strings.xml index e967e3e9990f..1599178b45e3 100644 --- a/packages/DocumentsUI/res/values-af/strings.xml +++ b/packages/DocumentsUI/res/values-af/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumente"</string> <string name="files_label" msgid="6051402950202690279">"Lêers"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Aflaaie"</string> <string name="title_open" msgid="4353228937663917801">"Maak oop vanuit"</string> <string name="title_save" msgid="2433679664882857999">"Stoor na"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Nuwe vouer"</string> diff --git a/packages/DocumentsUI/res/values-bn-rBD/strings.xml b/packages/DocumentsUI/res/values-bn-rBD/strings.xml index 81a0a86b30ff..c757eaf06b98 100644 --- a/packages/DocumentsUI/res/values-bn-rBD/strings.xml +++ b/packages/DocumentsUI/res/values-bn-rBD/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"দস্তাবেজগুলি"</string> <string name="files_label" msgid="6051402950202690279">"ফাইলগুলি"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"ডাউনলোডগুলি"</string> <string name="title_open" msgid="4353228937663917801">"এখান থেকে খুলুন"</string> <string name="title_save" msgid="2433679664882857999">"এতে সংরক্ষণ করুন"</string> <string name="menu_create_dir" msgid="2547620241173881754">"নতুন ফোল্ডার"</string> diff --git a/packages/DocumentsUI/res/values-ca/strings.xml b/packages/DocumentsUI/res/values-ca/strings.xml index 3b3194755fb8..f01624a2a611 100644 --- a/packages/DocumentsUI/res/values-ca/strings.xml +++ b/packages/DocumentsUI/res/values-ca/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documents"</string> <string name="files_label" msgid="6051402950202690279">"Fitxers"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Baixades"</string> <string name="title_open" msgid="4353228937663917801">"Obre des de"</string> <string name="title_save" msgid="2433679664882857999">"Desa a"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Carpeta nova"</string> diff --git a/packages/DocumentsUI/res/values-cs/strings.xml b/packages/DocumentsUI/res/values-cs/strings.xml index 8938cd1cb0fe..7c708092079d 100644 --- a/packages/DocumentsUI/res/values-cs/strings.xml +++ b/packages/DocumentsUI/res/values-cs/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenty"</string> <string name="files_label" msgid="6051402950202690279">"Soubory"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Stahování"</string> <string name="title_open" msgid="4353228937663917801">"Otevřít"</string> <string name="title_save" msgid="2433679664882857999">"Uložit do"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Nová složka"</string> diff --git a/packages/DocumentsUI/res/values-de/strings.xml b/packages/DocumentsUI/res/values-de/strings.xml index 2c3f4f751573..83eb8e0b7282 100644 --- a/packages/DocumentsUI/res/values-de/strings.xml +++ b/packages/DocumentsUI/res/values-de/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumente"</string> <string name="files_label" msgid="6051402950202690279">"Dateien"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Downloads"</string> <string name="title_open" msgid="4353228937663917801">"Öffnen von"</string> <string name="title_save" msgid="2433679664882857999">"Speichern unter"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Neuer Ordner"</string> diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml index 815585d8054e..42959af5d491 100644 --- a/packages/DocumentsUI/res/values-el/strings.xml +++ b/packages/DocumentsUI/res/values-el/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Έγγραφα"</string> <string name="files_label" msgid="6051402950202690279">"Αρχεία"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Λήψεις"</string> <string name="title_open" msgid="4353228937663917801">"Άνοιγμα από"</string> <string name="title_save" msgid="2433679664882857999">"Αποθήκευση σε"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Νέος φάκελος"</string> diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml index b54f62e9392d..58090ce7a1a1 100644 --- a/packages/DocumentsUI/res/values-es-rUS/strings.xml +++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documentos"</string> <string name="files_label" msgid="6051402950202690279">"Archivos"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Descargas"</string> <string name="title_open" msgid="4353228937663917801">"Abrir desde"</string> <string name="title_save" msgid="2433679664882857999">"Guardar en"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Carpeta nueva"</string> diff --git a/packages/DocumentsUI/res/values-et-rEE/strings.xml b/packages/DocumentsUI/res/values-et-rEE/strings.xml index a019d49ae55e..55d250361ba9 100644 --- a/packages/DocumentsUI/res/values-et-rEE/strings.xml +++ b/packages/DocumentsUI/res/values-et-rEE/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumendid"</string> <string name="files_label" msgid="6051402950202690279">"Failid"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Allalaadimised"</string> <string name="title_open" msgid="4353228937663917801">"Ava:"</string> <string name="title_save" msgid="2433679664882857999">"Salvesta:"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Uus kaust"</string> diff --git a/packages/DocumentsUI/res/values-fa/strings.xml b/packages/DocumentsUI/res/values-fa/strings.xml index 3c58ac59b7d9..1989c623f32e 100644 --- a/packages/DocumentsUI/res/values-fa/strings.xml +++ b/packages/DocumentsUI/res/values-fa/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"اسناد"</string> <string name="files_label" msgid="6051402950202690279">"فایلها"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"بارگیریها"</string> <string name="title_open" msgid="4353228937663917801">"باز کردن از"</string> <string name="title_save" msgid="2433679664882857999">"ذخیره در"</string> <string name="menu_create_dir" msgid="2547620241173881754">"پوشه جدید"</string> diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml index e746d6ec6c0c..ec81e67f374f 100644 --- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml +++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documents"</string> <string name="files_label" msgid="6051402950202690279">"Fichiers"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Téléchargements"</string> <string name="title_open" msgid="4353228937663917801">"Ouvrir à partir de"</string> <string name="title_save" msgid="2433679664882857999">"Enregistrer dans"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Nouveau dossier"</string> diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml index 80c5a89bb0d0..3d7ab32fcb05 100644 --- a/packages/DocumentsUI/res/values-fr/strings.xml +++ b/packages/DocumentsUI/res/values-fr/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Docs"</string> <string name="files_label" msgid="6051402950202690279">"Fichiers"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Téléchargements"</string> <string name="title_open" msgid="4353228937663917801">"Ouvrir à partir de"</string> <string name="title_save" msgid="2433679664882857999">"Enregistrer sous"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Nouveau dossier"</string> diff --git a/packages/DocumentsUI/res/values-gl-rES/strings.xml b/packages/DocumentsUI/res/values-gl-rES/strings.xml index e24d64de3bbc..db980064f637 100644 --- a/packages/DocumentsUI/res/values-gl-rES/strings.xml +++ b/packages/DocumentsUI/res/values-gl-rES/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documentos"</string> <string name="files_label" msgid="6051402950202690279">"Ficheiros"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Descargas"</string> <string name="title_open" msgid="4353228937663917801">"Abrir desde"</string> <string name="title_save" msgid="2433679664882857999">"Gardar en"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Novo cartafol"</string> diff --git a/packages/DocumentsUI/res/values-hr/strings.xml b/packages/DocumentsUI/res/values-hr/strings.xml index 0916968ffdd7..5884d6f1195b 100644 --- a/packages/DocumentsUI/res/values-hr/strings.xml +++ b/packages/DocumentsUI/res/values-hr/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenti"</string> <string name="files_label" msgid="6051402950202690279">"Datoteke"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Preuzimanja"</string> <string name="title_open" msgid="4353228937663917801">"Otvori iz"</string> <string name="title_save" msgid="2433679664882857999">"Spremi u"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Nova mapa"</string> diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml index 8d71582bafd2..7be66d3399be 100644 --- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml +++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Փաստաթղթեր"</string> <string name="files_label" msgid="6051402950202690279">"Ֆայլեր"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Ներբեռնումներ"</string> <string name="title_open" msgid="4353228937663917801">"Բացել այստեղից"</string> <string name="title_save" msgid="2433679664882857999">"Պահել այստեղ"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Նոր պանակ"</string> diff --git a/packages/DocumentsUI/res/values-is-rIS/strings.xml b/packages/DocumentsUI/res/values-is-rIS/strings.xml index 3b730d50f9b3..76dbe3250a75 100644 --- a/packages/DocumentsUI/res/values-is-rIS/strings.xml +++ b/packages/DocumentsUI/res/values-is-rIS/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Skjöl"</string> <string name="files_label" msgid="6051402950202690279">"Skrár"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Niðurhal"</string> <string name="title_open" msgid="4353228937663917801">"Opna frá"</string> <string name="title_save" msgid="2433679664882857999">"Vista í"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Ný mappa"</string> diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml index b6b90d55ea04..a9549274426d 100644 --- a/packages/DocumentsUI/res/values-ja/strings.xml +++ b/packages/DocumentsUI/res/values-ja/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"ドキュメント"</string> <string name="files_label" msgid="6051402950202690279">"ファイル"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"ダウンロード"</string> <string name="title_open" msgid="4353228937663917801">"次から開く:"</string> <string name="title_save" msgid="2433679664882857999">"次に保存:"</string> <string name="menu_create_dir" msgid="2547620241173881754">"新しいフォルダ"</string> diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml index b32691057d62..ef91fabaa227 100644 --- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml +++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"დოკუმენტები"</string> <string name="files_label" msgid="6051402950202690279">"ფაილები"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"ჩამოტვირთვები"</string> <string name="title_open" msgid="4353228937663917801">"გახსნა აქედან:"</string> <string name="title_save" msgid="2433679664882857999">"შენახვა აქ:"</string> <string name="menu_create_dir" msgid="2547620241173881754">"ახალი საქაღალდე"</string> diff --git a/packages/DocumentsUI/res/values-ko/strings.xml b/packages/DocumentsUI/res/values-ko/strings.xml index 3356a92c8611..407484120907 100644 --- a/packages/DocumentsUI/res/values-ko/strings.xml +++ b/packages/DocumentsUI/res/values-ko/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"문서"</string> <string name="files_label" msgid="6051402950202690279">"파일"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"다운로드"</string> <string name="title_open" msgid="4353228937663917801">"열기:"</string> <string name="title_save" msgid="2433679664882857999">"저장 위치:"</string> <string name="menu_create_dir" msgid="2547620241173881754">"새 폴더"</string> diff --git a/packages/DocumentsUI/res/values-ky-rKG/strings.xml b/packages/DocumentsUI/res/values-ky-rKG/strings.xml index d75f52231637..aecf5426fd68 100644 --- a/packages/DocumentsUI/res/values-ky-rKG/strings.xml +++ b/packages/DocumentsUI/res/values-ky-rKG/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документтер"</string> <string name="files_label" msgid="6051402950202690279">"Файлдар"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Жүктөөлөр"</string> <string name="title_open" msgid="4353228937663917801">"Кийинкиден ачуу:"</string> <string name="title_save" msgid="2433679664882857999">"Кийинкиге сактоо:"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Жаңы куржун"</string> diff --git a/packages/DocumentsUI/res/values-mk-rMK/strings.xml b/packages/DocumentsUI/res/values-mk-rMK/strings.xml index 8f15edd0b8d2..2d8be1bf6900 100644 --- a/packages/DocumentsUI/res/values-mk-rMK/strings.xml +++ b/packages/DocumentsUI/res/values-mk-rMK/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документи"</string> <string name="files_label" msgid="6051402950202690279">"Датотеки"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Преземања"</string> <string name="title_open" msgid="4353228937663917801">"Отвори од"</string> <string name="title_save" msgid="2433679664882857999">"Зачувај во"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Нова папка"</string> diff --git a/packages/DocumentsUI/res/values-mn-rMN/strings.xml b/packages/DocumentsUI/res/values-mn-rMN/strings.xml index f4a5d9606daf..d0e43f410127 100644 --- a/packages/DocumentsUI/res/values-mn-rMN/strings.xml +++ b/packages/DocumentsUI/res/values-mn-rMN/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документүүд"</string> <string name="files_label" msgid="6051402950202690279">"Файл"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Таталт"</string> <string name="title_open" msgid="4353228937663917801">"Нээх"</string> <string name="title_save" msgid="2433679664882857999">"Хадгалах"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Шинэ фолдер"</string> diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml index 266ca9387e8e..ea88ef635b94 100644 --- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml +++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumen"</string> <string name="files_label" msgid="6051402950202690279">"Fail"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Muat turun"</string> <string name="title_open" msgid="4353228937663917801">"Buka dari"</string> <string name="title_save" msgid="2433679664882857999">"Simpan ke"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Folder baharu"</string> diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml index 591d12313b10..01dda742fac0 100644 --- a/packages/DocumentsUI/res/values-nb/strings.xml +++ b/packages/DocumentsUI/res/values-nb/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenter"</string> <string name="files_label" msgid="6051402950202690279">"Filer"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Nedlastinger"</string> <string name="title_open" msgid="4353228937663917801">"Åpne fra"</string> <string name="title_save" msgid="2433679664882857999">"Lagre i"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Ny mappe"</string> diff --git a/packages/DocumentsUI/res/values-nl/strings.xml b/packages/DocumentsUI/res/values-nl/strings.xml index 701c06c69178..5948167bad00 100644 --- a/packages/DocumentsUI/res/values-nl/strings.xml +++ b/packages/DocumentsUI/res/values-nl/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documenten"</string> <string name="files_label" msgid="6051402950202690279">"Bestanden"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Downloads"</string> <string name="title_open" msgid="4353228937663917801">"Openen vanuit"</string> <string name="title_save" msgid="2433679664882857999">"Opslaan in"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Nieuwe map"</string> diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml index 586e263b2a74..3fd32662ae7f 100644 --- a/packages/DocumentsUI/res/values-pl/strings.xml +++ b/packages/DocumentsUI/res/values-pl/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenty"</string> <string name="files_label" msgid="6051402950202690279">"Pliki"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Pobrane"</string> <string name="title_open" msgid="4353228937663917801">"Otwórz z"</string> <string name="title_save" msgid="2433679664882857999">"Zapisz w"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Nowy folder"</string> diff --git a/packages/DocumentsUI/res/values-pt-rPT/strings.xml b/packages/DocumentsUI/res/values-pt-rPT/strings.xml index a1b82abbc846..02cd2dd0cbce 100644 --- a/packages/DocumentsUI/res/values-pt-rPT/strings.xml +++ b/packages/DocumentsUI/res/values-pt-rPT/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documentos"</string> <string name="files_label" msgid="6051402950202690279">"Ficheiros"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Transferências"</string> <string name="title_open" msgid="4353228937663917801">"Abrir de"</string> <string name="title_save" msgid="2433679664882857999">"Guardar em"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Nova pasta"</string> diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml index 4c4e6fa209f4..5d3228583c78 100644 --- a/packages/DocumentsUI/res/values-ro/strings.xml +++ b/packages/DocumentsUI/res/values-ro/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documente"</string> <string name="files_label" msgid="6051402950202690279">"Fișiere"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Descărcări"</string> <string name="title_open" msgid="4353228937663917801">"Deschideți din"</string> <string name="title_save" msgid="2433679664882857999">"Salvați în"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Dosar nou"</string> diff --git a/packages/DocumentsUI/res/values-sl/strings.xml b/packages/DocumentsUI/res/values-sl/strings.xml index 20fc5c585114..6da1290a548c 100644 --- a/packages/DocumentsUI/res/values-sl/strings.xml +++ b/packages/DocumentsUI/res/values-sl/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenti"</string> <string name="files_label" msgid="6051402950202690279">"Datoteke"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Prenosi"</string> <string name="title_open" msgid="4353228937663917801">"Odpri iz mape"</string> <string name="title_save" msgid="2433679664882857999">"Shrani v"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Nova mapa"</string> diff --git a/packages/DocumentsUI/res/values-sq-rAL/strings.xml b/packages/DocumentsUI/res/values-sq-rAL/strings.xml index 63c57a927624..b880bb44df38 100644 --- a/packages/DocumentsUI/res/values-sq-rAL/strings.xml +++ b/packages/DocumentsUI/res/values-sq-rAL/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumente"</string> <string name="files_label" msgid="6051402950202690279">"Skedarët"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Shkarkimet"</string> <string name="title_open" msgid="4353228937663917801">"Hap nga"</string> <string name="title_save" msgid="2433679664882857999">"Ruaje te"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Dosje e re"</string> diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml index 2956dc3dff36..93a1cf66ffef 100644 --- a/packages/DocumentsUI/res/values-sr/strings.xml +++ b/packages/DocumentsUI/res/values-sr/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документи"</string> <string name="files_label" msgid="6051402950202690279">"Датотеке"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Преузимања"</string> <string name="title_open" msgid="4353228937663917801">"Отвори са"</string> <string name="title_save" msgid="2433679664882857999">"Сачувај у"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Нови директоријум"</string> diff --git a/packages/DocumentsUI/res/values-sv/strings.xml b/packages/DocumentsUI/res/values-sv/strings.xml index c0af8fc82665..63da2c620faa 100644 --- a/packages/DocumentsUI/res/values-sv/strings.xml +++ b/packages/DocumentsUI/res/values-sv/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokument"</string> <string name="files_label" msgid="6051402950202690279">"Filer"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Nedladdningar"</string> <string name="title_open" msgid="4353228937663917801">"Öppna från"</string> <string name="title_save" msgid="2433679664882857999">"Spara till"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Ny mapp"</string> diff --git a/packages/DocumentsUI/res/values-ta-rIN/strings.xml b/packages/DocumentsUI/res/values-ta-rIN/strings.xml index af53217e1a6d..87cb68d466e8 100644 --- a/packages/DocumentsUI/res/values-ta-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-ta-rIN/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"ஆவணங்கள்"</string> <string name="files_label" msgid="6051402950202690279">"கோப்புகள்"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"இறக்கங்கள்"</string> <string name="title_open" msgid="4353228937663917801">"இதில் திற"</string> <string name="title_save" msgid="2433679664882857999">"இதில் சேமி"</string> <string name="menu_create_dir" msgid="2547620241173881754">"புதிய கோப்புறை"</string> diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml index 0403928cd738..dfb423edae55 100644 --- a/packages/DocumentsUI/res/values-th/strings.xml +++ b/packages/DocumentsUI/res/values-th/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"เอกสาร"</string> <string name="files_label" msgid="6051402950202690279">"ไฟล์"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"การดาวน์โหลด"</string> <string name="title_open" msgid="4353228937663917801">"เปิดจาก"</string> <string name="title_save" msgid="2433679664882857999">"บันทึกไปยัง"</string> <string name="menu_create_dir" msgid="2547620241173881754">"โฟลเดอร์ใหม่"</string> diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml index b83213b8850f..813b39a932cc 100644 --- a/packages/DocumentsUI/res/values-tl/strings.xml +++ b/packages/DocumentsUI/res/values-tl/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Mga Dokumento"</string> <string name="files_label" msgid="6051402950202690279">"Mga File"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Mga Download"</string> <string name="title_open" msgid="4353228937663917801">"Buksan mula sa"</string> <string name="title_save" msgid="2433679664882857999">"I-save sa"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Bagong folder"</string> diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml index 5caa5df626f3..90794a289a03 100644 --- a/packages/DocumentsUI/res/values-tr/strings.xml +++ b/packages/DocumentsUI/res/values-tr/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokümanlar"</string> <string name="files_label" msgid="6051402950202690279">"Dosyalar"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"İndirilenler"</string> <string name="title_open" msgid="4353228937663917801">"Şuradan aç:"</string> <string name="title_save" msgid="2433679664882857999">"Şuraya kaydet:"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Yeni klasör"</string> diff --git a/packages/DocumentsUI/res/values-uk/strings.xml b/packages/DocumentsUI/res/values-uk/strings.xml index b111daf82677..a8278d926f53 100644 --- a/packages/DocumentsUI/res/values-uk/strings.xml +++ b/packages/DocumentsUI/res/values-uk/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документи"</string> <string name="files_label" msgid="6051402950202690279">"Файли"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Завантаження"</string> <string name="title_open" msgid="4353228937663917801">"Відкрити"</string> <string name="title_save" msgid="2433679664882857999">"Зберегти в"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Нова папка"</string> diff --git a/packages/DocumentsUI/res/values-ur-rPK/strings.xml b/packages/DocumentsUI/res/values-ur-rPK/strings.xml index 6ceb77f4a73e..d8caa37e3fb5 100644 --- a/packages/DocumentsUI/res/values-ur-rPK/strings.xml +++ b/packages/DocumentsUI/res/values-ur-rPK/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"دستاویزات"</string> <string name="files_label" msgid="6051402950202690279">"فائلیں"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"ڈاؤن لوڈز"</string> <string name="title_open" msgid="4353228937663917801">"کھولیں از"</string> <string name="title_save" msgid="2433679664882857999">"اس میں محفوظ کریں"</string> <string name="menu_create_dir" msgid="2547620241173881754">"نیا فولڈر"</string> diff --git a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml index bf2639e40bdf..b944736d78fd 100644 --- a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml +++ b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Hujjatlar"</string> <string name="files_label" msgid="6051402950202690279">"Fayllar"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"Yuklanmalar"</string> <string name="title_open" msgid="4353228937663917801">"Ochish"</string> <string name="title_save" msgid="2433679664882857999">"Saqlash"</string> <string name="menu_create_dir" msgid="2547620241173881754">"Yangi jild"</string> diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml index bcd26c2ddcde..9901abf3e486 100644 --- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml @@ -18,8 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"文档"</string> <string name="files_label" msgid="6051402950202690279">"文件"</string> - <!-- no translation found for downloads_label (959113951084633612) --> - <skip /> + <string name="downloads_label" msgid="959113951084633612">"下载"</string> <string name="title_open" msgid="4353228937663917801">"打开文件"</string> <string name="title_save" msgid="2433679664882857999">"保存文件"</string> <string name="menu_create_dir" msgid="2547620241173881754">"新建文件夹"</string> diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml index cd02880b8d9f..9cfba1d89ba5 100644 --- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml @@ -18,7 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"文件"</string> <string name="files_label" msgid="6051402950202690279">"檔案"</string> - <string name="downloads_label" msgid="959113951084633612">"下載內容"</string> + <string name="downloads_label" msgid="959113951084633612">"下載"</string> <string name="title_open" msgid="4353228937663917801">"開啟檔案"</string> <string name="title_save" msgid="2433679664882857999">"儲存至"</string> <string name="menu_create_dir" msgid="2547620241173881754">"新增資料夾"</string> diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index 2e7c90899af5..2d77c6a3044a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -17,7 +17,6 @@ package com.android.documentsui.dirlist; import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.State.ACTION_CREATE; import static com.android.documentsui.State.ACTION_MANAGE; import static com.android.documentsui.State.MODE_GRID; import static com.android.documentsui.State.MODE_LIST; @@ -28,6 +27,7 @@ import static com.android.documentsui.model.DocumentInfo.getCursorLong; import static com.android.documentsui.model.DocumentInfo.getCursorString; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkState; +import static com.google.common.base.Preconditions.checkArgument; import android.app.Activity; import android.app.ActivityManager; @@ -89,6 +89,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.android.documentsui.BaseActivity; +import com.android.documentsui.BaseActivity.DocumentContext; import com.android.documentsui.CopyService; import com.android.documentsui.DirectoryLoader; import com.android.documentsui.DirectoryResult; @@ -101,20 +102,18 @@ import com.android.documentsui.Menus; import com.android.documentsui.MessageBar; import com.android.documentsui.MimePredicate; import com.android.documentsui.ProviderExecutor; +import com.android.documentsui.ProviderExecutor.Preemptable; import com.android.documentsui.R; import com.android.documentsui.RecentLoader; import com.android.documentsui.RecentsProvider; +import com.android.documentsui.RecentsProvider.StateColumns; import com.android.documentsui.RootCursorWrapper; import com.android.documentsui.RootsCache; import com.android.documentsui.Shared; +import com.android.documentsui.Shared; import com.android.documentsui.Snackbars; import com.android.documentsui.State; import com.android.documentsui.ThumbnailCache; -import com.android.documentsui.BaseActivity.DocumentContext; -import com.android.documentsui.ProviderExecutor.Preemptable; -import com.android.documentsui.Shared; -import com.android.documentsui.RecentsProvider.StateColumns; -import com.android.documentsui.dirlist.MultiSelectManager.Callback; import com.android.documentsui.dirlist.MultiSelectManager.Selection; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentStack; @@ -770,7 +769,9 @@ public class DirectoryFragment extends Fragment { return true; case R.id.menu_copy_to_clipboard: - copySelectionToClipboard(selection); + if (!selection.isEmpty()) { + copySelectionToClipboard(selection); + } return true; case R.id.menu_select_all: @@ -1359,11 +1360,14 @@ public class DirectoryFragment extends Fragment { } public void copySelectedToClipboard() { - Selection sel = mSelectionManager.getSelection(new Selection()); - copySelectionToClipboard(sel); + Selection selection = mSelectionManager.getSelection(new Selection()); + if (!selection.isEmpty()) { + copySelectionToClipboard(selection); + } } - void copySelectionToClipboard(Selection items) { + void copySelectionToClipboard(Selection selection) { + checkArgument(!selection.isEmpty()); new GetDocumentsTask() { @Override void onDocumentsReady(List<DocumentInfo> docs) { @@ -1374,7 +1378,7 @@ public class DirectoryFragment extends Fragment { R.plurals.clipboard_files_clipped, docs.size(), docs.size()), Snackbar.LENGTH_SHORT).show(); } - }.execute(items); + }.execute(selection); } public void pasteFromClipboard() { diff --git a/packages/MtpDocumentsProvider/Android.mk b/packages/MtpDocumentsProvider/Android.mk index ec18463c7163..3c2fa36bde40 100644 --- a/packages/MtpDocumentsProvider/Android.mk +++ b/packages/MtpDocumentsProvider/Android.mk @@ -5,6 +5,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := MtpDocumentsProvider LOCAL_CERTIFICATE := media +LOCAL_PRIVILEGED_MODULE := true include $(BUILD_PACKAGE) include $(LOCAL_PATH)/tests/Android.mk diff --git a/packages/MtpDocumentsProvider/AndroidManifest.xml b/packages/MtpDocumentsProvider/AndroidManifest.xml index 0172a4f031ee..2090d20c94de 100644 --- a/packages/MtpDocumentsProvider/AndroidManifest.xml +++ b/packages/MtpDocumentsProvider/AndroidManifest.xml @@ -3,29 +3,26 @@ package="com.android.mtp" android:sharedUserId="android.media"> <uses-feature android:name="android.hardware.usb.host" /> + <uses-permission android:name="android.permission.MANAGE_USB" /> <application android:label="@string/app_label"> <provider android:name=".MtpDocumentsProvider" android:authorities="com.android.mtp.documents" android:grantUriPermissions="true" android:exported="true" - android:permission="android.permission.MANAGE_DOCUMENTS" - android:enabled="false"> + android:permission="android.permission.MANAGE_DOCUMENTS"> <intent-filter> <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> </intent-filter> </provider> - <activity android:name=".ReceiverActivity" - android:theme="@android:style/Theme.NoDisplay" - android:screenOrientation="locked" - android:excludeFromRecents="true" - android:enabled="false"> + <service android:name=".MtpDocumentsService" /> + <receiver android:name=".UsbIntentReceiver" android:exported="true"> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> + <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" - android:resource="@xml/device_filter" /> - </activity> - <service android:name=".MtpDocumentsService"></service> + android:resource="@xml/device_filter" /> + </receiver> </application> </manifest> diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java index 9511e15f21c8..d5f00e6a8458 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java @@ -253,9 +253,15 @@ public class MtpDocumentsProvider extends DocumentsProvider { mRootScanner.notifyChange(); } - boolean hasOpenedDevices() { + int[] getOpenedDeviceIds() { synchronized (mDeviceListLock) { - return mMtpManager.getOpenedDeviceIds().length != 0; + return mMtpManager.getOpenedDeviceIds(); + } + } + + String getDeviceName(int deviceId) throws IOException { + synchronized (mDeviceListLock) { + return mMtpManager.getDeviceName(deviceId); } } @@ -308,7 +314,7 @@ public class MtpDocumentsProvider extends DocumentsProvider { getDeviceToolkit(deviceId).mDocumentLoader.clearTasks(); mDeviceToolkits.remove(deviceId); mMtpManager.closeDevice(deviceId); - if (!hasOpenedDevices()) { + if (getOpenedDeviceIds().length == 0) { mRootScanner.pause(); } } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java index 9b3c20fdefbe..b0cff83ef22e 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java @@ -16,16 +16,16 @@ package com.android.mtp; +import android.app.Notification; import android.app.Service; -import android.content.BroadcastReceiver; -import android.content.Context; +import android.app.NotificationManager; import android.content.Intent; -import android.content.IntentFilter; import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbManager; import android.os.IBinder; import android.util.Log; +import com.android.internal.util.Preconditions; + import java.io.IOException; /** @@ -34,10 +34,12 @@ import java.io.IOException; * starts to run when the first MTP device is opened, and stops when the last MTP device is closed. */ public class MtpDocumentsService extends Service { - static final String ACTION_OPEN_DEVICE = "com.android.mtp.action.ACTION_OPEN_DEVICE"; + static final String ACTION_OPEN_DEVICE = "com.android.mtp.OPEN_DEVICE"; + static final String ACTION_CLOSE_DEVICE = "com.android.mtp.CLOSE_DEVICE"; static final String EXTRA_DEVICE = "device"; + private static final int FOREGROUND_NOTIFICATION_ID = 1; - Receiver mReceiver; + NotificationManager mNotificationManager; @Override public IBinder onBind(Intent intent) { @@ -48,60 +50,89 @@ public class MtpDocumentsService extends Service { @Override public void onCreate() { super.onCreate(); - final IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED); - mReceiver = new Receiver(); - registerReceiver(mReceiver, filter); + mNotificationManager = getSystemService(NotificationManager.class); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // If intent is null, the service was restarted. if (intent != null) { - if (intent.getAction().equals(ACTION_OPEN_DEVICE)) { - final UsbDevice device = intent.<UsbDevice>getParcelableExtra(EXTRA_DEVICE); - try { - final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance(); - provider.openDevice(device.getDeviceId()); - return START_STICKY; - } catch (IOException error) { - Log.e(MtpDocumentsProvider.TAG, error.getMessage()); + final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance(); + final UsbDevice device = intent.<UsbDevice>getParcelableExtra(EXTRA_DEVICE); + try { + Preconditions.checkNotNull(device); + switch (intent.getAction()) { + case ACTION_OPEN_DEVICE: + provider.openDevice(device.getDeviceId()); + break; + + case ACTION_CLOSE_DEVICE: + provider.closeDevice(device.getDeviceId()); + break; + + default: + throw new IllegalArgumentException("Received unknown intent action."); } - } else { - Log.e(MtpDocumentsProvider.TAG, "Received unknown intent action."); + } catch (IOException | InterruptedException | IllegalArgumentException error) { + logErrorMessage(error); } + } else { + // TODO: Fetch devices again. } - stopSelfIfNeeded(); - return Service.START_NOT_STICKY; - } - @Override - public void onDestroy() { - unregisterReceiver(mReceiver); - mReceiver = null; - super.onDestroy(); + return updateForegroundState() ? START_STICKY : START_NOT_STICKY; } - private void stopSelfIfNeeded() { + /** + * Updates the foreground state of the service. + * @return Whether the service is foreground or not. + */ + private boolean updateForegroundState() { final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance(); - if (!provider.hasOpenedDevices()) { + final int[] deviceIds = provider.getOpenedDeviceIds(); + String message = null; + if (deviceIds.length != 0) { + // TODO: Localize the message. + // TODO: Add buttons "Open in Files" and "Open in Apps" if needed. + if (deviceIds.length > 1) { + message = deviceIds.length + " devices are being connected."; + } else { + try { + message = provider.getDeviceName(deviceIds[0]) + " is being connected."; + } catch (IOException exp) { + logErrorMessage(exp); + // If we failed to obtain device name, it looks the device is unusable. + // Because this is the last device we opened, we should hide the notification + // for the case. + try { + provider.closeDevice(deviceIds[0]); + } catch (IOException | InterruptedException closeError) { + logErrorMessage(closeError); + } + } + } + } + if (message != null) { + final Notification notification = new Notification.Builder(this) + .setContentTitle(message) + .setSmallIcon(android.R.drawable.ic_menu_camera) + .setCategory(Notification.CATEGORY_SYSTEM) + .setPriority(Notification.PRIORITY_LOW) + .build(); + startForeground(FOREGROUND_NOTIFICATION_ID, notification); + return true; + } else { + stopForeground(true /* removeNotification */); stopSelf(); + return false; } } - private class Receiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())) { - final UsbDevice device = - (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); - final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance(); - try { - provider.closeDevice(device.getDeviceId()); - } catch (IOException | InterruptedException error) { - Log.e(MtpDocumentsProvider.TAG, error.getMessage()); - } - stopSelfIfNeeded(); - } + private static void logErrorMessage(Exception exp) { + if (exp.getMessage() != null) { + Log.e(MtpDocumentsProvider.TAG, exp.getMessage()); + } else { + Log.e(MtpDocumentsProvider.TAG, exp.toString()); } } } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java index cd52f31bf046..e7f94b7a7bca 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java @@ -32,7 +32,6 @@ import com.android.internal.annotations.VisibleForTesting; import java.io.FileNotFoundException; import java.io.IOException; -import java.util.ArrayList; /** * The model wrapping android.mtp API. @@ -62,8 +61,10 @@ class MtpManager { } if (!mManager.hasPermission(rawDevice)) { - // Permission should be obtained via app selection dialog for intent. - throw new IOException("No parmission to operate USB device."); + mManager.grantPermission(rawDevice); + if (!mManager.hasPermission(rawDevice)) { + throw new IOException("Failed to grant a device permission."); + } } final MtpDevice device = new MtpDevice(rawDevice); @@ -99,6 +100,10 @@ class MtpManager { return result; } + String getDeviceName(int deviceId) throws IOException { + return getDevice(deviceId).getDeviceInfo().getModel(); + } + MtpRoot[] getRoots(int deviceId) throws IOException { final MtpDevice device = getDevice(deviceId); synchronized (device) { diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/ReceiverActivity.java b/packages/MtpDocumentsProvider/src/com/android/mtp/ReceiverActivity.java deleted file mode 100644 index 3ad2397cadba..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/ReceiverActivity.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mtp; - -import android.app.Activity; -import android.content.Intent; -import android.hardware.usb.UsbManager; -import android.os.Bundle; - -/** - * Invisible activity to receive intents. - * To show the application chooser for the UsbManager.ACTION_USB_DEVICE_ATTACHED intent, the intent - * should be received by activity. The activity has NoDisplay theme and immediately terminate after - * routing intent to MtpDocumentsService. - */ -public class ReceiverActivity extends Activity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(getIntent().getAction())) { - final Intent serviceIntent = new Intent( - MtpDocumentsService.ACTION_OPEN_DEVICE, - null, - this, - MtpDocumentsService.class); - serviceIntent.putExtra( - UsbManager.EXTRA_DEVICE, - getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE)); - startService(serviceIntent); - } - finish(); - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/UsbIntentReceiver.java b/packages/MtpDocumentsProvider/src/com/android/mtp/UsbIntentReceiver.java new file mode 100644 index 000000000000..0ac130eb7ec0 --- /dev/null +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/UsbIntentReceiver.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.mtp; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbManager; +import android.net.Uri; + +public class UsbIntentReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + final UsbDevice device = intent.getExtras().getParcelable(UsbManager.EXTRA_DEVICE); + switch (intent.getAction()) { + case UsbManager.ACTION_USB_DEVICE_ATTACHED: + startService(context, MtpDocumentsService.ACTION_OPEN_DEVICE, device); + break; + case UsbManager.ACTION_USB_DEVICE_DETACHED: + startService(context, MtpDocumentsService.ACTION_CLOSE_DEVICE, device); + break; + } + } + + private void startService(Context context, String action, UsbDevice device) { + final Intent intent = new Intent(action, Uri.EMPTY, context, MtpDocumentsService.class); + intent.putExtra(MtpDocumentsService.EXTRA_DEVICE, device); + context.startService(intent); + } +} diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml index f7b0e4d9fd22..c88647678af6 100644 --- a/packages/SettingsLib/res/values-af/arrays.xml +++ b/packages/SettingsLib/res/values-af/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Nie meer as 3 prosesse nie"</item> <item msgid="7899496259191969307">"Nie meer as 4 prosesse nie"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Laai tans"</item> + <item msgid="5220695614993094977">"MTP (Media-oordrag-protokol)"</item> + <item msgid="2086000968159047375">"PTP (Prentoordrag-protokol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB-ethernet)"</item> + <item msgid="1718924214939774352">"Oudiobron"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index f281489c736f..302ba041641c 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Persoonlik"</string> <string name="category_work" msgid="8699184680584175622">"Werk"</string> <string name="development_settings_title" msgid="215179176067683667">"Ontwikkelaaropsies"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Aktiveer ontwikkelaaropsies"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Stel opsies vir programontwikkeling"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Ontwikkelaar-opsies is nie beskikbaar vir hierdie gebruiker nie"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN-instellings is nie vir hierdie gebruiker beskikbaar nie"</string> diff --git a/packages/SettingsLib/res/values-bn-rBD/arrays.xml b/packages/SettingsLib/res/values-bn-rBD/arrays.xml index a2e811be9ee9..7729a4db9b3b 100644 --- a/packages/SettingsLib/res/values-bn-rBD/arrays.xml +++ b/packages/SettingsLib/res/values-bn-rBD/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"৩টি প্রক্রিয়ার বেশি নয়"</item> <item msgid="7899496259191969307">"৪টি প্রক্রিয়ার বেশি নয়"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"চার্জ হচ্ছে"</item> + <item msgid="5220695614993094977">"MTP (মিডিয়া ট্রান্সফার প্রোটোকল)"</item> + <item msgid="2086000968159047375">"PTP (পিকচার ট্রান্সফার প্রোটোকল)"</item> + <item msgid="7398830860950841822">"RNDIS (USB ইথারনেট)"</item> + <item msgid="1718924214939774352">"অডিও উৎস"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-bn-rBD/strings.xml b/packages/SettingsLib/res/values-bn-rBD/strings.xml index 2434f8ea3228..5c831832d7ab 100644 --- a/packages/SettingsLib/res/values-bn-rBD/strings.xml +++ b/packages/SettingsLib/res/values-bn-rBD/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"ব্যক্তিগত"</string> <string name="category_work" msgid="8699184680584175622">"কর্মক্ষেত্র"</string> <string name="development_settings_title" msgid="215179176067683667">"বিকাশকারী বিকল্পগুলি"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"বিকাশকারী বিকল্পগুলি সক্ষম করুন"</string> <string name="development_settings_summary" msgid="1815795401632854041">"অ্যাপ্লিকেশান উন্নয়নের জন্য বিকল্পগুলি সেট করুন"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"এই ব্যবহারকারীর জন্য বিকাশকারী বিকল্পগুলি উপলব্ধ নয়"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"এই ব্যবহারকারীর জন্য VPN সেটিংস উপলব্ধ নয়"</string> diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml index 9542af1a5944..ab80ccc780f2 100644 --- a/packages/SettingsLib/res/values-ca/arrays.xml +++ b/packages/SettingsLib/res/values-ca/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Com a màxim 3 processos"</item> <item msgid="7899496259191969307">"Com a màxim 4 processos"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"S\'està carregant"</item> + <item msgid="5220695614993094977">"MTP (protocol de transferència de fitxers multimèdia)"</item> + <item msgid="2086000968159047375">"PTP (protocol de transferència d\'imatges)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Font d\'àudio"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 065efd97f816..71a331d240d6 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Personal"</string> <string name="category_work" msgid="8699184680584175622">"Feina"</string> <string name="development_settings_title" msgid="215179176067683667">"Opcions per a desenvolupadors"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Activa les opcions per a desenvolupadors"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Defineix les opcions per al desenvolupament d\'aplicacions"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Les opcions per a desenvolupadors no estan disponibles per a aquest usuari."</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"La configuració de la VPN no està disponible per a aquest usuari."</string> diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml index 3f786b8d2106..d46781ae6989 100644 --- a/packages/SettingsLib/res/values-cs/arrays.xml +++ b/packages/SettingsLib/res/values-cs/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Maximálně 3 procesy"</item> <item msgid="7899496259191969307">"Maximálně 4 procesy"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Nabíjení"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Zdroj zvuku"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 951708eeaf1e..8ec5e25365a1 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Osobní"</string> <string name="category_work" msgid="8699184680584175622">"Pracovní"</string> <string name="development_settings_title" msgid="215179176067683667">"Pro vývojáře"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Aktivovat možnosti pro vývojáře"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Umožňuje nastavit možnosti pro vývoj aplikací"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Pro tohoto uživatele jsou možnosti vývojáře nedostupné."</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Nastavení sítě VPN pro tohoto uživatele není dostupné."</string> diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml index faa1d24f1299..d2a7f0d296c8 100644 --- a/packages/SettingsLib/res/values-de/arrays.xml +++ b/packages/SettingsLib/res/values-de/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Höchstens 3 Prozesse"</item> <item msgid="7899496259191969307">"Höchstens 4 Prozesse"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Wird aufgeladen"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB-Ethernet)"</item> + <item msgid="1718924214939774352">"Audioquelle"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index a78d00dc5e26..9b60b20a593c 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Nutzer"</string> <string name="category_work" msgid="8699184680584175622">"Geschäftlich"</string> <string name="development_settings_title" msgid="215179176067683667">"Entwickleroptionen"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Entwickleroptionen aktivieren"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Optionen zur App-Entwicklung festlegen"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Entwickleroptionen sind für diesen Nutzer nicht verfügbar."</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Die VPN-Einstellungen sind für diesen Nutzer nicht verfügbar."</string> diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml index cc796fb3a797..2672eeca8075 100644 --- a/packages/SettingsLib/res/values-el/arrays.xml +++ b/packages/SettingsLib/res/values-el/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Το πολύ 3 διαδικασίες"</item> <item msgid="7899496259191969307">"Το πολύ 4 διεργασίες"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Φόρτιση σε εξέλιξη"</item> + <item msgid="5220695614993094977">"MTP (Πρωτόκολλο μεταφοράς πολυμέσων)"</item> + <item msgid="2086000968159047375">"PTP (Πρωτόκολλο μεταφοράς εικόνων)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Πηγή ήχου"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 792b3d612d48..008491f9d464 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Προσωπικό"</string> <string name="category_work" msgid="8699184680584175622">"Εργασία"</string> <string name="development_settings_title" msgid="215179176067683667">"Επιλογές για προγραμματιστές"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Ενεργοποίηση επιλογών για προγραμματιστές"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Ορισμός επιλογών για ανάπτυξη εφαρμογής"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Οι επιλογές για προγραμματιστές δεν είναι διαθέσιμες για αυτόν το χρήστη"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Οι ρυθμίσεις VPN δεν είναι διαθέσιμες γι\' αυτόν το χρήστη"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml index b92b59847ee9..52992d55d2a4 100644 --- a/packages/SettingsLib/res/values-es-rUS/arrays.xml +++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Máximo 3 procesos"</item> <item msgid="7899496259191969307">"Máximo 4 procesos"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"En carga"</item> + <item msgid="5220695614993094977">"Protocolo de transferencia multimedia (MTP)"</item> + <item msgid="2086000968159047375">"Protocolo de transferencia de imágenes (PTP)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Fuente de audio"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 6085c088007e..261294318066 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Personal"</string> <string name="category_work" msgid="8699184680584175622">"Trabajo"</string> <string name="development_settings_title" msgid="215179176067683667">"Opciones del programador"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Activar opciones para programador"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Establecer opciones para desarrollar aplicaciones"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Las opciones de programador no están disponibles para este usuario."</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"La configuración de la red VPN no está disponible para este usuario."</string> diff --git a/packages/SettingsLib/res/values-et-rEE/arrays.xml b/packages/SettingsLib/res/values-et-rEE/arrays.xml index c88ef1c7f06c..5bf13bb5f82c 100644 --- a/packages/SettingsLib/res/values-et-rEE/arrays.xml +++ b/packages/SettingsLib/res/values-et-rEE/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Maksimaalselt 3 protsessi"</item> <item msgid="7899496259191969307">"Maksimaalselt 4 protsessi"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Laadimine"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Heliallikas"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-et-rEE/strings.xml b/packages/SettingsLib/res/values-et-rEE/strings.xml index 79d31525f303..5fb55eb8b239 100644 --- a/packages/SettingsLib/res/values-et-rEE/strings.xml +++ b/packages/SettingsLib/res/values-et-rEE/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Isiklik"</string> <string name="category_work" msgid="8699184680584175622">"Töö"</string> <string name="development_settings_title" msgid="215179176067683667">"Arendaja valikud"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Arendaja valikute lubamine"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Rakenduse arenduse valikute määramine"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Arendaja valikud pole selle kasutaja jaoks saadaval"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN-i seaded pole selle kasutaja jaoks saadaval"</string> diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml index 1507cdad8008..d75280b82626 100644 --- a/packages/SettingsLib/res/values-fa/arrays.xml +++ b/packages/SettingsLib/res/values-fa/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"حداکثر 3 پردازش"</item> <item msgid="7899496259191969307">"حداکثر 4 پردازش"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"در حال شارژ شدن"</item> + <item msgid="5220695614993094977">"MTP (پروتکل انتقال رسانه)"</item> + <item msgid="2086000968159047375">"PTP (پروتکل انتقال تصویر)"</item> + <item msgid="7398830860950841822">"RNDIS (اترنت USB)"</item> + <item msgid="1718924214939774352">"منبع صوتی"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index bce7b2a7f6ac..2551ba5e0be3 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"شخصی"</string> <string name="category_work" msgid="8699184680584175622">"محل کار"</string> <string name="development_settings_title" msgid="215179176067683667">"گزینههای برنامهنویسان"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"فعال کردن گزینههای برنامهنویس"</string> <string name="development_settings_summary" msgid="1815795401632854041">"تنظیم گزینههای مربوط به طراحی برنامه"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"گزینههای برنامهنویس برای این کاربر موجود نیست"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"تنظیمات VPN برای این کاربر در دسترس نیست"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml index 1772976981f7..714dbe486c07 100644 --- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml +++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Trois processus maximum"</item> <item msgid="7899496259191969307">"Quatre processus maximum"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Charge en cours"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol, protocole de transfert de fichiers multimédias)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol, protocole de transfert d\'images)"</item> + <item msgid="7398830860950841822">"RNDIS (Ethernet USB)"</item> + <item msgid="1718924214939774352">"Source audio"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 9652e52506e4..f2c79de77e5c 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Personnel"</string> <string name="category_work" msgid="8699184680584175622">"Travail"</string> <string name="development_settings_title" msgid="215179176067683667">"Options pour les développeurs"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Activer les options pour les développeurs"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Définir les options pour le développement de l\'application"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Les options proposées aux développeurs ne sont pas disponibles pour cet utilisateur."</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Les paramètres de RPV ne sont pas disponibles pour cet utilisateur"</string> diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml index 953596348d73..a8bed699a3a1 100644 --- a/packages/SettingsLib/res/values-fr/arrays.xml +++ b/packages/SettingsLib/res/values-fr/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Trois processus maximum"</item> <item msgid="7899496259191969307">"Quatre processus maximum"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"En charge"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (Ethernet USB)"</item> + <item msgid="1718924214939774352">"Source audio"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 8056f287af65..95e88044b6b1 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Personnel"</string> <string name="category_work" msgid="8699184680584175622">"Professionnel"</string> <string name="development_settings_title" msgid="215179176067683667">"Options pour les développeurs"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Activer les options pour les développeurs"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Définir les options pour le développement de l\'application"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Les options proposées aux développeurs ne sont pas disponibles pour cet utilisateur."</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Les paramètres VPN ne sont pas disponibles pour cet utilisateur."</string> diff --git a/packages/SettingsLib/res/values-gl-rES/arrays.xml b/packages/SettingsLib/res/values-gl-rES/arrays.xml index 4f0840d881d4..606e6f6499d7 100644 --- a/packages/SettingsLib/res/values-gl-rES/arrays.xml +++ b/packages/SettingsLib/res/values-gl-rES/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Como moito 3 procesos"</item> <item msgid="7899496259191969307">"Como moito 4 procesos"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Cargando"</item> + <item msgid="5220695614993094977">"MTP (protocolo de transferencia multimedia)"</item> + <item msgid="2086000968159047375">"PTP (protocolo de transferencia de imaxes)"</item> + <item msgid="7398830860950841822">"RNDIS (Ethernet USB)"</item> + <item msgid="1718924214939774352">"Fonte de audio"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-gl-rES/strings.xml b/packages/SettingsLib/res/values-gl-rES/strings.xml index bf9920df961f..d7ef503122e0 100644 --- a/packages/SettingsLib/res/values-gl-rES/strings.xml +++ b/packages/SettingsLib/res/values-gl-rES/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Persoal"</string> <string name="category_work" msgid="8699184680584175622">"Traballo"</string> <string name="development_settings_title" msgid="215179176067683667">"Opcións de programador"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Activar opcións de programador"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Definir as opcións de desenvolvemento de aplicacións"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"As opcións do programador non están dispoñibles para este usuario"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"A configuración da VPN non está dispoñible para este usuario"</string> diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml index 250e26a30ef8..d51f82dfea42 100644 --- a/packages/SettingsLib/res/values-hr/arrays.xml +++ b/packages/SettingsLib/res/values-hr/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Najviše 3 procesa"</item> <item msgid="7899496259191969307">"Najviše 4 procesa"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Punjenje"</item> + <item msgid="5220695614993094977">"MTP (protokol za prijenos medija)"</item> + <item msgid="2086000968159047375">"PTP (protokol za prijenos fotografija)"</item> + <item msgid="7398830860950841822">"RNDIS (USB ethernet)"</item> + <item msgid="1718924214939774352">"Audioizvor"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index b11568f5656f..f8434eb451cc 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Osobno"</string> <string name="category_work" msgid="8699184680584175622">"Posao"</string> <string name="development_settings_title" msgid="215179176067683667">"Opcije za razvojne programere"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Omogući opcije za razvojne programere"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Postavljanje opcija za razvoj aplikacije"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Opcije razvojnih programera nisu dostupne za ovog korisnika"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Postavke VPN-a nisu dostupne ovom korisniku"</string> diff --git a/packages/SettingsLib/res/values-hy-rAM/arrays.xml b/packages/SettingsLib/res/values-hy-rAM/arrays.xml index b32041484530..41143de5b9f6 100644 --- a/packages/SettingsLib/res/values-hy-rAM/arrays.xml +++ b/packages/SettingsLib/res/values-hy-rAM/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Առավելագույնը 3 գործընթաց"</item> <item msgid="7899496259191969307">"Ամենաշատը 4 գործընթաց"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Լիցքավորում"</item> + <item msgid="5220695614993094977">"MTP (Մեդիա ֆայլերի փոխանցման հաղորդակարգ)"</item> + <item msgid="2086000968159047375">"PTP (Նկարների փոխանցման հաղորդակարգ)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Ձայնի աղբյուրը"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-hy-rAM/strings.xml b/packages/SettingsLib/res/values-hy-rAM/strings.xml index c03851148a57..a2b901a32d1b 100644 --- a/packages/SettingsLib/res/values-hy-rAM/strings.xml +++ b/packages/SettingsLib/res/values-hy-rAM/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Անձնական"</string> <string name="category_work" msgid="8699184680584175622">"Աշխատանքային"</string> <string name="development_settings_title" msgid="215179176067683667">"Ծրագրավորման ընտրանքներ"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Միացնել մշակողի ընտրանքները"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Կարգավորել ընտրանքները ծրագրի ծրագրավորման համար"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Ծրագրավորման ընտրանքներն այլևս հասանելի չեն այս օգտվողի համար"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN-ի կարգավորումները հասանելի չեն այս օգտվողին"</string> diff --git a/packages/SettingsLib/res/values-is-rIS/arrays.xml b/packages/SettingsLib/res/values-is-rIS/arrays.xml index 3cb853d8c479..bbc7aec6bbbd 100644 --- a/packages/SettingsLib/res/values-is-rIS/arrays.xml +++ b/packages/SettingsLib/res/values-is-rIS/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Að hámarki 3 vinnslur"</item> <item msgid="7899496259191969307">"Að hámarki 4 vinnslur"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Í hleðslu"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Audio Source"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-is-rIS/strings.xml b/packages/SettingsLib/res/values-is-rIS/strings.xml index f601d3ed00fe..4139e6e2015f 100644 --- a/packages/SettingsLib/res/values-is-rIS/strings.xml +++ b/packages/SettingsLib/res/values-is-rIS/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Persónulegt"</string> <string name="category_work" msgid="8699184680584175622">"Vinna"</string> <string name="development_settings_title" msgid="215179176067683667">"Forritunarkostir"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Virkja valkosti þróunaraðila"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Stilla valkosti fyrir forritaþróun"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Valkostir þróunaraðila eru ekki í boði fyrir þennan notanda"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN-stillingar eru ekki í boði fyrir þennan notanda"</string> diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml index 451c57f893e0..6307a100b7a7 100644 --- a/packages/SettingsLib/res/values-ja/arrays.xml +++ b/packages/SettingsLib/res/values-ja/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"プロセスの上限: 3"</item> <item msgid="7899496259191969307">"プロセスの上限: 4"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"充電しています"</item> + <item msgid="5220695614993094977">"MTP(Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP(Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS(USBイーサネット)"</item> + <item msgid="1718924214939774352">"オーディオソース"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 5a8c028d2049..4c043ac3db78 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"個人用"</string> <string name="category_work" msgid="8699184680584175622">"仕事用"</string> <string name="development_settings_title" msgid="215179176067683667">"開発者向けオプション"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"開発者向けオプションの有効化"</string> <string name="development_settings_summary" msgid="1815795401632854041">"アプリ開発オプションを設定する"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"デベロッパー向けオプションはこのユーザーには表示されません"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"このユーザーはVPN設定を利用できません。"</string> diff --git a/packages/SettingsLib/res/values-ka-rGE/arrays.xml b/packages/SettingsLib/res/values-ka-rGE/arrays.xml index 14f0d1aa2407..ac627a292d34 100644 --- a/packages/SettingsLib/res/values-ka-rGE/arrays.xml +++ b/packages/SettingsLib/res/values-ka-rGE/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"არა უმეტეს 3 პროცესისა"</item> <item msgid="7899496259191969307">"არაუმეტეს 4 პროცესისა"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"იტენება"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"აუდიო წყარo"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ka-rGE/strings.xml b/packages/SettingsLib/res/values-ka-rGE/strings.xml index f3bf04d2c3d0..1ea79bf2c22b 100644 --- a/packages/SettingsLib/res/values-ka-rGE/strings.xml +++ b/packages/SettingsLib/res/values-ka-rGE/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"პირადი"</string> <string name="category_work" msgid="8699184680584175622">"სამსახური"</string> <string name="development_settings_title" msgid="215179176067683667">"პარამეტრები დეველოპერებისთვის"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"დეველოპერთა პარამეტრების ჩართვა"</string> <string name="development_settings_summary" msgid="1815795401632854041">"პარამეტრების დაყენება აპების დეველოპერებისთვის"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"ამ მომხმარებლისთვის დეველოპერის პარამეტრები არ არის ხელმისაწვდომი"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN პარამეტრები ამ მომხმარებლისათვის მიუწვდომელია"</string> diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml index 627abd4b290a..a8d548ffc467 100644 --- a/packages/SettingsLib/res/values-ko/arrays.xml +++ b/packages/SettingsLib/res/values-ko/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"최대 3개 프로세스"</item> <item msgid="7899496259191969307">"최대 4개 프로세스"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"충전"</item> + <item msgid="5220695614993094977">"MTP(Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP(Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS(USB 이더넷)"</item> + <item msgid="1718924214939774352">"오디오 소스"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 8f4b43908e91..c4ab08465f14 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"개인"</string> <string name="category_work" msgid="8699184680584175622">"직장"</string> <string name="development_settings_title" msgid="215179176067683667">"개발자 옵션"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"개발자 옵션 사용"</string> <string name="development_settings_summary" msgid="1815795401632854041">"앱 개발 옵션 설정"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"이 사용자는 개발자 옵션을 사용할 수 없습니다."</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"이 사용자는 VPN 설정을 수정할 수 없습니다."</string> diff --git a/packages/SettingsLib/res/values-ky-rKG/arrays.xml b/packages/SettingsLib/res/values-ky-rKG/arrays.xml index 97d4f2cecba0..7ec569e5077b 100644 --- a/packages/SettingsLib/res/values-ky-rKG/arrays.xml +++ b/packages/SettingsLib/res/values-ky-rKG/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Эң көп дегенде 3 процесс"</item> <item msgid="7899496259191969307">"Эң көп дегенде 4 процесс"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Кубатталууда"</item> + <item msgid="5220695614993094977">"MTP (Медиа өткөрүүчү протокол)"</item> + <item msgid="2086000968159047375">"PTP (Сүрөт өткөрүүчү протокол)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Аудио булак"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ky-rKG/strings.xml b/packages/SettingsLib/res/values-ky-rKG/strings.xml index 267cc6113b7b..43d979098ce5 100644 --- a/packages/SettingsLib/res/values-ky-rKG/strings.xml +++ b/packages/SettingsLib/res/values-ky-rKG/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Жеке"</string> <string name="category_work" msgid="8699184680584175622">"Жумуш"</string> <string name="development_settings_title" msgid="215179176067683667">"Иштеп чыгуучунун параметрлери"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Иштеп чыгуучунун параметрлери иштетүү"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Колдонмо өндүрүү мүмкүнчүлүктөрүн орнотуу"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Бул колдонуучуга өнүктүүрүүчү мүмкүнчүлүктөрү берилген эмес."</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Бул колдонуучу VPN жөндөөлөрүн колдоно албайт"</string> diff --git a/packages/SettingsLib/res/values-mk-rMK/arrays.xml b/packages/SettingsLib/res/values-mk-rMK/arrays.xml index 260afdc26b00..c97b57796247 100644 --- a/packages/SettingsLib/res/values-mk-rMK/arrays.xml +++ b/packages/SettingsLib/res/values-mk-rMK/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Најмногу 3 процеси"</item> <item msgid="7899496259191969307">"Најмногу 4 процеси"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Се полни"</item> + <item msgid="5220695614993094977">"МТП (Протокол за трансфер на медиуми)"</item> + <item msgid="2086000968159047375">"ПТП (Протокол за трансфер на слика)"</item> + <item msgid="7398830860950841822">"РНДИС (УСБ за етернет)"</item> + <item msgid="1718924214939774352">"Аудиоизвор"</item> + <item msgid="8126315616613006284">"МИДИ"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-mk-rMK/strings.xml b/packages/SettingsLib/res/values-mk-rMK/strings.xml index 7705f3452a30..f19b7b3888f7 100644 --- a/packages/SettingsLib/res/values-mk-rMK/strings.xml +++ b/packages/SettingsLib/res/values-mk-rMK/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Лични"</string> <string name="category_work" msgid="8699184680584175622">"Работа"</string> <string name="development_settings_title" msgid="215179176067683667">"Опции на развивач"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Овозможете ги опциите за програмери"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Постави опции за развој на апликација"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Опциите на програмерот не се достапни за овој корисник"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Поставките за ВПН не се достапни за овој корисник"</string> diff --git a/packages/SettingsLib/res/values-mn-rMN/arrays.xml b/packages/SettingsLib/res/values-mn-rMN/arrays.xml index c869ff45af6f..c4c6d28c9a73 100644 --- a/packages/SettingsLib/res/values-mn-rMN/arrays.xml +++ b/packages/SettingsLib/res/values-mn-rMN/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Хамгийн ихдээ 3 процесс"</item> <item msgid="7899496259191969307">"Хамгийн ихдээ 4 процесс"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Цэнэглэж байна"</item> + <item msgid="5220695614993094977">"MTP (Медиа дамжуулах протокол)"</item> + <item msgid="2086000968159047375">"PTP (Зураг Дамжуулах Протокол)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Аудио эх сурвалж"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-mn-rMN/strings.xml b/packages/SettingsLib/res/values-mn-rMN/strings.xml index ffbbec524f75..62e2c395401d 100644 --- a/packages/SettingsLib/res/values-mn-rMN/strings.xml +++ b/packages/SettingsLib/res/values-mn-rMN/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Хувийн"</string> <string name="category_work" msgid="8699184680584175622">"Ажил"</string> <string name="development_settings_title" msgid="215179176067683667">"Хөгжүүлэгчийн тохиргоо"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Хөгжүүлэгчийн сонголтыг идэвхжүүлэх"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Апп хөгжүүлэлтэд зориулсан сонголтуудыг тохируулах"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Энэ хэрэглэгч хөгжүүлэгчийн тохиргоог ашиглах боломжгүй"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Энэ хэрэглэгчид VPN тохиргоог ашиглах боломжгүй"</string> diff --git a/packages/SettingsLib/res/values-ms-rMY/arrays.xml b/packages/SettingsLib/res/values-ms-rMY/arrays.xml index d191075e0c17..320fa9bfdf22 100644 --- a/packages/SettingsLib/res/values-ms-rMY/arrays.xml +++ b/packages/SettingsLib/res/values-ms-rMY/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Paling banyak 3 proses"</item> <item msgid="7899496259191969307">"Paling banyak 4 proses"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Mengecas"</item> + <item msgid="5220695614993094977">"MTP (Protokol Pindahan Media)"</item> + <item msgid="2086000968159047375">"PTP (Protokol Pindahan Gambar)"</item> + <item msgid="7398830860950841822">"RNDIS (Ethernet USB)"</item> + <item msgid="1718924214939774352">"Sumber Audio"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ms-rMY/strings.xml b/packages/SettingsLib/res/values-ms-rMY/strings.xml index 40ba9a6a7054..babbefad97f4 100644 --- a/packages/SettingsLib/res/values-ms-rMY/strings.xml +++ b/packages/SettingsLib/res/values-ms-rMY/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Peribadi"</string> <string name="category_work" msgid="8699184680584175622">"Tempat Kerja"</string> <string name="development_settings_title" msgid="215179176067683667">"Pilihan pembangun"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Dayakan pilihan pembangun"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Tetapkan pilihan untuk pembangunan aplikasi"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Pilihan Pemaju tidak tersedia untuk pengguna ini"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Tetapan VPN tidak tersedia untuk pengguna ini"</string> diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml index acc35709e5db..0877f5c525fe 100644 --- a/packages/SettingsLib/res/values-nb/arrays.xml +++ b/packages/SettingsLib/res/values-nb/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Maksimalt 3 prosesser"</item> <item msgid="7899496259191969307">"Maksimalt 4 prosesser"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Lader"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Lydkilde"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 36ef78ba6807..2b461e7216e5 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Personlig"</string> <string name="category_work" msgid="8699184680584175622">"Jobb"</string> <string name="development_settings_title" msgid="215179176067683667">"Utvikleralternativer"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Slå på utvikleralternativer"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Angi alternativer for apputvikling"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Utvikleralternativene er ikke tilgjengelige for denne brukeren"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Innstillingene for VPN er ikke tilgjengelig for denne brukeren"</string> diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml index a119f4203c64..7f76bba56005 100644 --- a/packages/SettingsLib/res/values-nl/arrays.xml +++ b/packages/SettingsLib/res/values-nl/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Maximaal 3 processen"</item> <item msgid="7899496259191969307">"Maximaal 4 processen"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Opladen"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB-Ethernet)"</item> + <item msgid="1718924214939774352">"Audiobron"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index bd5c9817e1a6..49242f957c28 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Persoonlijk"</string> <string name="category_work" msgid="8699184680584175622">"Werk"</string> <string name="development_settings_title" msgid="215179176067683667">"Opties voor ontwikkelaars"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Opties voor ontwikkelaars inschakelen"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Opties instellen voor appontwikkeling"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Ontwikkelaarsopties zijn niet beschikbaar voor deze gebruiker"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Instellingen voor VPN zijn niet beschikbaar voor deze gebruiker"</string> diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml index b4808543b0f3..8df26cd333b7 100644 --- a/packages/SettingsLib/res/values-pl/arrays.xml +++ b/packages/SettingsLib/res/values-pl/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Maksymalnie 3 procesy"</item> <item msgid="7899496259191969307">"Maksymalnie 4 procesy"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Ładowanie"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (Ethernet przez USB)"</item> + <item msgid="1718924214939774352">"Źródło dźwięku"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 8b7dd3ff1c0d..2efb5c9774b1 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Osobiste"</string> <string name="category_work" msgid="8699184680584175622">"Praca"</string> <string name="development_settings_title" msgid="215179176067683667">"Opcje programistyczne"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Włącz opcje dla programistów"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Ustaw opcje związane z programowaniem aplikacji."</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Opcje programisty są niedostępne dla tego użytkownika"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Ustawienia VPN są niedostępne dla tego użytkownika"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml index f12841c1f036..693430ceed89 100644 --- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"No máximo, 3 processos"</item> <item msgid="7899496259191969307">"No máximo, 4 processos"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Carregamento"</item> + <item msgid="5220695614993094977">"MTP (Protocolo de transferência de multimédia)"</item> + <item msgid="2086000968159047375">"PTP (Protocolo de transferência de imagens)"</item> + <item msgid="7398830860950841822">"RNDIS (Ethernet USB)"</item> + <item msgid="1718924214939774352">"Fonte de áudio"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 156a60023ba6..2a8402e4be10 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Pessoal"</string> <string name="category_work" msgid="8699184680584175622">"Trabalho"</string> <string name="development_settings_title" msgid="215179176067683667">"Opções de programador"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Ativar as opções de programador"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Definir opções de desenvolvimento da aplicação"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"As opções de programador não estão disponíveis para este utilizador"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"As definições de VPN não estão disponíveis para este utilizador"</string> diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml index cae68125f70b..f75154f660ca 100644 --- a/packages/SettingsLib/res/values-ro/arrays.xml +++ b/packages/SettingsLib/res/values-ro/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Cel mult 3 procese"</item> <item msgid="7899496259191969307">"Cel mult 4 procese"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Încărcare"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Sursă audio"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index b34813a072fd..c45ede57e898 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Personal"</string> <string name="category_work" msgid="8699184680584175622">"Serviciu"</string> <string name="development_settings_title" msgid="215179176067683667">"Opțiuni dezvoltator"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Activați opțiunile pentru dezvoltatori"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Setați opțiuni pentru dezvoltarea aplicației"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Opțiunile de dezvoltator nu sunt disponibile pentru acest utilizator"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Setările VPN nu sunt disponibile pentru acest utilizator"</string> diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml index 9c3338c67040..253f11360e20 100644 --- a/packages/SettingsLib/res/values-sl/arrays.xml +++ b/packages/SettingsLib/res/values-sl/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Največ 3 postopki"</item> <item msgid="7899496259191969307">"Največ 4 postopki"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Polnjenje"</item> + <item msgid="5220695614993094977">"MTP (protokol za prenos predstavnosti)"</item> + <item msgid="2086000968159047375">"PTP (protokol za prenos slik)"</item> + <item msgid="7398830860950841822">"RNDIS (Ethernet USB)"</item> + <item msgid="1718924214939774352">"Vir zvoka"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 6a9f863467a9..04918e01e848 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Osebno"</string> <string name="category_work" msgid="8699184680584175622">"Služba"</string> <string name="development_settings_title" msgid="215179176067683667">"Možnosti za razvijalce"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Omogočanje možnosti za razvijalce"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Nastavi možnosti za razvoj aplikacij"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Možnosti razvijalca niso na voljo za tega uporabnika"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Nastavitve VPN niso na voljo za tega uporabnika"</string> diff --git a/packages/SettingsLib/res/values-sq-rAL/arrays.xml b/packages/SettingsLib/res/values-sq-rAL/arrays.xml index 2ed253fff618..7473f16625d4 100644 --- a/packages/SettingsLib/res/values-sq-rAL/arrays.xml +++ b/packages/SettingsLib/res/values-sq-rAL/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Maksimumi 3 procese"</item> <item msgid="7899496259191969307">"Maksimumi 4 procese"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Po ngarkohet"</item> + <item msgid="5220695614993094977">"MTP (Protokolli i Transferimit të Medias)"</item> + <item msgid="2086000968159047375">"PTP (Protokolli i Transferimit të Fotografive)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Eternet)"</item> + <item msgid="1718924214939774352">"Burimi i audios"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sq-rAL/strings.xml b/packages/SettingsLib/res/values-sq-rAL/strings.xml index ced2013bf4e9..3bc769c4831d 100644 --- a/packages/SettingsLib/res/values-sq-rAL/strings.xml +++ b/packages/SettingsLib/res/values-sq-rAL/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Personale"</string> <string name="category_work" msgid="8699184680584175622">"Punë"</string> <string name="development_settings_title" msgid="215179176067683667">"Opsionet e zhvilluesit"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Aktivizo opsionet e zhvilluesit"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Cakto opsionet për zhvillimin e aplikacionit"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Opsionet e programuesit nuk mundësohen për këtë përdorues"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Cilësimet e VPN-së nuk ofrohen për këtë përdorues"</string> diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml index 39583aa5a98d..cd44e15e79c2 100644 --- a/packages/SettingsLib/res/values-sr/arrays.xml +++ b/packages/SettingsLib/res/values-sr/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Највише три процеса"</item> <item msgid="7899496259191969307">"Највише четири процеса"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Пуњење"</item> + <item msgid="5220695614993094977">"MTP (протокол за трансфер медија)"</item> + <item msgid="2086000968159047375">"PTP (протокол за пренос слика)"</item> + <item msgid="7398830860950841822">"RNDIS (USB етернет)"</item> + <item msgid="1718924214939774352">"Извор звука"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index a2be0e42b84b..036622f498ec 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Лично"</string> <string name="category_work" msgid="8699184680584175622">"Посао"</string> <string name="development_settings_title" msgid="215179176067683667">"Опције за програмера"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Омогући опције за програмера"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Подешавање опција за програмирање апликације"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Опције за програмере нису доступне за овог корисника"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Подешавања VPN-а нису доступна за овог корисника"</string> diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml index e77ec0a6fa86..54537f46977e 100644 --- a/packages/SettingsLib/res/values-sv/arrays.xml +++ b/packages/SettingsLib/res/values-sv/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Högst 3 processer"</item> <item msgid="7899496259191969307">"Högst 4 processer"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Laddar"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB-ethernet)"</item> + <item msgid="1718924214939774352">"Ljudkälla"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 9fb6f37c06cb..2f95b06dd5a8 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Personligt"</string> <string name="category_work" msgid="8699184680584175622">"Arbetet"</string> <string name="development_settings_title" msgid="215179176067683667">"Utvecklaralternativ"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Aktivera utvecklaralternativ"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Ange alternativ för apputveckling"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Utvecklaralternativ är inte tillgängliga för den här användaren"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN-inställningarna är inte tillgängliga för den här användaren"</string> diff --git a/packages/SettingsLib/res/values-ta-rIN/arrays.xml b/packages/SettingsLib/res/values-ta-rIN/arrays.xml index 978a7291d020..ad421595f93c 100644 --- a/packages/SettingsLib/res/values-ta-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-ta-rIN/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"அதிகபட்சமாக 3 செயல்முறைகள்"</item> <item msgid="7899496259191969307">"அதிகபட்சமாக 4 செயல்முறைகள்"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"சார்ஜ் ஏறுகிறது"</item> + <item msgid="5220695614993094977">"MTP (மீடியா பரிமாற்ற நெறிமுறை)"</item> + <item msgid="2086000968159047375">"PTP (படப் பரிமாற்ற நெறிமுறை)"</item> + <item msgid="7398830860950841822">"RNDIS (USB ஈத்தர்நெட்)"</item> + <item msgid="1718924214939774352">"ஆடியோ மூலம்"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ta-rIN/strings.xml b/packages/SettingsLib/res/values-ta-rIN/strings.xml index 2d35f7b56759..f4fee1ffab06 100644 --- a/packages/SettingsLib/res/values-ta-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ta-rIN/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"தனிப்பட்டவை"</string> <string name="category_work" msgid="8699184680584175622">"பணியிடம்"</string> <string name="development_settings_title" msgid="215179176067683667">"டெவெலப்பர் விருப்பங்கள்"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"டெவெலப்பர் விருப்பங்களை இயக்கு"</string> <string name="development_settings_summary" msgid="1815795401632854041">"பயன்பாட்டின் மேம்பாட்டிற்காக விருப்பங்களை அமை"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"இவருக்கு, டெவெலப்பர் விருப்பங்கள் இல்லை"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"இவரால் VPN அமைப்புகளை மாற்ற முடியாது"</string> diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml index c65988e0616b..43d273970e59 100644 --- a/packages/SettingsLib/res/values-th/arrays.xml +++ b/packages/SettingsLib/res/values-th/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"มากที่สุด 3 กระบวนการ"</item> <item msgid="7899496259191969307">"มากที่สุด 4 กระบวนการ"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"การชาร์จ"</item> + <item msgid="5220695614993094977">"MTP (โปรโตคอลการโอนสื่อ)"</item> + <item msgid="2086000968159047375">"PTP (โปรโตคอลการโอนรูปภาพ)"</item> + <item msgid="7398830860950841822">"RNDIS (อีเทอร์เน็ต USB)"</item> + <item msgid="1718924214939774352">"แหล่งที่มาของเสียง"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 30bed9878f06..c91bb42e4558 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"ส่วนตัว"</string> <string name="category_work" msgid="8699184680584175622">"ที่ทำงาน"</string> <string name="development_settings_title" msgid="215179176067683667">"สำหรับนักพัฒนาซอฟต์แวร์"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"เปิดใช้ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์"</string> <string name="development_settings_summary" msgid="1815795401632854041">"ตั้งค่าตัวเลือกสำหรับการพัฒนาแอปพลิเคชัน"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์ไม่สามารถใช้ได้สำหรับผู้ใช้นี้"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"การตั้งค่า VPN ไม่สามารถใช้ได้สำหรับผู้ใช้รายนี้"</string> diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml index 571560b2789b..c7cf6d24f6be 100644 --- a/packages/SettingsLib/res/values-tl/arrays.xml +++ b/packages/SettingsLib/res/values-tl/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"3 proseso sa pinakamarami"</item> <item msgid="7899496259191969307">"4 na proseso sa pinakamarami"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Nagcha-charge"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Pinagmulan ng Audio"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 63d1c6bda9a3..a389febad665 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Personal"</string> <string name="category_work" msgid="8699184680584175622">"Trabaho"</string> <string name="development_settings_title" msgid="215179176067683667">"Mga opsyon ng developer"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"I-enable ang mga opsyon ng developer"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Magtakda ng mga pagpipilian para sa pagbuo ng app"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Hindi available ang mga pagpipilian ng developer para sa user na ito"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Hindi available ang mga setting ng VPN para sa user na ito"</string> diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml index cecc51dba24b..9326903e9955 100644 --- a/packages/SettingsLib/res/values-tr/arrays.xml +++ b/packages/SettingsLib/res/values-tr/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"En çok 3 işlem"</item> <item msgid="7899496259191969307">"En çok 4 işlem"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Şarj oluyor"</item> + <item msgid="5220695614993094977">"MTP (Medya Aktarım Protokolü)"</item> + <item msgid="2086000968159047375">"PTP (Resim Aktarım Protokolü)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Ses Kaynağı"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index dc6f188dd13c..48ed86712c55 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Kişisel"</string> <string name="category_work" msgid="8699184680584175622">"İş"</string> <string name="development_settings_title" msgid="215179176067683667">"Geliştirici seçenekleri"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Geliştirici seçeneklerini etkinleştir"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Uygulama geliştirme için seçenekleri ayarla"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Bu kullanıcı, geliştirici seçeneklerini kullanamaz"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN ayarları bu kullanıcı için kullanılamıyor"</string> diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml index 92bfe4fdc50b..6cccc8c122e3 100644 --- a/packages/SettingsLib/res/values-uk/arrays.xml +++ b/packages/SettingsLib/res/values-uk/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Не більше 3 процесів"</item> <item msgid="7899496259191969307">"Не більше 4 процесів"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Заряджається"</item> + <item msgid="5220695614993094977">"MTP (протокол передавання медіаданих)"</item> + <item msgid="2086000968159047375">"PTP (протокол передавання зображень)"</item> + <item msgid="7398830860950841822">"RNDIS (Ethernet через USB)"</item> + <item msgid="1718924214939774352">"Джерело аудіо"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index dfabfbd67338..5a0ddd01a376 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Особисте"</string> <string name="category_work" msgid="8699184680584175622">"Робота"</string> <string name="development_settings_title" msgid="215179176067683667">"Параметри розробника"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Увімкнути параметри розробника"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Установити параметри для розробки програми"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Параметри розробника не доступні для цього користувача"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Цей користувач не може налаштовувати мережу VPN"</string> diff --git a/packages/SettingsLib/res/values-ur-rPK/arrays.xml b/packages/SettingsLib/res/values-ur-rPK/arrays.xml index 228c214de7e3..80fb750461db 100644 --- a/packages/SettingsLib/res/values-ur-rPK/arrays.xml +++ b/packages/SettingsLib/res/values-ur-rPK/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"زیادہ سے زیادہ 3 پروسیسز"</item> <item msgid="7899496259191969307">"زیادہ سے زیادہ 4 پروسیسز"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"چارجنگ"</item> + <item msgid="5220695614993094977">"MTP (میڈیا کی منتقلی کا پروٹوکول)"</item> + <item msgid="2086000968159047375">"PTP (تصویر کی منتقلی کا پروٹوکول)"</item> + <item msgid="7398830860950841822">"RNDIS (USB ایتھرنیٹ)"</item> + <item msgid="1718924214939774352">"آڈیو ماخذ"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-ur-rPK/strings.xml b/packages/SettingsLib/res/values-ur-rPK/strings.xml index c71898f5645f..3f6563bd5f18 100644 --- a/packages/SettingsLib/res/values-ur-rPK/strings.xml +++ b/packages/SettingsLib/res/values-ur-rPK/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"ذاتی"</string> <string name="category_work" msgid="8699184680584175622">"دفتر"</string> <string name="development_settings_title" msgid="215179176067683667">"ڈویلپر کے اختیارات"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"ڈیولپر کے اختیارات فعال کریں"</string> <string name="development_settings_summary" msgid="1815795401632854041">"ایپ ڈویلپمنٹ کیلئے اختیارات سیٹ کریں"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"اس صارف کیلئے ڈیولپر کے اختیارات دستیاب نہیں ہیں"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN ترتیبات اس صارف کیلئے دستیاب نہیں ہیں"</string> diff --git a/packages/SettingsLib/res/values-uz-rUZ/arrays.xml b/packages/SettingsLib/res/values-uz-rUZ/arrays.xml index b05a818e9d1b..a84c5d52d4ef 100644 --- a/packages/SettingsLib/res/values-uz-rUZ/arrays.xml +++ b/packages/SettingsLib/res/values-uz-rUZ/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"Ko‘pi bilan 3 ta jarayon"</item> <item msgid="7899496259191969307">"Ko‘pi bilan 4 ta jarayon"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Quvvat olmoqda"</item> + <item msgid="5220695614993094977">"MTP (media fayllarni o‘tkazish protokoli)"</item> + <item msgid="2086000968159047375">"PTP (rasmlarni o‘tkazish protokoli)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Audio manbasi"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-uz-rUZ/strings.xml b/packages/SettingsLib/res/values-uz-rUZ/strings.xml index d50a2c08ab33..82e8dc694cde 100644 --- a/packages/SettingsLib/res/values-uz-rUZ/strings.xml +++ b/packages/SettingsLib/res/values-uz-rUZ/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"Shaxsiy"</string> <string name="category_work" msgid="8699184680584175622">"Ish"</string> <string name="development_settings_title" msgid="215179176067683667">"Dasturchi sozlamalari"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"Dasturchi sozlamalarini yoqish"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Ilova dasturlash moslamalari"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Bu foydalanuvchiga dasturchi imkoniyatlari taqdim etilmagan"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Ushbu foydalanuvchi uchun VPN sozlamalari mavjud emas"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml index 05640f3f8566..1378aaa1c5bc 100644 --- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml @@ -147,5 +147,12 @@ <item msgid="836593137872605381">"不得超过3个进程"</item> <item msgid="7899496259191969307">"不得超过4个进程"</item> </string-array> - <!-- no translation found for usb_configuration_titles:0 (488237561639712799) --> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"充电"</item> + <item msgid="5220695614993094977">"MTP(媒体传输协议)"</item> + <item msgid="2086000968159047375">"PTP(图片传输协议)"</item> + <item msgid="7398830860950841822">"RNDIS(USB 以太网)"</item> + <item msgid="1718924214939774352">"音频来源"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 8cfd8bef25c8..886a7cee8552 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -136,8 +136,7 @@ <string name="category_personal" msgid="1299663247844969448">"个人"</string> <string name="category_work" msgid="8699184680584175622">"工作"</string> <string name="development_settings_title" msgid="215179176067683667">"开发者选项"</string> - <!-- no translation found for development_settings_enable (542530994778109538) --> - <skip /> + <string name="development_settings_enable" msgid="542530994778109538">"启用开发者选项"</string> <string name="development_settings_summary" msgid="1815795401632854041">"设置应用开发选项"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"此用户无法使用开发者选项"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"此用户无权修改VPN设置"</string> diff --git a/packages/Shell/res/values-af/strings.xml b/packages/Shell/res/values-af/strings.xml index a9960d14b8fe..8c4de4e1a783 100644 --- a/packages/Shell/res/values-af/strings.xml +++ b/packages/Shell/res/values-af/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Tuisskerm"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Foutverslag word tans gegenereer"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Foutverslag vasgevang"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Swiep na links om jou foutverslag te deel"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Raak om jou foutverslag te deel"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Wys hierdie boodskap volgende keer"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Foutverslae"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Foutverslaglêer kon nie gelees word nie"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"naamloos"</string> </resources> diff --git a/packages/Shell/res/values-bn-rBD/strings.xml b/packages/Shell/res/values-bn-rBD/strings.xml index f37e88a61497..afa3a46e9ade 100644 --- a/packages/Shell/res/values-bn-rBD/strings.xml +++ b/packages/Shell/res/values-bn-rBD/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"শেল"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"ত্রুটির প্রতিবেদন তৈরি করা হচ্ছে"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"ত্রুটির প্রতিবেদন নেওয়া হয়েছে"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"আপনার বাগ রিপোর্ট শেয়ার করতে বামে সোয়াইপ করুন"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"আপনার ত্রুটির প্রতিবেদন ভাগ করতে স্পর্শ করুন"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"এই বার্তাটি পরের বার দেখান"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"ত্রুটির প্রতিবেদনগুলি"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"ত্রুটির প্রতিবেদনের ফাইলটি পড়া যায়নি"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"নামবিহীন"</string> </resources> diff --git a/packages/Shell/res/values-ca/strings.xml b/packages/Shell/res/values-ca/strings.xml index f8652cfe1256..188da676717f 100644 --- a/packages/Shell/res/values-ca/strings.xml +++ b/packages/Shell/res/values-ca/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Protecció"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"S\'està generant l\'informe d\'errors"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"S\'ha registrat l\'informe d\'error"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Llisca cap a l\'esquerra per compartir l\'informe d\'errors."</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Toca aquí per compartir el teu informe d\'error."</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Mostra aquest missatge la propera vegada"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Informes d\'error"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"No s\'ha pogut llegir el fitxer de l\'informe d\'errors"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"sense nom"</string> </resources> diff --git a/packages/Shell/res/values-cs/strings.xml b/packages/Shell/res/values-cs/strings.xml index 1647b2b4a2da..fdc8023ad429 100644 --- a/packages/Shell/res/values-cs/strings.xml +++ b/packages/Shell/res/values-cs/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Vytváří se zpráva o chybě"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Bylo vytvořeno chybové hlášení"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Chcete-li hlášení chyby sdílet, přejeďte doleva."</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Chybové hlášení můžete sdílet klepnutím."</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Zobrazit tuto zprávu příště"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Zprávy o chybách"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Soubor chybové zprávy nelze načíst"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"bez názvu"</string> </resources> diff --git a/packages/Shell/res/values-de/strings.xml b/packages/Shell/res/values-de/strings.xml index ef83da66d909..13c1c9626592 100644 --- a/packages/Shell/res/values-de/strings.xml +++ b/packages/Shell/res/values-de/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Fehlerbericht wird generiert"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Fehlerbericht erfasst"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Wischen Sie nach links, um Ihren Fehlerbericht zu teilen."</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Tippen, um Fehlerbericht zu teilen"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Diese Nachricht nächstes Mal zeigen"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Fehlerberichte"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Fehlerberichtdatei konnte nicht gelesen werden."</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"Unbenannt"</string> </resources> diff --git a/packages/Shell/res/values-el/strings.xml b/packages/Shell/res/values-el/strings.xml index c437798e07c5..aa03bec167bf 100644 --- a/packages/Shell/res/values-el/strings.xml +++ b/packages/Shell/res/values-el/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Κέλυφος"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Δημιουργείται αναφορά σφάλματος"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Η λήψη της αναφοράς ήταν επιτυχής"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Σύρετε προς τα αριστερά για κοινή χρήση της αναφοράς σφαλμάτων"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Αγγίξτε για να μοιραστείτε τη αναφορά σφαλμάτων"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Εμφάνιση αυτού του μηνύματος την επόμενη φορά"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Αναφορές σφαλμάτων"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Δεν ήταν δυνατή η ανάγνωση του αρχείου της αναφοράς σφαλμάτων"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"ανώνυμη"</string> </resources> diff --git a/packages/Shell/res/values-es-rUS/strings.xml b/packages/Shell/res/values-es-rUS/strings.xml index 3a204a2069a0..ab2dd63b084a 100644 --- a/packages/Shell/res/values-es-rUS/strings.xml +++ b/packages/Shell/res/values-es-rUS/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"El informe de errores se está generando"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Informe de errores capturado"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Desliza el dedo hacia la izquierda para compartir el informe de errores."</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Toca para compartir tu informe de errores."</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Mostrar este mensaje la próxima vez"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Informes de errores"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"No se pudo leer el archivo de informe de errores"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"sin nombre"</string> </resources> diff --git a/packages/Shell/res/values-et-rEE/strings.xml b/packages/Shell/res/values-et-rEE/strings.xml index 2e1e037ae557..3edefa4f04e0 100644 --- a/packages/Shell/res/values-et-rEE/strings.xml +++ b/packages/Shell/res/values-et-rEE/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Kest"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Veaaruande loomine"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Veaaruanne jäädvustati"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Veaaruande jagamiseks pühkige vasakule"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Veaaruande jagamiseks puudutage"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Kuva see sõnum järgmisel korral"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Veaaruanded"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Veaaruande faili ei õnnestunud lugeda"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"nimeta"</string> </resources> diff --git a/packages/Shell/res/values-fa/strings.xml b/packages/Shell/res/values-fa/strings.xml index 578bb44c4e59..409fd53c74fa 100644 --- a/packages/Shell/res/values-fa/strings.xml +++ b/packages/Shell/res/values-fa/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"گزارش اشکال در حال ایجاد شدن است"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"گزارش اشکال دریافت شد"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"برای اشتراکگذاری گزارش اشکال، به تندی آن را به چپ بکشید"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"جهت اشتراکگذاری گزارش اشکال خود لمس کنید"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"دفعه بعد این پیام نشان داده شود"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"گزارش اشکال"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"فایل گزارش اشکال خوانده نشد"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"بینام"</string> </resources> diff --git a/packages/Shell/res/values-fr-rCA/strings.xml b/packages/Shell/res/values-fr-rCA/strings.xml index df5893ee731a..4dc448219d26 100644 --- a/packages/Shell/res/values-fr-rCA/strings.xml +++ b/packages/Shell/res/values-fr-rCA/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Le rapport de bogue est en cours de création"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Rapport de bogue enregistré"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Faites glisser le doigt vers la gauche pour partager votre rapport de bogue."</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Appuyer ici pour partager votre rapport de bogue"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Afficher ce message la prochaine fois"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Rapports de bogues"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Impossible de lire le fichier du rapport de bogue"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"sans nom"</string> </resources> diff --git a/packages/Shell/res/values-fr/strings.xml b/packages/Shell/res/values-fr/strings.xml index 52d4543a33a1..a3e4f7d0c2a3 100644 --- a/packages/Shell/res/values-fr/strings.xml +++ b/packages/Shell/res/values-fr/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Le rapport de bug est en cours de création."</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Rapport de bug enregistré"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Faites glisser le doigt vers la gauche pour partager votre rapport d\'erreur."</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Appuyez ici pour partager le rapport de bug"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Afficher ce message la prochaine fois"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Rapports d\'erreur"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Impossible de lire le fichier de rapport de bug."</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"sans nom"</string> </resources> diff --git a/packages/Shell/res/values-gl-rES/strings.xml b/packages/Shell/res/values-gl-rES/strings.xml index f9af246db797..8b28caa00969 100644 --- a/packages/Shell/res/values-gl-rES/strings.xml +++ b/packages/Shell/res/values-gl-rES/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Estase xerando o informe de erro"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Informe de erros rexistrado"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Pasa o dedo á esquerda para compartir o teu informe de erros"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Toca aquí para compartir o teu informe de erros"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Mostrar esta mensaxe a próxima vez"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Informes de erros"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Non se puido ler o ficheiro de informe de erros"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"sen nome"</string> </resources> diff --git a/packages/Shell/res/values-hr/strings.xml b/packages/Shell/res/values-hr/strings.xml index ce45c5058b96..1957bdb487c2 100644 --- a/packages/Shell/res/values-hr/strings.xml +++ b/packages/Shell/res/values-hr/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Ljuska"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Generira se izvješće o programskoj pogrešci"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Prijava programske pogreške snimljena je"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Prijeđite prstom ulijevo da biste poslali izvješće o programskim pogreškama"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Dodirnite za dijeljenje prijave programske pogreške"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Prikaži tu poruku sljedeći put"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Izvj. o prog. pogreš."</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Izvješće o programskoj pogrešci nije pročitano"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"bez naziva"</string> </resources> diff --git a/packages/Shell/res/values-hy-rAM/strings.xml b/packages/Shell/res/values-hy-rAM/strings.xml index dac4c25cc0a7..317cb0b9682f 100644 --- a/packages/Shell/res/values-hy-rAM/strings.xml +++ b/packages/Shell/res/values-hy-rAM/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Խեցի"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Վրիպակի զեկույցը ստեղծվում է"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Վրիպակի զեկույց է ստացվել"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Սահեցրեք ձախ՝ սխալի հաշվետվությունը համօգտագործելու համար"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Հպեք` ձեր վրիպակի մասին զեկույցը տարածելու համար"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Այս հաղորդագրությունը ցույց տալ հաջորդ անգամ"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Վրիպակների հաշվետվություններ"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Հնարավոր չէ կարդալ վրիպակների զեկույցի ֆայլը"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"անանուն"</string> </resources> diff --git a/packages/Shell/res/values-is-rIS/strings.xml b/packages/Shell/res/values-is-rIS/strings.xml index 495ec55c2525..39605db770ef 100644 --- a/packages/Shell/res/values-is-rIS/strings.xml +++ b/packages/Shell/res/values-is-rIS/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Skipanalína"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Verið er að búa til villutilkynningu"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Villutilkynning útbúin"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Strjúktu til vinstri til að deila villuskýrslunni"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Snertu til að deila villutilkynningunni"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Sýna þessi skilaboð næst"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Villutilkynningar"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Ekki var hægt að lesa úr villuskýrslunni"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"án heitis"</string> </resources> diff --git a/packages/Shell/res/values-ja/strings.xml b/packages/Shell/res/values-ja/strings.xml index 11533e066489..fd4a1508a35e 100644 --- a/packages/Shell/res/values-ja/strings.xml +++ b/packages/Shell/res/values-ja/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"シェル"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"バグレポートを生成しています"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"バグレポートが記録されました"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"バグレポートを共有するには左にスワイプ"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"バグレポートを共有するにはタップします"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"このメッセージを次回も表示する"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"バグレポート"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"バグレポート ファイルを読み取ることができませんでした"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"名前なし"</string> </resources> diff --git a/packages/Shell/res/values-ka-rGE/strings.xml b/packages/Shell/res/values-ka-rGE/strings.xml index 5d1a41755c48..802f9448b327 100644 --- a/packages/Shell/res/values-ka-rGE/strings.xml +++ b/packages/Shell/res/values-ka-rGE/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"გარეკანი"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"მიმდინარეობს ხარვეზის შესახებ ანგარიშის გენერირება"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"ანგარიში ხარვეზების შესახებ შექმნილია"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"გაასრიალეთ მარცხნივ თქვენი ხარვეზის შეტყობინების გასაზიარებლად"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"შეეხეთ თქვენი ხარვეზების ანგარიშის გასაზიარებლად"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"შემდგომში აჩვენე ეს შეტყობინება"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"შეცდომების ანგარიშები"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"ხარვეზების შესახებ ანგარიშის წაკითხვა ვერ მოხერხდა"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"უსახელო"</string> </resources> diff --git a/packages/Shell/res/values-ko/strings.xml b/packages/Shell/res/values-ko/strings.xml index 8ef29dbf0bfc..5e96e6d8239a 100644 --- a/packages/Shell/res/values-ko/strings.xml +++ b/packages/Shell/res/values-ko/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"셸"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"버그 신고 생성 중"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"버그 신고서 캡처됨"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"왼쪽으로 스와이프하여 버그 신고서를 공유하세요."</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"버그 신고서를 공유하려면 터치하세요."</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"다음에 이 메시지 표시"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"버그 신고"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"버그 신고 파일을 읽을 수 없습니다."</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"이름 없음"</string> </resources> diff --git a/packages/Shell/res/values-ky-rKG/strings.xml b/packages/Shell/res/values-ky-rKG/strings.xml index cf043b25ac33..aafeb2433d89 100644 --- a/packages/Shell/res/values-ky-rKG/strings.xml +++ b/packages/Shell/res/values-ky-rKG/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Командалык кабык"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Мүчүлүштүктөр тууралуу билдирүү өндүрүлүүдө"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Ката тууралуу билдирүү түзүлдү"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Ката жөнүндө кабар менен бөлүшүү үчүн солго серпип коюңуз"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Ката тууралуу билдирүүңүздү жөнөтүш үчүн, тийиңиз"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Бул билдирүү кийин көрсөтүлсүн"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Мүчүлүштүктөрдү кабарлоолор"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Мүчүлүштүк тууралуу кабарлаган файл окулбай койду"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"аты жок"</string> </resources> diff --git a/packages/Shell/res/values-mk-rMK/strings.xml b/packages/Shell/res/values-mk-rMK/strings.xml index 1c5453e3e28e..0f3ed5a0f8fd 100644 --- a/packages/Shell/res/values-mk-rMK/strings.xml +++ b/packages/Shell/res/values-mk-rMK/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Обвивка"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Се генерира извештајот за грешки"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Извештајот за грешка е снимен"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Повлечете налево за да споделите пријава за грешка"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Допри да се сподели твојот извештај за грешка"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Прикажи ја поракава следниот пат"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Извештаи за грешки"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Датотеката со извештај за грешка не можеше да се прочита"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"неименувани"</string> </resources> diff --git a/packages/Shell/res/values-mn-rMN/strings.xml b/packages/Shell/res/values-mn-rMN/strings.xml index 1ca6f00dd554..8f6a2b010c89 100644 --- a/packages/Shell/res/values-mn-rMN/strings.xml +++ b/packages/Shell/res/values-mn-rMN/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Шел"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Алдааны тайланг үүсгэсэн"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Алдааны мэдээлэл хүлээн авав"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Өөрийн согог репортыг хуваалцахын тулд зүүн шудрана уу"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Та алдааны мэдэгдлийг хуваалцах бол хүрнэ үү"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Энэ мессежийг дараагийн удаа харуулах"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Гэмтлийн тухай тайлан"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Алдааны тайлангийн файлыг уншиж чадахгүй байна"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"нэр байхгүй"</string> </resources> diff --git a/packages/Shell/res/values-ms-rMY/strings.xml b/packages/Shell/res/values-ms-rMY/strings.xml index 4c39d9213730..4491add52dd0 100644 --- a/packages/Shell/res/values-ms-rMY/strings.xml +++ b/packages/Shell/res/values-ms-rMY/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Laporan pepijat sedang dijanakan"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Laporan pepijat telah ditangkap"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Leret ke kiri untuk berkongsi laporan pepijat anda"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Sentuh untuk berkongsi laporan pepijat anda"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Tunjukkan mesej ini pada masa akan datang"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Laporan pepijat"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Fail laporan pepijat tidak dapat dibaca"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"tidak bernama"</string> </resources> diff --git a/packages/Shell/res/values-nb/strings.xml b/packages/Shell/res/values-nb/strings.xml index 49214e0b781e..14a873c4a45d 100644 --- a/packages/Shell/res/values-nb/strings.xml +++ b/packages/Shell/res/values-nb/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Kommandoliste"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Feilrapporten blir generert"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Feilrapporten er lagret"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Sveip til venstre for å dele feilrapporten din"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Trykk for å dele feilrapporten din"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Vis denne meldingen neste gang"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Feilrapporter"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Feilrapportfilen kunne ikke leses"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"uten navn"</string> </resources> diff --git a/packages/Shell/res/values-nl/strings.xml b/packages/Shell/res/values-nl/strings.xml index 71d068b26814..9bfce9452190 100644 --- a/packages/Shell/res/values-nl/strings.xml +++ b/packages/Shell/res/values-nl/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Bugrapport wordt gegenereerd"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Foutenrapport vastgelegd"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Veeg naar links om je bugmelding te delen"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Raak aan om je foutenrapport te delen"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Dit bericht de volgende keer weergeven"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Foutenrapporten"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Bestand met bugrapport kan niet worden gelezen"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"naamloos"</string> </resources> diff --git a/packages/Shell/res/values-pl/strings.xml b/packages/Shell/res/values-pl/strings.xml index f79c198555a2..0c8a6b400fcb 100644 --- a/packages/Shell/res/values-pl/strings.xml +++ b/packages/Shell/res/values-pl/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Powłoka"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Trwa generowanie raportu o błędzie"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Raport o błędach został zapisany"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Przesuń palcem w lewo, by udostępnić swoje zgłoszenie błędu"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Kliknij, by udostępnić raport o błędach"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Pokaż ten komunikat następnym razem"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Raporty o błędach"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Nie można odczytać raportu o błędzie"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"bez nazwy"</string> </resources> diff --git a/packages/Shell/res/values-pt-rPT/strings.xml b/packages/Shell/res/values-pt-rPT/strings.xml index a025cbc6e453..417c44419246 100644 --- a/packages/Shell/res/values-pt-rPT/strings.xml +++ b/packages/Shell/res/values-pt-rPT/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"O relatório de erro está a ser gerado"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Relatório de erros capturado"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Deslizar rapidamente para a esquerda para partilhar o seu relatório de erros"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Toque para partilhar o relatório de erros"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Mostrar esta mensagem da próxima vez"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Relatórios de erros"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Não foi possível ler o ficheiro de relatório de erro"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"sem nome"</string> </resources> diff --git a/packages/Shell/res/values-ro/strings.xml b/packages/Shell/res/values-ro/strings.xml index ac14e9082304..132f21f90f2c 100644 --- a/packages/Shell/res/values-ro/strings.xml +++ b/packages/Shell/res/values-ro/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Se generează raportul de eroare"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Raportul despre erori a fost creat"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Glisați la stânga pentru a trimite raportul de erori"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Atingeți pentru a permite accesul la raportul despre erori"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Afișați acest mesaj data viitoare"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Rapoarte de erori"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Fișierul cu raportul de eroare nu a putut fi citit"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"fără nume"</string> </resources> diff --git a/packages/Shell/res/values-sl/strings.xml b/packages/Shell/res/values-sl/strings.xml index a4c30617c9d9..91041e162971 100644 --- a/packages/Shell/res/values-sl/strings.xml +++ b/packages/Shell/res/values-sl/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Lupina"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Poročilo o napakah se pripravlja"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Poročilo o napaki je posneto"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Povlecite v levo, če želite poslati sporočilo o napaki"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Dotaknite se, če želite deliti sporočilo o napaki z drugimi"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Pokaži to sporočilo naslednjič"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Poročila o napakah"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Datoteke s poročilom o napakah ni bilo mogoče prebrati"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"neimenovano"</string> </resources> diff --git a/packages/Shell/res/values-sq-rAL/strings.xml b/packages/Shell/res/values-sq-rAL/strings.xml index fe100f25a2ff..e91aa09c1dc5 100644 --- a/packages/Shell/res/values-sq-rAL/strings.xml +++ b/packages/Shell/res/values-sq-rAL/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Guaska"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Po krijohet raporti i defekteve në kod"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Raporti i defektit në kod u regjistrua"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Rrëshqit majtas për të ndarë raportin e defektit në kod"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Prek për të ndarë raportin e defektit në kod"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Tregoje këtë mesazh herën tjetër"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Raportet e gabimeve"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Skedari i raportimit të defektit në kod nuk mund të lexohej."</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"e paemërtuar"</string> </resources> diff --git a/packages/Shell/res/values-sr/strings.xml b/packages/Shell/res/values-sr/strings.xml index d8735912e225..1be47da769ad 100644 --- a/packages/Shell/res/values-sr/strings.xml +++ b/packages/Shell/res/values-sr/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Извештај о грешци се генерише"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Извештај о грешци је снимљен"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Превуците улево да бисте делили извештај о грешкама"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Додирните да бисте делили извештај о грешци"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Прикажи ову поруку следећи пут"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Извештаји о грешкама"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Датотека извештаја о грешци не може да се прочита"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"неименовано"</string> </resources> diff --git a/packages/Shell/res/values-sv/strings.xml b/packages/Shell/res/values-sv/strings.xml index 65bc05573d91..9f5b5f07cb41 100644 --- a/packages/Shell/res/values-sv/strings.xml +++ b/packages/Shell/res/values-sv/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Skal"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Felrapporten genereras"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Felrapporten har skapats"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Svep åt vänster om du vill dela felrapporten"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Tryck om du vill dela felrapporten"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Visa det här meddelandet nästa gång"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Felrapporter"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Det gick inte att läsa felrapporten"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"namnlös"</string> </resources> diff --git a/packages/Shell/res/values-sw/strings.xml b/packages/Shell/res/values-sw/strings.xml index 927c4d8d7bc1..422ca81a17ee 100644 --- a/packages/Shell/res/values-sw/strings.xml +++ b/packages/Shell/res/values-sw/strings.xml @@ -25,5 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Onyesha ujumbe huu wakati mwingine"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Ripoti za hitilafu"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Faili ya ripoti ya hitilafu haikusomwa"</string> - <string name="bugreport_unnamed" msgid="2800582406842092709">"isiyokuwa na jina"</string> + <string name="bugreport_unnamed" msgid="2800582406842092709">"Isiyo na jina"</string> </resources> diff --git a/packages/Shell/res/values-ta-rIN/strings.xml b/packages/Shell/res/values-ta-rIN/strings.xml index 4bf3d609bfd2..31daf5421e51 100644 --- a/packages/Shell/res/values-ta-rIN/strings.xml +++ b/packages/Shell/res/values-ta-rIN/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"ஷெல்"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"பிழை அறிக்கை உருவாக்கப்படுகிறது"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"பிழை அறிக்கைகள் படமெடுக்கப்பட்டன"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"பிழை அறிக்கையைப் பகிர இடது புறமாகத் தேய்க்கவும்"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"உங்கள் பிழை அறிக்கையைப் பகிர, தொடவும்"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"இந்தச் செய்தியை அடுத்த முறைக் காட்டு"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"பிழை அறிக்கைகள்"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"பிழை அறிக்கையைப் படிக்க முடியவில்லை"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"பெயரிடப்படாதது"</string> </resources> diff --git a/packages/Shell/res/values-th/strings.xml b/packages/Shell/res/values-th/strings.xml index 66492de054e2..2d9a65ef0463 100644 --- a/packages/Shell/res/values-th/strings.xml +++ b/packages/Shell/res/values-th/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"กำลังสร้างรายงานข้อบกพร่อง"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"จับภาพรายงานข้อบกพร่องแล้ว"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"กวาดไปทางซ้ายเพื่อแชร์รายงานข้อบกพร่อง"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"แตะเพื่อแชร์รายงานข้อบกพร่องของคุณ"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"แสดงข้อความนี้ในครั้งต่อไป"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"รายงานข้อบกพร่อง"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"ไม่สามารถอ่านไฟล์รายงานข้อบกพร่อง"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"ไม่มีชื่อ"</string> </resources> diff --git a/packages/Shell/res/values-tl/strings.xml b/packages/Shell/res/values-tl/strings.xml index f43dc9f2f723..8fead8f8293c 100644 --- a/packages/Shell/res/values-tl/strings.xml +++ b/packages/Shell/res/values-tl/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Binubuo na ang ulat ng bug"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Na-capture ang ulat ng bug"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Mag-swipe pakaliwa upang ibahagi ang iyong ulat ng bug"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Pindutin upang ibahagi ang iyong ulat ng bug"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Ipakita ang mensaheng ito sa susunod"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Mga ulat sa bug"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Hindi mabasa ang file ng pag-uulat ng bug"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"walang pangalan"</string> </resources> diff --git a/packages/Shell/res/values-tr/strings.xml b/packages/Shell/res/values-tr/strings.xml index 4f7772e5e6be..e1d30cc429fe 100644 --- a/packages/Shell/res/values-tr/strings.xml +++ b/packages/Shell/res/values-tr/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Kabuk"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Hata raporu oluşturuluyor"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Hata raporu kaydedildi"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Hata raporunuzu paylaşmak için hızlıca sola kaydırın"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Hata raporunuzu paylaşmak için dokunun"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Bir dahaki sefere bu iletiyi göster"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Hata raporları"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Hata raporu dosyası okunamadı"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"adsız"</string> </resources> diff --git a/packages/Shell/res/values-uk/strings.xml b/packages/Shell/res/values-uk/strings.xml index 6c6d70dd9828..f1396cb3950e 100644 --- a/packages/Shell/res/values-uk/strings.xml +++ b/packages/Shell/res/values-uk/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Оболонка"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Генерується повідомлення про помилку"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Звіт про помилки створено"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Проведіть пальцем ліворуч, щоб надіслати звіт про помилки"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Торкніться, щоб надіслати звіт про помилки"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Показати це повідомлення наступного разу"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Звіти про помилки"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Не вдалося прочитати звіт про помилки"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"без назви"</string> </resources> diff --git a/packages/Shell/res/values-ur-rPK/strings.xml b/packages/Shell/res/values-ur-rPK/strings.xml index c6a68511e2d6..412d23052c6d 100644 --- a/packages/Shell/res/values-ur-rPK/strings.xml +++ b/packages/Shell/res/values-ur-rPK/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"شیل"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"بگ رپورٹ تخلیق ہو رہی ہے"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"بَگ رپورٹ کیپچر کر لی گئی"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"اپنی بگ رپورٹ کا اشتراک کرنے کیلئے بائیں سوائپ کریں"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"اپنی بَگ رپورٹ کا اشتراک کرنے کیلئے ٹچ کریں"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"یہ پیغام اگلی بار دکھائیں"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"بگ رپورٹس"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"بگ رپورٹ فائل پڑھی نہیں جا سکی"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"بغیر نام"</string> </resources> diff --git a/packages/Shell/res/values-uz-rUZ/strings.xml b/packages/Shell/res/values-uz-rUZ/strings.xml index c2cd1dcd2af7..ca46d2ae731a 100644 --- a/packages/Shell/res/values-uz-rUZ/strings.xml +++ b/packages/Shell/res/values-uz-rUZ/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Terminal"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"Xatoliklar hisoboti tayyorlanmoqda"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"Xatolik hisobotini yozib olindi"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Xatolik hisobotini yuborish uchun barmog‘ingiz bilan chapga suring"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Xatolik hisobotini bo‘lishish uchun barmog‘ingizni tegizing."</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"Ushbu xabar keyingi safar ko‘rsatilsin"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Xatoliklar hisoboti"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Xatoliklar hisoboti faylini o‘qib bo‘lmadi"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"nomsiz"</string> </resources> diff --git a/packages/Shell/res/values-zh-rCN/strings.xml b/packages/Shell/res/values-zh-rCN/strings.xml index 03af82395418..5a8e5f7f3d36 100644 --- a/packages/Shell/res/values-zh-rCN/strings.xml +++ b/packages/Shell/res/values-zh-rCN/strings.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Shell"</string> - <!-- no translation found for bugreport_in_progress_title (7409917338223386637) --> - <skip /> + <string name="bugreport_in_progress_title" msgid="7409917338223386637">"正在生成错误报告"</string> <string name="bugreport_finished_title" msgid="2293711546892863898">"已抓取错误报告"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"向左滑动即可分享错误报告"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"触摸即可分享您的错误报告"</string> @@ -26,6 +25,5 @@ <string name="bugreport_confirm_repeat" msgid="4926842460688645058">"下次再显示这条讯息"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"错误报告"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"无法读取错误报告文件"</string> - <!-- no translation found for bugreport_unnamed (2800582406842092709) --> - <skip /> + <string name="bugreport_unnamed" msgid="2800582406842092709">"未命名"</string> </resources> diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java index a54d9eff15b0..0e31cdf4a0e2 100644 --- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java +++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java @@ -49,6 +49,7 @@ import android.os.Bundle; import android.os.SystemProperties; import android.service.notification.StatusBarNotification; import android.support.test.uiautomator.UiDevice; +import android.support.test.uiautomator.UiObject; import android.test.InstrumentationTestCase; import android.util.Log; @@ -68,8 +69,7 @@ import com.android.shell.ActionSendMultipleConsumerActivity.CustomActionSendMult * <li>asserts the extras received by the custom activity * </ul> * <p> - * TODO: currently, these tests only work if the bug report sharing warning is disabled and the - * device screen is unlocked. + * <strong>NOTE</strong>: these tests only work if the device is unlocked. */ public class BugreportReceiverTest extends InstrumentationTestCase { @@ -99,6 +99,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { mUiBot = new UiBot(UiDevice.getInstance(instrumentation), TIMEOUT); mListener = ActionSendMultipleConsumerActivity.getListener(mContext); cancelExistingNotifications(); + BugreportPrefs.setWarningState(mContext, BugreportPrefs.STATE_HIDE); } public void testFullWorkflow() throws Exception { @@ -132,6 +133,36 @@ public class BugreportReceiverTest extends InstrumentationTestCase { // TODO: assert service is down } + public void testBugreportFinished_withWarning() throws Exception { + // Explicitly shows the warning. + BugreportPrefs.setWarningState(mContext, BugreportPrefs.STATE_SHOW); + + // Send notification and click on share. + createTextFile(PLAIN_TEXT_PATH, BUGREPORT_CONTENT); + Intent intent = new Intent(INTENT_BUGREPORT_FINISHED); + intent.putExtra(EXTRA_BUGREPORT, PLAIN_TEXT_PATH); + mContext.sendBroadcast(intent); + mUiBot.clickOnNotification(mContext.getString(R.string.bugreport_finished_title)); + + // Handle the warning + mUiBot.getVisibleObject(mContext.getString(R.string.bugreport_confirm)); + // TODO: get ok and showMessageAgain from the dialog reference above + UiObject showMessageAgain = + mUiBot.getVisibleObject(mContext.getString(R.string.bugreport_confirm_repeat)); + mUiBot.click(showMessageAgain, "show-message-again"); + UiObject ok = mUiBot.getVisibleObject(mContext.getString(com.android.internal.R.string.ok)); + mUiBot.click(ok, "ok"); + + // Share the bugreport. + mUiBot.chooseActivity(UI_NAME); + Bundle extras = mListener.getExtras(); + assertActionSendMultiple(extras, BUGREPORT_CONTENT, null); + + // Make sure it's hidden now. + int newState = BugreportPrefs.getWarningState(mContext, BugreportPrefs.STATE_UNKNOWN); + assertEquals("Didn't change state", BugreportPrefs.STATE_HIDE, newState); + } + public void testBugreportFinished_plainBugreportAndScreenshot() throws Exception { createTextFile(PLAIN_TEXT_PATH, BUGREPORT_CONTENT); createTextFile(SCREENSHOT_PATH, SCREENSHOT_CONTENT); diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 2f79adfcb8e8..2e65656546c3 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -180,13 +180,6 @@ </intent-filter> </receiver> - <receiver android:name=".qs.tiles.HotspotTile$APChangedReceiver" - androidprv:systemUserOnly="true"> - <intent-filter> - <action android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" /> - </intent-filter> - </receiver> - <activity android:name=".tuner.TunerActivity" android:enabled="false" android:icon="@drawable/tuner" diff --git a/packages/SystemUI/res/drawable/header_dot.xml b/packages/SystemUI/res/drawable/header_dot.xml new file mode 100644 index 000000000000..568a9c29175a --- /dev/null +++ b/packages/SystemUI/res/drawable/header_dot.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** Copyright 2015, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +--> +<shape + xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + + <solid + android:color="#FFFFFF"/> + + <size + android:width="3dp" + android:height="3dp"/> +</shape> diff --git a/core/res/res/drawable/ic_arrow_up_14dp.xml b/packages/SystemUI/res/drawable/quick_header_bg.xml index c4cc0d1599b4..d45d673d8bca 100644 --- a/core/res/res/drawable/ic_arrow_up_14dp.xml +++ b/packages/SystemUI/res/drawable/quick_header_bg.xml @@ -1,3 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> <!-- ~ Copyright (C) 2015 The Android Open Source Project ~ @@ -13,12 +14,8 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="14.0dp" - android:height="14.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:pathData="M12.000000,8.000000l-6.000000,6.000000 1.400000,1.400000 4.600000,-4.599999 4.600000,4.599999 1.400000,-1.400000z" - android:fillColor="#FF000000"/> -</vector> + +<ripple xmlns:android="http://schemas.android.com/apk/res/android" + android:color="?android:attr/colorControlHighlight" > + <item android:drawable="@color/system_primary_color"/> +</ripple> diff --git a/packages/SystemUI/res/layout/hybrid_notification.xml b/packages/SystemUI/res/layout/hybrid_notification.xml index 9e64d2cc6eb6..f6678593084c 100644 --- a/packages/SystemUI/res/layout/hybrid_notification.xml +++ b/packages/SystemUI/res/layout/hybrid_notification.xml @@ -18,21 +18,23 @@ <com.android.systemui.statusbar.notification.HybridNotificationView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="@dimen/notification_max_height"> + android:layout_height="wrap_content" + android:paddingStart="@*android:dimen/notification_content_margin_start" + android:paddingEnd="12dp" + android:gravity="bottom"> <TextView android:id="@+id/notification_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_vertical" + android:paddingEnd="4dp" android:singleLine="true" android:textAppearance="@*android:style/TextAppearance.Material.Notification.Title" - android:paddingEnd="4dp" /> <TextView android:id="@+id/notification_text" - android:layout_width="wrap_content" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center_vertical" + android:paddingEnd="4dp" android:textAppearance="@*android:style/TextAppearance.Material.Notification" android:singleLine="true" /> diff --git a/packages/SystemUI/res/layout/notification_children_divider.xml b/packages/SystemUI/res/layout/notification_children_divider.xml index f011afebb2ef..53273cf108ca 100644 --- a/packages/SystemUI/res/layout/notification_children_divider.xml +++ b/packages/SystemUI/res/layout/notification_children_divider.xml @@ -20,4 +20,4 @@ android:id="@+id/notification_more_divider" android:layout_width="match_parent" android:layout_height="@dimen/notification_children_divider_height" - android:background="@*android:drawable/notification_template_divider" /> + android:background="#61000000" /> diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml index 187316885f9f..bb37b83af336 100644 --- a/packages/SystemUI/res/layout/qs_panel.xml +++ b/packages/SystemUI/res/layout/qs_panel.xml @@ -19,7 +19,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/qs_background_primary" - android:paddingTop="8dp" android:paddingBottom="8dp" android:elevation="2dp"> diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml index cc35c51c3ee8..e949adc8a748 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml @@ -25,21 +25,14 @@ android:layout_gravity="@integer/notification_panel_layout_gravity" android:paddingStart="@dimen/notification_side_padding" android:paddingEnd="@dimen/notification_side_padding" + android:clipChildren="false" + android:clipToPadding="false" android:baselineAligned="false" - android:elevation="4dp" - android:background="@drawable/notification_header_bg" + android:background="@drawable/quick_header_bg" android:clickable="true" android:focusable="true" > - <com.android.systemui.qs.QuickQSPanel - android:id="@+id/quick_qs_panel" - android:background="#0000" - android:layout_width="144dp" - android:layout_height="match_parent" - android:layout_alignParentEnd="true" - android:layout_marginEnd="12dp" /> - <LinearLayout android:id="@+id/expanded_group" android:layout_width="wrap_content" @@ -49,7 +42,8 @@ android:clipToPadding="false" android:orientation="horizontal" android:layout_alignParentEnd="true" - android:layout_marginEnd="10dp"> + android:layout_marginTop="30dp" + android:layout_marginEnd="16dp"> <com.android.systemui.statusbar.AlphaOptimizedFrameLayout android:id="@+id/settings_button_container" @@ -84,49 +78,60 @@ android:tint="@android:color/white" /> </LinearLayout> - <FrameLayout - android:id="@+id/date_group" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/clock_collapsed_bottom_margin" - android:layout_alignParentBottom="true"> - <com.android.systemui.statusbar.policy.DateView android:id="@+id/date_collapsed" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:singleLine="true" - android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date" - android:layout_below="@id/clock" - systemui:datePattern="@string/abbrev_wday_month_day_no_year_alarm" - /> - </FrameLayout> - <include layout="@layout/split_clock_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:layout_above="@id/date_group" + android:layout_marginTop="2dp" + android:layout_alignParentStart="true" + android:layout_alignParentTop="true" android:id="@+id/clock" /> - <com.android.systemui.statusbar.AlphaOptimizedButton android:id="@+id/alarm_status" + <com.android.systemui.statusbar.policy.DateView + android:id="@+id/date" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - android:layout_toEndOf="@id/date_group" - android:layout_marginBottom="4dp" + android:layout_marginStart="6dp" + android:layout_marginTop="8dp" + android:layout_toEndOf="@id/clock" + android:layout_alignParentTop="true" + android:drawableStart="@drawable/header_dot" + android:drawablePadding="6dp" + android:singleLine="true" + android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock" + android:textSize="@dimen/qs_time_collapsed_size" + systemui:datePattern="@string/abbrev_wday_month_day_no_year_alarm" + /> + + <com.android.systemui.statusbar.AlphaOptimizedButton + android:id="@+id/alarm_status" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:layout_toEndOf="@id/date" android:drawablePadding="6dp" android:drawableStart="@drawable/ic_access_alarms_small" android:textColor="#64ffffff" android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date" - android:paddingEnd="6dp" + android:minHeight="36dp" android:paddingStart="6dp" - android:paddingTop="16dp" - android:paddingBottom="16dp" android:background="?android:attr/selectableItemBackground" android:visibility="gone" /> + <com.android.systemui.qs.QuickQSPanel + android:id="@+id/quick_qs_panel" + android:background="#0000" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="30dp" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:layout_alignParentEnd="true" + android:clipChildren="false" + android:clipToPadding="false" /> + <include android:id="@+id/qs_detail_header" layout="@layout/qs_detail_header" diff --git a/packages/SystemUI/res/layout/split_clock_view.xml b/packages/SystemUI/res/layout/split_clock_view.xml index d1269dabf286..ae5136f2a399 100644 --- a/packages/SystemUI/res/layout/split_clock_view.xml +++ b/packages/SystemUI/res/layout/split_clock_view.xml @@ -27,6 +27,7 @@ android:layout_height="wrap_content" android:singleLine="true" android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock" + android:textSize="@dimen/qs_time_collapsed_size" /> <TextClock android:id="@+id/am_pm_view" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 7006d439330f..f3e7cfe289be 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Luitoestel stil."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Maak <xliff:g id="APP">%s</xliff:g> toe."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> verwerp."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle onlangse programme is toegemaak."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobiele warmkol afgeskakel."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobiele warmkol aangeskakel."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Uitsaai van skerm gestaak."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Skermhelderheid"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G-data is laat wag"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data is laat wag"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> gebruik"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g>-limiet"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> waarskuwing"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Jou onlangse skerms verskyn hier"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Programinligting"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"skermvaspen"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Weier"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is die volumedialoog"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Raak om die oorspronklike terug te stel."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Jy gebruik tans jou werkprofiel"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Stelsel-UI-ontvanger"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Wys persentasie van ingebedde battery"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 948c538fa009..838a4eb2f31c 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"የስልክ ጥሪ ፀጥታ።"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> አስወግድ።"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ተሰናብቷል::"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ሁሉም የቅርብ ጊዜ ማመልከቻዎች ተሰናብተዋል።"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"የተንቀሳቃሽ ስልክ መገናኛ ነጥብ ጠፍቷል።"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"የተንቀሳቃሽ ስልክ መገናኛ ነጥብ በርቷል።"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"ማያ ገጽ መውሰድ ቆሟል።"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"ብሩህነት ያሳዩ"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2ጂ-3ጂ ውሂብ ላፍታ ቆሟል"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4ጂ ውሂብ ላፍታ ቆሟል"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ጥቅም ላይ ውሏል"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ገደብ"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"የ<xliff:g id="DATA_LIMIT">%s</xliff:g> ማስጠንቀቂያ"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"የቅርብ ጊዜ ማያ ገጾችዎ እዚህ ይታያሉ"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"የመተግበሪያ መረጃ"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ማያ ገጽ መሰካት"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ከልክል"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> የድምጽ መጠን መገናኛው ነው"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"የመጀመሪያውን ወደነበረበት ለመመለስ ይንኩ።"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">"፣"</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"የስራ መገለጫዎን እየተጠቀሙ ነው"</string> <string name="system_ui_tuner" msgid="708224127392452018">"የስርዓት በይነገጽ መቃኛ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"የተቀላቀለ የባትሪ አጠቃቀም መቶኛ አሳይ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index e2723642ebb2..2789ffa553e6 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -165,6 +165,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"رنين صامت."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"إزالة <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"تمت إزالة <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"تم تجاهل كل التطبيقات المستخدمة مؤخرًا."</string> @@ -216,6 +218,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"تم إيقاف نقطة اتصال الجوّال."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"تم تشغيل نقطة اتصال الجوّال."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"توقف إرسال الشاشة."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"سطوع الشاشة"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"بيانات شبكات الجيل الثاني والثالث متوقفة مؤقتًا"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"تم إيقاف بيانات شبكة الجيل الرابع مؤقتًا"</string> @@ -293,6 +303,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> مستخدم"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"قيد <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"تحذير <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"تظهر شاشاتك المعروضة مؤخرًا هنا"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"معلومات التطبيق"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"تثبيت الشاشة"</string> @@ -407,7 +419,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"رفض"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> هو مربع حوار مستوى الصوت"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"المس لاستعادة الإعداد الأصلي."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">"،"</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"أنت تستخدم ملفك الشخصي للعمل"</string> <string name="system_ui_tuner" msgid="708224127392452018">"أداة ضبط واجهة مستخدم النظام"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"عرض نسبة البطارية المدمجة"</string> diff --git a/packages/SystemUI/res/values-az-rAZ/strings.xml b/packages/SystemUI/res/values-az-rAZ/strings.xml index 7f2a6b071d2b..652f71c4a1bc 100644 --- a/packages/SystemUI/res/values-az-rAZ/strings.xml +++ b/packages/SystemUI/res/values-az-rAZ/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Zəngvuran səssiz."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> kənarlaşdırın."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> çıxarıldı."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Bütün son tətbiqlər kənarlaşdırıldı."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobil hotspot deaktivdir."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobil hotspot aktivdir."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Ekran yayımı dayandırıldı."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Display brightness"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G məlumatlarına fasilə verildi"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G məlumatlarına fasilə verildi"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> işlənib"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> limit"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> xəbərdarlığı"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Your recent screens appear here"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Tətbiq haqqında"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ekran sancağı"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Rədd et"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> proqramı səs səviyyəsi dialoqudur"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Orijinalı bərpa etmək üçün toxun."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"İş profilinizi istifadə edirsiniz"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Daxil batareya faizini göstərin"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 6ed2adbfb561..0bbdbe92db8d 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Звънът е заглушен."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Отхвърляне на <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Приложението <xliff:g id="APP">%s</xliff:g> е отхвърлено."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Всички скорошни приложения са отхвърлени."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Мобилната точка за достъп се изключи."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Мобилната точка за достъп се включи."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Предаването на съдържанието от екрана спря."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Яркост на екрана"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Данните от 2G – 3G са поставени на пауза"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Данните от 4G са поставени на пауза"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Използвано: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ограничение от <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Предупреждение: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Скорошните ви екрани се показват тук"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Информация за приложението"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"фиксиране на екрана"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Отказване"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> изпълнява ролята на диалоговия прозорец за силата на звука"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Докоснете, за да възстановите оригинала."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Използвате служебния си потребителски профил"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Тунер на системния потребителски интерфейс"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Показване на процента на вградената батерия"</string> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 20e2c354b8d7..e1c3d5ebac8d 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"রিং বাজানো বন্ধ করুন৷"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> খারিজ করুন।"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> খারিজ করা হয়েছে৷"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"সমস্ত সাম্প্রতিক অ্যাপ্লিকেশন খারিজ করা হয়েছে।"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"মোবাইল হটস্পট বন্ধ হয়েছে।"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"মোবাইল হটস্পট চালু হয়েছে।"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"স্ক্রীন কাস্ট করা থেমেছে।"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"প্রদর্শনের উজ্জ্বলতা"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ডেটা বিরতি দেওয়া হয়েছে"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ডেটা বিরতি দেওয়া হয়েছে"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ব্যবহৃত হয়েছে"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"সীমা <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সতর্কতা"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"আপনার সাম্প্রতিক স্ক্রীনগুলো এখানে দেখা যাবে"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"অ্যাপ্লিকেশানের তথ্য"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"স্ক্রীন পিন করা"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"প্রত্যাখ্যান করুন"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> হল ভলিউম ডায়লগ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"আসলটি পুনঃস্থাপন করতে স্পর্শ করুন৷"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"আপনি আপনার কাজের প্রোফাইল ব্যবহার করছেন"</string> <string name="system_ui_tuner" msgid="708224127392452018">"সিস্টেম UI টিউনার"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"এম্বেড করা ব্যাটারির শতকরা হার দেখায়"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 0bb4826e2390..e361ed0f3f23 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Mode silenci."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ignora <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"S\'ha omès <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"S\'han descartat totes les aplicacions recents."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"El punt d\'accés mòbil està desactivat."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"El punt d\'accés mòbil està activat."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"S\'ha aturat l\'emissió de la pantalla."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Brillantor de la pantalla"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Les dades 2G-3G estan aturades"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Les dades 4G estan aturades"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Utilitzats: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Límit: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advertiment: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Aquí es mostren les teves pantalles recents."</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informació de l\'aplicació"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixació de pantalla"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Denega"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> és el diàleg de volum"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca per restaurar l\'original."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estàs utilitzant el perfil professional"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Personalitzador d\'interfície d\'usuari"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostra el percentatge de la bateria inserit"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 63a16ad32026..11a9bbe15095 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -163,6 +163,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Tiché vyzvánění."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Zavřít aplikaci <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikace <xliff:g id="APP">%s</xliff:g> byla odebrána."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Všechny naposledy použité aplikace byly odstraněny."</string> @@ -214,6 +216,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobile hotspot je vypnutý."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobile hotspot je zapnutý."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Odesílání obrazovky zastaveno."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Jas displeje"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Data 2G a 3G jsou pozastavena"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Data 4G jsou pozastavena"</string> @@ -291,6 +301,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Využito: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limit: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozornění při <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Zde budou zobrazeny vaše poslední obrazovky"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informace o aplikaci"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"připnutí obrazovky"</string> @@ -405,7 +417,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odmítnout"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je dialog hlasitosti"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Klepnutím obnovíte originál."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Používáte pracovní profil"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Nástroj na ladění uživatelského rozhraní systému"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Zobrazovat vložené procento nabití baterie"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index eb8053d922a5..aef1037bace4 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Lydløs."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Afvis <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> er annulleret."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle de seneste applikationer er lukket."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobilhotspot er slået fra."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobilhotspot er slået til."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Casting af din skærm er stoppet."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Skærmens lysstyrke"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G-data er sat på pause"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data er sat på pause"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> brugt"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Grænse: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advarsel ved <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Dine seneste skærme vises her"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Oplysninger om applikationen"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"bliv i app"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Afvis"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er dialogboksen for lydstyrke"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tryk for at gendanne originalen."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Du bruger din arbejdsprofil"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Vis procent for det indbyggede batteri"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index e156c92da9c8..6ba1a8ede188 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Klingelton lautlos"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> beenden"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> entfernt"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle kürzlich verwendeten Apps wurden entfernt."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Der mobile Hotspot ist deaktiviert."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Der mobile Hotspot ist aktiviert."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Die Bildschirmübertragung wurde angehalten."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Helligkeit des Displays"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-/3G-Daten pausiert"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-Daten pausiert"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> verwendet"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> Datenlimit"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Warnung für <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Hier sehen Sie Ihre zuletzt geöffneten Apps."</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"App-Info"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"Bildschirmfixierung"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Ablehnen"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> regelt die Lautstärke."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Zum Wiederherstellen des Originals hier tippen"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">"u."</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Sie verwenden Ihr Arbeitsprofil."</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Eingebettete Akku-Prozentzahl anzeigen"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index b0dcc40f5a88..c9c7efbd5d26 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Ειδοποίηση ήχου στο αθόρυβο."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Παράβλεψη <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Απορρίφθηκαν <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Έγινε παράβλεψη όλων των πρόσφατων εφαρμογών."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Το σημείο πρόσβασης κινητής συσκευής απενεργοποιήθηκε."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Το σημείο πρόσβασης κινητής συσκευής ενεργοποιήθηκε."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Η μετάδοση της οθόνης διακόπηκε."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Φωτεινότητα οθόνης"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Τα δεδομένα 2G-3G τέθηκαν σε παύση"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Τα δεδομένα 4G τέθηκαν σε παύση"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Χρησιμοποιούνται <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Όριο <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Προειδοποίηση για <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Οι πρόσφατες οθόνες σας εμφανίζονται εδώ"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Πληροφορίες εφαρμογής"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"καρφίτσωμα οθόνης"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Απόρριψη"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> αποτελεί το παράθυρο διαλόγου ελέγχου έντασης"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Αγγίξτε για επαναφορά αρχικού."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Χρησιμοποιείτε το προφίλ εργασίας σας"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Εμφάνιση ποσοστού ενσωματωμένης μπαταρίας"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 84f178565e13..f3061d720c98 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -161,6 +161,7 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Ringer silent."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <string name="accessibility_work_mode" msgid="2478631941714607225">"Work mode"</string> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Dismiss <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"All recent applications dismissed."</string> @@ -212,6 +213,10 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobile hotspot turned off."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobile hotspot turned on."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Screen casting stopped."</string> + <string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"Work mode off."</string> + <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Work mode on."</string> + <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Work mode turned off."</string> + <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Work mode turned on."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Display brightness"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G data is paused"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G data is paused"</string> @@ -289,6 +294,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> used"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> limit"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> warning"</string> + <string name="quick_settings_work_mode_label" msgid="6244915274350490429">"Work mode"</string> <string name="recents_empty_message" msgid="8682129509540827999">"Your recent screens appear here"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen pinning"</string> @@ -403,7 +409,7 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Deny"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <string name="group_summary_concadenation" msgid="6846402378100148789">", "</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"You\'re using your work profile"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Show embedded battery percentage"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 84f178565e13..f3061d720c98 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -161,6 +161,7 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Ringer silent."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <string name="accessibility_work_mode" msgid="2478631941714607225">"Work mode"</string> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Dismiss <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"All recent applications dismissed."</string> @@ -212,6 +213,10 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobile hotspot turned off."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobile hotspot turned on."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Screen casting stopped."</string> + <string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"Work mode off."</string> + <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Work mode on."</string> + <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Work mode turned off."</string> + <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Work mode turned on."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Display brightness"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G data is paused"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G data is paused"</string> @@ -289,6 +294,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> used"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> limit"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> warning"</string> + <string name="quick_settings_work_mode_label" msgid="6244915274350490429">"Work mode"</string> <string name="recents_empty_message" msgid="8682129509540827999">"Your recent screens appear here"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen pinning"</string> @@ -403,7 +409,7 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Deny"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <string name="group_summary_concadenation" msgid="6846402378100148789">", "</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"You\'re using your work profile"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Show embedded battery percentage"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 84f178565e13..f3061d720c98 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -161,6 +161,7 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Ringer silent."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <string name="accessibility_work_mode" msgid="2478631941714607225">"Work mode"</string> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Dismiss <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"All recent applications dismissed."</string> @@ -212,6 +213,10 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobile hotspot turned off."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobile hotspot turned on."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Screen casting stopped."</string> + <string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"Work mode off."</string> + <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Work mode on."</string> + <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Work mode turned off."</string> + <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Work mode turned on."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Display brightness"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G data is paused"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G data is paused"</string> @@ -289,6 +294,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> used"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> limit"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> warning"</string> + <string name="quick_settings_work_mode_label" msgid="6244915274350490429">"Work mode"</string> <string name="recents_empty_message" msgid="8682129509540827999">"Your recent screens appear here"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen pinning"</string> @@ -403,7 +409,7 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Deny"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <string name="group_summary_concadenation" msgid="6846402378100148789">", "</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"You\'re using your work profile"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Show embedded battery percentage"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index c9af19312291..0d9f55e6eb6b 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Timbre en silencio"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Rechazar <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> descartada."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Se descartaron todas las aplicaciones recientes."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Zona móvil desactivada"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Zona móvil activada"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Transmisión de pantalla detenida"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Brillo de pantalla"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Datos 2G-3G pausados"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Datos 4G pausados"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Utilizados: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Límite de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advertencia de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Las pantallas recientes aparecen aquí."</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Información de la aplicación"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"Fijar pantalla"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Rechazar"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> es el cuadro de diálogo de volumen."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar el original."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estás usando tu perfil de trabajo"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador de IU del sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentaje de la batería integrada"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 51984bf8a698..a5a39ced15e8 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Modo silencio"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ignorar <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Se ha eliminado <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Se han ignorado todas las aplicaciones recientes."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Punto de acceso móvil desactivado."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Punto de acceso móvil activado."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Envío de pantalla detenido."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Brillo de la pantalla"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Datos 2G-3G pausados"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Datos 4G pausados"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> utilizado"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Límite de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advertencia de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Aquí aparecerán tus pantallas recientes"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Información de la aplicación"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fijación de pantalla"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Rechazar"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> es el cuadro de diálogo de volumen"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar la versión original."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">"y"</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estás usando tu perfil de trabajo"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Configurador de IU del sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentaje de batería insertado"</string> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index b527b9f88315..79ab1eeb7f43 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Vaikne kõlisti."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Rakendusest <xliff:g id="APP">%s</xliff:g> loobumine."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Loobusite rakendusest <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Kõikidest hiljutistest rakendustest on loobutud"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobiilside leviala on välja lülitatud."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobiilside leviala on sisse lülitatud."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Ekraanikuva ülekandmine on peatatud."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Ekraani heledus"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G andmekasutus on peatatud"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G andmekasutus on peatatud"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> on kasutatud"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limiit: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> hoiatus"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Teie viimane ekraanikuva ilmub siia"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Rakenduste teave"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ekraanikuva kinnitamine"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Keela"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> on helitugevuse dialoog"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Originaali taastamiseks puudutage."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Kasutate oma tööprofiili"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Süsteemi kasutajaliidese tuuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Kuva lisatud akutaseme protsent"</string> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index b7cfb2a2ad77..94ce0ff9d77c 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Tonu-jotzailea isilik."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Baztertu <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> baztertu da."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Azken aplikazio guztiak baztertu da."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Konexioa partekatzeko aukera desaktibatu egin da."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Konexioa partekatzeko aukera aktibatu egin da."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Pantaila igortzeari utzi zaio."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Bistaratu distira"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G datuen erabilera eten da"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G datuen erabilera eten da"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> erabilita"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Muga: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Abisua: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Ikusitako azken pantailak erakusten dira hemen"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Aplikazioaren informazioa"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"pantaila-ainguratzea"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Ukatu"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> da bolumenaren leihoa"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Ukitu jatorrizkora leheneratzeko"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Work profila erabiltzen ari zara"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Sistemako erabiltzaile-interfazearen konfiguratzailea"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Erakutsi txertatutako bateriaren ehunekoa"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index b3d821673e51..9fbafc27a909 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"زنگ بیصدا."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"رد کردن <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> نادیده گرفته شد."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"همه برنامههای اخیر رد شدند."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"نقطه اتصال دستگاه همراه خاموش شد."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"نقطه اتصال دستگاه همراه روشن شد."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"فرستادن صفحه نمایش متوقف شد."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"روشنایی نمایشگر"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"داده 2G-3G موقتاً متوقف شده است"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"داده 4G موقتاً متوقف شده است"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> استفاده شده"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> محدودیت"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"هشدار <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"صفحههای اخیر شما اینجا نمایان میشوند"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"اطلاعات برنامه"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"پین کردن صفحه"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"اجازه ندارد"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> کنترلکننده صدا است"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"برای بازیابی کنترلکننده اصلی، لمس کنید."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">"،"</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"درحال استفاده از نمایه کاریتان هستید"</string> <string name="system_ui_tuner" msgid="708224127392452018">"تنظیمکننده واسط کاربری سیستم"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"نمایش درصد شارژ باتری جاسازی شده"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 235eef0c3987..6c9e9d6c4ab5 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Soittoääni: äänetön."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Hylätään <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> hylättiin."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Kaikki viimeisimmät sovellukset on hylätty."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobiiliyhteyden hotspot poistettiin käytöstä."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobiiliyhteyden hotspot otettiin käyttöön."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Ruudun lähetys pysäytettiin."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Näytön kirkkaus"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G-tiedonsiirto keskeytettiin"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-tiedonsiirto keskeytettiin"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"käytetty <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"kiintiö <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> – varoitus"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Äskettäin käytetyt ruudut näkyvät tässä"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Sovellustiedot"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"näytön kiinnitys"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Estä"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> on äänenvoimakkuusvalinta."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Palauta alkuperäinen koskettamalla."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Käytät työprofiilia."</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Näytä akun varaus kuvakkeessa"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 3493067775d1..86b207ecfdc5 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Sonnerie en mode silencieux"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Supprimer <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Application \"<xliff:g id="APP">%s</xliff:g>\" ignorée."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Toutes les applications récentes ont été supprimées."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Point d\'accès mobile désactivé."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Point d\'accès mobile activé."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Diffusion d\'écran arrêtée."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Luminosité de l\'écran"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Données 2G/3G désactivées"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Données 4G désactivées"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Quantité de données utilisées :<xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limite : <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Avertissement : <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Vos écrans récents s\'affichent ici"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Détails de l\'application"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"épinglage d\'écran"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Refuser"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> correspond à la boîte de dialogue du volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touchez pour restaurer l\'original."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Vous utilisez votre profil professionnel."</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Afficher le pourcentage intégré de charge"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index ebed6e963a2d..6953c878f795 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Sonnerie en mode silencieux"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Supprimer <xliff:g id="APP">%s</xliff:g>"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Application \"<xliff:g id="APP">%s</xliff:g>\" ignorée."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Toutes les applications récentes ont été supprimées."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Point d\'accès mobile désactivé."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Point d\'accès mobile activé."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Diffusion d\'écran interrompue."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Luminosité de l\'affichage"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Données 2G-3G désactivées"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Données 4G désactivées"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> utilisés"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> au maximum"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Avertissement : <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Vos écrans récents s\'affichent ici"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Infos application"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"épinglage d\'écran"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Refuser"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> correspond à la boîte de dialogue du volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Appuyez pour restaurer l\'interface d\'origine."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Vous utilisez votre profil professionnel."</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Afficher le pourcentage intégré de la batterie"</string> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index a9648b9a5c2c..2a2a2e07cef8 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Timbre silenciado"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Rexeitar <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Rexeitouse <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Rexeitáronse todas as aplicacións recentes."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Desactivouse a zona interactiva móbil."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Activouse a zona interactiva móbil."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Detívose a emisión en pantalla."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Brillo de pantalla"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Os datos 2G-3G están en pausa"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Os datos 4G están en pausa"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> usados"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Límite de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advertencia <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"As túas pantallas recentes aparecen aquí"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Información da aplicación"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixación de pantalla"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Denegar"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é o cadro de diálogo de volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar o orixinal."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estás usando o perfil de traballo"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Configurador da IU do sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentaxe de batería inserida"</string> diff --git a/packages/SystemUI/res/values-gu-rIN/strings.xml b/packages/SystemUI/res/values-gu-rIN/strings.xml index 804a9404c4fc..6b67a209adda 100644 --- a/packages/SystemUI/res/values-gu-rIN/strings.xml +++ b/packages/SystemUI/res/values-gu-rIN/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"રિંગર શાંત છે."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> કાઢી નાખો."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> કાઢી નાખી."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"તમામ તાજેતરની એપ્લિકેશનો કાઢી નાખી."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"મોબાઇલ હોટસ્પોટ બંધ કર્યું."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"મોબાઇલ હોટસ્પોટ ચાલુ કર્યું."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"સ્ક્રીન કાસ્ટિંગ બંધ કર્યું."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"પ્રદર્શન તેજ"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ડેટા થોભાવ્યો છે"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ડેટા થોભાવ્યો છે"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> વાપર્યો"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> મર્યાદા"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ચેતવણી"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"તમારી તાજેતરની સ્ક્રીન્સ અહીં દેખાય છે"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"એપ્લિકેશન માહિતી"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"સ્ક્રીન પિનિંગ"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"નકારો"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> એ વૉલ્યૂમ સંવાદ છે"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"મૂળને પુનઃસ્થાપિત કરવા માટે ટચ કરો."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"તમે તમારી કાર્ય પ્રોફાઇલનો ઉપયોગ કરી રહ્યાં છો"</string> <string name="system_ui_tuner" msgid="708224127392452018">"સિસ્ટમ UI ટ્યૂનર"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"એમ્બેડ કરેલ બૅટરી ટકા બતાવો"</string> diff --git a/packages/SystemUI/res/values-h560dp/config.xml b/packages/SystemUI/res/values-h560dp/config.xml index f210d7b04c6d..8b576b924632 100644 --- a/packages/SystemUI/res/values-h560dp/config.xml +++ b/packages/SystemUI/res/values-h560dp/config.xml @@ -18,6 +18,6 @@ <resources> <!-- The maximum number of items to be displayed in quick settings --> - <integer name="quick_settings_detail_max_item_count">8</integer> + <integer name="quick_settings_detail_max_item_count">6</integer> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 354de044f913..feba1fe7b4a7 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"रिंगर मौन."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> को ख़ारिज करें."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> खा़रिज कर दिया गया."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"हाल ही के सभी ऐप्लिकेशन ख़ारिज कर दिए गए."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"मोबाइल हॉटस्पॉट को बंद किया गया."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"मोबाइल हॉटस्पॉट को चालू किया गया."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"स्क्रीन कास्ट करना रुक गया."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"स्क्रीन की स्क्रीन की रोशनी"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G डेटा रोक दिया गया है"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G डेटा रोक दिया गया है"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> उपयोग किया गया"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> सीमा"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> चेतावनी"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"आपकी हाल की स्क्रीन यहां दिखाई देती हैं"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"एप्लिकेशन जानकारी"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"स्क्रीन पिन करना"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"अस्वीकार करें"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> वॉल्यूम संवाद है"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"मूल वॉल्यूम को फिर से लाने के लिए स्पर्श करें."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"आप अपनी कार्य प्रोफ़ाइल का उपयोग कर रहे हैं"</string> <string name="system_ui_tuner" msgid="708224127392452018">"सिस्टम UI ट्यूनर"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"एम्बेड किया गया बैटरी प्रतिशत दिखाएं"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index b35360e755fd..de1ca72dabfc 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -162,6 +162,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Softver zvona utišan."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Odbacivanje aplikacije <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikacija <xliff:g id="APP">%s</xliff:g> odbačena je."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Odbačene su sve nedavne aplikacije."</string> @@ -213,6 +215,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobilna žarišna točka isključena."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobilna žarišna točka uključena."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Emitiranje zaslona zaustavljeno."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Svjetlina zaslona"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G – 3G podaci pauzirani"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G podaci pauzirani"</string> @@ -290,6 +300,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> iskorišteno"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ograničenje od <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozorenje <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Ovdje se pojavljuju vaši nedavni zasloni"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacije o aplikaciji"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"prikvačivanje zaslona"</string> @@ -404,7 +416,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odbij"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> predstavlja dijaloški okvir za upravljanje glasnoćom"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Dodirnite da biste vratili izvorno."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Upotrebljavate radni profil"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Ugađanje korisničkog sučelja sustava"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Prikaži ugrađeni postotak baterije"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 7956a2104c66..7763fa742762 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Csengő néma."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"A(z) <xliff:g id="APP">%s</xliff:g> elvetése."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> eltávolítva."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Az összes alkalmazás eltávolítva a nemrég használtak közül."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"A mobil hotspot kikapcsolva."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"A mobil hotspot bekapcsolva."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"A képernyő átküldése leállítva."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"A kijelző fényereje"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"A 2G és 3G adatforgalom szünetel."</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"A 4G adatforgalom szünetel"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> felhasználva"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> korlát"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Figyelem! <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"A legutóbbi képernyők itt jelennek meg"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Az alkalmazás adatai"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"képernyő rögzítése"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Elutasítás"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás kezeli a hangerőt"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Érintse meg az eredeti érték visszaállításához."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"A munkaprofilt használja"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Kezelőfelület-hangoló"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"A beépített akkumulátor töltöttségi szintjének megjelenítése"</string> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index de70fec049ac..cbb9a895d125 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Զանգակը լռեցված է:"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Անտեսել <xliff:g id="APP">%s</xliff:g>-ը:"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>-ը անտեսված է:"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Բոլոր վերջին հավելվածները հեռացվել են ցուցակից:"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Շարժական կապի WiFi ցրիչն անջատվեց:"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Շարժական կապի WiFi ցրիչը միացավ:"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Էկրանի հեռարձակումն ընդհատվեց:"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Ցուցադրել պայծառությունը"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2Գ-3Գ տվյալների օգտագործումը դադարեցված է"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4Գ տվյալների օգտագործումը դադարեցված է"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Օգտագործված է՝ <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Սահմանաչափ՝ <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> զգուշացում"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Ձեր վերջին էկրանները տեսանելի են այստեղ"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Հավելվածի մասին"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"էկրանի ամրակցում"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Մերժել"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ը ձայնի ուժգնության երկխոսության հավելված է"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Դիպչեք՝ սկզբնօրինակը վերականգնելու համար:"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Դուք օգտագործում եք ձեր աշխատանքային պրոֆիլը"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Համակարգի ՕՄ-ի կարգավորիչ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Ցուցադրել ներկառուցված մարտկոցի տոկոսայնությունը"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 51ddcc015c01..bbf018df7bbd 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Pendering senyap."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Menyingkirkan <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> disingkirkan."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Semua aplikasi terbaru telah ditutup."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Hotspot seluler dinonaktifkan."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Hotspot seluler diaktifkan."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Transmisi layar berhenti."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Kecerahan tampilan"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Data 2G-3G dijeda"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Data 4G dijeda"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> digunakan"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Batas <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Peringatan <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Layar terkini Anda muncul di sini"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Info Aplikasi"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"pin ke layar"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Tolak"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> adalah dialog volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Sentuh untuk memulihkan aslinya."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Anda menggunakan profil kerja"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Penyetel Antarmuka Pengguna Sistem"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Tampilkan persentase baterai yang tersemat"</string> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index 20d8693c3fbb..f9235a0c0688 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Engin hringing."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Hunsa <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> vísað frá."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Öll nýleg forrit fjarlægð."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Slökkt á farsímaaðgangsstað."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Kveikt á farsímaaðgangsstað."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Skjáútsendingu hætt."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Birtustig skjás"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Slökkt er á 2G- og 3G-gögnum"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Slökkt er á 4G-gögnum"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> notuð"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> hámark"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> viðvörun"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Nýlegar skjámyndir birtast hér"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Forritsupplýsingar"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"skjáfesting"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Hafna"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er hljóðstyrksvalmyndin"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Snertu til að færa í upprunalegt horf."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Þú ert að nota vinnusniðið"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Fínstillingar kerfisviðmóts"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Sýna innfellda rafhlöðustöðu"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 872679951781..a389126e09be 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Suoneria silenziosa."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Elimina <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> eliminata."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Tutte le applicazioni recenti sono state rimosse."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Hotspot mobile disattivato."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Hotspot mobile attivato."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Trasmissione dello schermo interrotta."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Luminosità dello schermo"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Dati 2G-3G sospesi"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Dati 4G sospesi"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> utilizzati"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limite di <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Avviso <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Le tue schermate recenti vengono visualizzate in questa sezione"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informazioni sull\'applicazione"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"blocco su schermo"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Nega"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> rappresenta la finestra di dialogo relativa al volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tocca per ripristinare l\'originale."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Stai utilizzando il profilo di lavoro"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Sintetizzatore interfaccia utente di sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostra percentuale batteria incorporata"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index a28dc2a9343f..cd64034a7940 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -163,6 +163,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"צלצול שקט."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"סגור את <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> נדחה."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"כל האפליקציות האחרונות נסגרו."</string> @@ -214,6 +216,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"נקודה לשיתוף אינטרנט בנייד כבויה."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"נקודה לשיתוף אינטרנט בנייד מופעלת."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"העברת המסך הופסקה."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"בהירות תצוגה"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"השימוש בנתוני 2G-3G מושהה"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"השימוש בנתוני 4G מושהה"</string> @@ -291,6 +301,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> בשימוש"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"הגבלה של <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"אזהרה - <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"המסכים האחרונים מופיעים כאן"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"מידע על האפליקציה"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"הצמדת מסך"</string> @@ -405,7 +417,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"דחה"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> הוא תיבת הדו-שיח של עוצמת הקול"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"גע כדי לשחזר את עוצמת הקול המקורית."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"אתה משתמש בפרופיל העבודה שלך"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"הצג בשורת הסטטוס את אחוז עוצמת הסוללה"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 13217a0c4f98..39c716108992 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"マナーモード着信。"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>を削除します。"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>は削除されました。"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"最近のアプリケーションをすべて消去しました。"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"モバイルアクセスポイントをOFFにしました。"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"モバイルアクセスポイントをONにしました。"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"画面のキャストが停止しました。"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"ディスプレイの明るさ"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G~3Gデータは一時停止中です"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4Gデータは一時停止中です"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g>使用中"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"上限: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"警告: 上限は<xliff:g id="DATA_LIMIT">%s</xliff:g>です"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"ここに最近の画面が表示されます"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"アプリ情報"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"画面固定"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"許可しない"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>を音量ダイアログとして使用"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"タップすると元の音量ダイアログが復元されます。"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">"、"</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"仕事用プロファイルを使用しています"</string> <string name="system_ui_tuner" msgid="708224127392452018">"システムUI調整ツール"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"内蔵電池の残量の割合を表示する"</string> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index c4e84a8d6a41..234891f0e135 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"უხმო რეჟიმი."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>-ის უგულებელყოფა."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ამოშლილია სიიდან."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ყველა ბოლო აპლიკაცია გაუქმდა."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"მობილური ქსელის წერტილი გამოირთო."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"მობილური ქსელის წერტილი ჩაირთო."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"ეკრანის გადაცემა შეჩერებულია."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"ეკრანის სიკაშკაშე"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G მონაცემები შეჩერებულია"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G მონაცემები შეჩერებულია"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"გამოყენებულია: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"ლიმიტი: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> გაფრთხილება"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"თქვენი ბოლო ეკრანები აქ გამოჩნდება"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"აპლიკაციის შესახებ"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ეკრანზე ჩამაგრება"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"უარყოფა"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ხმოვან დიალოგშია"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ორიგინალის აღდგენისათვის, შეეხეთ."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"თქვენ სამსახურის პროფილს იყენებთ"</string> <string name="system_ui_tuner" msgid="708224127392452018">"სისტემის UI ტუნერი"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"ჩამაგრებული ბატარეის პროცენტის ჩვენება"</string> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index 213317049df7..08e2a508f15b 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Қоңырау үнсіз."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> қолданбасынан бас тарту."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> алынып тасталған."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Барлық жақындағы қабылданбаған қолданбалар."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Мобильді хотспот өшірілді."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Мобильді хотспот қосылды."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Экранды трансляциялау тоқтатылды."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Дисплей жарықтығы"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G деректері кідіртілді"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G деректері кідіртілді"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> пайдаланылған"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> шегі"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> туралы ескерту"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Мұнда жақындағы экрандар көрсетіледі"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Қолданба туралы ақпарат"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"экранды бекіту"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Өшіру"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> — көлем диалогтық терезесі"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Түпнұсқаны қалпына келтіру үшін түртіңіз."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Сіз жұмыс профиліңізді пайдаланып жатырсыз"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Жүйелік пайдаланушылық интерфейс тюнері"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Ендірілген батарея пайыздық шамасын көрсету"</string> diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index 6fbb325662af..2df7f1f8698d 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"កម្មវិធីរោទ៍ស្ងាត់។"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"បោះបង់ <xliff:g id="APP">%s</xliff:g> ។"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> បដិសេធ។"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"កម្មវិធីថ្មីៗទាំងអស់ត្រូវបានបោះបង់។"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"បានបិទហតស្ប៉តចល័ត។"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"បានបើកហតស្ប៉តចល័ត។"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"បានបញ្ឈប់ការចាត់ថ្នាក់អេក្រង់។"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"ពន្លឺការបង្ហាញ"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"ទិន្នន័យ 2G-3G ត្រូវបានផ្អាក"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"ទិន្នន័យ 4G ត្រូវបានផ្អាក"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"បានប្រើ <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"ដែនកំណត់ <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ការព្រមាន"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"អេក្រង់បច្ចុប្បន្នរបស់អ្នកបង្ហាញនៅទីនេះ"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"ព័ត៌មានកម្មវិធី"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ការភ្ជាប់អេក្រង់"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"បដិសេធ"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> គឺជាប្រអប់សម្លេង"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ប៉ះដើម្បីស្តារច្បាប់ដើម។"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"អ្នកកំពុងប្រើប្រវត្តិរូបការងាររបស់អ្នក"</string> <string name="system_ui_tuner" msgid="708224127392452018">"កម្មវិធីសម្រួល UI ប្រព័ន្ធ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"បង្ហាញភាគរយថាមពលថ្មដែលបានបង្កប់"</string> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index c8fc91d149fe..ee466d0c2ea2 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"ರಿಂಗರ್ ಶಾಂತ."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ವಜಾಗೊಳಿಸು."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ಇತ್ತೀಚಿನ ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ಮೊಬೈಲ್ ಹಾಟ್ಸ್ಪಾಟ್ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ಮೊಬೈಲ್ ಹಾಟ್ಸ್ಪಾಟ್ ಆನ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"ಸ್ಕ್ರೀನ್ ಪ್ರಸಾರವನ್ನು ನಿಲ್ಲಿಸಲಾಗಿದೆ."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"ಹೊಳಪನ್ನು ಪ್ರದರ್ಶಿಸಿ"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ಡೇಟಾವನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ಬಳಸಲಾಗಿದೆ"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ಮಿತಿ"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ಎಚ್ಚರಿಕೆ"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಪರದೆಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ಸ್ಕ್ರೀನ್ ಪಿನ್ನಿಂಗ್"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ನಿರಾಕರಿಸು"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ವಾಲ್ಯೂಮ್ ಸಂವಾದವಾಗಿದೆ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ಮೂಲ ಮರುಸ್ಥಾಪಿಸಲು ಸ್ಪರ್ಶಿಸಿ."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ನೀವು ಬಳಸುತ್ತಿರುವಿರಿ"</string> <string name="system_ui_tuner" msgid="708224127392452018">"ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"ಎಂಬೆಡ್ ಮಾಡಲಾದ ಬ್ಯಾಟರಿ ಶೇಕಡಾ ತೋರಿಸಿ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 1296d21f1689..35725aaf1fa5 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"벨소리가 무음입니다."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>을(를) 숨깁니다."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>이(가) 제거되었습니다."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"최근 사용한 애플리케이션을 모두 닫았습니다."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"모바일 핫스팟이 사용 중지되었습니다."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"모바일 핫스팟을 사용합니다."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"화면 전송이 중지되었습니다."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"디스플레이 밝기"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G 데이터 사용 중지됨"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G 데이터 사용 중지됨"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> 사용됨"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"한도: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> 경고"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"여기에 최근 화면이 표시됩니다."</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"애플리케이션 정보"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"화면 고정"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"거부"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>은(는) 볼륨 대화입니다."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"원본을 복원하려면 터치하세요."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"직장 프로필을 사용하고 있습니다."</string> <string name="system_ui_tuner" msgid="708224127392452018">"시스템 UI 튜너"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"내장형 배터리 잔량 비율 표시"</string> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index ead55c77cd2c..79b8937a8630 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Үнсүз шыңгыроо."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> этибарга албоо."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> жок болду."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Акыркы колдонмолордун баары көз жаздымда калтырылды."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Мобилдик байланыш түйүнү өчүрүлдү."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Мобилдик байланыш түйүнү күйгүзүлдү."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Тышкы экранга чыгаруу аракети токтотулду."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Жарыктыгын көрсөтүү"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G дайындары тындырылды."</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G дайындары тындырылды"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> колдонулду"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> чектөө"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> эскертүү"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Акыркы экрандарыңыз бул жерден көрүнөт"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Колдонмо жөнүндө маалымат"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"экран кадоо"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Жок"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> үндү катуулатуу диалогу"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Түпнусканы калыбына келтирүү үчүн тийип коюңуз."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Жумуш профилиңизди колдонуп жатасыз"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Батарянын кубатнын деңгээли пайыз менен көрсөтлсүн"</string> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index c0689c3f13ca..015d4da66a50 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"ປິດສຽງ."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"ປິດ <xliff:g id="APP">%s</xliff:g> ໄວ້."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"ປິດ <xliff:g id="APP">%s</xliff:g> ແລ້ວ."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ທຸກແອັບພລິເຄຊັນບໍ່ດົນມານີ້ຖືກປ່ອຍໄປ."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ປິດຮັອດສະປອດເຄື່ອນທີ່ແລ້ວ."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ເປີດຮັອດສະປອດເຄື່ອນທີ່ແລ້ວ."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"ຢຸດການສົ່ງພາບໜ້າຈໍແລ້ວ."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"ຄວາມແຈ້ງຂອງຈໍ"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"ຂໍ້ມູນ 2G-3G ຢຸດຊົ່ວຄາວແລ້ວ"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"ຂໍ້ມູນ 4G ຢຸດຊົ່ວຄາວແລ້ວ"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"ໃຊ້ໄປແລ້ວ <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"ຈຳກັດ <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"ຄຳເຕືອນ <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Your recent screens appear here"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"ຂໍ້ມູນແອັບພລິເຄຊັນ"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ການປັກໝຸດໜ້າຈໍ"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ປະຕິເສດ"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ແມ່ນໜ້າຕ່າງລະດັບສຽງ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ສໍາຜັດເພື່ອກູ້ຄືນຕົ້ນສະບັບ."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ທ່ານກຳລັງໃຊ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານ"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"ສະແດງເປີເຊັນແບັດເຕີຣີທີ່ຕິດມາ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 4425d31c828e..282866fbb321 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -163,6 +163,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Skambutis tylus."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Atsisakyti <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Atsisakyta programos „<xliff:g id="APP">%s</xliff:g>“."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Atsisakyta visų naujausių programų."</string> @@ -214,6 +216,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobiliojo ryšio viešosios interneto prieigos taškas išjungtas."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobiliojo ryšio viešosios interneto prieigos taškas įjungtas."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Ekrano perdavimas sustabdytas."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Ekrano šviesumas"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G duomenys pristabdyti"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G duomenys pristabdyti"</string> @@ -291,6 +301,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Išnaudota: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limitas: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> įspėjimas"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Čia rodomi naujausi ekranai"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Programos informacija"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ekrano prisegimas"</string> @@ -405,7 +417,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Atmesti"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ yra garsumo valdymo dialogo langas"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Palieskite, kad atkurtumėte originalą."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Naudojate darbo profilį"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Sistemos naudotojo sąsajos derinimo priemonė"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Rodyti įterptą akumuliat. įkrovos procentinę vertę"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index eca57a60f815..8e99c5769894 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -162,6 +162,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Zvana signāls — kluss."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Nerādīt lietotni <xliff:g id="APP">%s</xliff:g>"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Lietotne <xliff:g id="APP">%s</xliff:g> vairs netiek rādīta."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Visas nesen izmantotās lietojumprogrammas tika noņemtas."</string> @@ -213,6 +215,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobilais tīklājs ir izslēgts."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobilais tīklājs ir ieslēgts."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Ekrāna apraidīšana ir apturēta."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Ekrāna spilgtums"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G datu lietojums ir apturēts"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G datu lietojums ir apturēts"</string> @@ -290,6 +300,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Tiek izmantots: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ierobežojums: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> brīdinājums"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Jūsu pēdējie ekrāni tiek rādīti šeit."</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informācija par lietojumprogrammu"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"Piespraust ekrānu"</string> @@ -404,7 +416,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Neatļaut"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ir skaļuma dialoglodziņš"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Pieskarieties, lai atjaunotu sākotnējo."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Jūs izmantojat darba profilu."</string> <string name="system_ui_tuner" msgid="708224127392452018">"Sistēmas saskarnes regulators"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Rādīt akumulatora uzlādes līmeni procentos"</string> diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index 038c669c2d40..c2de755f2bd3 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Ѕвонче на тивко."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Отфрли <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> е отфрлена."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Сите неодамнешни апликации се отфрлени."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Мобилната точка на пристап е исклучена."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Мобилната точка на пристап е вклучена."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Емитувањето на екранот запре."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Осветленост на екранот"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Податоците 2G-3G се паузирани"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Податоците 4G се паузирани"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Искористено: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Лимит: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Предупредување за <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Вашите неодамнешни екрани се појавуваат тука"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Информации за апликацијата"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"прикачување екран"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Одбиј"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> е дијалог за јачина на звук"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Допрете за да го вратите оригиналот."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Го користите работниот профил"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Адаптер на УИ на системот"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Прикажи вграден процент на батеријата"</string> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index f4964d0f63fd..5594792c2b33 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"റിംഗർ നിശ്ശബ്ദമാണ്."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> നിരസിക്കുക."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> നിരസിച്ചു."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"അടുത്തിടെയുള്ള എല്ലാ അപ്ലിക്കേഷനും നിരസിച്ചു."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"മൊബൈൽ ഹോട്ട്സ്പോട്ട് ഓഫാക്കി."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"മൊബൈൽ ഹോട്ട്സ്പോട്ട് ഓണാക്കി."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"സ്ക്രീൻ കാസ്റ്റുചെയ്യൽ നിർത്തി."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"ഡിസ്പ്ലേ തെളിച്ചം"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ഡാറ്റ താൽക്കാലികമായി നിർത്തി"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ഡാറ്റ താൽക്കാലികമായി നിർത്തി"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ഉപയോഗിച്ചു"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> പരിധി"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> മുന്നറിയിപ്പ്"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"നിങ്ങളുടെ പുതിയ സ്ക്രീനുകൾ ഇവിടെ ദൃശ്യമാകുന്നു"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"ആപ്പ് വിവരം"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"സ്ക്രീൻ പിൻ ചെയ്യൽ"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"നിരസിക്കുക"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>, വോളിയം ഡയലോഗാണ്"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ആദ്യത്തേത് പുനഃസ്ഥാപിക്കാൻ സ്പർശിക്കുക."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"നിങ്ങൾ ഉപയോഗിക്കുന്നത് ഔദ്യോഗിക പ്രൊഫൈലാണ്"</string> <string name="system_ui_tuner" msgid="708224127392452018">"സിസ്റ്റം UI ട്യൂണർ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"എംബഡ് ചെയ്ത ബാറ്ററി ശതമാനം കാണിക്കുക"</string> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index 122068c304cf..260a580b1b13 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -159,6 +159,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Хонхыг хаах."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>-г хаах."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> байхгүй."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Хамгийн сүүлийн бүх програмыг арилгасан байна."</string> @@ -210,6 +212,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Мобайл хотспотыг унтраасан."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Мобайл хотспотыг асаасан."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Дэлгэц дамжуулалт зогссон."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Дэлгэцийн гэрэлтэлт"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G дата-г түр зогсоосон байна"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G дата-г түр зогсоосон байна"</string> @@ -287,6 +297,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ашигласан"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> хязгаар"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> анхааруулга"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Таны саяхны дэлгэц энд харагдах болно"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Аппликешны мэдээлэл"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"дэлгэц тогтоох"</string> @@ -401,7 +413,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Татгалзах"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> нь дууны диалог юм."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Анхны хувилбарыг эргүүлэн хадгалахыг хүсвэл хүрнэ үү."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Та өөрийн ажлын профайлыг ашиглаж байна"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Системийн UI Тохируулагч"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Залгаатай тэжээлийн хувийг харуулах"</string> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index 6415adb00573..0c7f795d9bcb 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"रिंगर मूक."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> डिसमिस करा."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> डिसमिस केला."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"अलीकडील सर्व अनुप्रयोग डिसमिस झाले."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"मोबाईल हॉटस्पॉट बंद केला."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"मोबाईल हॉटस्पॉट चालू केला."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"स्क्रीन कास्ट करणे थांबले."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"प्रदर्शन चमक"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G डेटास विराम दिला आहे"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G डेटास विराम दिला आहे"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> वापरले"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> मर्यादा"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> चेतावणी"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"आपल्या अलीकडील स्क्रीन येथे दिसतात"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"अनुप्रयोग माहिती"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"स्क्रीन पिन करणे"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"नकार द्या"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> हा व्हॉल्यूम संवाद आहे"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"मूळ पुनर्संचयित करण्यासाठी स्पर्श करा."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"आपण आपले कार्य प्रोफाईल वापरत आहात"</string> <string name="system_ui_tuner" msgid="708224127392452018">"सिस्टीम UI ट्यूनर"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"एम्बेडेड बॅटरी टक्केवारी दर्शवा"</string> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index ceefc29b2c4d..9772a3c53b00 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Pendering senyap."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ketepikan <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ditolak."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Semua aplikasi terbaharu diketepikan."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Tempat liputan mudah alih bergerak dimatikan."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Tempat liputan mudah alih bergerak dihidupkan."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Penghantaran skrin dihentikan."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Kecerahan paparan"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Data 2G-3G dijeda"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Data 4G dijeda"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> digunakan"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> had"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Amaran <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Skrin terbaru anda terpapar di sini"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Maklumat Aplikasi"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"penyematan skrin"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Tolak"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ialah dialog kelantangan"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Sentuh untuk memulihkan yang asal."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Anda sedang menggunakan profil kerja"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Penala UI Sistem"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Tunjukkan peratusan bateri terbenam"</string> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index 81c0932ce43e..2b1acfb57bce 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"ဖုန်းမြည်သံပိတ်သည်။"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>ကို ပယ်လိုက်ရန်"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ထုတ်ထားသည်။"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"မကြာသေးမီက အပလီကေးရှင်းများအားလုံး ဖယ်ထုတ်ပြီးပါပြီ။"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"မိုဘိုင်း ဟော့စပေါ့ ပိတ်ထား။"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"မိုဘိုင်း ဟော့စပေါ့ ဖွင့်ထား။"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"မျက်နှာပြင် ကာစ်တင် လုပ်မှု ရပ်လိုက်ပြီ။"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"တောက်ပမှုကို ပြရန်"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ဒေတာ ခေတ္တရပ်တန့်သည်"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G data ခေတ္တရပ်တန့်သည်"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> သုံးထား"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ကန့်သတ်ချက်"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> သတိပေးချက်"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"သင်၏ မကြာမီက မျက်နှာပြင်များ ဒီမှာ ပေါ်လာကြမည်"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"အပလီကေးရှင်း အင်ဖို"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"မျက်နှာပြင် ပင်ထိုးမှု"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ငြင်းပယ်သည်"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် အသံဒိုင်ယာလော့ခ်ဖြစ်သည်"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"မူရင်းအားပြန်လည်သိမ်းဆည်းရန် ထိပါ။"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">"၊"</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"သင်သည် အလုပ်ပရိုဖိုင်းအား သုံးနေသည်"</string> <string name="system_ui_tuner" msgid="708224127392452018">"စနစ် UI ဖမ်းစက်"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"မြုတ်ထားသည့် ဘတ်ထရီ ရာခိုင်နှုန်းကို ပြပါ"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 7f6895e87abf..6dcd6bcd3375 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Stille modus."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Avvis <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> avvist."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle nylig brukte apper er avvist."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobil Wi-Fi-sone er slått av."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobil Wi-Fi-sone er slått på."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Skjermcastingen er stoppet."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Lysstyrken på skjermen"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G- og 3G-data er satt på pause"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data er satt på pause"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> brukt"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Grense på <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advarsel for <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"De sist brukte skjermene dine vises her"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Appinformasjon"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"én-appsmodus"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Ikke tillat"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er volumdialogen"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Trykk for å gå tilbake til den opprinnelige volumdialogen."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Du bruker jobbprofilen din"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Vis prosent for det innebygde batteriet"</string> diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 51e8a1678700..a05ce9ba8d0b 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"घन्टी मौन।"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> खारेज गर्नुहोस्।"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> खारेज गरिएको छ।"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"सबै हालका अनुप्रयोगहरू खारेज गरियो।"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"मोबाइल हटस्पट बन्द गरियो।"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"मोबाइल हटस्पट खुला गरियो।"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"स्क्रिन कास्टिङ रोकियो।"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"प्रदर्शन चमक"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G डेटा रोकिएको छ"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G डेटा रोकिएको छ"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> प्रयोग गरियो"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> सीमा"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> चेतावनी दिँदै"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"तपाईँको हालको स्क्रिन यहाँ प्रकट हुन्छ"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"अनुप्रयोग जानकारी"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"स्क्रिन पिन गर्दै"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"अस्वीकार गर्नुहोस्"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> भोल्यूम संवाद हो"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"मूल पुनर्स्थापना गर्न छुनुहोस्।"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"तपाईँले कार्य प्रोफाइल प्रयोग गर्दै हुनुहुन्छ"</string> <string name="system_ui_tuner" msgid="708224127392452018">"प्रणाली UI ट्युनर"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"इम्बेड गरिएको ब्याट्री प्रतिशत देखाउनुहोस्"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 88d0b4b4bf35..7ded71cb674e 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -161,6 +161,7 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Belsoftware stil."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <string name="accessibility_work_mode" msgid="2478631941714607225">"Werkmodus"</string> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> sluiten."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> verwijderd."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle recente apps gesloten."</string> @@ -212,6 +213,10 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobiele hotspot uitgeschakeld."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobiele hotspot ingeschakeld."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Casten van scherm gestopt."</string> + <string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"Werkmodus uit."</string> + <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Werkmodus aan."</string> + <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Werkmodus uitgeschakeld."</string> + <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Werkmodus ingeschakeld."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Helderheid van het scherm"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G/3G-data zijn onderbroken"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data zijn onderbroken"</string> @@ -289,6 +294,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> gebruikt"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limiet van <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Waarschuwing voor <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <string name="quick_settings_work_mode_label" msgid="6244915274350490429">"Werkmodus"</string> <string name="recents_empty_message" msgid="8682129509540827999">"Je recente schermen worden hier weergegeven"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"App-informatie"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"scherm vastzetten"</string> @@ -403,7 +409,7 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Afwijzen"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is het volumedialoogvenster"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tik hierop om het origineel te herstellen."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <string name="group_summary_concadenation" msgid="6846402378100148789">", "</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"U gebruikt je werkprofiel"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Systeem-UI-tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Percentage ingebouwde accu weergeven"</string> diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml index df6c473afcc1..02838bd0c002 100644 --- a/packages/SystemUI/res/values-pa-rIN/strings.xml +++ b/packages/SystemUI/res/values-pa-rIN/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"ਰਿੰਗਰ ਸਾਈਲੈਂਟ।"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ਨੂੰ ਰੱਦ ਕਰੋ।"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ਰੱਦ ਕੀਤਾ।"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ਸਾਰੀਆਂ ਹਾਲੀਆ ਐਪਲੀਕੇਸ਼ਨਾਂ ਰੱਦ ਕੀਤੀਆਂ।"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ਮੋਬਾਈਲ ਹੌਟਸਪੌਟ ਬੰਦ ਕੀਤੀ।"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ਮੋਬਾਈਲ ਹੌਟਸਪੌਟ ਚਾਲੂ ਕੀਤੀ।"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"ਸਕ੍ਰੀਨ ਜੋੜਨਾ ਬੰਦ ਹੋਇਆ।"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"ਡਿਸਪਲੇ ਚਮਕ"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ਡਾਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ਡਾਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ਵਰਤਿਆ"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ਸੀਮਾ"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ਚਿਤਾਵਨੀ"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"ਤੁਹਾਡੀਆਂ ਹਾਲੀਆ ਸਕ੍ਰੀਨਾਂ ਇੱਥੇ ਪ੍ਰਗਟ ਹੋਣਗੀਆਂ"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"ਐਪਲੀਕੇਸ਼ਨ ਜਾਣਕਾਰੀ"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ਸਕ੍ਰੀਨ ਪਿਨਿੰਗ"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ਅਸਵੀਕਾਰ ਕਰੋ"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਵੋਲਯੂਮ ਡਾਇਲੌਗ ਹੈ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ਅਸਲੀ ਨੂੰ ਰੀਸਟੋਰ ਕਰਨ ਲਈ ਛੋਹਵੋ।"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ਤੁਸੀਂ ਆਪਣੀ ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਵਰਤ ਰਹੇ ਹੋ"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI ਟਿਊਨਰ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"ਜੋਡ਼ੀ ਗਈ ਬੈਟਰੀ ਪ੍ਰਤਿਸ਼ਤਤਾ ਦਿਖਾਓ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 694132b8e3b1..d9d1dc492828 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -163,6 +163,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Dzwonek wyciszony."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Usuń stąd <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>: zamknięto."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Wszystkie ostatnie aplikacje zostały zamknięte."</string> @@ -214,6 +216,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobilny hotspot został wyłączony."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobilny hotspot został włączony."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Zatrzymano przesyłanie ekranu."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Jasność wyświetlacza"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Transmisja danych 2G-3G została wstrzymana"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Transmisja danych 4G została wstrzymana"</string> @@ -291,6 +301,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Wykorzystano <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limit <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Ostrzeżenie: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Tutaj pojawią się ostatnie ekrany"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacje o aplikacji"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"przypinanie ekranu"</string> @@ -405,7 +417,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odmów"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> steruje głośnością"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Dotknij, by przywrócić pierwotną."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Używasz profilu do pracy"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Kalibrator System UI"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Pokaż procent naładowania baterii"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index e806bfc8123c..74046212e7b5 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Campainha silenciosa."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Descartar <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> descartado."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Todos os apps recentes foram dispensados."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"O ponto de acesso móvel foi desativado."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"O ponto de acesso móvel foi ativado."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"A transmissão de tela foi interrompida."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Brilho da tela"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Os dados 2G e 3G foram pausados"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Os dados 4G foram pausados"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Usados: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limite: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Aviso de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Suas telas recentes aparecem aqui"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informações do app"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixação de tela"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Negar"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é a caixa de diálogo referente ao volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toque para restaurar o original."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Você está usando seu perfil de trabalho"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador System UI"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentagem de bateria incorporada"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 468c75de2acd..e14194b4aa0d 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Campainha em silêncio."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ignorar <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ignorado."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Todas as aplicações recentes foram ignoradas."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Zona Wi-Fi móvel desligada."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Zona Wi-Fi móvel ligada."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Transmissão do ecrã interrompida."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Brilho do visor"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Dados 2G-3G em pausa"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Dados 4G em pausa"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> utilizado(s)"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limite de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Aviso de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Os ecrãs recentes aparecem aqui"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informações da aplicação"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixação no ecrã"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Recusar"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é a caixa de diálogo do volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toque para restaurar o original."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Está a utilizar o seu perfil de trabalho"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador da interface do sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar percentagem da bateria incorporada"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index e806bfc8123c..74046212e7b5 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Campainha silenciosa."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Descartar <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> descartado."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Todos os apps recentes foram dispensados."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"O ponto de acesso móvel foi desativado."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"O ponto de acesso móvel foi ativado."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"A transmissão de tela foi interrompida."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Brilho da tela"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Os dados 2G e 3G foram pausados"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Os dados 4G foram pausados"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Usados: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limite: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Aviso de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Suas telas recentes aparecem aqui"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informações do app"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixação de tela"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Negar"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é a caixa de diálogo referente ao volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toque para restaurar o original."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Você está usando seu perfil de trabalho"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador System UI"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentagem de bateria incorporada"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 1b8e8de1ca2a..eacc909b9159 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -162,6 +162,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Sonerie silențioasă."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Închideți <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> a fost eliminată."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Toate aplicațiile recente au fost închise."</string> @@ -213,6 +215,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Hotspotul mobil este dezactivat."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Hotspotul mobil este activat."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Transmiterea ecranului a fost oprită."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Luminozitatea ecranului"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Conexiunea de date 2G – 3G este întreruptă"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Conexiunea de date 4G este întreruptă"</string> @@ -290,6 +300,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> utilizați"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limită de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Avertizare: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Ecranele dvs. recente apar aici"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informații despre aplicație"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixare pe ecran"</string> @@ -404,7 +416,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Refuzați"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> afișează caseta de dialog pentru volum"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Atingeți pentru a reveni la setarea inițială."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Acum folosiți profilul de serviciu"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Afișați procentajul bateriei încorporat"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 9068e0b85517..c26f785bb664 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -163,6 +163,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Беззвучный режим."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Удаление приложения <xliff:g id="APP">%s</xliff:g> из списка."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" удалено из списка."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Все недавние приложения закрыты."</string> @@ -214,6 +216,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Точка доступа отключена."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Точка доступа включена."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Трансляция прекращена."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Яркость экрана"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Передача данных 2G и 3G приостановлена"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Передача данных 4G приостановлена"</string> @@ -291,6 +301,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Использовано: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ограничение: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Предупреждение: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Здесь будут показаны недавние приложения"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Сведения о приложении"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"Заблокировать в приложении"</string> @@ -405,7 +417,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Нет"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"Приложение <xliff:g id="APP_NAME">%1$s</xliff:g> назначено регулятором громкости"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Нажмите, чтобы восстановить приложение по умолчанию."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Вы перешли в рабочий профиль"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Показывать уровень заряда батареи в процентах"</string> diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index 3be371832a75..3ef672a247cf 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"හඬ නඟනය නිශ්ශබ්දයි."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ඉවතලන්න."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> අස් කර ඇත."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"සියලුම මෑත යෙඳුම් අස් කරන ලදි."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ජංගම හොට්ස්පොටය අක්රිය කරන ලදි."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ජංගම හොට්ස්පොටය සක්රිය කරන ලදි."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"තිරය විකාශය කිරීම නැවත් වන ලදි."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"දීප්තිය දර්ශනය කරන්න"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G දත්ත විරාම කර ඇත"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G දත්ත විරාම කර ඇත"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> භාවිතා කර තිබේ"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> සීමිත"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> අවවාද කිරීම"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"මෙහි ඔබගේ මෑතක තිර පෙන්නුම් කරයි"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"යෙදුම් තොරතුරු"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"තිර ඇමිණීම"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ප්රතික්ෂේප කරන්න"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ධාරිතා සංවාදයයි"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"මුල් තත්ත්වය නැවත ප්රතිසාධනය කිරීමට ස්පර්ශ කරන්න."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ඔබ ඔබේ කාර්යාල පැතිකඩ භාවිත කරමින් සිටී"</string> <string name="system_ui_tuner" msgid="708224127392452018">"පද්ධති UI සුසරකය"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"කාවද්දන ලද බැටරි ප්රතිශතය පෙන්වන්න"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index d96194c6ada4..2d6aa9d863ef 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -163,6 +163,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Tiché zvonenie."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Zrušiť aplikáciu <xliff:g id="APP">%s</xliff:g>"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikácia <xliff:g id="APP">%s</xliff:g> bola zrušená."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Všetky nedávne aplikácie boli odmietnuté."</string> @@ -214,6 +216,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobilný hotspot je vypnutý."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobilný hotspot je zapnutý."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Prenášanie bolo zastavené."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Jas displeja"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Dátové prenosy 2G a 3G sú pozastavené"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Dátové prenosy 4G sú pozastavené"</string> @@ -291,6 +301,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Využité: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limit: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozornenie pri <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Vaše nedávne obrazovky sa zobrazia tu."</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informácie o aplikácii"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"pripnutie k obrazovke"</string> @@ -405,7 +417,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odmietnuť"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je dialóg hlasitosti"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Klepnutím obnovíte originál."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Používate svoj pracovný profil."</string> <string name="system_ui_tuner" msgid="708224127392452018">"Tuner používateľského rozhrania systému"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Zobraziť percentá vloženej batérie"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index f3d3b3947d16..18fa504c4cd1 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -163,6 +163,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Zvonjenje izklopljeno."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Opusti aplikacijo <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikacija <xliff:g id="APP">%s</xliff:g> je bila odstranjena."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Vse nedavne aplikacije so bile opuščene."</string> @@ -214,6 +216,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobilna dostopna točka je izklopljena."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobilna dostopna točka je vklopljena."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Predvajanje zaslona je ustavljeno."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Svetlost zaslona"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Prenos podatkov v omrežju 2G/3G je zaustavljen"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Prenos podatkov v omrežju 4G je zaustavljen"</string> @@ -291,6 +301,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Porabljeno: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Omejitev: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Opozorilo – <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Vaši nedavni zasloni so prikazani tu"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Podatki o aplikaciji"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"pripenjanje zaslona"</string> @@ -405,7 +417,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Zavrni"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je pogovorno okno glede prostornine"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Dotaknite se, če želite obnoviti izvirnik."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Uporabljate delovni profil"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Uglaševalnik uporabniškega vmesnika sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Prikaži odstotek napolnjenosti vgraj. akumulatorja"</string> diff --git a/packages/SystemUI/res/values-sq-rAL/strings.xml b/packages/SystemUI/res/values-sq-rAL/strings.xml index afad77229161..ab7e5b02f750 100644 --- a/packages/SystemUI/res/values-sq-rAL/strings.xml +++ b/packages/SystemUI/res/values-sq-rAL/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Zilja është heshtur."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Largo <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> është hequr."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Të gjitha aplikacionet e fundit u larguan."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Qasja në zona publike interneti është e çaktivizuar."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Zona e qasjes publike për internet është e aktivizuar."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Transmetimi i ekranit ndaloi."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Ndriçimi i ekranit"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Të dhënat 2G-3G janë ndërprerë"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Të dhënat 4G janë ndërprerë"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Të përdorura: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Kufiri: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Paralajmërim për kufirin prej <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Ekranet e tua të fundit shfaqen këtu"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacioni i aplikacionit"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"gozhdimi i ekranit"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Refuzo"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> është dialogu i volumit"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Prek për të restauruar origjinalin."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Po përdor profilin tënd të punës"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Shfaq përqindjen e baterisë së integruar"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index ad14d2604773..196d1f14a6ee 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -162,6 +162,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Нечујно звоно."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Одбаците <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Апликација <xliff:g id="APP">%s</xliff:g> је одбачена."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Све недавно коришћене апликације су одбачене."</string> @@ -213,6 +215,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Мобилни хотспот је искључен."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Мобилни хотспот је укључен."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Пребацивање екрана је заустављено."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Осветљеност екрана"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G подаци су паузирани"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G подаци су паузирани"</string> @@ -290,6 +300,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Искористили сте <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ограничење од <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Упозорење за <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Недавни екрани се појављују овде"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Информације о апликацији"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"качење екрана"</string> @@ -404,7 +416,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Одбиј"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> је дијалог за јачину звука"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Додирните да бисте вратили оригинал."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Користите профил за Work"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Тјунер за кориснички интерфејс система"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Приказуј уграђени проценат батерије"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 15e8b121d163..31066bfd9aa2 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Tyst ringsignal."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ta bort <xliff:g id="APP">%s</xliff:g> från listan."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> togs bort permanent."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alla appar har tagits bort från listan Senaste."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Den mobila trådlösa surfzonen har inaktiverats."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Den mobila trådlösa surfzonen har aktiverats."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Castningen av skärmen har stoppats."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Skärmens ljusstyrka"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G- och 3G-data har pausats"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data har pausats"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> används"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Gräns: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Varning <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Dina senaste skärmar visas här"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Appinformation"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fästa skärmen"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Neka"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> används som volymkontroll"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tryck här om du vill återställa den ursprungliga appen."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Du använder din jobbprofil"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Inställningar för systemgränssnitt"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Visa inbäddad batteriprocent"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 1d231fcf7612..eeeef1f68d5b 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Mlio wa simu uko kimya."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ondoa <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> imeondolewa."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Programu za hivi majuzi zimeondolewa."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mtandao-hewa unaoweza kuhamishika umezimwa."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mtandao-hewa unaoweza kuhamishika umewashwa."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Utumaji wa skrini umesitishwa."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Ung\'aavu wa skrini"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Data ya 2G-3G imesitishwa"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Data ya 4G imesitishwa"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> imetumika"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"kikomo <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Onyo <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Skrini zako za hivi majuzi huonekana hapa"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Maelezo ya Programu"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"kudumisha programu moja"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Kataa"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ni mazungumzo ya sauti"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Gusa ili urejeshe ya awali."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Unatumia wasifu wako wa kazini"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Kipokea Ishara cha SystemUI"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Onyesha asilimia ya betri iliyopachikwa"</string> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index c41494b0c76a..a6ad0df8b385 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"ரிங்கர் நிசப்தம்."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ஐ நிராகரி."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> விலக்கப்பட்டது."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"எல்லா சமீபத்திய பயன்பாடுகளும் விலக்கப்பட்டன."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"மொபைல் ஹாட்ஸ்பாட் முடக்கப்பட்டது."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"மொபைல் ஹாட்ஸ்பாட் இயக்கப்பட்டது."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"திரையை அனுப்புதல் நிறுத்தப்பட்டது."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"திரை பிரகாசம்"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G டேட்டா இடைநிறுத்தப்பட்டது"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G டேட்டா இடைநிறுத்தப்பட்டது"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"பயன்படுத்தியது - <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> வரம்பு"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> எச்சரிக்கை"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"சமீபத்திய திரைகள் இங்கு தோன்றும்"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"பயன்பாட்டு தகவல்"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"திரையை பின் செய்தல்"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"நிராகரி"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"ஒலியளவு செய்தி: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"அசலை மீட்டமைக்கத் தொடவும்."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"பணி சுயவிவரத்தைப் பயன்படுத்துகிறீர்கள்"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"உள்ளிணைந்த பேட்டரி சதவீதத்தைக் காட்டு"</string> diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index a628ef74d55c..468d00d50cc4 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"రింగర్ నిశ్శబ్దంలో ఉంది."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>ని తీసివేయండి."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> తీసివేయబడింది."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"అన్ని ఇటీవలి అనువర్తనాలు తీసివేయబడ్డాయి."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"మొబైల్ హాట్స్పాట్ ఆఫ్ చేయబడింది."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"మొబైల్ హాట్స్పాట్ ఆన్ చేయబడింది."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"స్క్రీన్ ప్రసారం ఆపివేయబడింది."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"ప్రదర్శన ప్రకాశం"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G డేటా పాజ్ చేయబడింది"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G డేటా పాజ్ చేయబడింది"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> వినియోగించబడింది"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> పరిమితి"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> హెచ్చరిక"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"మీ ఇటీవలి స్క్రీన్లు ఇక్కడ కనిపిస్తాయి"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"అనువర్తన సమాచారం"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"స్క్రీన్ పిన్నింగ్"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"తిరస్కరించు"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> అనేది వాల్యూమ్ డైలాగ్"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"అసలుదాన్ని పునరుద్ధరించడానికి తాకండి."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"మీరు మీ కార్యాలయ ప్రొఫైల్ను ఉపయోగిస్తున్నారు"</string> <string name="system_ui_tuner" msgid="708224127392452018">"సిస్టమ్ UI ట్యూనర్"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"పొందుపరిచిన బ్యాటరీ శాతం చూపు"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 44ad1fa0e615..130a8bf606c9 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"เสียงเรียกเข้าแบบปิดเสียง"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"ยกเลิก <xliff:g id="APP">%s</xliff:g>"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ถูกลบไปแล้ว"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ปิดแอปพลิเคชันล่าสุดทั้งหมดแล้ว"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ปิดฮอตสปอตเคลื่อนที่แล้ว"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"เปิดฮอตสปอตเคลื่อนที่แล้ว"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"หยุดการส่งหน้าจอแล้ว"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"ความสว่างของหน้าจอ"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"หยุดการใช้ข้อมูล 2G-3G ชั่วคราวแล้ว"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"หยุดการใช้ข้อมูล 4G ชั่วคราวแล้ว"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"ใช้ไปแล้ว <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"ขีดจำกัด <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"คำเตือน <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"หน้าจอล่าสุดของคุณแสดงที่นี่"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"ข้อมูลแอปพลิเคชัน"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"การตรึงหน้าจอ"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ปฏิเสธ"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> เป็นช่องโต้ตอบระดับเสียง"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"แตะเพื่อคืนค่าดั้งเดิม"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"คุณกำลังใช้โปรไฟล์งานของคุณ"</string> <string name="system_ui_tuner" msgid="708224127392452018">"ตัวรับสัญญาณ UI ระบบ"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"แสดงเปอร์เซ็นต์ของแบตเตอรี่ในตัว"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index c1bb85c62477..2546c9ec8a8f 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Naka-silent ang ringer."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"I-dismiss ang <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Hindi pinansin ang <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Na-dismiss ang lahat ng kamakailang application."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Na-off ang mobile hotspot."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Na-on ang mobile hotspot."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Itinigil ang pagka-cast sa screen."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Liwanag ng display"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Naka-pause ang 2G-3G data"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Naka-pause ang 4G data"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ang nagamit"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ang limitasyon"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Babala sa <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Lumalabas dito ang iyong mga kamakailang screen"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Impormasyon ng Application"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"pagpi-pin sa screen"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Tanggihan"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"Ang <xliff:g id="APP_NAME">%1$s</xliff:g> ang volume dialog"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Pindutin upang ibalik ang orihinal."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Ginagamit mo ang iyong profile sa trabaho"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Tuner ng System UI"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Ipakita ang naka-embed na porsyento ng baterya"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 854f850931cd..c9aa1f54b0a1 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Telefon zili sessiz."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> uygulamasını kapat."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> kaldırıldı."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Tüm son uygulamalar kapatıldı."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobil hotspot kapatıldı."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobil hotspot açıldı."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Ekran yayını durduruldu."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Ekran parlaklığı"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G veri kullanımı duraklatıldı"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G veri kullanımı duraklatıldı"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> kullanıldı"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Sınır: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> uyarısı"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Son ekranlarınız burada görünür"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Uygulama Bilgileri"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ekran sabitleme"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Reddet"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ses denetimi iletişim kutusu olarak ayarlandı"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Orijinali geri yüklemek için dokunun."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"İş profilinizi kullanıyorsunuz"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Sistem Arayüzü Ayarlayıcısı"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Yerleşik pil yüzdesini göster"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 5347d93016db..58ae655dda2c 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -163,6 +163,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Дзвінок беззвучний."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Видалити додаток <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Програму <xliff:g id="APP">%s</xliff:g> закрито."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Усі останні додатки закрито."</string> @@ -214,6 +216,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Мобільну точку доступу вимкнено."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Мобільну точку доступу ввімкнено."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Трансляцію екрана зупинено."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Яскравість дисплея"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Передавання даних 2G–3G призупинено"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Передавання даних 4G призупинено"</string> @@ -291,6 +301,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Використовується: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Обмеження: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Застереження: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Ваші останні екрани відображаються тут"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Інформація про додаток"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"закріпити екран"</string> @@ -405,7 +417,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Відхилити"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> призначено регулятором гучності"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Торкніться, щоб відновити оригінал."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Ви в робочому профілі"</string> <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Показувати заряд акумулятора у відсотках"</string> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index b9da6e3395c6..9d42aadd7f63 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"رنگر خاموش۔"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> کو مسترد کریں۔"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> کو ہٹا دیا گیا۔"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"سبھی حالیہ ایپلیکیشنز کو برخاست کر دیا گیا۔"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"موبائل ہاٹ اسپاٹ کو آف کر دیا گیا۔"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"موبائل ہاٹ اسپاٹ کو آن کر دیا گیا۔"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"اسکرین کو کاسٹ کرنا بند کر دیا۔"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"ڈسپلے کی چمک"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ڈیٹا موقوف کر دیا گیا"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ڈیٹا موقوف کر دیا گیا"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> استعمال کردہ"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> حد"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> وارننگ"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"آپ کی حالیہ اسکرینز یہاں ظاہر ہوتی ہیں"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"ایپلیکیشن کی معلومات"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"اسکرین کو پن کرنا"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"مسترد کریں"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> والیوم ڈائلاگ ہے"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"اصل کو بحال کرنے کیلئے ٹچ کریں۔"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">"،"</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"آپ اپنا دفتری پروفائل استعمال کر رہے ہیں۔"</string> <string name="system_ui_tuner" msgid="708224127392452018">"سسٹم UI ٹیونر"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"سرایت کردہ بیٹری کی فیصد دکھائیں"</string> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index 67cd123d700c..f7959eac3349 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Ovozsiz qo‘ng‘iroq."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Olib tashlash: <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> olib tashlangan."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Yaqinda ishlatilgan barcha ilovalar olib tashlandi."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobil ulanish nuqtasi o‘chirildi."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobil ulanish nuqtasi yoqildi."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Ekranni translatsiya qilish to‘xtadi."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Ekran yorqinligi"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G internet to‘xtatib qo‘yildi"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G internet to‘xtatib qo‘yildi"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> foydalanilgan"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Cheklov: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Ogohlantirish: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Siz yaqinda ishlatgan ilova ekranlari bu yerda ko‘rinadi"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Ilova haqida ma’lumot"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"o‘zgarmas ekran"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Rad etish"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ovoz balandligini boshqaradi"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Aslini tiklash uchun bosing."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Siz ishchi profildan foydalanmoqdasiz"</string> <string name="system_ui_tuner" msgid="708224127392452018">"SystemUI Tuner"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Batareya foizi ko‘rsatilsin"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index aa8106896027..ffcc73a177c6 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Chuông im lặng."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Xóa bỏ <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> đã bị loại bỏ."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Đã bỏ qua tất cả các ứng dụng gần đây."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Đã tắt điểm phát sóng di động."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Đã bật điểm phát sóng di động."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Đã ngừng truyền màn hình."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Độ sáng màn hình"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Đã tạm dừng dữ liệu 2G-3G"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Đã tạm dừng dữ liệu 4G"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Đã sử dụng <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Giới hạn <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Cảnh báo <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Màn hình gần đây của bạn sẽ xuất hiện tại đây"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Thông tin ứng dụng"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"khóa màn hình"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Từ chối"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> là hộp thoại khối lượng"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Chạm để khôi phục bản gốc."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Bạn đang sử dụng hồ sơ công việc của mình"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Bộ điều hướng giao diện người dùng hệ thống"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Hiển thị tỷ lệ phần trăm pin được nhúng"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index fa69975ad942..2d8dd2a6b5ae 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"振铃器静音。"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"移除<xliff:g id="APP">%s</xliff:g>。"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"已删除<xliff:g id="APP">%s</xliff:g>"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"已关闭所有最近用过的应用。"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"移动热点已关闭。"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"移动热点已开启。"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"屏幕投射已停止。"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"屏幕亮度"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G 数据网络已暂停使用"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G 数据网络已暂停使用"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"已使用<xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"上限为<xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g>警告"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"您最近浏览过的屏幕会显示在此处"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"应用信息"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"固定屏幕"</string> @@ -326,8 +338,8 @@ <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"仅限\n优先打扰"</string> <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"仅限\n闹钟"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"正在充电(还需<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>充满)"</string> - <string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"正在快速充电(还需 <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>才能充满)"</string> - <string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"正在慢速充电(还需 <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>才能充满)"</string> + <string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"正在快速充电(还需<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>充满)"</string> + <string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"正在慢速充电(还需<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>充满)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"切换用户"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"切换用户,当前用户为<xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> <string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"当前用户为<xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"拒绝"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”已用作音量控制对话框"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"触摸即可恢复原始设置。"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">"、"</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"您当前正在使用工作资料"</string> <string name="system_ui_tuner" msgid="708224127392452018">"系统界面调谐器"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"嵌入式显示电池电量百分比 显示嵌入的电池电量百分比"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 7375a92bedd9..569d847b9680 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"鈴聲靜音。"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"關閉「<xliff:g id="APP">%s</xliff:g>」。"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"「<xliff:g id="APP">%s</xliff:g>」已關閉。"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"所有最近使用的應用程式均已關閉。"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"流動熱點已關閉。"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"流動熱點已開啟。"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"已停止投放螢幕。"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"顯示光暗度"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"已暫停 2G-3G 數據"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"已暫停 4G 數據"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"已使用 <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"上限為 <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> 警告"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"您最近的螢幕顯示在這裡"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"應用程式資料"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"螢幕固定"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"拒絕"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」為音量對話框"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"輕觸即可復原。"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">"、"</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"您正在使用工作設定檔"</string> <string name="system_ui_tuner" msgid="708224127392452018">"系統使用者介面調諧器"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"顯示嵌入的電池百分比"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 5edda8461e57..f2ffe168e1ff 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"鈴聲靜音。"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"關閉「<xliff:g id="APP">%s</xliff:g>」。"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"「<xliff:g id="APP">%s</xliff:g>」已關閉。"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"最近使用的應用程式已全部關閉。"</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"可攜式無線基地台已關閉。"</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"可攜式無線基地台已開啟。"</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"已停止投放螢幕。"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"螢幕亮度"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"已暫停 2G-3G 數據連線"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"已暫停 4G 數據連線"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"已使用 <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"上限為 <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> 警告"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"您最近的螢幕會顯示在這裡"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"應用程式資訊"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"螢幕固定"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"拒絕"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」現在是預設的音量控制對話方塊。"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"輕觸這裡即可恢復原始設定。"</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">"、"</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"您正在使用 Work 設定檔"</string> <string name="system_ui_tuner" msgid="708224127392452018">"系統使用者介面調整精靈"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"顯示嵌入式電池百分比"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 51c4389d746b..efa04e695e36 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -161,6 +161,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Isikhali sithulile."</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> + <!-- no translation found for accessibility_work_mode (2478631941714607225) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Cashisa i-<xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ivaliwe."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Zonke izinhlelo zokusebenza zakamuva zicashisiwe."</string> @@ -212,6 +214,14 @@ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"I-hotspot ivaliwe."</string> <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"I-hotspot ivuliwe."</string> <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Ukusakaza kwesikrini kumisiwe."</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> <string name="accessibility_brightness" msgid="8003681285547803095">"Bonisa ukukhanya"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G idatha imisiwe"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G idatha imisiwe"</string> @@ -289,6 +299,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> isetshenzisiwe"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> umkhawulo"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> isexwayiso"</string> + <!-- no translation found for quick_settings_work_mode_label (6244915274350490429) --> + <skip /> <string name="recents_empty_message" msgid="8682129509540827999">"Izikrini zakho zakamuva zivela lapha"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Ulwazi lohlelo lokusebenza"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ukuphina isikrini"</string> @@ -403,7 +415,8 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Phika"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> yingxoxo yevolumu"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Thinta ukuze ubuyisele kokwangempela."</string> - <string name="group_summary_concadenation" msgid="2705151242008937028">","</string> + <!-- no translation found for group_summary_concadenation (6846402378100148789) --> + <skip /> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Usebenzisa iphrofayela yakho yomsebenzi"</string> <string name="system_ui_tuner" msgid="708224127392452018">"Isishuni se-UI yesistimu"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Bonisa amaphesenti ebhethri elinamathiselwe"</string> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index a0052cec986e..388da17301e8 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -117,7 +117,7 @@ <integer name="quick_settings_brightness_dialog_long_timeout">4000</integer> <!-- The maximum number of items to be displayed in quick settings --> - <integer name="quick_settings_detail_max_item_count">7</integer> + <integer name="quick_settings_detail_max_item_count">5</integer> <!-- Should "4G" be shown instead of "LTE" when the network is NETWORK_TYPE_LTE? --> <bool name="config_show4GForLTE">true</bool> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 086e9f44a786..4e812aa8d76c 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -36,18 +36,6 @@ <!-- The font size for the clock --> <dimen name="status_bar_clock_size">14sp</dimen> - <!-- The margin on the start of the content view --> - <dimen name="notification_content_margin_start">16dp</dimen> - - <!-- The maximum size of the title when in single line mode --> - <dimen name="notification_maximum_title_length">150sp</dimen> - - <!-- The margin on the end of the content view --> - <dimen name="notification_content_margin_end">8dp</dimen> - - <!-- Height of a single line notification in the status bar --> - <dimen name="notification_single_line_height">32sp</dimen> - <!-- Height of a small notification in the status bar--> <dimen name="notification_min_height">84dp</dimen> @@ -107,7 +95,7 @@ <dimen name="close_handle_underlap">32dp</dimen> <!-- Height of the status bar header bar --> - <dimen name="status_bar_header_height">60dp</dimen> + <dimen name="status_bar_header_height">90dp</dimen> <!-- Height of the status bar header bar when expanded --> <dimen name="status_bar_header_height_expanded">116dp</dimen> @@ -173,7 +161,7 @@ <dimen name="borderless_button_radius">2dp</dimen> <!-- How far the expanded QS panel peeks from the header in collapsed state. --> - <dimen name="qs_peek_height">8dp</dimen> + <dimen name="qs_peek_height">0dp</dimen> <!-- Zen mode panel: condition item button padding --> <dimen name="zen_mode_condition_detail_button_padding">8dp</dimen> @@ -351,8 +339,11 @@ <!-- radius of the corners of the material rounded rect background but negative--> <dimen name="notification_material_rounded_rect_radius_negative">-2dp</dimen> - <!-- The padding between notification children --> - <dimen name="notification_children_padding">2dp</dimen> + <!-- The padding between notification children when collapsed --> + <dimen name="notification_children_padding">4dp</dimen> + + <!-- The padding on top of the first notification to the children container --> + <dimen name="notification_children_container_top_padding">8dp</dimen> <!-- The height of the divider between the notfication children --> <dimen name="notification_children_divider_height">1dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 6c87cd6b83c4..666a02437f09 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1038,8 +1038,8 @@ <!-- VolumeUI restoration notification: text --> <string name="volumeui_notification_text">Touch to restore the original.</string> - <!-- Describes the way 2 names are concatenated. An example would be ", " to produce "Peter Muller, Paul Curry". Please also include a space here if it's appropriate in the language and if it's a RTL language include it on the left. [CHAR LIMIT=3] --> - <string name="group_summary_concadenation">, </string> + <!-- Describes the way 2 names are concatenated. An example would be ", " to produce "Peter Muller, Paul Curry". Please also include a space here if it's appropriate in the language and if it's a RTL language include it on the left. The translation should start and end with " to keep the white space if desired [CHAR LIMIT=5] --> + <string name="group_summary_concadenation">", "</string> <!-- Toast shown when user unlocks screen and managed profile activity is in the foreground --> <string name="managed_profile_foreground_toast">You\'re using your work profile</string> diff --git a/packages/SystemUI/res/xml/tuner_prefs.xml b/packages/SystemUI/res/xml/tuner_prefs.xml index 8dcf8a7bc60f..e31927eb9cec 100644 --- a/packages/SystemUI/res/xml/tuner_prefs.xml +++ b/packages/SystemUI/res/xml/tuner_prefs.xml @@ -18,25 +18,10 @@ xmlns:sysui="http://schemas.android.com/apk/res-auto" android:title="@string/system_ui_tuner"> - <PreferenceScreen - android:title="@string/quick_settings"> - - <PreferenceCategory - android:title="@string/experimental"> - - <com.android.systemui.tuner.TunerSwitch - android:key="qs_show_brightness" - android:title="@string/show_brightness" - sysui:defValue="true" /> - - <com.android.systemui.tuner.QSPagingSwitch - android:key="qs_paged_panel" - android:title="@string/qs_paging" /> - - </PreferenceCategory> - - </PreferenceScreen> - + <com.android.systemui.tuner.TunerSwitch + android:key="qs_show_brightness" + android:title="@string/show_brightness" + sysui:defValue="true" /> <PreferenceScreen android:title="@string/status_bar" > diff --git a/packages/SystemUI/src/com/android/systemui/QSQuickTileView.java b/packages/SystemUI/src/com/android/systemui/QSQuickTileView.java deleted file mode 100644 index 33626505ff79..000000000000 --- a/packages/SystemUI/src/com/android/systemui/QSQuickTileView.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui; - -import android.content.Context; -import android.view.View; -import android.widget.ImageView; -import com.android.systemui.qs.QSTile; -import com.android.systemui.qs.QSTileBaseView; - -public class QSQuickTileView extends QSTileBaseView { - - private final int mPadding; - private final ImageView mIcon; - - public QSQuickTileView(Context context) { - super(context); - mPadding = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_padding); - mIcon = createIcon(); - addView(mIcon); - } - - protected ImageView createIcon() { - final ImageView icon = new ImageView(mContext); - icon.setId(android.R.id.icon); - icon.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - return icon; - } - - @Override - public void init(OnClickListener click, OnClickListener clickSecondary, - OnLongClickListener longClick) { - setClickable(true); - setOnClickListener(click); - } - - @Override - protected void handleStateChanged(QSTile.State state) { - mIcon.setImageDrawable(state.icon.getDrawable(getContext())); - setContentDescription(state.contentDescription); - } - - @Override - public boolean setType(int type) { - return false; - } - - @Override - public View updateAccessibilityOrder(View previousView) { - return this; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - mIcon.measure(exactly(getMeasuredWidth() - 2 * mPadding), - exactly(getMeasuredHeight() - 2 * mPadding)); - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - layout(mIcon, mPadding, mPadding); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index 0e4a4e53a80b..ca4a03af9636 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -73,11 +73,6 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { } @Override - public void setTileVisibility(TileRecord tile, int visibility) { - tile.tileView.setVisibility(visibility); - } - - @Override public void addTile(TileRecord tile) { mTiles.add(tile); distributeTiles(); @@ -101,10 +96,6 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { final int NT = mTiles.size(); for (int i = 0; i < NT; i++) { TileRecord tile = mTiles.get(i); - if (tile.tile.getTileType() == QSTileView.QS_TYPE_QUICK) { - // Don't show any quick tiles for now. - continue; - } if (mPages.get(index).isFull()) { if (++index == mPages.size()) { if (DEBUG) Log.d(TAG, "Adding page for " + tile.tile.getClass().getSimpleName()); @@ -178,7 +169,6 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { public TilePage(Context context, AttributeSet attrs) { super(context, attrs); - mAllowDual = false; updateResources(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/PseudoGridView.java b/packages/SystemUI/src/com/android/systemui/qs/PseudoGridView.java index cb6708e4aec5..699273aad612 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PseudoGridView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PseudoGridView.java @@ -98,7 +98,7 @@ public class PseudoGridView extends ViewGroup { } } - setMeasuredDimension(width, getDefaultSize(totalHeight, heightMeasureSpec)); + setMeasuredDimension(width, resolveSizeAndState(totalHeight, heightMeasureSpec, 0)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSIconView.java b/packages/SystemUI/src/com/android/systemui/qs/QSIconView.java new file mode 100644 index 000000000000..b56ad76ec2b4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/QSIconView.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.Animatable; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import com.android.systemui.R; + +import java.util.Objects; + +public class QSIconView extends ViewGroup { + + private final View mIcon; + private final int mIconSizePx; + private final int mTilePaddingBelowIconPx; + + public QSIconView(Context context) { + super(context); + + final Resources res = context.getResources(); + mIconSizePx = res.getDimensionPixelSize(R.dimen.qs_tile_icon_size); + mTilePaddingBelowIconPx = res.getDimensionPixelSize(R.dimen.qs_tile_padding_below_icon); + + mIcon = createIcon(); + addView(mIcon); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int w = MeasureSpec.getSize(widthMeasureSpec); + final int iconSpec = exactly(mIconSizePx); + mIcon.measure(MeasureSpec.makeMeasureSpec(w, getIconMeasureMode()), iconSpec); + setMeasuredDimension(w, mIcon.getMeasuredHeight() + mTilePaddingBelowIconPx); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + final int w = getMeasuredWidth(); + final int h = getMeasuredHeight(); + int top = 0; + final int iconLeft = (w - mIcon.getMeasuredWidth()) / 2; + layout(mIcon, iconLeft, top); + } + + public void setIcon(QSTile.State state) { + setIcon((ImageView) mIcon, state); + } + + protected void setIcon(ImageView iv, QSTile.State state) { + if (!Objects.equals(state.icon, iv.getTag(R.id.qs_icon_tag))) { + Drawable d = state.icon != null ? state.icon.getDrawable(mContext) : null; + if (d != null && state.autoMirrorDrawable) { + d.setAutoMirrored(true); + } + iv.setImageDrawable(d); + iv.setTag(R.id.qs_icon_tag, state.icon); + if (d instanceof Animatable) { + Animatable a = (Animatable) d; + if (state.icon instanceof QSTile.AnimationIcon && !iv.isShown()) { + a.stop(); // skip directly to end state + } + } + } + + } + + protected int getIconMeasureMode() { + return MeasureSpec.EXACTLY; + } + + protected View createIcon() { + final ImageView icon = new ImageView(mContext); + icon.setId(android.R.id.icon); + icon.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + return icon; + } + + protected static int exactly(int size) { + return MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY); + } + + protected static void layout(View child, int left, int top) { + child.layout(left, top, left + child.getMeasuredWidth(), top + child.getMeasuredHeight()); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index bb2b8fc4742d..ae8542ad9d88 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -19,14 +19,12 @@ package com.android.systemui.qs; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.AnimatorListenerAdapter; -import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Handler; import android.os.Message; -import android.provider.Settings; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -36,7 +34,6 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; - import com.android.internal.logging.MetricsLogger; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; @@ -56,7 +53,6 @@ import java.util.Collection; public class QSPanel extends FrameLayout implements Tunable { public static final String QS_SHOW_BRIGHTNESS = "qs_show_brightness"; - public static final String QS_THE_NEW_QS = "qs_paged_panel"; protected final Context mContext; protected final ArrayList<TileRecord> mRecords = new ArrayList<TileRecord>(); @@ -102,20 +98,25 @@ public class QSPanel extends FrameLayout implements Tunable { updateDetailText(); mDetail.setVisibility(GONE); mDetail.setClickable(true); - mBrightnessView = LayoutInflater.from(context).inflate( - R.layout.quick_settings_brightness_dialog, this, false); - mFooter = new QSFooter(this, context); addView(mDetail); mQsContainer = new LinearLayout(mContext); mQsContainer.setOrientation(LinearLayout.VERTICAL); mQsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); - addView(mQsContainer); + mBrightnessView = LayoutInflater.from(context).inflate( + R.layout.quick_settings_brightness_dialog, this, false); mQsContainer.addView(mBrightnessView); + + mTileLayout = (QSTileLayout) LayoutInflater.from(mContext).inflate( + R.layout.qs_paged_tile_layout, mQsContainer, false); + mQsContainer.addView((View) mTileLayout); + + mFooter = new QSFooter(this, context); mQsContainer.addView(mFooter.getView()); + mClipper = new QSDetailClipper(mDetail); updateResources(); @@ -136,7 +137,7 @@ public class QSPanel extends FrameLayout implements Tunable { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - TunerService.get(mContext).addTunable(this, QS_SHOW_BRIGHTNESS, QS_THE_NEW_QS); + TunerService.get(mContext).addTunable(this, QS_SHOW_BRIGHTNESS); } @Override @@ -150,36 +151,15 @@ public class QSPanel extends FrameLayout implements Tunable { if (QS_SHOW_BRIGHTNESS.equals(key)) { mBrightnessView.setVisibility(newValue == null || Integer.parseInt(newValue) != 0 ? VISIBLE : GONE); - } else if (QS_THE_NEW_QS.equals(key)) { - boolean theNewQs = newValue != null && Integer.parseInt(newValue) != 0; - if (mTileLayout != null) { - for (int i = 0; i < mRecords.size(); i++) { - mTileLayout.removeTile(mRecords.get(i)); - } - mQsContainer.removeView((View) mTileLayout); - } - int layout = theNewQs - ? R.layout.qs_paged_tile_layout : R.layout.qs_tile_layout; - mTileLayout = - (QSTileLayout) LayoutInflater.from(mContext).inflate(layout, mQsContainer, false); - mQsContainer.addView((View) mTileLayout, 1 /* Between brightness and footer */); - for (int i = 0; i < mRecords.size(); i++) { - mTileLayout.addTile(mRecords.get(i)); - } - if (theNewQs) { - mCustomizePanel = (QSCustomizer) LayoutInflater.from(mContext) - .inflate(R.layout.qs_customize_panel, null); - mCustomizePanel.setHost(mHost); - } else { - if (mCustomizePanel != null && mCustomizePanel.isCustomizing()) { - mCustomizePanel.hide(mCustomizePanel.getWidth() / 2, - mCustomizePanel.getHeight() / 2); - } - mCustomizePanel = null; - } } } + protected void createCustomizePanel() { + mCustomizePanel = (QSCustomizer) LayoutInflater.from(mContext) + .inflate(R.layout.qs_customize_panel, null); + mCustomizePanel.setHost(mHost); + } + private void updateDetailText() { mDetailDoneButton.setText(R.string.quick_settings_done); mDetailSettingsButton.setText(R.string.quick_settings_more_settings); @@ -200,6 +180,7 @@ public class QSPanel extends FrameLayout implements Tunable { public void setHost(QSTileHost host) { mHost = host; mFooter.setHost(host); + createCustomizePanel(); } public QSTileHost getHost() { @@ -298,19 +279,10 @@ public class QSPanel extends FrameLayout implements Tunable { showDetail(show, r); } - private void showDetail(boolean show, Record r) { + protected void showDetail(boolean show, Record r) { mHandler.obtainMessage(H.SHOW_DETAIL, show ? 1 : 0, 0, r).sendToTarget(); } - private void setTileVisibility(TileRecord record, int visibility) { - mHandler.obtainMessage(H.SET_TILE_VISIBILITY, visibility, 0, record).sendToTarget(); - } - - private void handleSetTileVisibility(TileRecord tile, int visibility) { - if (visibility == tile.tileView.getVisibility()) return; - mTileLayout.setTileVisibility(tile, visibility); - } - public void setTiles(Collection<QSTile<?>> tiles) { for (TileRecord record : mRecords) { mTileLayout.removeTile(record); @@ -325,16 +297,17 @@ public class QSPanel extends FrameLayout implements Tunable { } private void drawTile(TileRecord r, QSTile.State state) { - final int visibility = state.visible ? VISIBLE : GONE; - setTileVisibility(r, visibility); r.tileView.onStateChanged(state); } + protected QSTileBaseView createTileView(QSTile<?> tile) { + return new QSTileView(mContext, tile.createTileView(mContext)); + } + protected void addTile(final QSTile<?> tile) { final TileRecord r = new TileRecord(); r.tile = tile; - r.tileView = tile.createTileView(mContext); - r.tileView.setVisibility(View.GONE); + r.tileView = createTileView(tile); final QSTile.Callback callback = new QSTile.Callback() { @Override public void onStateChanged(QSTile.State state) { @@ -369,13 +342,7 @@ public class QSPanel extends FrameLayout implements Tunable { final View.OnClickListener click = new View.OnClickListener() { @Override public void onClick(View v) { - r.tile.click(); - } - }; - final View.OnClickListener clickSecondary = new View.OnClickListener() { - @Override - public void onClick(View v) { - r.tile.secondaryClick(); + onTileClick(r.tile); } }; final View.OnLongClickListener longClick = new View.OnLongClickListener() { @@ -396,7 +363,7 @@ public class QSPanel extends FrameLayout implements Tunable { return true; } }; - r.tileView.init(click, clickSecondary, longClick); + r.tileView.init(click, longClick); r.tile.setListening(mListening); callback.onStateChanged(r.tile.getState()); r.tile.refreshState(); @@ -407,6 +374,10 @@ public class QSPanel extends FrameLayout implements Tunable { } } + protected void onTileClick(QSTile<?> tile) { + tile.click(); + } + public boolean isShowingDetail() { return mDetailRecord != null || (mCustomizePanel != null && mCustomizePanel.isCustomizing()); @@ -429,7 +400,7 @@ public class QSPanel extends FrameLayout implements Tunable { return mQsContainer.getMeasuredHeight(); } - private void handleShowDetail(Record r, boolean show) { + protected void handleShowDetail(Record r, boolean show) { if (r instanceof TileRecord) { handleShowDetailTile((TileRecord) r, show); } else { @@ -515,9 +486,7 @@ public class QSPanel extends FrameLayout implements Tunable { private void logTiles() { for (int i = 0; i < mRecords.size(); i++) { TileRecord tileRecord = mRecords.get(i); - if (tileRecord.tile.getState().visible) { - MetricsLogger.visible(mContext, tileRecord.tile.getMetricsCategory()); - } + MetricsLogger.visible(mContext, tileRecord.tile.getMetricsCategory()); } } @@ -554,13 +523,11 @@ public class QSPanel extends FrameLayout implements Tunable { public void handleMessage(Message msg) { if (msg.what == SHOW_DETAIL) { handleShowDetail((Record)msg.obj, msg.arg1 != 0); - } else if (msg.what == SET_TILE_VISIBILITY) { - handleSetTileVisibility((TileRecord) msg.obj, msg.arg1); } } } - private static class Record { + protected static class Record { View detailView; DetailAdapter detailAdapter; int x; @@ -619,13 +586,7 @@ public class QSPanel extends FrameLayout implements Tunable { public interface QSTileLayout { void addTile(TileRecord tile); void removeTile(TileRecord tile); - void setTileVisibility(TileRecord tile, int visibility); int getOffsetTop(TileRecord tile); void updateResources(); } - - public static boolean isTheNewQS(Context context) { - return Settings.Secure.getIntForUser(context.getContentResolver(), QS_THE_NEW_QS, - ActivityManager.getCurrentUser(), 0) != 0; - } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java index 7f45545bf30b..39f0c5578e8e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java @@ -86,20 +86,12 @@ public abstract class QSTile<TState extends State> implements Listenable { mTileSpec = tileSpec; } - public int getTileType() { - return QSTileView.QS_TYPE_NORMAL; - } - - public final boolean supportsDualTargets() { - return getTileType() == QSTileView.QS_TYPE_DUAL; - } - public Host getHost() { return mHost; } - public QSTileBaseView createTileView(Context context) { - return new QSTileView(context); + public QSIconView createTileView(Context context) { + return new QSIconView(context); } public DetailAdapter getDetailAdapter() { @@ -181,7 +173,8 @@ public abstract class QSTile<TState extends State> implements Listenable { } protected void handleSecondaryClick() { - // optional + // Default to normal click. + handleClick(); } protected void handleLongClick() { @@ -327,8 +320,10 @@ public abstract class QSTile<TState extends State> implements Listenable { public interface Host { void startActivityDismissingKeyguard(Intent intent); void startActivityDismissingKeyguard(PendingIntent intent); + void startRunnableDismissingKeyguard(Runnable runnable); void warn(String message, Throwable t); void collapsePanels(); + void openPanels(); Looper getLooper(); Context getContext(); Collection<QSTile<?>> getTiles(); @@ -345,6 +340,7 @@ public abstract class QSTile<TState extends State> implements Listenable { UserSwitcherController getUserSwitcherController(); UserInfoController getUserInfoController(); BatteryController getBatteryController(); + void removeTile(String tileSpec); public interface Callback { void onTilesChanged(); @@ -451,7 +447,6 @@ public abstract class QSTile<TState extends State> implements Listenable { } public static class State { - public boolean visible; public Icon icon; public CharSequence label; public CharSequence contentDescription; @@ -461,14 +456,12 @@ public abstract class QSTile<TState extends State> implements Listenable { public boolean copyTo(State other) { if (other == null) throw new IllegalArgumentException(); if (!other.getClass().equals(getClass())) throw new IllegalArgumentException(); - final boolean changed = other.visible != visible - || !Objects.equals(other.icon, icon) + final boolean changed = !Objects.equals(other.icon, icon) || !Objects.equals(other.label, label) || !Objects.equals(other.contentDescription, contentDescription) || !Objects.equals(other.autoMirrorDrawable, autoMirrorDrawable) || !Objects.equals(other.dualLabelContentDescription, dualLabelContentDescription); - other.visible = visible; other.icon = icon; other.label = label; other.contentDescription = contentDescription; @@ -484,7 +477,6 @@ public abstract class QSTile<TState extends State> implements Listenable { protected StringBuilder toStringBuilder() { final StringBuilder sb = new StringBuilder(getClass().getSimpleName()).append('['); - sb.append("visible=").append(visible); sb.append(",icon=").append(icon); sb.append(",label=").append(label); sb.append(",contentDescription=").append(contentDescription); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java index 72fc88de11ea..68461f531578 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileBaseView.java @@ -1,57 +1,112 @@ /* * Copyright (C) 2015 The Android Open Source Project * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ - package com.android.systemui.qs; import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.RippleDrawable; import android.os.Handler; import android.os.Looper; import android.os.Message; -import android.util.AttributeSet; import android.view.View; -import android.view.ViewGroup; - -public abstract class QSTileBaseView extends ViewGroup { +import android.widget.LinearLayout; +import com.android.systemui.R; - public static final int QS_TYPE_NORMAL = 0; - public static final int QS_TYPE_DUAL = 1; - public static final int QS_TYPE_QUICK = 2; +public class QSTileBaseView extends LinearLayout { private final H mHandler = new H(); + private QSIconView mIcon; + private RippleDrawable mRipple; + private Drawable mTileBackground; - public QSTileBaseView(Context context) { + public QSTileBaseView(Context context, QSIconView icon) { super(context); + mIcon = icon; + addView(mIcon); + + mTileBackground = newTileBackground(); + if (mTileBackground instanceof RippleDrawable) { + setRipple((RippleDrawable) mTileBackground); + } + setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); + setBackground(mTileBackground); + + // Default to Quick Tile padding, and QSTileView will specify its own padding. + int padding = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_padding); + setPadding(padding, padding, padding, padding); } - public QSTileBaseView(Context context, AttributeSet attrs) { - super(context, attrs); + private Drawable newTileBackground() { + final int[] attrs = new int[] { android.R.attr.selectableItemBackgroundBorderless }; + final TypedArray ta = mContext.obtainStyledAttributes(attrs); + final Drawable d = ta.getDrawable(0); + ta.recycle(); + return d; } + private void setRipple(RippleDrawable tileBackground) { + mRipple = tileBackground; + if (getWidth() != 0) { + updateRippleSize(getWidth(), getHeight()); + } + } - public void onStateChanged(QSTile.State state) { - mHandler.obtainMessage(H.STATE_CHANGED, state).sendToTarget(); + private void updateRippleSize(int width, int height) { + // center the touch feedback on the center of the icon, and dial it down a bit + final int cx = width / 2; + final int cy = height / 2; + final int rad = (int)(mIcon.getHeight() * .85f); + mRipple.setHotspotBounds(cx - rad, cy - rad, cx + rad, cy + rad); } - public abstract void init(OnClickListener click, OnClickListener clickSecondary, - OnLongClickListener longClick); - public abstract View updateAccessibilityOrder(View previousView); - public abstract boolean setType(int type); + public void init(OnClickListener click, OnLongClickListener longClick) { + setClickable(true); + setOnClickListener(click); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + final int w = getMeasuredWidth(); + final int h = getMeasuredHeight(); + + if (mRipple != null) { + updateRippleSize(w, h); + } + } - protected abstract void handleStateChanged(QSTile.State state); + /** + * Update the accessibility order for this view. + * + * @param previousView the view which should be before this one + * @return the last view in this view which is accessible + */ + public View updateAccessibilityOrder(View previousView) { + setAccessibilityTraversalAfter(previousView.getId()); + return this; + } - protected static int exactly(int size) { - return MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY); + public void onStateChanged(QSTile.State state) { + mHandler.obtainMessage(H.STATE_CHANGED, state).sendToTarget(); } - protected static void layout(View child, int left, int top) { - child.layout(left, top, left + child.getMeasuredWidth(), top + child.getMeasuredHeight()); + protected void handleStateChanged(QSTile.State state) { + mIcon.setIcon(state); + setContentDescription(state.contentDescription); } private class H extends Handler { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java index 4cc2b8d191ee..41ac4d9413dd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java @@ -17,26 +17,16 @@ package com.android.systemui.qs; import android.content.Context; -import android.content.res.ColorStateList; import android.content.res.Configuration; import android.content.res.Resources; -import android.content.res.TypedArray; import android.graphics.Typeface; -import android.graphics.drawable.Animatable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.RippleDrawable; import android.util.MathUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.View; -import android.widget.ImageView; -import android.widget.ImageView.ScaleType; import android.widget.TextView; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; -import com.android.systemui.qs.QSTile.AnimationIcon; - -import java.util.Objects; /** View that represents a standard quick settings tile. **/ public class QSTileView extends QSTileBaseView { @@ -44,59 +34,25 @@ public class QSTileView extends QSTileBaseView { Typeface.NORMAL); protected final Context mContext; - private final View mIcon; - private final View mDivider; - private final int mIconSizePx; private final int mTileSpacingPx; private int mTilePaddingTopPx; - private final int mTilePaddingBelowIconPx; - private final int mDualTileVerticalPaddingPx; - private final View mTopBackgroundView; private TextView mLabel; - private QSDualTileLabel mDualLabel; - private int mType; - private OnClickListener mClickPrimary; - private OnClickListener mClickSecondary; - private OnLongClickListener mLongClick; - private Drawable mTileBackground; - private RippleDrawable mRipple; - - private View mCircle; - public QSTileView(Context context) { - super(context); + public QSTileView(Context context, QSIconView icon) { + super(context, icon); mContext = context; final Resources res = context.getResources(); - mIconSizePx = res.getDimensionPixelSize(R.dimen.qs_tile_icon_size); mTileSpacingPx = res.getDimensionPixelSize(R.dimen.qs_tile_spacing); - mTilePaddingBelowIconPx = res.getDimensionPixelSize(R.dimen.qs_tile_padding_below_icon); - mDualTileVerticalPaddingPx = - res.getDimensionPixelSize(R.dimen.qs_dual_tile_padding_vertical); - mTileBackground = newTileBackground(); - recreateLabel(); setClipChildren(false); - mTopBackgroundView = new View(context); - mTopBackgroundView.setId(View.generateViewId()); - addView(mTopBackgroundView); - - mIcon = createIcon(); - addView(mIcon); - - mCircle = createCircleIcon(); - addView(mCircle); - - mDivider = new View(mContext); - mDivider.setBackgroundColor(context.getColor(R.color.qs_tile_divider)); - final int dh = res.getDimensionPixelSize(R.dimen.qs_tile_divider_height); - mDivider.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, dh)); - addView(mDivider); - setClickable(true); updateTopPadding(); setId(View.generateViewId()); + createLabel(); + setOrientation(VERTICAL); + setGravity(Gravity.CENTER); } private void updateTopPadding() { @@ -106,6 +62,8 @@ public class QSTileView extends QSTileBaseView { float largeFactor = (MathUtils.constrain(getResources().getConfiguration().fontScale, 1.0f, FontSizeUtils.LARGE_TEXT_SCALE) - 1f) / (FontSizeUtils.LARGE_TEXT_SCALE - 1f); mTilePaddingTopPx = Math.round((1 - largeFactor) * padding + largeFactor * largePadding); + setPadding(mTileSpacingPx, mTilePaddingTopPx + mTileSpacingPx, mTileSpacingPx, + mTileSpacingPx); requestLayout(); } @@ -114,260 +72,29 @@ public class QSTileView extends QSTileBaseView { super.onConfigurationChanged(newConfig); updateTopPadding(); FontSizeUtils.updateFontSize(mLabel, R.dimen.qs_tile_text_size); - if (mDualLabel != null) { - mDualLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX, - getResources().getDimensionPixelSize(R.dimen.qs_tile_text_size)); - } } - private void recreateLabel() { - CharSequence labelText = null; - CharSequence labelDescription = null; - if (mLabel != null) { - labelText = mLabel.getText(); - removeView(mLabel); - mLabel = null; - } - if (mDualLabel != null) { - labelText = mDualLabel.getText(); - labelDescription = mLabel != null ? mLabel.getContentDescription() : null; - removeView(mDualLabel); - mDualLabel = null; - } + private void createLabel() { final Resources res = mContext.getResources(); - if (mType == QS_TYPE_DUAL) { - mDualLabel = new QSDualTileLabel(mContext); - mDualLabel.setId(View.generateViewId()); - mDualLabel.setBackgroundResource(R.drawable.btn_borderless_rect); - mDualLabel.setFirstLineCaret(mContext.getDrawable(R.drawable.qs_dual_tile_caret)); - mDualLabel.setTextColor(mContext.getColor(R.color.qs_tile_text)); - mDualLabel.setPadding(0, mDualTileVerticalPaddingPx, 0, mDualTileVerticalPaddingPx); - mDualLabel.setTypeface(CONDENSED); - mDualLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX, - res.getDimensionPixelSize(R.dimen.qs_tile_text_size)); - mDualLabel.setClickable(true); - mDualLabel.setOnClickListener(mClickSecondary); - mDualLabel.setFocusable(true); - if (labelText != null) { - mDualLabel.setText(labelText); - } - if (labelDescription != null) { - mDualLabel.setContentDescription(labelDescription); - } - addView(mDualLabel); - mDualLabel.setAccessibilityTraversalAfter(mTopBackgroundView.getId()); - } else if (mType == QS_TYPE_NORMAL) { - mLabel = new TextView(mContext); - mLabel.setTextColor(mContext.getColor(R.color.qs_tile_text)); - mLabel.setGravity(Gravity.CENTER_HORIZONTAL); - mLabel.setMinLines(2); - mLabel.setPadding(0, 0, 0, 0); - mLabel.setTypeface(CONDENSED); - mLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX, - res.getDimensionPixelSize(R.dimen.qs_tile_text_size)); - mLabel.setClickable(false); - if (labelText != null) { - mLabel.setText(labelText); - } - addView(mLabel); - } - } - - public boolean setType(int type) { - final boolean changed = mType != type; - mType = type; - if (changed) { - recreateLabel(); - } - if (mTileBackground instanceof RippleDrawable) { - setRipple((RippleDrawable) mTileBackground); - } - if (mType == QS_TYPE_DUAL) { - mTopBackgroundView.setOnClickListener(mClickPrimary); - setOnClickListener(null); - setClickable(false); - setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); - mTopBackgroundView.setBackground(mTileBackground); - } else { - mTopBackgroundView.setOnClickListener(null); - mTopBackgroundView.setClickable(false); - setOnClickListener(mClickPrimary); - setOnLongClickListener(mLongClick); - setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); - setBackground(mTileBackground); - } - mTopBackgroundView.setFocusable(mType == QS_TYPE_DUAL); - setFocusable(mType != QS_TYPE_DUAL); - mDivider.setVisibility(mType == QS_TYPE_DUAL ? VISIBLE : GONE); - mCircle.setVisibility(mType == QS_TYPE_QUICK ? VISIBLE : GONE); - postInvalidate(); - return changed; - } - - private void setRipple(RippleDrawable tileBackground) { - mRipple = tileBackground; - if (getWidth() != 0) { - updateRippleSize(getWidth(), getHeight()); - } + mLabel = new TextView(mContext); + mLabel.setTextColor(mContext.getColor(R.color.qs_tile_text)); + mLabel.setGravity(Gravity.CENTER_HORIZONTAL); + mLabel.setMinLines(2); + mLabel.setPadding(0, 0, 0, 0); + mLabel.setTypeface(CONDENSED); + mLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX, + res.getDimensionPixelSize(R.dimen.qs_tile_text_size)); + mLabel.setClickable(false); + addView(mLabel); } - public void init(OnClickListener clickPrimary, OnClickListener clickSecondary, - OnLongClickListener longClick) { - mClickPrimary = clickPrimary; - mClickSecondary = clickSecondary; - mLongClick = longClick; - } - - protected View createIcon() { - final ImageView icon = new ImageView(mContext); - icon.setId(android.R.id.icon); - icon.setScaleType(ScaleType.CENTER_INSIDE); - return icon; - } - - protected View createCircleIcon() { - final ImageView icon = new ImageView(mContext); - icon.setImageResource(R.drawable.ic_qs_circle); - // TODO: Not this. - icon.setPadding(20, 20, 20, 20); - return icon; - } - - protected View createCircle() { - final ImageView icon = new ImageView(mContext); - icon.setId(android.R.id.icon); - icon.setScaleType(ScaleType.CENTER_INSIDE); - return icon; - } - - private Drawable newTileBackground() { - final int[] attrs = new int[] { android.R.attr.selectableItemBackgroundBorderless }; - final TypedArray ta = mContext.obtainStyledAttributes(attrs); - final Drawable d = ta.getDrawable(0); - ta.recycle(); - return d; - } - - private View labelView() { - return mType == QS_TYPE_DUAL ? mDualLabel : mLabel; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final int w = MeasureSpec.getSize(widthMeasureSpec); - final int h = MeasureSpec.getSize(heightMeasureSpec); - final int iconSpec = exactly(mIconSizePx); - mIcon.measure(MeasureSpec.makeMeasureSpec(w, getIconMeasureMode()), iconSpec); - switch (mType) { - case QS_TYPE_QUICK: - mCircle.measure( - MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY)); - break; - case QS_TYPE_DUAL: - mDivider.measure(widthMeasureSpec, exactly(mDivider.getLayoutParams().height)); - default: - labelView().measure(widthMeasureSpec, - MeasureSpec.makeMeasureSpec(h, MeasureSpec.AT_MOST)); - break; - } - int heightSpec = exactly( - mIconSizePx + mTilePaddingBelowIconPx + mTilePaddingTopPx); - mTopBackgroundView.measure(widthMeasureSpec, heightSpec); - setMeasuredDimension(w, h); - } - - protected int getIconMeasureMode() { - return MeasureSpec.EXACTLY; - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - final int w = getMeasuredWidth(); - final int h = getMeasuredHeight(); - - layout(mTopBackgroundView, 0, mTileSpacingPx); - - int top = 0; - top += mTileSpacingPx; - top += mTilePaddingTopPx; - final int iconLeft = (w - mIcon.getMeasuredWidth()) / 2; - if (mType == QS_TYPE_QUICK) { - top = (h - mIcon.getMeasuredHeight()) / 2; - layout(mCircle, 0, 0); - } - layout(mIcon, iconLeft, top); - if (mRipple != null) { - updateRippleSize(w, h); - - } - top = mIcon.getBottom(); - top += mTilePaddingBelowIconPx; - if (mType == QS_TYPE_DUAL) { - layout(mDivider, 0, top); - top = mDivider.getBottom(); - } - if (mType != QS_TYPE_QUICK) { - layout(labelView(), 0, top); - } - } - - private void updateRippleSize(int width, int height) { - // center the touch feedback on the center of the icon, and dial it down a bit - final int cx = width / 2; - final int cy = mType == QS_TYPE_DUAL ? mIcon.getTop() + mIcon.getHeight() / 2 : height / 2; - final int rad = (int)(mIcon.getHeight() * 1.25f); - mRipple.setHotspotBounds(cx - rad, cy - rad, cx + rad, cy + rad); + public void init(OnClickListener clickPrimary, OnLongClickListener longClick) { + setOnClickListener(clickPrimary); + setOnLongClickListener(longClick); } protected void handleStateChanged(QSTile.State state) { - if (mIcon instanceof ImageView) { - setIcon((ImageView) mIcon, state); - } - if (mType == QS_TYPE_DUAL) { - mDualLabel.setText(state.label); - mDualLabel.setContentDescription(state.dualLabelContentDescription); - mTopBackgroundView.setContentDescription(state.contentDescription); - } else if (mType == QS_TYPE_NORMAL) { - mLabel.setText(state.label); - setContentDescription(state.contentDescription); - } - } - - protected void setIcon(ImageView iv, QSTile.State state) { - if (!Objects.equals(state.icon, iv.getTag(R.id.qs_icon_tag))) { - Drawable d = state.icon != null ? state.icon.getDrawable(mContext) : null; - if (d != null && state.autoMirrorDrawable) { - d.setAutoMirrored(true); - } - iv.setImageDrawable(d); - iv.setTag(R.id.qs_icon_tag, state.icon); - if (d instanceof Animatable) { - Animatable a = (Animatable) d; - if (state.icon instanceof AnimationIcon && !iv.isShown()) { - a.stop(); // skip directly to end state - } - } - } - } - - /** - * Update the accessibility order for this view. - * - * @param previousView the view which should be before this one - * @return the last view in this view which is accessible - */ - public View updateAccessibilityOrder(View previousView) { - View firstView; - View lastView; - if (mType == QS_TYPE_DUAL) { - lastView = mDualLabel; - firstView = mTopBackgroundView; - } else { - firstView = this; - lastView = this; - } - firstView.setAccessibilityTraversalAfter(previousView.getId()); - return lastView; + super.handleStateChanged(state); + mLabel.setText(state.label); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index 6a053bee36cd..bda46756e1aa 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -19,7 +19,6 @@ package com.android.systemui.qs; import android.content.Context; import android.content.res.ColorStateList; import android.util.AttributeSet; -import android.util.Log; import android.view.Gravity; import android.view.View; import android.widget.ImageView; @@ -30,10 +29,14 @@ import java.util.ArrayList; import java.util.Collection; /** - * Version of QSPanel that only shows 4 Quick Tiles in the QS Header. + * Version of QSPanel that only shows N Quick Tiles in the QS Header. */ public class QuickQSPanel extends QSPanel { + private int mMaxTiles; + private QSPanel mFullPanel; + private View mHeader; + public QuickQSPanel(Context context, AttributeSet attrs) { super(context, attrs); if (mTileLayout != null) { @@ -46,6 +49,36 @@ public class QuickQSPanel extends QSPanel { mQsContainer.addView((View) mTileLayout, 1 /* Between brightness and footer */); } + public void setQSPanelAndHeader(QSPanel fullPanel, View header) { + mFullPanel = fullPanel; + mHeader = header; + } + + @Override + protected void handleShowDetail(QSPanel.Record r, boolean show) { + if (show) { + mHeader.performClick(); + mFullPanel.showDetail(show, r); + } else { + // Not sure how we would end up here... + super.handleShowDetail(r, show); + } + } + + @Override + protected QSTileBaseView createTileView(QSTile<?> tile) { + return new QSTileBaseView(mContext, tile.createTileView(mContext)); + } + + public void setMaxTiles(int maxTiles) { + mMaxTiles = maxTiles; + } + + @Override + protected void onTileClick(QSTile<?> tile) { + tile.secondaryClick(); + } + @Override public void onTuningChanged(String key, String newValue) { // No tunings for you. @@ -59,11 +92,8 @@ public class QuickQSPanel extends QSPanel { public void setTiles(Collection<QSTile<?>> tiles) { ArrayList<QSTile<?>> quickTiles = new ArrayList<>(); for (QSTile<?> tile : tiles) { - if (tile.getTileType() == QSTileView.QS_TYPE_QUICK) { - Log.d("QSPanel", "Adding " + tile.getTileSpec()); - quickTiles.add(tile); - } - if (quickTiles.size() == 2) { + quickTiles.add(tile); + if (quickTiles.size() == mMaxTiles) { break; } } @@ -74,6 +104,8 @@ public class QuickQSPanel extends QSPanel { public HeaderTileLayout(Context context) { super(context); + setClipChildren(false); + setClipToPadding(false); setGravity(Gravity.CENTER_VERTICAL); setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); @@ -92,17 +124,14 @@ public class QuickQSPanel extends QSPanel { @Override public void addTile(TileRecord tile) { tile.tileView.setLayoutParams(generateLayoutParams()); - // These shouldn't be normal tiles, but they will be for now so that the circles don't - // show up. - tile.tileView.setType(QSTileView.QS_TYPE_NORMAL); addView(tile.tileView, getChildCount() - 1 /* Leave icon at end */); } private LayoutParams generateLayoutParams() { - int size = - mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size); + int size = mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size); LayoutParams lp = new LayoutParams(0, size); lp.weight = 1; + lp.gravity = Gravity.CENTER; return lp; } @@ -112,11 +141,6 @@ public class QuickQSPanel extends QSPanel { } @Override - public void setTileVisibility(TileRecord tile, int visibility) { - tile.tileView.setVisibility(visibility); - } - - @Override public int getOffsetTop(TileRecord tile) { return 0; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java index a2e129660cfe..b2bfa0603237 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java @@ -27,7 +27,7 @@ import com.android.systemui.R; import com.android.systemui.qs.QSTile.SignalState; /** View that represents a custom quick settings tile for displaying signal info (wifi/cell). **/ -public final class SignalTileView extends QSTileView { +public final class SignalTileView extends QSIconView { private static final long DEFAULT_DURATION = new ValueAnimator().getDuration(); private static final long SHORT_DURATION = DEFAULT_DURATION / 3; @@ -106,8 +106,7 @@ public final class SignalTileView extends QSTileView { } @Override - protected void handleStateChanged(QSTile.State state) { - super.handleStateChanged(state); + public void setIcon(QSTile.State state) { final SignalState s = (SignalState) state; setIcon(mSignal, s); if (s.overlayIconId > 0) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java index 1336eec1a478..ff111776ed85 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java @@ -18,14 +18,9 @@ public class TileLayout extends ViewGroup implements QSTileLayout { private static final String TAG = "TileLayout"; - private int mDualTileUnderlap; protected int mColumns; private int mCellWidth; private int mCellHeight; - private int mLargeCellWidth; - private int mLargeCellHeight; - - protected boolean mAllowDual = true; protected final ArrayList<TileRecord> mRecords = new ArrayList<>(); @@ -59,21 +54,11 @@ public class TileLayout extends ViewGroup implements QSTileLayout { super.removeAllViews(); } - @Override - public void setTileVisibility(TileRecord tile, int visibility) { - tile.tileView.setVisibility(visibility); - } - public void updateResources() { final Resources res = mContext.getResources(); final int columns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns)); mCellHeight = getCellHeight(); mCellWidth = (int) (mCellHeight * TILE_ASPECT); - mLargeCellHeight = mAllowDual ? res.getDimensionPixelSize(R.dimen.qs_dual_tile_height) - : mCellHeight; - mLargeCellWidth = mAllowDual ? (int) (mLargeCellHeight * TILE_ASPECT) : mCellWidth; - mDualTileUnderlap = mAllowDual - ? res.getDimensionPixelSize(R.dimen.qs_dual_tile_padding_vertical) : 0; if (mColumns != columns) { mColumns = columns; postInvalidate(); @@ -90,16 +75,13 @@ public class TileLayout extends ViewGroup implements QSTileLayout { int r = -1; int c = -1; int rows = 0; - boolean rowIsDual = false; for (TileRecord record : mRecords) { if (record.tileView.getVisibility() == GONE) continue; // wrap to next column if we've reached the max # of columns // also don't allow dual + single tiles on the same row - if (r == -1 || c == (mColumns - 1) - || rowIsDual != (mAllowDual && record.tile.supportsDualTargets())) { + if (r == -1 || c == (mColumns - 1)) { r++; c = 0; - rowIsDual = mAllowDual && record.tile.supportsDualTargets(); } else { c++; } @@ -110,13 +92,9 @@ public class TileLayout extends ViewGroup implements QSTileLayout { View previousView = this; for (TileRecord record : mRecords) { - if (record.tileView.setType(mAllowDual ? record.tile.getTileType() - : QSTileView.QS_TYPE_NORMAL)) { - record.tileView.handleStateChanged(record.tile.getState()); - } if (record.tileView.getVisibility() == GONE) continue; - final int cw = record.row == 0 ? mLargeCellWidth : mCellWidth; - final int ch = record.row == 0 ? mLargeCellHeight : mCellHeight; + final int cw = mCellWidth; + final int ch = mCellHeight; record.tileView.measure(exactly(cw), exactly(ch)); previousView = record.tileView.updateAccessibilityOrder(previousView); } @@ -135,7 +113,7 @@ public class TileLayout extends ViewGroup implements QSTileLayout { for (TileRecord record : mRecords) { if (record.tileView.getVisibility() == GONE) continue; final int cols = getColumnCount(record.row); - final int cw = record.row == 0 ? mLargeCellWidth : mCellWidth; + final int cw = mCellWidth; final int extra = (w - cw * cols) / (cols + 1); int left = record.col * cw + (record.col + 1) * extra; final int top = getRowTop(record.row); @@ -153,7 +131,7 @@ public class TileLayout extends ViewGroup implements QSTileLayout { private int getRowTop(int row) { if (row <= 0) return 0; - return mLargeCellHeight - mDualTileUnderlap + (row - 1) * mCellHeight; + return row * mCellHeight; } private int getColumnCount(int row) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java b/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java deleted file mode 100644 index e64f6a0afdda..000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.qs; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; - -import com.android.systemui.Prefs; -import com.android.systemui.R; -import com.android.systemui.statusbar.phone.SystemUIDialog; -import com.android.systemui.statusbar.policy.Listenable; - -public class UsageTracker implements Listenable { - private static final long MILLIS_PER_DAY = 1000 * 60 * 60 * 24; - - private final Context mContext; - private final long mTimeToShowTile; - @Prefs.Key private final String mPrefKey; - private final String mResetAction; - - private boolean mRegistered; - - public UsageTracker(Context context, @Prefs.Key String prefKey, Class<?> tile, - int timeoutResource) { - mContext = context; - mPrefKey = prefKey; - mTimeToShowTile = MILLIS_PER_DAY * mContext.getResources().getInteger(timeoutResource); - mResetAction = "com.android.systemui.qs." + tile.getSimpleName() + ".usage_reset"; - } - - @Override - public void setListening(boolean listen) { - if (listen && !mRegistered) { - mContext.registerReceiver(mReceiver, new IntentFilter(mResetAction)); - mRegistered = true; - } else if (!listen && mRegistered) { - mContext.unregisterReceiver(mReceiver); - mRegistered = false; - } - } - - public boolean isRecentlyUsed() { - long lastUsed = Prefs.getLong(mContext, mPrefKey, 0L /* defaultValue */); - return (System.currentTimeMillis() - lastUsed) < mTimeToShowTile; - } - - public void trackUsage() { - Prefs.putLong(mContext, mPrefKey, System.currentTimeMillis()); - } - - public void reset() { - Prefs.remove(mContext, mPrefKey); - } - - public void showResetConfirmation(String title, final Runnable onConfirmed) { - final SystemUIDialog d = new SystemUIDialog(mContext); - d.setTitle(title); - d.setMessage(mContext.getString(R.string.quick_settings_reset_confirmation_message)); - d.setNegativeButton(android.R.string.cancel, null); - d.setPositiveButton(R.string.quick_settings_reset_confirmation_button, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - reset(); - if (onConfirmed != null) { - onConfirmed.run(); - } - } - }); - d.setCanceledOnTouchOutside(true); - d.show(); - } - - private BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (mResetAction.equals(intent.getAction())) { - reset(); - } - } - }; -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/BlankCustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/customize/BlankCustomTile.java index a4ff6852374a..95ff611d7419 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/BlankCustomTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/BlankCustomTile.java @@ -72,12 +72,10 @@ public class BlankCustomTile extends QSTile<QSTile.State> { try { PackageManager pm = mContext.getPackageManager(); ServiceInfo info = pm.getServiceInfo(mComponent, 0); - state.visible = true; state.icon = new DrawableIcon(info.loadIcon(pm)); state.label = info.loadLabel(pm).toString(); state.contentDescription = state.label; } catch (Exception e) { - state.visible = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java index 422ae4d31691..87c2973592b6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java @@ -81,6 +81,11 @@ public class CustomQSPanel extends QSPanel { } } + @Override + protected void createCustomizePanel() { + // Already in CustomizePanel. + } + public void tileSelected(QSTile<?> tile, ClipData currentClip) { String sourceSpec = getSpec(currentClip); String destSpec = tile.getTileSpec(); @@ -176,13 +181,16 @@ public class CustomQSPanel extends QSPanel { if (mTiles.get(i).startsWith(CustomTile.PREFIX)) { mCurrentTiles.add(BlankCustomTile.create(mHost, mTiles.get(i))); } else { - mCurrentTiles.add(mHost.createTile(mTiles.get(i))); + QSTile<?> tile = mHost.createTile(mTiles.get(i)); + if (tile != null) { + mCurrentTiles.add(tile); + } } mCurrentTiles.get(mCurrentTiles.size() - 1).setTileSpec(mTiles.get(i)); } super.setTiles(mCurrentTiles); } - + public void addTile(String spec) { mTiles.add(spec); setTilesInternal(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/NonPagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/customize/NonPagedTileLayout.java index d0d5b549039f..3acbed865dc8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/NonPagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/NonPagedTileLayout.java @@ -25,14 +25,12 @@ import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.LinearLayout; - import com.android.systemui.R; import com.android.systemui.qs.PagedTileLayout; import com.android.systemui.qs.PagedTileLayout.TilePage; import com.android.systemui.qs.QSPanel.QSTileLayout; import com.android.systemui.qs.QSPanel.TileRecord; import com.android.systemui.qs.QSTile; -import com.android.systemui.qs.QSTileView; import com.android.systemui.qs.QuickTileLayout; import java.util.ArrayList; @@ -75,13 +73,12 @@ public class NonPagedTileLayout extends LinearLayout implements QSTileLayout, On public void addTile(TileRecord record) { mTiles.add(record); distributeTiles(); - if (record.tile.getTileType() == QSTileView.QS_TYPE_QUICK - || record.tileView.getTag() == record.tile) { + if (record.tileView.getTag() == record.tile) { return; } record.tileView.setTag(record.tile); record.tileView.setVisibility(View.VISIBLE); - record.tileView.init(null, null, null); + record.tileView.init(null, null); record.tileView.setOnTouchListener(this); if (mCurrentClip != null && mCurrentClip.getItemAt(0) .getText().toString().equals(record.tile.getTileSpec())) { @@ -107,10 +104,6 @@ public class NonPagedTileLayout extends LinearLayout implements QSTileLayout, On final int NT = mTiles.size(); for (int i = 0; i < NT; i++) { TileRecord tile = mTiles.get(i); - if (tile.tile.getTileType() == QSTileView.QS_TYPE_QUICK) { - // Ignore quick tiles for now. - continue; - } mPages.get(index).addTile(tile); // Keep everything in one layout for now. if (false && mPages.get(index).isFull()) { @@ -125,12 +118,6 @@ public class NonPagedTileLayout extends LinearLayout implements QSTileLayout, On } @Override - public void setTileVisibility(TileRecord tile, int visibility) { - // All tiles visible here, so that they can be re-arranged. - tile.tileView.setVisibility(View.VISIBLE); - } - - @Override public int getOffsetTop(TileRecord tile) { // No touch feedback, so this isn't required. return 0; diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index baad370ca014..4a7d67f9fe38 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -37,9 +37,7 @@ import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Toolbar; import android.widget.Toolbar.OnMenuItemClickListener; - import com.android.systemui.R; -import com.android.systemui.SystemUIApplication; import com.android.systemui.qs.QSDetailClipper; import com.android.systemui.qs.QSTile.Host.Callback; import com.android.systemui.qs.customize.DropButton.OnDropListener; @@ -80,14 +78,13 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene public QSCustomizer(Context context, AttributeSet attrs) { super(new ContextThemeWrapper(context, android.R.style.Theme_Material), attrs); - mPhoneStatusBar = ((SystemUIApplication) mContext.getApplicationContext()) - .getComponent(PhoneStatusBar.class); mClipper = new QSDetailClipper(this); } public void setHost(QSTileHost host) { mHost = host; mHost.addCallback(this); + mPhoneStatusBar = host.getPhoneStatusBar(); mQsPanel.setTiles(mHost.getTiles()); mQsPanel.setHost(mHost); mQsPanel.setSavedTiles(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java index 144b202f5248..6706c7aace12 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -88,6 +88,9 @@ public class TileAdapter extends BaseAdapter { } Log.d(TAG, "Trying " + spec); final QSTile<?> tile = host.createTile(spec); + if (tile == null) { + continue; + } // Bad, bad, very bad. tile.setListening(true); tile.clearState(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java index 49f8d1c20413..fc802dde9797 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java @@ -73,7 +73,6 @@ public class AirplaneModeTile extends QSTile<QSTile.BooleanState> { final int value = arg instanceof Integer ? (Integer)arg : mSetting.getValue(); final boolean airplaneMode = value != 0; state.value = airplaneMode; - state.visible = true; state.label = mContext.getString(R.string.airplane_mode); if (airplaneMode) { state.icon = mEnable; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java index 8f9655d65d15..84eac65a54e7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java @@ -73,7 +73,6 @@ public class BatteryTile extends QSTile<QSTile.State> implements BatteryControll int level = (arg != null) ? (Integer) arg : mLevel; String percentage = NumberFormat.getPercentInstance().format((double) level / 100.0); - state.visible = true; state.icon = new Icon() { @Override public Drawable getDrawable(Context context) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java index 7f07ddc009c5..cfc09a0153bf 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java @@ -24,18 +24,15 @@ import android.provider.Settings; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; - import com.android.internal.logging.MetricsLogger; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.systemui.R; import com.android.systemui.qs.QSDetailItems; import com.android.systemui.qs.QSDetailItems.Item; import com.android.systemui.qs.QSTile; -import com.android.systemui.qs.QSTileView; import com.android.systemui.statusbar.policy.BluetoothController; import java.util.Collection; -import java.util.Set; /** Quick settings tile: Bluetooth **/ public class BluetoothTile extends QSTile<QSTile.BooleanState> { @@ -44,21 +41,13 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> { private final BluetoothController mController; private final BluetoothDetailAdapter mDetailAdapter; - private final boolean mAlwaysDetail; - - public BluetoothTile(Host host, boolean alwaysDetail) { + public BluetoothTile(Host host) { super(host); - mAlwaysDetail = alwaysDetail; mController = host.getBluetoothController(); mDetailAdapter = new BluetoothDetailAdapter(); } @Override - public int getTileType() { - return QSTileView.QS_TYPE_DUAL; - } - - @Override public DetailAdapter getDetailAdapter() { return mDetailAdapter; } @@ -78,18 +67,15 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> { } @Override - protected void handleClick() { - if (mAlwaysDetail) { - handleSecondaryClick(); - return; - } + protected void handleSecondaryClick() { + // Secondary clicks are header clicks, just toggle. final boolean isEnabled = (Boolean)mState.value; MetricsLogger.action(mContext, getMetricsCategory(), !isEnabled); mController.setBluetoothEnabled(!isEnabled); } @Override - protected void handleSecondaryClick() { + protected void handleClick() { if (!mState.value) { mState.value = true; mController.setBluetoothEnabled(true); @@ -99,11 +85,9 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> { @Override protected void handleUpdateState(BooleanState state, Object arg) { - final boolean supported = mController.isBluetoothSupported(); final boolean enabled = mController.isBluetoothEnabled(); final boolean connected = mController.isBluetoothConnected(); final boolean connecting = mController.isBluetoothConnecting(); - state.visible = supported; state.value = enabled; state.autoMirrorDrawable = false; if (enabled) { @@ -155,6 +139,10 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> { } } + public static boolean isSupported(Host host) { + return host.getBluetoothController().isBluetoothSupported(); + } + private final BluetoothController.Callback mCallback = new BluetoothController.Callback() { @Override public void onBluetoothStateChange(boolean enabled) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java index 48b74a4566a5..a8e139c1cd43 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java @@ -23,12 +23,10 @@ import android.util.Log; import android.view.View; import android.view.View.OnAttachStateChangeListener; import android.view.ViewGroup; - import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.qs.QSDetailItems; import com.android.systemui.qs.QSDetailItems.Item; -import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QSTile; import com.android.systemui.statusbar.policy.CastController; import com.android.systemui.statusbar.policy.CastController.CastDevice; @@ -87,14 +85,23 @@ public class CastTile extends QSTile<QSTile.BooleanState> { @Override protected void handleClick() { + if (mKeyguard.isSecure() && !mKeyguard.canSkipBouncer()) { + mHost.startRunnableDismissingKeyguard(new Runnable() { + @Override + public void run() { + MetricsLogger.action(mContext, getMetricsCategory()); + showDetail(true); + mHost.openPanels(); + } + }); + return; + } MetricsLogger.action(mContext, getMetricsCategory()); showDetail(true); } @Override protected void handleUpdateState(BooleanState state, Object arg) { - state.visible = !mKeyguard.isSecure() || !mKeyguard.isShowing() - || mKeyguard.canSkipBouncer() || QSPanel.isTheNewQS(mContext); state.label = mContext.getString(R.string.quick_settings_cast_title); state.value = false; state.autoMirrorDrawable = false; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index a0bbbe3d2043..6c7b33730eec 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -26,8 +26,8 @@ import android.view.ViewGroup; import com.android.internal.logging.MetricsLogger; import com.android.settingslib.net.MobileDataController; import com.android.systemui.R; +import com.android.systemui.qs.QSIconView; import com.android.systemui.qs.QSTile; -import com.android.systemui.qs.QSTileBaseView; import com.android.systemui.qs.SignalTileView; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.IconState; @@ -71,7 +71,7 @@ public class CellularTile extends QSTile<QSTile.SignalState> { } @Override - public QSTileBaseView createTileView(Context context) { + public QSIconView createTileView(Context context) { return new SignalTileView(context); } @@ -86,9 +86,15 @@ public class CellularTile extends QSTile<QSTile.SignalState> { } @Override + protected void handleSecondaryClick() { + boolean dataEnabled = mDataController.isMobileDataSupported() + && mDataController.isMobileDataEnabled(); + MetricsLogger.action(mContext, MetricsLogger.QS_CELLULAR_TOGGLE, !dataEnabled); + mDataController.setMobileDataEnabled(!dataEnabled); + } + + @Override protected void handleUpdateState(SignalState state, Object arg) { - state.visible = mController.hasMobileDataFeature(); - if (!state.visible) return; CallbackInfo cb = (CallbackInfo) arg; if (cb == null) { cb = mSignalCallback.mInfo; @@ -138,6 +144,10 @@ public class CellularTile extends QSTile<QSTile.SignalState> { return string; } + public static boolean isSupported(Host host) { + return host.getNetworkController().hasMobileDataFeature(); + } + private static final class CallbackInfo { boolean enabled; boolean wifiEnabled; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java index 2f9a496d9602..f73ee354443d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java @@ -17,14 +17,10 @@ package com.android.systemui.qs.tiles; import android.provider.Settings.Secure; - import com.android.internal.logging.MetricsLogger; -import com.android.systemui.Prefs; import com.android.systemui.R; -import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QSTile; import com.android.systemui.qs.SecureSetting; -import com.android.systemui.qs.UsageTracker; /** Quick settings tile: Invert colors **/ public class ColorInversionTile extends QSTile<QSTile.BooleanState> { @@ -34,7 +30,6 @@ public class ColorInversionTile extends QSTile<QSTile.BooleanState> { private final AnimationIcon mDisable = new AnimationIcon(R.drawable.ic_invert_colors_disable_animation); private final SecureSetting mSetting; - private final UsageTracker mUsageTracker; private boolean mListening; @@ -45,28 +40,14 @@ public class ColorInversionTile extends QSTile<QSTile.BooleanState> { Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED) { @Override protected void handleValueChanged(int value, boolean observedChange) { - if (value != 0 || observedChange) { - mUsageTracker.trackUsage(); - } - if (mListening) { - handleRefreshState(value); - } + handleRefreshState(value); } }; - mUsageTracker = new UsageTracker(host.getContext(), - Prefs.Key.COLOR_INVERSION_TILE_LAST_USED, ColorInversionTile.class, - R.integer.days_to_show_color_inversion_tile); - if (mSetting.getValue() != 0 && !mUsageTracker.isRecentlyUsed()) { - mUsageTracker.trackUsage(); - } - mUsageTracker.setListening(true); - mSetting.setListening(true); } @Override protected void handleDestroy() { super.handleDestroy(); - mUsageTracker.setListening(false); mSetting.setListening(false); } @@ -77,7 +58,7 @@ public class ColorInversionTile extends QSTile<QSTile.BooleanState> { @Override public void setListening(boolean listening) { - mListening = listening; + mSetting.setListening(listening); } @Override @@ -95,23 +76,9 @@ public class ColorInversionTile extends QSTile<QSTile.BooleanState> { } @Override - protected void handleLongClick() { - if (mState.value) return; // don't allow usage reset if inversion is active - final String title = mContext.getString(R.string.quick_settings_reset_confirmation_title, - mState.label); - mUsageTracker.showResetConfirmation(title, new Runnable() { - @Override - public void run() { - refreshState(); - } - }); - } - - @Override protected void handleUpdateState(BooleanState state, Object arg) { final int value = arg instanceof Integer ? (Integer) arg : mSetting.getValue(); final boolean enabled = value != 0; - state.visible = enabled || mUsageTracker.isRecentlyUsed() || QSPanel.isTheNewQS(mContext); state.value = enabled; state.label = mContext.getString(R.string.quick_settings_inversion_label); state.icon = enabled ? mEnable : mDisable; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CustomTile.java index 04006ebae41e..bb74f341b89d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CustomTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CustomTile.java @@ -104,9 +104,15 @@ public class CustomTile extends QSTile<QSTile.State> { mServiceConnection, Service.BIND_AUTO_CREATE, new UserHandle(ActivityManager.getCurrentUser())); mBound = true; + } else { + if (mService != null) { + mService.onStartListening(); + } else { + Log.d(TAG, "Can't start service listening"); + } } } else { - if (mService!= null) { + if (mService != null) { mService.onStopListening(); } if (mIsTokenGranted && !mIsShowingDialog) { @@ -168,7 +174,6 @@ public class CustomTile extends QSTile<QSTile.State> { @Override protected void handleUpdateState(State state, Object arg) { - state.visible = true; Drawable drawable = mTile.getIcon().loadDrawable(mContext); drawable.setTint(mContext.getColor(android.R.color.white)); state.icon = new DrawableIcon(drawable); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index 781ab1c7363c..d96f735301e5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -29,7 +29,6 @@ import android.view.View; import android.view.View.OnAttachStateChangeListener; import android.view.ViewGroup; import android.widget.Toast; - import com.android.internal.logging.MetricsLogger; import com.android.systemui.Prefs; import com.android.systemui.R; @@ -126,7 +125,6 @@ public class DndTile extends QSTile<QSTile.BooleanState> { final boolean newValue = zen != Global.ZEN_MODE_OFF; final boolean valueChanged = state.value != newValue; state.value = newValue; - state.visible = isVisible(mContext); switch (zen) { case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: state.icon = ResourceIcon.get(R.drawable.ic_qs_dnd_on); @@ -215,6 +213,10 @@ public class DndTile extends QSTile<QSTile.BooleanState> { } }; + public static boolean isSupported(Host host) { + return isVisible(host.getContext()); + } + private final class DndDetailAdapter implements DetailAdapter, OnAttachStateChangeListener { @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java index 21cbef21c22a..12c12980b065 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java @@ -17,7 +17,6 @@ package com.android.systemui.qs.tiles; import android.app.ActivityManager; - import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.qs.QSTile; @@ -71,7 +70,8 @@ public class FlashlightTile extends QSTile<QSTile.BooleanState> implements @Override protected void handleUpdateState(BooleanState state, Object arg) { - state.visible = mFlashlightController.isAvailable(); + // TODO: Flashlight available handling... +// state.visible = mFlashlightController.isAvailable(); state.label = mHost.getContext().getString(R.string.quick_settings_flashlight_label); if (arg instanceof UserBoolean) { boolean value = ((UserBoolean) arg).value; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index 79084ae73e3c..250d5674bb6e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -16,16 +16,9 @@ package com.android.systemui.qs.tiles; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - import com.android.internal.logging.MetricsLogger; -import com.android.systemui.Prefs; import com.android.systemui.R; -import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QSTile; -import com.android.systemui.qs.UsageTracker; import com.android.systemui.statusbar.policy.HotspotController; /** Quick settings tile: Hotspot **/ @@ -36,19 +29,15 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { new AnimationIcon(R.drawable.ic_hotspot_disable_animation); private final HotspotController mController; private final Callback mCallback = new Callback(); - private final UsageTracker mUsageTracker; public HotspotTile(Host host) { super(host); mController = host.getHotspotController(); - mUsageTracker = newUsageTracker(host.getContext()); - mUsageTracker.setListening(true); } @Override protected void handleDestroy() { super.handleDestroy(); - mUsageTracker.setListening(false); } @Override @@ -75,22 +64,7 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { } @Override - protected void handleLongClick() { - if (mState.value) return; // don't allow usage reset if hotspot is active - final String title = mContext.getString(R.string.quick_settings_reset_confirmation_title, - mState.label); - mUsageTracker.showResetConfirmation(title, new Runnable() { - @Override - public void run() { - refreshState(); - } - }); - } - - @Override protected void handleUpdateState(BooleanState state, Object arg) { - state.visible = (mController.isHotspotSupported() && mUsageTracker.isRecentlyUsed()) - || QSPanel.isTheNewQS(mContext); state.label = mContext.getString(R.string.quick_settings_hotspot_label); if (arg instanceof Boolean) { @@ -98,7 +72,7 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { } else { state.value = mController.isHotspotEnabled(); } - state.icon = state.visible && state.value ? mEnable : mDisable; + state.icon = state.value ? mEnable : mDisable; } @Override @@ -115,31 +89,10 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { } } - private static UsageTracker newUsageTracker(Context context) { - return new UsageTracker(context, Prefs.Key.HOTSPOT_TILE_LAST_USED, HotspotTile.class, - R.integer.days_to_show_hotspot_tile); - } - private final class Callback implements HotspotController.Callback { @Override public void onHotspotChanged(boolean enabled) { refreshState(enabled); } }; - - /** - * This will catch broadcasts for changes in hotspot state so we can show - * the hotspot tile for a number of days after use. - */ - public static class APChangedReceiver extends BroadcastReceiver { - private UsageTracker mUsageTracker; - - @Override - public void onReceive(Context context, Intent intent) { - if (mUsageTracker == null) { - mUsageTracker = newUsageTracker(context); - } - mUsageTracker.trackUsage(); - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java index c7f2284c07a6..0883445891a4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java @@ -124,7 +124,6 @@ public class IntentTile extends QSTile<QSTile.State> { } // Save the last one in case we need it later. mLastIntent = intent; - state.visible = intent.getBooleanExtra("visible", true); state.contentDescription = intent.getStringExtra("contentDescription"); state.label = intent.getStringExtra("label"); state.icon = null; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java index 0e2672ca4da1..08540f69ff6e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java @@ -18,7 +18,6 @@ package com.android.systemui.qs.tiles; import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; -import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QSTile; import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.LocationController; @@ -60,6 +59,20 @@ public class LocationTile extends QSTile<QSTile.BooleanState> { @Override protected void handleClick() { + if (mKeyguard.isSecure() && mKeyguard.isShowing()) { + mHost.startRunnableDismissingKeyguard(new Runnable() { + @Override + public void run() { + final boolean wasEnabled = (Boolean) mState.value; + mHost.openPanels(); + MetricsLogger.action(mContext, getMetricsCategory(), !wasEnabled); + mController.setLocationEnabled(!wasEnabled); + mEnable.setAllowAnimation(true); + mDisable.setAllowAnimation(true); + } + }); + return; + } final boolean wasEnabled = (Boolean) mState.value; MetricsLogger.action(mContext, getMetricsCategory(), !wasEnabled); mController.setLocationEnabled(!wasEnabled); @@ -74,7 +87,6 @@ public class LocationTile extends QSTile<QSTile.BooleanState> { // Work around for bug 15916487: don't show location tile on top of lock screen. After the // bug is fixed, this should be reverted to only hiding it on secure lock screens: // state.visible = !(mKeyguard.isSecure() && mKeyguard.isShowing()); - state.visible = !mKeyguard.isShowing() || QSPanel.isTheNewQS(mContext); state.value = locationEnabled; if (locationEnabled) { state.icon = mEnable; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QBluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QBluetoothTile.java deleted file mode 100644 index 4fe7e45846a3..000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QBluetoothTile.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.qs.tiles; - -import android.content.Context; -import com.android.systemui.QSQuickTileView; -import com.android.systemui.qs.QSTileBaseView; -import com.android.systemui.qs.QSTileView; - -/** Quick settings tile: Bluetooth **/ -public class QBluetoothTile extends BluetoothTile { - - public QBluetoothTile(Host host) { - super(host, false); - } - - @Override - public QSTileBaseView createTileView(Context context) { - return new QSQuickTileView(context); - } - - @Override - public int getTileType() { - return QSTileView.QS_TYPE_QUICK; - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QLockTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QLockTile.java deleted file mode 100644 index 8b3013a96f9c..000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QLockTile.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.systemui.qs.tiles; - -import android.content.Context; -import com.android.internal.logging.MetricsLogger; -import com.android.systemui.QSQuickTileView; -import com.android.systemui.R; -import com.android.systemui.qs.QSTile; -import com.android.systemui.qs.QSTileBaseView; -import com.android.systemui.qs.QSTileView; -import com.android.systemui.statusbar.policy.KeyguardMonitor; - -public class QLockTile extends QSTile<QSTile.State> implements KeyguardMonitor.Callback { - - private final KeyguardMonitor mKeyguard; - - public QLockTile(Host host) { - super(host); - mKeyguard = host.getKeyguardMonitor(); - } - - @Override - public QSTileBaseView createTileView(Context context) { - return new QSQuickTileView(context); - } - - @Override - public int getTileType() { - return QSTileView.QS_TYPE_QUICK; - } - - @Override - protected State newTileState() { - return new State(); - } - - @Override - public void setListening(boolean listening) { - if (listening) { - mKeyguard.addCallback(this); - } else { - mKeyguard.removeCallback(this); - } - } - - @Override - public int getMetricsCategory() { - return MetricsLogger.QS_LOCK_TILE; - } - - @Override - public void onKeyguardChanged() { - refreshState(); - } - - @Override - protected void handleClick() { - if (mKeyguard.isShowing()) { - mKeyguard.unlock(); - } else { - mKeyguard.lock(); - } - } - - @Override - protected void handleUpdateState(State state, Object arg) { - // TOD: Content description. - state.visible = true; - if (mKeyguard.isShowing()) { - state.icon = ResourceIcon.get(R.drawable.ic_qs_lock); - } else { - state.icon = ResourceIcon.get(R.drawable.ic_qs_lock_open); - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QWifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QWifiTile.java deleted file mode 100644 index f0fe87d2261f..000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QWifiTile.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.qs.tiles; - -import android.content.Context; -import com.android.systemui.QSQuickTileView; -import com.android.systemui.qs.QSTileBaseView; -import com.android.systemui.qs.QSTileView; -import com.android.systemui.statusbar.policy.WifiIcons; - -/** Quick settings tile: Wifi **/ -public class QWifiTile extends WifiTile { - - public QWifiTile(Host host) { - super(host, false); - } - - @Override - public QSTileBaseView createTileView(Context context) { - return new QSQuickTileView(context); - } - - @Override - public int getTileType() { - return QSTileView.QS_TYPE_QUICK; - } - - @Override - protected void handleUpdateState(SignalState state, Object arg) { - super.handleUpdateState(state, arg); - - CallbackInfo cb = (CallbackInfo) arg; - if (cb == null) { - cb = mSignalCallback.mInfo; - } - boolean wifiConnected = cb.enabled && (cb.wifiSignalIconId > 0) && (cb.enabledDesc != null); - - if (state.enabled && wifiConnected) { - // Only show full signal here. - state.icon = ResourceIcon.get(WifiIcons.QS_WIFI_SIGNAL_STRENGTH[1][4]); - } - // No activity in the quick toggle. - state.activityIn = false; - state.activityOut = false; - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java index 1a26a4dad39e..d85cf605c851 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java @@ -72,7 +72,8 @@ public class RotationLockTile extends QSTile<QSTile.BooleanState> { final boolean rotationLocked = arg != null ? ((UserBoolean) arg).value : mController.isRotationLocked(); final boolean userInitiated = arg != null ? ((UserBoolean) arg).userInitiated : false; - state.visible = mController.isRotationLockAffordanceVisible(); + // TODO: Handle accessibility rotation lock and whatnot. +// state.visible = mController.isRotationLockAffordanceVisible(); if (state.value == rotationLocked && state.contentDescription != null) { // No change and initialized, no need to update all the values. return; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java index 3c5ab8d491b7..d29cae4caace 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java @@ -67,17 +67,19 @@ public class UserTile extends QSTile<QSTile.State> implements UserInfoController @Override protected void handleUpdateState(State state, Object arg) { final Pair<String, Drawable> p = arg != null ? (Pair<String, Drawable>) arg : mLastUpdate; - state.visible = p != null; - if (!state.visible) return; - state.label = p.first; - // TODO: Better content description. - state.contentDescription = p.first; - state.icon = new Icon() { - @Override - public Drawable getDrawable(Context context) { - return p.second; - } - }; + if (p != null) { + state.label = p.first; + // TODO: Better content description. + state.contentDescription = p.first; + state.icon = new Icon() { + @Override + public Drawable getDrawable(Context context) { + return p.second; + } + }; + } else { + // TODO: Default state. + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java index 7f4442a397f7..48b4096c8500 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java @@ -18,20 +18,19 @@ package com.android.systemui.qs.tiles; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.res.Resources; import android.provider.Settings; import android.util.Log; import android.view.View; import android.view.ViewGroup; - import com.android.internal.logging.MetricsLogger; import com.android.settingslib.wifi.AccessPoint; import com.android.systemui.R; import com.android.systemui.qs.QSDetailItems; import com.android.systemui.qs.QSDetailItems.Item; +import com.android.systemui.qs.QSIconView; import com.android.systemui.qs.QSTile; -import com.android.systemui.qs.QSTileBaseView; -import com.android.systemui.qs.QSTileView; import com.android.systemui.qs.SignalTileView; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; @@ -51,22 +50,14 @@ public class WifiTile extends QSTile<QSTile.SignalState> { protected final WifiSignalCallback mSignalCallback = new WifiSignalCallback(); - private final boolean mAlwaysDetail; - - public WifiTile(Host host, boolean alwaysDetail) { + public WifiTile(Host host) { super(host); - mAlwaysDetail = alwaysDetail; mController = host.getNetworkController(); mWifiController = mController.getAccessPointController(); mDetailAdapter = new WifiDetailAdapter(); } @Override - public int getTileType() { - return QSTileView.QS_TYPE_DUAL; - } - - @Override protected SignalState newTileState() { return new SignalState(); } @@ -95,23 +86,20 @@ public class WifiTile extends QSTile<QSTile.SignalState> { } @Override - public QSTileBaseView createTileView(Context context) { + public QSIconView createTileView(Context context) { return new SignalTileView(context); } @Override - protected void handleClick() { - if (mAlwaysDetail) { - handleSecondaryClick(); - return; - } + protected void handleSecondaryClick() { + // Secondary clicks are header clicks, just toggle. mState.copyTo(mStateBeforeClick); MetricsLogger.action(mContext, getMetricsCategory(), !mState.enabled); mController.setWifiEnabled(!mState.enabled); } @Override - protected void handleSecondaryClick() { + protected void handleClick() { if (!mWifiController.canConfigWifi()) { mHost.startActivityDismissingKeyguard(new Intent(Settings.ACTION_WIFI_SETTINGS)); return; @@ -125,7 +113,6 @@ public class WifiTile extends QSTile<QSTile.SignalState> { @Override protected void handleUpdateState(SignalState state, Object arg) { - state.visible = true; if (DEBUG) Log.d(TAG, "handleUpdateState arg=" + arg); CallbackInfo cb = (CallbackInfo) arg; if (cb == null) { @@ -201,6 +188,10 @@ public class WifiTile extends QSTile<QSTile.SignalState> { return string; } + public static boolean isSupported(Host host) { + return host.getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI); + } + protected static final class CallbackInfo { boolean enabled; boolean connected; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java index 7605f3b89bf1..07915f8dc56e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java @@ -22,14 +22,8 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.UserInfo; -import android.os.IUserManager; -import android.os.RemoteException; -import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; -import android.util.ArraySet; -import android.util.Log; - import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.qs.QSTile; @@ -110,8 +104,7 @@ public class WorkModeTile extends QSTile<QSTile.BooleanState> { @Override protected void handleUpdateState(BooleanState state, Object arg) { if (!hasActiveProfile()) { - state.visible = false; - state.value = false; + mHost.removeTile(getTileSpec()); return; } @@ -124,7 +117,6 @@ public class WorkModeTile extends QSTile<QSTile.BooleanState> { userInitialized = false; } - state.visible = true; final AnimationIcon icon; state.label = mContext.getString(R.string.quick_settings_work_mode_label); if (state.value) { diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java index 5d17e2c54201..8979843b49c7 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -52,6 +52,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.util.ArraySet; import android.util.Log; import android.util.MutableBoolean; import android.util.Pair; @@ -154,7 +155,7 @@ public class SystemServicesProxy { /** Returns a list of the recents tasks */ public List<ActivityManager.RecentTaskInfo> getRecentTasks(int numLatestTasks, int userId, - boolean isTopTaskHome) { + boolean isTopTaskHome, ArraySet<Integer> quietProfileIds) { if (mAm == null) return null; // If we are mocking, then create some recent tasks @@ -215,6 +216,8 @@ public class SystemServicesProxy { // tasks if it is not the first active task. boolean isExcluded = (t.baseIntent.getFlags() & Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) == Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; + // Filter out recent tasks from managed profiles which are in quiet mode. + isExcluded |= quietProfileIds.contains(t.userId); if (isExcluded && (isTopTaskHome || !isFirstValidTask)) { iter.remove(); continue; diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java index 63d09ee88680..1845bf94ecf8 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java @@ -18,10 +18,13 @@ package com.android.systemui.recents.model; import android.app.ActivityManager; import android.content.Context; +import android.content.pm.UserInfo; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.UserHandle; +import android.os.UserManager; +import android.util.ArraySet; import android.util.Log; import com.android.systemui.Prefs; import com.android.systemui.recents.Recents; @@ -66,20 +69,42 @@ public class RecentsTaskLoadPlan { List<ActivityManager.RecentTaskInfo> mRawTasks; TaskStack mStack; + ArraySet<Integer> mCurrentQuietProfiles = new ArraySet<Integer>(); /** Package level ctor */ RecentsTaskLoadPlan(Context context) { mContext = context; } + private void updateCurrentQuietProfilesCache(int currentUserId) { + mCurrentQuietProfiles.clear(); + + if (currentUserId == UserHandle.USER_CURRENT) { + currentUserId = ActivityManager.getCurrentUser(); + } + UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + List<UserInfo> profiles = userManager.getProfiles(currentUserId); + if (profiles != null) { + for (int i = 0; i < profiles.size(); i++) { + UserInfo user = profiles.get(i); + if (user.isManagedProfile() && user.isQuietModeEnabled()) { + mCurrentQuietProfiles.add(user.id); + } + } + } + } + /** * An optimization to preload the raw list of tasks. The raw tasks are saved in least-recent * to most-recent order. */ public synchronized void preloadRawTasks(boolean isTopTaskHome) { + int currentUserId = UserHandle.USER_CURRENT; + updateCurrentQuietProfilesCache(currentUserId); SystemServicesProxy ssp = Recents.getSystemServices(); mRawTasks = ssp.getRecentTasks(ActivityManager.getMaxRecentTasksStatic(), - UserHandle.CURRENT.getIdentifier(), isTopTaskHome); + currentUserId, isTopTaskHome, mCurrentQuietProfiles); + // Since the raw tasks are given in most-recent to least-recent order, we need to reverse it Collections.reverse(mRawTasks); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java index a0a1baccfe64..7ae686e42602 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java @@ -411,6 +411,8 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState(); if (launchState.launchedViaDragGesture) { setTranslationY(getMeasuredHeight()); + } else { + setTranslationY(0f); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 3c7ff7f13146..879624e9803e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1544,7 +1544,6 @@ public abstract class BaseStatusBar extends SystemUI implements } } entry.row = row; - updateNotificationHeightRange(entry); entry.row.setOnActivatedListener(this); entry.row.setExpandable(bigContentViewLocal != null); @@ -1557,19 +1556,11 @@ public abstract class BaseStatusBar extends SystemUI implements row.setUserExpanded(userExpanded); } row.setUserLocked(userLocked); - row.updateStatusBarNotification(entry.notification); + row.onNotificationUpdated(entry); applyRemoteInput(entry); return true; } - private void updateNotificationHeightRange(Entry entry) { - boolean customView = entry.getContentView().getId() - != com.android.internal.R.id.status_bar_latest_event_content; - boolean beforeN = entry.targetSdk < Build.VERSION_CODES.N; - int minHeight = customView && beforeN ? mRowMinHeightLegacy : mRowMinHeight; - entry.row.setHeightRange(minHeight, mRowMaxHeight); - } - /** * Adds RemoteInput actions from the WearableExtender; to be removed once more apps support this * via first-class API. @@ -2191,7 +2182,7 @@ public abstract class BaseStatusBar extends SystemUI implements // update the contentIntent mNotificationClicker.register(entry.row, sbn); - entry.row.updateStatusBarNotification(entry.notification); + entry.row.onNotificationUpdated(entry); entry.row.resetHeight(); applyRemoteInput(entry); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 7a94a58297b3..5c79c7d922d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -22,6 +22,7 @@ import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.os.Build; import android.service.notification.StatusBarNotification; import android.util.AttributeSet; import android.view.MotionEvent; @@ -49,6 +50,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { private static final int DEFAULT_DIVIDER_ALPHA = 0x29; private static final int COLORED_DIVIDER_ALPHA = 0x7B; private final LinearInterpolator mLinearInterpolator = new LinearInterpolator(); + private final int mNotificationMinHeightLegacy; + private final int mNotificationMinHeight; + private final int mNotificationMaxHeight; private int mRowMinHeight; /** Does this row contain layouts that can adapt to row expansion */ @@ -86,6 +90,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { private String mLoggingKey; private boolean mWasReset; private NotificationGuts mGuts; + private NotificationData.Entry mEntry; private StatusBarNotification mStatusBarNotification; private boolean mIsHeadsUp; private boolean mLastChronometerRunning = true; @@ -99,6 +104,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { private boolean mIsSystemChildExpanded; private boolean mIsPinned; private FalsingManager mFalsingManager; + private NotificationHeaderUtil mHeaderUtil = new NotificationHeaderUtil(this); private boolean mJustClicked; private boolean mIconAnimationRunning; @@ -187,10 +193,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } } - public void updateStatusBarNotification(StatusBarNotification statusBarNotification) { - mStatusBarNotification = statusBarNotification; - mPrivateLayout.onNotificationUpdated(statusBarNotification); - mPublicLayout.onNotificationUpdated(statusBarNotification); + public void onNotificationUpdated(NotificationData.Entry entry) { + mEntry = entry; + mStatusBarNotification = entry.notification; + mPrivateLayout.onNotificationUpdated(entry.notification); + mPublicLayout.onNotificationUpdated(entry.notification); updateVetoButton(); if (mIsSummaryWithChildren) { recreateNotificationHeader(); @@ -198,7 +205,23 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { if (mIconAnimationRunning) { setIconAnimationRunning(true); } + if (mNotificationParent != null) { + mNotificationParent.updateChildrenHeaderAppearance(); + } onChildrenCountChanged(); + updateLimits(); + } + + private void updateLimits() { + boolean customView = getPrivateLayout().getContractedChild().getId() + != com.android.internal.R.id.status_bar_latest_event_content; + boolean beforeN = mEntry.targetSdk < Build.VERSION_CODES.N; + int minHeight = customView && beforeN && !mIsSummaryWithChildren ? + mNotificationMinHeightLegacy : mNotificationMinHeight; + mRowMinHeight = minHeight; + mMaxViewHeight = mNotificationMaxHeight; + mPrivateLayout.setSmallHeight(mRowMinHeight); + mPublicLayout.setSmallHeight(mRowMinHeight); } public StatusBarNotification getStatusBarNotification() { @@ -246,6 +269,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { if (mChildrenContainer != null) { mChildrenContainer.removeNotification(row); } + mHeaderUtil.restoreNotificationHeader(row); onChildrenCountChanged(); row.setIsChildInGroup(false, null); } @@ -414,17 +438,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } } - public CharSequence getSubText() { - Notification notification = mStatusBarNotification.getNotification(); - CharSequence subText = notification.extras.getCharSequence(Notification.EXTRA_SUMMARY_TEXT); - if (subText == null) { - subText = notification.extras.getCharSequence(Notification.EXTRA_SUB_TEXT); + public NotificationHeaderView getNotificationHeader() { + if (mNotificationHeader != null) { + return mNotificationHeader; } - return subText; - } - - public void setContentSubTextVisible(boolean visible) { - mPrivateLayout.setSubTextVisible(visible); + return mPrivateLayout.getNotificationHeader(); } public void setOnExpandClickListener(OnExpandClickListener onExpandClickListener) { @@ -438,6 +456,12 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { public ExpandableNotificationRow(Context context, AttributeSet attrs) { super(context, attrs); mFalsingManager = FalsingManager.getInstance(context); + mNotificationMinHeightLegacy = getResources().getDimensionPixelSize( + R.dimen.notification_min_height_legacy); + mNotificationMinHeight = getResources().getDimensionPixelSize( + R.dimen.notification_min_height); + mNotificationMaxHeight = getResources().getDimensionPixelSize( + R.dimen.notification_max_height); } /** @@ -514,13 +538,15 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } } - private void updateChildrenVisibility(boolean animated) { + private void updateChildrenVisibility() { if (mChildrenContainer == null) { return; } mChildrenContainer.setVisibility(mIsSummaryWithChildren ? VISIBLE : INVISIBLE); mNotificationHeader.setVisibility(mIsSummaryWithChildren ? VISIBLE : INVISIBLE); mPrivateLayout.setVisibility(!mIsSummaryWithChildren ? VISIBLE : INVISIBLE); + // The limits might have changed if the view suddenly became a group or vice versa + updateLimits(); } @Override @@ -546,13 +572,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } } - public void setHeightRange(int rowMinHeight, int rowMaxHeight) { - mRowMinHeight = rowMinHeight; - mMaxViewHeight = rowMaxHeight; - mPrivateLayout.setSmallHeight(mRowMinHeight); - mPublicLayout.setSmallHeight(mRowMinHeight); - } - public boolean isExpandable() { if (mIsSummaryWithChildren && !mShowingPublic) { return !mChildrenExpanded; @@ -720,8 +739,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } } mPrivateLayout.updateExpandButtons(isExpandable()); + updateChildrenHeaderAppearance(); updateHeaderChildCount(); - updateChildrenVisibility(true); + updateChildrenVisibility(); } /** @@ -841,6 +861,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { public void setChildrenExpanded(boolean expanded, boolean animate) { mChildrenExpanded = expanded; + if (mNotificationHeader != null) { + mNotificationHeader.setExpanded(expanded); + } if (mChildrenContainer != null) { mChildrenContainer.setChildrenExpanded(expanded); } @@ -948,9 +971,23 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } else { header.reapply(getContext(), mNotificationHeader); } + updateHeaderExpandButton(); + updateChildrenHeaderAppearance(); updateHeaderChildCount(); } + private void updateHeaderExpandButton() { + if (mIsSummaryWithChildren) { + mNotificationHeader.setIsGroupHeader(true /* isGroupHeader*/); + } + } + + public void updateChildrenHeaderAppearance() { + if (mIsSummaryWithChildren) { + mHeaderUtil.updateChildrenHeaderAppearance(); + } + } + public boolean isMaxExpandHeightInitialized() { return mMaxExpandHeight != 0; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java index fb8086c3828e..da01d54796b6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java @@ -52,7 +52,6 @@ public class NotificationContentView extends FrameLayout { private static final int VISIBLE_TYPE_SINGLELINE = 3; private final Rect mClipBounds = new Rect(); - private final int mSingleLineHeight; private final int mHeadsUpHeight; private final int mRoundRectRadius; private final Interpolator mLinearInterpolator = new LinearInterpolator(); @@ -104,8 +103,6 @@ public class NotificationContentView extends FrameLayout { super(context, attrs); mHybridViewManager = new HybridNotificationViewManager(getContext(), this); mFadePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD)); - mSingleLineHeight = getResources().getDimensionPixelSize( - R.dimen.notification_single_line_height); mHeadsUpHeight = getResources().getDimensionPixelSize(R.dimen.notification_mid_height); mRoundRectRadius = getResources().getDimensionPixelSize( R.dimen.notification_material_rounded_rect_radius); @@ -160,9 +157,8 @@ public class NotificationContentView extends FrameLayout { maxChildHeight = Math.max(maxChildHeight, mHeadsUpChild.getMeasuredHeight()); } if (mSingleLineView != null) { - int size = Math.min(maxSize, mSingleLineHeight); mSingleLineView.measure(widthMeasureSpec, - MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY)); + MeasureSpec.makeMeasureSpec(maxSize, MeasureSpec.AT_MOST)); maxChildHeight = Math.max(maxChildHeight, mSingleLineView.getMeasuredHeight()); } int ownHeight = Math.min(maxChildHeight, maxSize); @@ -297,7 +293,7 @@ public class NotificationContentView extends FrameLayout { public int getMinHeight() { if (mIsChildInGroup && !isGroupExpanded()) { - return mSingleLineHeight; + return mSingleLineView.getHeight(); } else { return mSmallHeight; } @@ -509,18 +505,6 @@ public class NotificationContentView extends FrameLayout { } } - public void setSubTextVisible(boolean visible) { - if (mExpandedChild != null) { - mExpandedWrapper.setSubTextVisible(visible); - } - if (mContractedChild != null) { - mContractedWrapper.setSubTextVisible(visible); - } - if (mHeadsUpChild != null) { - mHeadsUpWrapper.setSubTextVisible(visible); - } - } - public void setGroupManager(NotificationGroupManager groupManager) { mGroupManager = groupManager; } @@ -540,4 +524,18 @@ public class NotificationContentView extends FrameLayout { mHeadsUpWrapper.updateExpandability(expandable, mExpandClickListener); } } + + public NotificationHeaderView getNotificationHeader() { + NotificationHeaderView header = null; + if (mContractedChild != null) { + header = mContractedWrapper.getNotificationHeader(); + } + if (header == null && mExpandedChild != null) { + header = mExpandedWrapper.getNotificationHeader(); + } + if (header == null && mHeadsUpChild != null) { + header = mHeadsUpWrapper.getNotificationHeader(); + } + return header; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java new file mode 100644 index 000000000000..859a33060c09 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java @@ -0,0 +1,346 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar; + +import android.app.Notification; +import android.graphics.PorterDuff; +import android.graphics.drawable.Icon; +import android.text.TextUtils; +import android.view.NotificationHeaderView; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +/** + * A Util to manage {@link android.view.NotificationHeaderView} objects and their redundancies. + */ +public class NotificationHeaderUtil { + + private static final TextViewComparator sTextViewComparator = new TextViewComparator(); + private static final VisibilityApplicator sVisibilityApplicator = new VisibilityApplicator(); + private static final DataExtractor sIconExtractor = new DataExtractor() { + @Override + public Object extractData(ExpandableNotificationRow row) { + return row.getStatusBarNotification().getNotification(); + } + }; + private static final IconComparator sIconVisibilityComparator = new IconComparator() { + public boolean compare(View parent, View child, Object parentData, + Object childData) { + return hasSameIcon(parentData, childData) + && hasSameColor(parentData, childData); + } + }; + private static final IconComparator sGreyComparator = new IconComparator() { + public boolean compare(View parent, View child, Object parentData, + Object childData) { + return !hasSameIcon(parentData, childData) + || hasSameColor(parentData, childData); + } + }; + private final static ResultApplicator mGreyApplicator = new ResultApplicator() { + @Override + public void apply(View view, boolean apply) { + NotificationHeaderView header = (NotificationHeaderView) view; + ImageView icon = (ImageView) view.findViewById( + com.android.internal.R.id.icon); + ImageView expand = (ImageView) view.findViewById( + com.android.internal.R.id.expand_button); + applyToChild(icon, apply, header.getOriginalIconColor()); + int color = header.getOriginalNotificationColor(); + if (color == Notification.COLOR_DEFAULT) { + color = view.getContext().getColor( + com.android.internal.R.color.notification_icon_default_color); + } + applyToChild(expand, apply, color); + } + + private void applyToChild(View view, boolean shouldApply, int originalColor) { + if (view.getVisibility() == View.VISIBLE + && originalColor != NotificationHeaderView.NO_COLOR) { + ImageView imageView = (ImageView) view; + imageView.getDrawable().mutate(); + if (shouldApply) { + // lets gray it out + int grey = view.getContext().getColor( + com.android.internal.R.color.notification_icon_default_color); + imageView.getDrawable().setColorFilter(grey, PorterDuff.Mode.SRC_ATOP); + } else { + // lets reset it + imageView.getDrawable().setColorFilter(originalColor, + PorterDuff.Mode.SRC_ATOP); + } + } + } + }; + + private final ExpandableNotificationRow mRow; + private final ArrayList<HeaderProcessor> mComparators = new ArrayList<>(); + private final HashSet<Integer> mDividers = new HashSet<>(); + + NotificationHeaderUtil(ExpandableNotificationRow row) { + mRow = row; + // To hide the icons if they are the same and the color is the same + mComparators.add(new HeaderProcessor(mRow, + com.android.internal.R.id.icon, + sIconExtractor, + sIconVisibilityComparator, + sVisibilityApplicator)); + // To grey them out the icons and expand button when the icons are not the same + mComparators.add(new HeaderProcessor(mRow, + com.android.internal.R.id.notification_header, + sIconExtractor, + sGreyComparator, + mGreyApplicator)); + mComparators.add(HeaderProcessor.forTextView(mRow, + com.android.internal.R.id.app_name_text)); + mComparators.add(HeaderProcessor.forTextView(mRow, + com.android.internal.R.id.header_sub_text)); + mComparators.add(HeaderProcessor.forTextView(mRow, + com.android.internal.R.id.header_content_info)); + mDividers.add(com.android.internal.R.id.sub_text_divider); + mDividers.add(com.android.internal.R.id.content_info_divider); + mDividers.add(com.android.internal.R.id.time_divider); + } + + public void updateChildrenHeaderAppearance() { + List<ExpandableNotificationRow> notificationChildren = mRow.getNotificationChildren(); + if (notificationChildren == null) { + return; + } + // Initialize the comparators + for (int compI = 0; compI < mComparators.size(); compI++) { + mComparators.get(compI).init(); + } + + // Compare all notification headers + for (int i = 0; i < notificationChildren.size(); i++) { + ExpandableNotificationRow row = notificationChildren.get(i); + for (int compI = 0; compI < mComparators.size(); compI++) { + mComparators.get(compI).compareToHeader(row); + } + } + + // Apply the comparison to the row + for (int i = 0; i < notificationChildren.size(); i++) { + ExpandableNotificationRow row = notificationChildren.get(i); + for (int compI = 0; compI < mComparators.size(); compI++) { + mComparators.get(compI).apply(row); + } + // We need to sanitize the dividers since they might be off-balance now + sanitizeDividers(row); + } + } + + private void sanitizeDividers(ExpandableNotificationRow row) { + if (row.isSummaryWithChildren()) { + sanitizeHeader(row.getNotificationHeader()); + return; + } + final NotificationContentView layout = row.getPrivateLayout(); + sanitizeChild(layout.getContractedChild()); + sanitizeChild(layout.getHeadsUpChild()); + sanitizeChild(layout.getExpandedChild()); + } + + private void sanitizeChild(View child) { + if (child != null) { + NotificationHeaderView header = (NotificationHeaderView) child.findViewById( + com.android.internal.R.id.notification_header); + sanitizeHeader(header); + } + } + + private void sanitizeHeader(NotificationHeaderView rowHeader) { + if (rowHeader == null) { + return; + } + View left = null; + View right; + final int childCount = rowHeader.getChildCount(); + for (int i = 1; i < childCount - 1 ; i++) { + View child = rowHeader.getChildAt(i); + if (mDividers.contains(Integer.valueOf(child.getId()))) { + boolean visible = false; + // Lets find the item to the right + for (i++; i < childCount - 1; i++) { + right = rowHeader.getChildAt(i); + if (mDividers.contains(Integer.valueOf(right.getId()))) { + // A divider was found, this needs to be hidden + i--; + break; + } else if (right.getVisibility() == View.VISIBLE) { + visible = left != null; + left = right; + break; + } + } + child.setVisibility(visible ? View.VISIBLE : View.GONE); + } else if (child.getVisibility() == View.VISIBLE) { + left = child; + } + } + } + + public void restoreNotificationHeader(ExpandableNotificationRow row) { + for (int compI = 0; compI < mComparators.size(); compI++) { + mComparators.get(compI).apply(row, true /* reset */); + } + sanitizeDividers(row); + } + + private static class HeaderProcessor { + private final int mId; + private final DataExtractor mExtractor; + private final ResultApplicator mApplicator; + private final ExpandableNotificationRow mParentRow; + private boolean mApply; + private View mParentView; + private ViewComparator mComparator; + private Object mParentData; + + public static HeaderProcessor forTextView(ExpandableNotificationRow row, int id) { + return new HeaderProcessor(row, id, null, sTextViewComparator, sVisibilityApplicator); + } + + HeaderProcessor(ExpandableNotificationRow row, int id, DataExtractor extractor, + ViewComparator comparator, + ResultApplicator applicator) { + mId = id; + mExtractor = extractor; + mApplicator = applicator; + mComparator = comparator; + mParentRow = row; + } + + public void init() { + mParentView = mParentRow.getNotificationHeader().findViewById(mId); + mParentData = mExtractor == null ? null : mExtractor.extractData(mParentRow); + mApply = !mComparator.isEmpty(mParentView); + } + public void compareToHeader(ExpandableNotificationRow row) { + if (!mApply) { + return; + } + NotificationHeaderView header = row.getNotificationHeader(); + if (header == null) { + mApply = false; + return; + } + Object childData = mExtractor == null ? null : mExtractor.extractData(row); + mApply = mComparator.compare(mParentView, header.findViewById(mId), + mParentData, childData); + } + + public void apply(ExpandableNotificationRow row) { + apply(row, false /* reset */); + } + + public void apply(ExpandableNotificationRow row, boolean reset) { + boolean apply = mApply && !reset; + if (row.isSummaryWithChildren()) { + applyToView(apply, row.getNotificationHeader()); + return; + } + applyToView(apply, row.getPrivateLayout().getContractedChild()); + applyToView(apply, row.getPrivateLayout().getHeadsUpChild()); + applyToView(apply, row.getPrivateLayout().getExpandedChild()); + } + + private void applyToView(boolean apply, View parent) { + if (parent != null) { + View view = parent.findViewById(mId); + if (view != null && !mComparator.isEmpty(view)) { + mApplicator.apply(view, apply); + } + } + } + } + + private interface ViewComparator { + /** + * @param parent the parent view + * @param child the child view + * @param parentData optional data for the parent + * @param childData optional data for the child + * @return whether to views are the same + */ + boolean compare(View parent, View child, Object parentData, Object childData); + boolean isEmpty(View view); + } + + private interface DataExtractor { + Object extractData(ExpandableNotificationRow row); + } + + private static class TextViewComparator implements ViewComparator { + @Override + public boolean compare(View parent, View child, Object parentData, Object childData) { + TextView parentView = (TextView) parent; + TextView childView = (TextView) child; + return parentView.getText().equals(childView.getText()); + } + + @Override + public boolean isEmpty(View view) { + return TextUtils.isEmpty(((TextView) view).getText()); + } + } + + private static abstract class IconComparator implements ViewComparator { + @Override + public boolean compare(View parent, View child, Object parentData, Object childData) { + return false; + } + + protected boolean hasSameIcon(Object parentData, Object childData) { + Icon parentIcon = ((Notification) parentData).getSmallIcon(); + Icon childIcon = ((Notification) childData).getSmallIcon(); + return parentIcon.sameAs(childIcon); + } + + /** + * @return whether two ImageViews have the same colorFilterSet or none at all + */ + protected boolean hasSameColor(Object parentData, Object childData) { + int parentColor = ((Notification) parentData).color; + int childColor = ((Notification) childData).color; + return parentColor == childColor; + } + + @Override + public boolean isEmpty(View view) { + return false; + } + } + + private interface ResultApplicator { + void apply(View view, boolean apply); + } + + private static class VisibilityApplicator implements ResultApplicator { + + @Override + public void apply(View view, boolean apply) { + view.setVisibility(apply ? View.GONE : View.VISIBLE); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationTemplateViewWrapper.java index f20ccd5b92c8..fb0a419ad37c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationTemplateViewWrapper.java @@ -31,6 +31,7 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.view.MotionEvent; +import android.view.NotificationHeaderView; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; @@ -64,10 +65,8 @@ public class NotificationTemplateViewWrapper extends NotificationViewWrapper { private ImageView mIcon; protected ImageView mPicture; - private TextView mSubText; - private View mSubTextDivider; private ImageView mExpandButton; - private ViewGroup mNotificationHeader; + private NotificationHeaderView mNotificationHeader; private ProgressBar mProgressBar; protected NotificationTemplateViewWrapper(Context ctx, View view) { @@ -83,8 +82,6 @@ public class NotificationTemplateViewWrapper extends NotificationViewWrapper { View mainColumn = mView.findViewById(com.android.internal.R.id.notification_main_column); mIcon = (ImageView) mView.findViewById(com.android.internal.R.id.icon); mPicture = (ImageView) mView.findViewById(com.android.internal.R.id.right_icon); - mSubText = (TextView) mView.findViewById(com.android.internal.R.id.header_sub_text); - mSubTextDivider = mView.findViewById(com.android.internal.R.id.sub_text_divider); mExpandButton = (ImageView) mView.findViewById(com.android.internal.R.id.expand_button); mColor = resolveColor(mExpandButton); final View progress = mView.findViewById(com.android.internal.R.id.progress); @@ -94,7 +91,7 @@ public class NotificationTemplateViewWrapper extends NotificationViewWrapper { // It's still a viewstub mProgressBar = null; } - mNotificationHeader = (ViewGroup) mView.findViewById( + mNotificationHeader = (NotificationHeaderView) mView.findViewById( com.android.internal.R.id.notification_header); ArrayList<View> viewsToInvert = new ArrayList<>(); if (mainColumn != null) { @@ -138,12 +135,22 @@ public class NotificationTemplateViewWrapper extends NotificationViewWrapper { } } if (mIcon != null) { + boolean hadColorFilter = mNotificationHeader.getOriginalIconColor() + != NotificationHeaderView.NO_COLOR; if (fade) { - fadeIconColorFilter(mIcon, dark, delay); - fadeIconAlpha(mIcon, dark, delay); + if (hadColorFilter) { + fadeIconColorFilter(mIcon, dark, delay); + fadeIconAlpha(mIcon, dark, delay); + } else { + fadeGrayscale(mIcon, dark, delay); + } } else { - updateIconColorFilter(mIcon, dark); - updateIconAlpha(mIcon, dark); + if (hadColorFilter) { + updateIconColorFilter(mIcon, dark); + updateIconAlpha(mIcon, dark); + } else { + updateGrayscale(mIcon, dark); + } } } setPictureGrayscale(dark, fade, delay); @@ -271,21 +278,6 @@ public class NotificationTemplateViewWrapper extends NotificationViewWrapper { } @Override - public void setSubTextVisible(boolean visible) { - if (mSubText == null) { - return; - } - boolean subTextAvailable = !TextUtils.isEmpty(mSubText.getText()); - if (visible && subTextAvailable) { - mSubText.setVisibility(View.VISIBLE); - mSubTextDivider.setVisibility(View.VISIBLE); - } else { - mSubText.setVisibility(View.GONE); - mSubTextDivider.setVisibility(View.GONE); - } - } - - @Override public void updateExpandability(boolean expandable, View.OnClickListener onClickListener) { mExpandButton.setVisibility(expandable ? View.VISIBLE : View.GONE); mNotificationHeader.setOnClickListener(expandable ? onClickListener : null); @@ -310,4 +302,9 @@ public class NotificationTemplateViewWrapper extends NotificationViewWrapper { (int) (gSource * (1f - t) + gTarget * t), (int) (bSource * (1f - t) + bTarget * t)); } + + @Override + public NotificationHeaderView getNotificationHeader() { + return mNotificationHeader; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewWrapper.java index e83ecb7436ba..119d57ba7506 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewWrapper.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar; import android.content.Context; +import android.view.NotificationHeaderView; import android.view.View; /** @@ -83,4 +84,11 @@ public abstract class NotificationViewWrapper { * @param onClickListener the listener to invoke when the expand affordance is clicked on */ public void updateExpandability(boolean expandable, View.OnClickListener onClickListener) {} + + /** + * @return the notification header if it exists + */ + public NotificationHeaderView getNotificationHeader() { + return null; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/HybridNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/HybridNotificationView.java index 8f46e89fa04f..fafea9856db2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/HybridNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/HybridNotificationView.java @@ -18,21 +18,17 @@ package com.android.systemui.statusbar.notification; import android.annotation.Nullable; import android.content.Context; -import android.text.TextUtils; import android.util.AttributeSet; import android.widget.TextView; +import com.android.keyguard.AlphaOptimizedLinearLayout; import com.android.systemui.R; -import com.android.systemui.statusbar.AlphaOptimizedFrameLayout; /** * A hybrid view which may contain information about one ore more notifications. */ -public class HybridNotificationView extends AlphaOptimizedFrameLayout { +public class HybridNotificationView extends AlphaOptimizedLinearLayout { - protected final int mSingleLineHeight; - protected final int mStartMargin; - protected final int mEndMargin; protected TextView mTitleView; protected TextView mTextView; @@ -51,62 +47,6 @@ public class HybridNotificationView extends AlphaOptimizedFrameLayout { public HybridNotificationView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - mSingleLineHeight = context.getResources().getDimensionPixelSize( - R.dimen.notification_single_line_height); - mStartMargin = context.getResources().getDimensionPixelSize( - R.dimen.notification_content_margin_start); - mEndMargin = context.getResources().getDimensionPixelSize( - R.dimen.notification_content_margin_end); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int totalWidth = MeasureSpec.getSize(widthMeasureSpec); - int remainingWidth = totalWidth - mStartMargin - mEndMargin; - int newHeightSpec = MeasureSpec.makeMeasureSpec( - MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.AT_MOST); - int newWidthSpec = MeasureSpec.makeMeasureSpec(remainingWidth, MeasureSpec.AT_MOST); - mTitleView.measure(newWidthSpec, newHeightSpec); - int maxTitleLength = getResources().getDimensionPixelSize( - R.dimen.notification_maximum_title_length); - int titleWidth = mTitleView.getMeasuredWidth(); - int heightSpec = MeasureSpec.makeMeasureSpec(mSingleLineHeight, MeasureSpec.AT_MOST); - boolean hasText = !TextUtils.isEmpty(mTextView.getText()); - if (titleWidth > maxTitleLength && hasText) { - titleWidth = maxTitleLength; - int widthSpec = MeasureSpec.makeMeasureSpec(titleWidth, MeasureSpec.EXACTLY); - mTitleView.measure(widthSpec, heightSpec); - } - if (hasText) { - remainingWidth -= titleWidth; - int widthSpec = MeasureSpec.makeMeasureSpec(remainingWidth, MeasureSpec.AT_MOST); - mTextView.measure(widthSpec, newHeightSpec); - } - setMeasuredDimension(totalWidth, mSingleLineHeight); - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - int childLeft = mStartMargin; - int childRight = childLeft + mTitleView.getMeasuredWidth(); - int childBottom = (mSingleLineHeight + mTitleView.getMeasuredHeight()) / 2; - int childTop = childBottom - mTitleView.getMeasuredHeight(); - int rtlLeft = transformForRtl(childLeft); - int rtlRight = transformForRtl(childRight); - mTitleView.layout(Math.min(rtlLeft, rtlRight), childTop, Math.max(rtlLeft, rtlRight), - childBottom); - childLeft = childRight; - childRight = childLeft + mTextView.getMeasuredWidth(); - childTop = mTitleView.getTop() + mTitleView.getBaseline() - mTextView.getBaseline(); - childBottom = childTop + mTextView.getMeasuredHeight(); - rtlLeft = transformForRtl(childLeft); - rtlRight = transformForRtl(childRight); - mTextView.layout(Math.min(rtlLeft, rtlRight), childTop, Math.max(rtlLeft, rtlRight), - childBottom); - } - - private int transformForRtl(int left) { - return isLayoutRtl() ? getWidth() - left : left; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/HybridNotificationViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/HybridNotificationViewManager.java index 987f7b831b45..b8adf5b17db7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/HybridNotificationViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/HybridNotificationViewManager.java @@ -68,9 +68,9 @@ public class HybridNotificationViewManager { } private CharSequence resolveText(Notification notification) { - CharSequence contentText = notification.extras.getCharSequence(Notification.EXTRA_BIG_TEXT); + CharSequence contentText = notification.extras.getCharSequence(Notification.EXTRA_TEXT); if (contentText == null) { - contentText = notification.extras.getCharSequence(Notification.EXTRA_TEXT); + contentText = notification.extras.getCharSequence(Notification.EXTRA_BIG_TEXT); } return contentText; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java index 08da0d3344c9..f6fc259ce6ca 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java @@ -21,6 +21,7 @@ import android.service.notification.StatusBarNotification; import com.android.systemui.statusbar.ExpandableNotificationRow; import com.android.systemui.statusbar.NotificationData; +import com.android.systemui.statusbar.StatusBarState; import java.util.HashMap; import java.util.HashSet; @@ -146,6 +147,20 @@ public class NotificationGroupManager { return !group.children.isEmpty(); } + public void setStatusBarState(int newState) { + if (mBarState == newState) { + return; + } + mBarState = newState; + if (mBarState == StatusBarState.KEYGUARD) { + for (NotificationGroup group : mGroupMap.values()) { + if (group.expanded) { + setGroupExpanded(group, false); + } + } + } + } + /** * @return whether a given notification is a child in a group which has a summary */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 73ee363a61cf..6a2b32d51958 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -44,7 +44,6 @@ import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; import android.widget.FrameLayout; import android.widget.TextView; - import com.android.internal.logging.MetricsLogger; import com.android.keyguard.KeyguardStatusView; import com.android.systemui.DejankUtils; @@ -65,7 +64,6 @@ import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.KeyguardUserSwitcher; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.stack.StackStateAnimator; -import com.android.systemui.tuner.TunerService; import java.util.List; @@ -73,7 +71,7 @@ public class NotificationPanelView extends PanelView implements ExpandableView.OnHeightChangedListener, ObservableScrollView.Listener, View.OnClickListener, NotificationStackScrollLayout.OnOverscrollTopChangedListener, KeyguardAffordanceHelper.Callback, NotificationStackScrollLayout.OnEmptySpaceClickListener, - HeadsUpManager.OnHeadsUpChangedListener, TunerService.Tunable { + HeadsUpManager.OnHeadsUpChangedListener { private static final boolean DEBUG = false; @@ -221,13 +219,10 @@ public class NotificationPanelView extends PanelView implements private final Interpolator mTouchResponseInterpolator = new PathInterpolator(0.3f, 0f, 0.1f, 1f); - private boolean mNewQs; - public NotificationPanelView(Context context, AttributeSet attrs) { super(context, attrs); setWillNotDraw(!DEBUG); mFalsingManager = FalsingManager.getInstance(context); - TunerService.get(context).addTunable(this, QSPanel.QS_THE_NEW_QS); } public void setStatusBar(PhoneStatusBar bar) { @@ -235,26 +230,10 @@ public class NotificationPanelView extends PanelView implements } @Override - public void onTuningChanged(String key, String newValue) { - if (QSPanel.QS_THE_NEW_QS.equals(key)) { - boolean b = newValue != null && Integer.parseInt(newValue) != 0; - if (mNewQs != b) { - if (mHeader != null) { - // We are too late, no good way to re-initialize yet, just die and come back up. - android.os.Process.killProcess(android.os.Process.myPid()); - } else { - mNewQs = b; - } - } - } - } - - @Override protected void onFinishInflate() { super.onFinishInflate(); ViewStub stub = (ViewStub) findViewById(R.id.status_bar_header); - stub.setLayoutResource(mNewQs - ? R.layout.quick_status_bar_expanded_header : R.layout.status_bar_expanded_header); + stub.setLayoutResource(R.layout.quick_status_bar_expanded_header); mHeader = (BaseStatusBarHeader) stub.inflate(); mHeader.setOnClickListener(this); mKeyguardStatusBar = (KeyguardStatusBarView) findViewById(R.id.keyguard_header); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index e51cf7ac218f..181e6aa5f12d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -2233,6 +2233,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mHandler.post(mAnimateCollapsePanels); } + public void postAnimateOpenPanels() { + mHandler.sendEmptyMessage(MSG_OPEN_SETTINGS_PANEL); + } + public void animateCollapsePanels(int flags) { animateCollapsePanels(flags, false /* force */, false /* delayed */, 1.0f /* speedUpFactor */); @@ -3132,10 +3136,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mNaturalBarHeight = res.getDimensionPixelSize( com.android.internal.R.dimen.status_bar_height); - mRowMinHeightLegacy = res.getDimensionPixelSize(R.dimen.notification_min_height_legacy); - mRowMinHeight = res.getDimensionPixelSize(R.dimen.notification_min_height); - mRowMaxHeight = res.getDimensionPixelSize(R.dimen.notification_max_height); - mMaxAllowedKeyguardNotifications = res.getInteger(R.integer.keyguard_max_notification_count); if (DEBUG) Log.v(TAG, "updateResources"); @@ -3282,6 +3282,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, return !isDeviceProvisioned() || (mDisabled1 & StatusBarManager.DISABLE_SEARCH) != 0; } + public void postQSRunnableDismissingKeyguard(final Runnable runnable) { + mHandler.post(new Runnable() { + @Override + public void run() { + mLeaveOpenOnKeyguardHide = true; + executeRunnableDismissingKeyguard(runnable, null, false, true); + } + }); + } + public void postStartActivityDismissingKeyguard(final PendingIntent intent) { mHandler.post(new Runnable() { @Override @@ -3862,6 +3872,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, clearNotificationEffects(); } mState = state; + mGroupManager.setStatusBarState(state); mFalsingManager.setStatusBarState(state); mStatusBarWindowManager.setStatusBarState(state); updateDozing(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java index 327b81ea6b22..7f27ba72e9e4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; +import android.app.ActivityManager; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; @@ -27,10 +28,11 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Process; import android.os.RemoteException; +import android.provider.Settings; import android.service.quicksettings.IQSService; import android.service.quicksettings.Tile; +import android.text.TextUtils; import android.util.Log; - import com.android.systemui.R; import com.android.systemui.qs.QSTile; import com.android.systemui.qs.tiles.AirplaneModeTile; @@ -45,12 +47,6 @@ import com.android.systemui.qs.tiles.FlashlightTile; import com.android.systemui.qs.tiles.HotspotTile; import com.android.systemui.qs.tiles.IntentTile; import com.android.systemui.qs.tiles.LocationTile; -import com.android.systemui.qs.tiles.QAirplaneTile; -import com.android.systemui.qs.tiles.QBluetoothTile; -import com.android.systemui.qs.tiles.QFlashlightTile; -import com.android.systemui.qs.tiles.QLockTile; -import com.android.systemui.qs.tiles.QRotationLockTile; -import com.android.systemui.qs.tiles.QWifiTile; import com.android.systemui.qs.tiles.RotationLockTile; import com.android.systemui.qs.tiles.UserTile; import com.android.systemui.qs.tiles.WifiTile; @@ -137,7 +133,7 @@ public final class QSTileHost extends IQSService.Stub implements QSTile.Host, Tu TunerService.get(mContext).addTunable(this, TILES_SETTING); } - PhoneStatusBar getPhoneStatusBar() { + public PhoneStatusBar getPhoneStatusBar() { return mStatusBar; } @@ -166,6 +162,11 @@ public final class QSTileHost extends IQSService.Stub implements QSTile.Host, Tu } @Override + public void startRunnableDismissingKeyguard(Runnable runnable) { + mStatusBar.postQSRunnableDismissingKeyguard(runnable); + } + + @Override public void warn(String message, Throwable t) { // already logged } @@ -176,6 +177,11 @@ public final class QSTileHost extends IQSService.Stub implements QSTile.Host, Tu } @Override + public void openPanels() { + mStatusBar.postAnimateOpenPanels(); + } + + @Override public Looper getLooper() { return mLooper; } @@ -273,8 +279,10 @@ public final class QSTileHost extends IQSService.Stub implements QSTile.Host, Tu if (DEBUG) Log.d(TAG, "Creating tile: " + tileSpec); try { QSTile<?> tile = createTile(tileSpec); - tile.setTileSpec(tileSpec); - newTiles.put(tileSpec, tile); + if (tile != null) { + tile.setTileSpec(tileSpec); + newTiles.put(tileSpec, tile); + } } catch (Throwable t) { Log.w(TAG, "Error creating tile for spec: " + tileSpec, t); } @@ -290,6 +298,14 @@ public final class QSTileHost extends IQSService.Stub implements QSTile.Host, Tu } @Override + public void removeTile(String tileSpec) { + ArrayList<String> specs = new ArrayList<>(mTileSpecs); + specs.remove(tileSpec); + Settings.Secure.putStringForUser(mContext.getContentResolver(), TILES_SETTING, + TextUtils.join(",", specs), ActivityManager.getCurrentUser()); + } + + @Override public void updateQsTile(Tile tile) throws RemoteException { verifyCaller(tile.getComponentName().getPackageName()); CustomTile customTile = getTileForComponent(tile.getComponentName()); @@ -334,13 +350,17 @@ public final class QSTileHost extends IQSService.Stub implements QSTile.Host, Tu } public QSTile<?> createTile(String tileSpec) { - if (tileSpec.equals("wifi")) return new WifiTile(this, false); - else if (tileSpec.equals("bt")) return new BluetoothTile(this, false); + if (tileSpec.equals("wifi")) return WifiTile.isSupported(this) + ? new WifiTile(this) : null; + else if (tileSpec.equals("bt")) return BluetoothTile.isSupported(this) + ? new BluetoothTile(this) : null; + else if (tileSpec.equals("cell")) return CellularTile.isSupported(this) + ? new CellularTile(this) : null; + else if (tileSpec.equals("dnd")) return DndTile.isSupported(this) + ? new DndTile(this) : null; else if (tileSpec.equals("inversion")) return new ColorInversionTile(this); - else if (tileSpec.equals("cell")) return new CellularTile(this); else if (tileSpec.equals("airplane")) return new AirplaneModeTile(this); else if (tileSpec.equals("work")) return new WorkModeTile(this); - else if (tileSpec.equals("dnd")) return new DndTile(this); else if (tileSpec.equals("rotation")) return new RotationLockTile(this); else if (tileSpec.equals("flashlight")) return new FlashlightTile(this); else if (tileSpec.equals("location")) return new LocationTile(this); @@ -348,16 +368,6 @@ public final class QSTileHost extends IQSService.Stub implements QSTile.Host, Tu else if (tileSpec.equals("hotspot")) return new HotspotTile(this); else if (tileSpec.equals("user")) return new UserTile(this); else if (tileSpec.equals("battery")) return new BatteryTile(this); - // Detail only versions of wifi and bluetooth. - else if (tileSpec.equals("dwifi")) return new WifiTile(this, true); - else if (tileSpec.equals("dbt")) return new BluetoothTile(this, true); - // Quick tiles, no text. - else if (tileSpec.equals("qwifi")) return new QWifiTile(this); - else if (tileSpec.equals("qbt")) return new QBluetoothTile(this); - else if (tileSpec.equals("qairplane")) return new QAirplaneTile(this); - else if (tileSpec.equals("qrotation")) return new QRotationLockTile(this); - else if (tileSpec.equals("qflashlight")) return new QFlashlightTile(this); - else if (tileSpec.equals("qlock")) return new QLockTile(this); // Intent tiles. else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(this,tileSpec); else if (tileSpec.startsWith(CustomTile.PREFIX)) return CustomTile.create(this,tileSpec); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java index cc9f5c747c2c..c4930a9d1750 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java @@ -24,16 +24,18 @@ import android.graphics.Rect; import android.graphics.drawable.Animatable; import android.graphics.drawable.RippleDrawable; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; - +import com.android.keyguard.KeyguardStatusView; import com.android.systemui.R; import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QSTile; +import com.android.systemui.qs.QuickQSPanel; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.UserInfoController; @@ -42,6 +44,7 @@ import com.android.systemui.tuner.TunerService; public class QuickStatusBarHeader extends BaseStatusBarHeader implements NextAlarmController.NextAlarmChangeCallback, View.OnClickListener { + private static final String TAG = "QuickStatusBarHeader"; private ActivityStarter mActivityStarter; private NextAlarmController mNextAlarmController; private SettingsButton mSettingsButton; @@ -63,7 +66,7 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements private boolean mListening; private AlarmManager.AlarmClockInfo mNextAlarm; - private QSPanel mHeaderQsPanel; + private QuickQSPanel mHeaderQsPanel; public QuickStatusBarHeader(Context context, AttributeSet attrs) { super(context, attrs); @@ -75,7 +78,7 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements mExpandedGroup = (ViewGroup) findViewById(R.id.expanded_group); - mHeaderQsPanel = (QSPanel) findViewById(R.id.quick_qs_panel); + mHeaderQsPanel = (QuickQSPanel) findViewById(R.id.quick_qs_panel); mSettingsButton = (SettingsButton) findViewById(R.id.settings_button); mSettingsContainer = findViewById(R.id.settings_button_container); @@ -118,14 +121,15 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements @Override public void setExpanded(boolean expanded) { mExpanded = expanded; + updateEverything(); } @Override public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) { mNextAlarm = nextAlarm; + Log.d(TAG, "Got alarm update " + (nextAlarm != null)); if (nextAlarm != null) { - // TODO:... -// mAlarmStatus.setText(KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm)); + mAlarmStatus.setText(KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm)); } mAlarmShowing = nextAlarm != null; updateEverything(); @@ -133,9 +137,10 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements @Override public void setExpansion(float headerExpansionFraction) { - float offset = getHeight() * headerExpansionFraction; - mExpandedGroup.setTranslationY(offset - getHeight()); - mHeaderQsPanel.setTranslationY(offset); + mExpandedGroup.setAlpha(headerExpansionFraction); + mExpandedGroup.setVisibility(headerExpansionFraction > 0 ? View.VISIBLE : View.INVISIBLE); + mHeaderQsPanel.setAlpha(1 - headerExpansionFraction); + mHeaderQsPanel.setVisibility(headerExpansionFraction < 1 ? View.VISIBLE : View.INVISIBLE); } public void setListening(boolean listening) { @@ -153,7 +158,7 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements } private void updateVisibilities() { - mAlarmStatus.setVisibility(mExpanded && mAlarmShowing ? View.VISIBLE : View.GONE); + mAlarmStatus.setVisibility(mAlarmShowing ? View.VISIBLE : View.GONE); mQsDetailHeader.setVisibility(mExpanded && mShowingDetail ? View.VISIBLE : View.INVISIBLE); mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility( TunerService.isTunerEnabled(mContext) ? View.VISIBLE : View.INVISIBLE); @@ -161,8 +166,10 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements private void updateListeners() { if (mListening) { + Log.d(TAG, "Listening for Alarms"); mNextAlarmController.addStateChangedCallback(this); } else { + Log.d(TAG, "Not listening for Alarms"); mNextAlarmController.removeStateChangedCallback(this); } } @@ -190,7 +197,9 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements host.getUserSwitcherController(), host.getUserInfoController(), host.getKeyguardMonitor(), host.getSecurityController(), host.getBatteryController()); + mHeaderQsPanel.setQSPanelAndHeader(mQsPanel, this); mHeaderQsPanel.setHost(myHost); + mHeaderQsPanel.setMaxTiles(5); mHeaderQsPanel.setTiles(myHost.getTiles()); myHost.addCallback(new QSTile.Host.Callback() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java index 6cda561bd08f..3d21f44e4e24 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java @@ -59,7 +59,7 @@ import java.text.NumberFormat; */ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnClickListener, BatteryController.BatteryStateChangeCallback, NextAlarmController.NextAlarmChangeCallback, - EmergencyListener, TunerService.Tunable { + EmergencyListener { private boolean mExpanded; private boolean mListening; @@ -234,28 +234,6 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC updateClockCollapsedMargin(); } - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - TunerService.get(mContext).addTunable(this, QSPanel.QS_THE_NEW_QS); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - TunerService.get(mContext).removeTunable(this); - } - - @Override - public void onTuningChanged(String key, String newValue) { - if (QSPanel.QS_THE_NEW_QS.equals(key)) { - mAllowExpand = newValue == null || Integer.parseInt(newValue) == 0; - if (!mAllowExpand) { - setExpanded(false); - } - } - } - private void updateClockCollapsedMargin() { Resources res = getResources(); int padding = res.getDimensionPixelSize(R.dimen.clock_collapsed_bottom_margin); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java index 77a9871b6727..9015a0e786f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java @@ -46,7 +46,7 @@ public class NotificationChildrenContainer extends ViewGroup { private final List<ExpandableNotificationRow> mChildren = new ArrayList<>(); private final int mNotificationHeaderHeight; private final int mNotificationAppearDistance; - private final float mHeaderTopPaddingSubstraction; + private final int mNotificatonTopPadding; private final HybridNotificationViewManager mHybridViewManager; private final float mCollapsedBottompadding; private boolean mChildrenExpanded; @@ -78,28 +78,23 @@ public class NotificationChildrenContainer extends ViewGroup { mNotificationAppearDistance = getResources().getDimensionPixelSize( R.dimen.notification_appear_distance); mNotificationHeaderHeight = getResources().getDimensionPixelSize( - com.android.internal.R.dimen.notification_header_height); - mHeaderTopPaddingSubstraction = 2 * getResources().getDisplayMetrics().density; - mCollapsedBottompadding = 10 * getResources().getDisplayMetrics().density; + com.android.internal.R.dimen.notification_content_margin_top); + mNotificatonTopPadding = getResources().getDimensionPixelSize( + R.dimen.notification_children_container_top_padding); + mCollapsedBottompadding = 11.5f * getResources().getDisplayMetrics().density; mHybridViewManager = new HybridNotificationViewManager(getContext(), this); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int childCount = mChildren.size(); - boolean firstChild = true; for (int i = 0; i < childCount; i++) { View child = mChildren.get(i); - boolean viewGone = child.getVisibility() == View.GONE; - if (viewGone) { + if (child.getVisibility() == View.GONE) { continue; } child.layout(0, 0, getWidth(), child.getMeasuredHeight()); - if (!firstChild) { - mDividers.get(i - 1).layout(0, 0, getWidth(), mDividerHeight); - } else { - firstChild = false; - } + mDividers.get(i).layout(0, 0, getWidth(), mDividerHeight); } if (mGroupOverflowContainer != null) { mGroupOverflowContainer.layout(0, 0, getWidth(), @@ -119,21 +114,17 @@ public class NotificationChildrenContainer extends ViewGroup { } int newHeightSpec = MeasureSpec.makeMeasureSpec(ownMaxHeight, MeasureSpec.AT_MOST); int dividerHeightSpec = MeasureSpec.makeMeasureSpec(mDividerHeight, MeasureSpec.EXACTLY); - int height = mNotificationHeaderHeight; + int height = mNotificationHeaderHeight + mNotificatonTopPadding; int childCount = mChildren.size(); - boolean firstChild = true; for (int i = 0; i < childCount; i++) { View child = mChildren.get(i); child.measure(widthMeasureSpec, newHeightSpec); height += child.getMeasuredHeight(); - if (!firstChild) { - // layout the divider - View divider = mDividers.get(i - 1); - divider.measure(widthMeasureSpec, dividerHeightSpec); - height += mChildPadding; - } else { - firstChild = false; - } + + // layout the divider + View divider = mDividers.get(i); + divider.measure(widthMeasureSpec, dividerHeightSpec); + height += mDividerHeight; } int width = MeasureSpec.getSize(widthMeasureSpec); if (mGroupOverflowContainer != null) { @@ -152,11 +143,11 @@ public class NotificationChildrenContainer extends ViewGroup { int newIndex = childIndex < 0 ? mChildren.size() : childIndex; mChildren.add(newIndex, row); addView(row); - if (mChildren.size() != 1) { - View divider = inflateDivider(); - addView(divider); - mDividers.add(Math.max(newIndex - 1, 0), divider); - } + + View divider = inflateDivider(); + addView(divider); + mDividers.add(newIndex, divider); + updateGroupOverflow(); } @@ -164,10 +155,10 @@ public class NotificationChildrenContainer extends ViewGroup { int childIndex = mChildren.indexOf(row); mChildren.remove(row); removeView(row); - if (!mDividers.isEmpty()) { - View divider = mDividers.remove(Math.max(childIndex - 1, 0)); - removeView(divider); - } + + View divider = mDividers.remove(childIndex); + removeView(divider); + row.setSystemChildExpanded(false); updateGroupOverflow(); } @@ -246,7 +237,10 @@ public class NotificationChildrenContainer extends ViewGroup { * in @param maxAllowedVisibleChildren */ private int getIntrinsicHeight(float maxAllowedVisibleChildren) { - int intrinsicHeight = mNotificationHeaderHeight;; + int intrinsicHeight = mNotificationHeaderHeight; + if (mChildrenExpanded) { + intrinsicHeight += mNotificatonTopPadding; + } int visibleChildren = 0; int childCount = mChildren.size(); for (int i = 0; i < childCount; i++) { @@ -254,14 +248,15 @@ public class NotificationChildrenContainer extends ViewGroup { break; } ExpandableNotificationRow child = mChildren.get(i); - if (i == 0 && child.hasSameBgColor(mNotificationParent)) { - intrinsicHeight -= mHeaderTopPaddingSubstraction; - } intrinsicHeight += child.getIntrinsicHeight(); visibleChildren++; } if (visibleChildren > 0) { - intrinsicHeight += (visibleChildren - 1) * mDividerHeight; + if (mChildrenExpanded) { + intrinsicHeight += visibleChildren * mDividerHeight; + } else { + intrinsicHeight += (visibleChildren - 1) * mChildPadding; + } } if (!mChildrenExpanded) { intrinsicHeight += mCollapsedBottompadding; @@ -288,12 +283,9 @@ public class NotificationChildrenContainer extends ViewGroup { for (int i = 0; i < childCount; i++) { ExpandableNotificationRow child = mChildren.get(i); if (!firstChild) { - // There's a divider - yPosition += mChildPadding; + yPosition += mChildrenExpanded ? mDividerHeight : mChildPadding; } else { - if (child.hasSameBgColor(mNotificationParent)) { - yPosition -= mHeaderTopPaddingSubstraction; - } + yPosition += mChildrenExpanded ? mNotificatonTopPadding + mDividerHeight : 0; firstChild = false; } StackViewState childState = resultState.getViewStateForView(child); @@ -340,23 +332,18 @@ public class NotificationChildrenContainer extends ViewGroup { public void applyState(StackScrollState state) { int childCount = mChildren.size(); - boolean firstChild = true; ViewState tmpState = new ViewState(); for (int i = 0; i < childCount; i++) { ExpandableNotificationRow child = mChildren.get(i); StackViewState viewState = state.getViewStateForView(child); - if (!firstChild) { - // layout the divider - View divider = mDividers.get(i - 1); - tmpState.initFrom(divider); - tmpState.yTranslation = (int) (viewState.yTranslation - - (mChildPadding + mDividerHeight) / 2.0f); - tmpState.alpha = mChildrenExpanded && viewState.alpha != 0 ? 0.5f : 0; - state.applyViewState(divider, tmpState); - } else { - firstChild = false; - } state.applyState(child, viewState); + + // layout the divider + View divider = mDividers.get(i); + tmpState.initFrom(divider); + tmpState.yTranslation = viewState.yTranslation - mDividerHeight; + tmpState.alpha = mChildrenExpanded && viewState.alpha != 0 ? 0.5f : 0; + state.applyViewState(divider, tmpState); } if (mGroupOverflowContainer != null) { state.applyViewState(mGroupOverflowContainer, mGroupOverFlowState); @@ -375,34 +362,30 @@ public class NotificationChildrenContainer extends ViewGroup { return; } int childCount = mChildren.size(); - boolean firstChild = true; StackViewState sourceState = new StackViewState(); ViewState dividerState = new ViewState(); for (int i = 0; i < childCount; i++) { ExpandableNotificationRow child = mChildren.get(i); StackViewState viewState = state.getViewStateForView(child); - if (!firstChild) { - // layout the divider - View divider = mDividers.get(i - 1); - dividerState.initFrom(divider); - dividerState.yTranslation = viewState.yTranslation - - (mChildPadding + mDividerHeight) / 2.0f + mNotificationAppearDistance; - dividerState.alpha = 0; - state.applyViewState(divider, dividerState); - } else { - firstChild = false; - } sourceState.copyFrom(viewState); sourceState.alpha = 0; sourceState.yTranslation += mNotificationAppearDistance; state.applyState(child, sourceState); + + // layout the divider + View divider = mDividers.get(i); + dividerState.initFrom(divider); + dividerState.yTranslation = viewState.yTranslation - mDividerHeight + + mNotificationAppearDistance; + dividerState.alpha = 0; + state.applyViewState(divider, dividerState); + } } public void startAnimationToState(StackScrollState state, StackStateAnimator stateAnimator, boolean withDelays, long baseDelay, long duration) { int childCount = mChildren.size(); - boolean firstChild = true; ViewState tmpState = new ViewState(); int notGoneIndex = 0; for (int i = 0; i < childCount; i++) { @@ -414,18 +397,15 @@ public class NotificationChildrenContainer extends ViewGroup { ? difference * StackStateAnimator.ANIMATION_DELAY_PER_ELEMENT_EXPAND_CHILDREN : 0; delay += baseDelay; - if (!firstChild) { - // layout the divider - View divider = mDividers.get(i - 1); - tmpState.initFrom(divider); - tmpState.yTranslation = viewState.yTranslation - - (mChildPadding + mDividerHeight) / 2.0f; - tmpState.alpha = mChildrenExpanded && viewState.alpha != 0 ? 0.5f : 0;; - stateAnimator.startViewAnimations(divider, tmpState, delay, duration); - } else { - firstChild = false; - } stateAnimator.startStackAnimations(child, viewState, state, -1, delay); + + // layout the divider + View divider = mDividers.get(i); + tmpState.initFrom(divider); + tmpState.yTranslation = viewState.yTranslation - mDividerHeight; + tmpState.alpha = mChildrenExpanded && viewState.alpha != 0 ? 0.5f : 0; + stateAnimator.startViewAnimations(divider, tmpState, delay, duration); + notGoneIndex++; } if (mGroupOverflowContainer != null) { diff --git a/packages/SystemUI/src/com/android/systemui/tuner/QSPagingSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/QSPagingSwitch.java index 04a51f07b1d0..d19a825013ed 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/QSPagingSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/QSPagingSwitch.java @@ -9,8 +9,8 @@ import com.android.systemui.statusbar.phone.QSTileHost; public class QSPagingSwitch extends TunerSwitch { public static final String QS_PAGE_TILES = - "dwifi,dbt,dnd,cell,battery,user,rotation,flashlight,location," - + "hotspot,qwifi,qbt,qlock,qflashlight,qairplane,inversion,cast"; + "dnd,cell,battery,user,rotation,flashlight,location," + + "hotspot,inversion,cast"; public QSPagingSwitch(Context context, AttributeSet attrs) { super(context, attrs); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 11fdbb5886e1..8cf25b3bbd99 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -3987,6 +3987,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private final Uri mDisplayDaltonizerUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER); + private final Uri mDisplayColorMatrixUri = Settings.Secure.getUriFor( + Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX); + private final Uri mHighTextContrastUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED); @@ -4017,6 +4020,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { contentResolver.registerContentObserver( mDisplayDaltonizerUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( + mDisplayColorMatrixUri, false, this, UserHandle.USER_ALL); + contentResolver.registerContentObserver( mHighTextContrastUri, false, this, UserHandle.USER_ALL); } @@ -4066,6 +4071,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (readDisplayColorAdjustmentSettingsLocked(userState)) { updateDisplayColorAdjustmentSettingsLocked(userState); } + } else if (mDisplayColorMatrixUri.equals(uri)) { + updateDisplayColorAdjustmentSettingsLocked(userState); } else if (mHighTextContrastUri.equals(uri)) { if (readHighTextContrastEnabledSettingLocked(userState)) { onUserStateChangedLocked(userState); diff --git a/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java b/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java index d0b5898076fc..1a7de25988f2 100644 --- a/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java +++ b/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java @@ -107,9 +107,24 @@ class DisplayAdjustmentUtils { setDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED); } + String matrix = Settings.Secure.getStringForUser(cr, + Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX, userId); + if (matrix != null) { + colorMatrix = multiply(colorMatrix, getMatrix(matrix)); + } + setColorTransform(colorMatrix); } + private static float[] getMatrix(String matrix) { + String[] strValues = matrix.split(","); + float[] values = new float[strValues.length]; + for (int i = 0; i < values.length; i++) { + values[i] = Float.parseFloat(strValues[i]); + } + return values; + } + private static float[] multiply(float[] matrix, float[] other) { if (matrix == null) { return other; diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index f6af942acc53..960fb4bcbd07 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -1363,7 +1363,7 @@ class AlarmManagerService extends SystemService { pw.print(" nowRTC="); pw.print(nowRTC); pw.print("="); pw.print(sdf.format(new Date(nowRTC))); - pw.print(" nowELAPSED="); TimeUtils.formatDuration(nowELAPSED, pw); + pw.print(" nowELAPSED="); pw.print(nowELAPSED); pw.println(); pw.print(" mLastTimeChangeClockTime="); pw.print(mLastTimeChangeClockTime); pw.print("="); pw.println(sdf.format(new Date(mLastTimeChangeClockTime))); @@ -1464,6 +1464,15 @@ class AlarmManagerService extends SystemService { pw.print(" Broadcast ref count: "); pw.println(mBroadcastRefCount); pw.println(); + if (mInFlight.size() > 0) { + pw.println("Outstanding deliveries:"); + for (int i = 0; i < mInFlight.size(); i++) { + pw.print(" #"); pw.print(i); pw.print(": "); + pw.println(mInFlight.get(i)); + } + pw.println(); + } + pw.print(" mAllowWhileIdleMinTime="); TimeUtils.formatDuration(mAllowWhileIdleMinTime, pw); pw.println(); @@ -2956,6 +2965,11 @@ class AlarmManagerService extends SystemService { // is a repeating alarm, so toss it removeImpl(alarm.operation); } + // No actual delivery was possible, so the delivery tracker's + // 'finished' callback won't be invoked. We also don't need + // to do any wakelock or stats tracking, so we have nothing + // left to do here but go on to the next thing. + return; } } else { // Direct listener callback alarm @@ -2974,6 +2988,11 @@ class AlarmManagerService extends SystemService { Slog.i(TAG, "Alarm undeliverable to listener " + alarm.listener.asBinder(), e); } + // As in the PendingIntent.CanceledException case, delivery of the + // alarm was not possible, so we have no wakelock or timeout or + // stats management to do. It threw before we posted the delayed + // timeout message, so we're done here. + return; } } diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 473eff654eac..184f8905acaf 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -2716,12 +2716,13 @@ class MountService extends IMountService.Stub } @Override - public void createUserKey(int userId, int serialNumber) { + public void createUserKey(int userId, int serialNumber, boolean ephemeral) { enforcePermission(android.Manifest.permission.STORAGE_INTERNAL); waitForReady(); try { - mCryptConnector.execute("cryptfs", "create_user_key", userId, serialNumber); + mCryptConnector.execute("cryptfs", "create_user_key", userId, serialNumber, + ephemeral ? 1 : 0); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } @@ -2797,13 +2798,14 @@ class MountService extends IMountService.Stub } @Override - public void prepareUserStorage(String volumeUuid, int userId, int serialNumber) { + public void prepareUserStorage( + String volumeUuid, int userId, int serialNumber, boolean ephemeral) { enforcePermission(android.Manifest.permission.STORAGE_INTERNAL); waitForReady(); try { mCryptConnector.execute("cryptfs", "prepare_user_storage", escapeNull(volumeUuid), - userId, serialNumber); + userId, serialNumber, ephemeral ? 1 : 0); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 2742c657d853..4348913a2885 100755 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -1240,8 +1240,9 @@ public final class ActiveServices { try { // Before going further -- if this app is not allowed to run in the // background, then at this point we aren't going to let it period. - if (!mAm.checkAllowBackgroundLocked(sInfo.applicationInfo.uid, - sInfo.packageName, callingPid)) { + final int allowed = mAm.checkAllowBackgroundLocked( + sInfo.applicationInfo.uid, sInfo.packageName, callingPid); + if (allowed != ActivityManager.APP_START_MODE_NORMAL) { Slog.w(TAG, "Background execution not allowed: service " + r.intent + " to " + name.flattenToShortString() + " from pid=" + callingPid + " uid=" + callingUid diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f22062cb0616..e4a6f3c7c96d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -7463,13 +7463,11 @@ public final class ActivityManagerService extends ActivityManagerNative public int getAppStartMode(int uid, String packageName) { synchronized (this) { - boolean bg = checkAllowBackgroundLocked(uid, packageName, -1); - return bg ? ActivityManager.APP_START_MODE_NORMAL - : ActivityManager.APP_START_MODE_DISABLED; + return checkAllowBackgroundLocked(uid, packageName, -1); } } - boolean checkAllowBackgroundLocked(int uid, String packageName, int callingPid) { + int checkAllowBackgroundLocked(int uid, String packageName, int callingPid) { UidRecord uidRec = mActiveUids.get(uid); if (uidRec == null || uidRec.idle) { if (callingPid >= 0) { @@ -7480,15 +7478,15 @@ public final class ActivityManagerService extends ActivityManagerNative if (proc != null && proc.curProcState < ActivityManager.PROCESS_STATE_RECEIVER) { // Whoever is instigating this is in the foreground, so we will allow it // to go through. - return true; + return ActivityManager.APP_START_MODE_NORMAL; } } if (mAppOpsService.noteOperation(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName) != AppOpsManager.MODE_ALLOWED) { - return false; + return ActivityManager.APP_START_MODE_DELAYED; } } - return true; + return ActivityManager.APP_START_MODE_NORMAL; } private ProviderInfo getProviderInfoLocked(String authority, int userHandle) { @@ -17903,7 +17901,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (mSupportedSystemLocales == null) { mSupportedSystemLocales = Resources.getSystem().getAssets().getLocales(); } - final Locale locale = values.getLocales().getBestMatch(mSupportedSystemLocales); + final Locale locale = values.getLocales().getFirstMatch(mSupportedSystemLocales); SystemProperties.set("persist.sys.locale", locale.toLanguageTag()); mHandler.sendMessage(mHandler.obtainMessage(SEND_LOCALE_TO_MOUNT_DAEMON_MSG, locale)); diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 66371d13c20e..d215fc60ea5b 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -180,6 +180,7 @@ final class ActivityRecord { private boolean inHistory; // are we in the history stack? final ActivityStackSupervisor mStackSupervisor; boolean mStartingWindowShown = false; + boolean mUpdateTaskThumbnailWhenHidden; ActivityContainer mInitialActivityContainer; TaskDescription taskDescription; // the recents information for this activity diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 60f26e224373..b052d17a8dcb 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -925,7 +925,7 @@ final class ActivityStack { final ActivityRecord next = mStackSupervisor.topRunningActivityLocked(); if (mService.mHasRecents && (next == null || next.noDisplay || next.task != prev.task || uiSleeping)) { - prev.updateThumbnailLocked(screenshotActivitiesLocked(prev), null); + prev.mUpdateTaskThumbnailWhenHidden = true; } stopFullyDrawnTraceIfNeeded(); @@ -1221,6 +1221,10 @@ final class ActivityStack { private void setVisible(ActivityRecord r, boolean visible) { r.visible = visible; + if (!visible && r.mUpdateTaskThumbnailWhenHidden) { + r.updateThumbnailLocked(r.task.stack.screenshotActivitiesLocked(r), null); + r.mUpdateTaskThumbnailWhenHidden = false; + } mWindowManager.setAppVisibility(r.appToken, visible); final ArrayList<ActivityContainer> containers = r.mChildContainers; for (int containerNdx = containers.size() - 1; containerNdx >= 0; --containerNdx) { diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index b1609819403a..39e25ee482f9 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -562,8 +562,9 @@ public final class BroadcastQueue { skip = true; } if (!skip) { - if (!mService.checkAllowBackgroundLocked(filter.receiverList.uid, filter.packageName, - -1)) { + final int allowed = mService.checkAllowBackgroundLocked(filter.receiverList.uid, + filter.packageName, -1); + if (allowed == ActivityManager.APP_START_MODE_DISABLED) { Slog.w(TAG, "Background execution not allowed: receiving " + r.intent + " to " + filter.receiverList.app @@ -1013,15 +1014,6 @@ public final class BroadcastQueue { skip = true; } if (!skip) { - if (!mService.checkAllowBackgroundLocked(info.activityInfo.applicationInfo.uid, - info.activityInfo.packageName, -1)) { - Slog.w(TAG, "Background execution not allowed: receiving " - + r.intent + " to " - + component.flattenToShortString()); - skip = true; - } - } - if (!skip) { skip = !mService.mIntentFirewall.checkBroadcast(r.intent, r.callingUid, r.callingPid, r.resolvedType, info.activityInfo.applicationInfo.uid); } @@ -1083,6 +1075,36 @@ public final class BroadcastQueue { } } + String targetProcess = info.activityInfo.processName; + ProcessRecord app = mService.getProcessRecordLocked(targetProcess, + info.activityInfo.applicationInfo.uid, false); + if (!skip) { + final int allowed = mService.checkAllowBackgroundLocked( + info.activityInfo.applicationInfo.uid, info.activityInfo.packageName, -1); + if (allowed != ActivityManager.APP_START_MODE_NORMAL) { + // We won't allow this receiver to be launched if the app has been + // completely disabled from launches, or it is delayed and the broadcast + // was not explicitly sent to it and this would result in a new process + // for it being created. + if (allowed == ActivityManager.APP_START_MODE_DISABLED) { + Slog.w(TAG, "Background execution disabled: receiving " + + r.intent + " to " + + component.flattenToShortString()); + skip = true; + } + if (((r.intent.getFlags()&Intent.FLAG_RECEIVER_EXCLUDE_BACKGROUND) != 0) + || (r.intent.getComponent() == null + && r.intent.getPackage() == null && app == null + && ((r.intent.getFlags() + & Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND) == 0))) { + Slog.w(TAG, "Background execution not allowed: receiving " + + r.intent + " to " + + component.flattenToShortString()); + skip = true; + } + } + } + if (skip) { if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Skipping delivery of ordered [" + mQueueName + "] " @@ -1095,7 +1117,6 @@ public final class BroadcastQueue { } r.state = BroadcastRecord.APP_RECEIVE; - String targetProcess = info.activityInfo.processName; r.curComponent = component; final int receiverUid = info.activityInfo.applicationInfo.uid; // If it's a singleton, it needs to be the same app or a special app @@ -1126,8 +1147,6 @@ public final class BroadcastQueue { } // Is this receiver's application already running? - ProcessRecord app = mService.getProcessRecordLocked(targetProcess, - info.activityInfo.applicationInfo.uid, false); if (app != null && app.thread != null) { try { app.addPackage(info.activityInfo.packageName, diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java index b42bcff15f83..1a269cf840f7 100644 --- a/services/core/java/com/android/server/am/BroadcastRecord.java +++ b/services/core/java/com/android/server/am/BroadcastRecord.java @@ -188,7 +188,7 @@ final class BroadcastRecord extends Binder { if (o instanceof BroadcastFilter) ((BroadcastFilter)o).dumpBrief(pw, p2); else if (o instanceof ResolveInfo) - ((ResolveInfo)o).dump(printer, p2); + ((ResolveInfo)o).dump(printer, p2, 0); } } diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index f6f82da6f75c..62e78a456c98 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -253,7 +253,8 @@ final class UserController { final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null); bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId); - bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT); + bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT + | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); mService.broadcastIntentLocked(null, null, bootIntent, null, null, 0, null, null, new String[] { android.Manifest.permission.RECEIVE_BOOT_COMPLETED }, AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, userId); diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index 5108564e916b..3a10dbe3fc50 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -62,6 +62,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Protocol; import com.android.internal.util.State; import com.android.internal.util.StateMachine; +import com.android.internal.util.WakeupMessage; import com.android.server.connectivity.NetworkAgentInfo; import java.io.IOException; @@ -565,19 +566,14 @@ public class NetworkMonitor extends StateMachine { private class LingeringState extends State { private static final String ACTION_LINGER_EXPIRED = "android.net.netmon.lingerExpired"; - private CustomIntentReceiver mBroadcastReceiver; - private PendingIntent mIntent; + private WakeupMessage mWakeupMessage; @Override public void enter() { - mLingerToken = new Random().nextInt(); - mBroadcastReceiver = new CustomIntentReceiver(ACTION_LINGER_EXPIRED, mLingerToken, - CMD_LINGER_EXPIRED); - mIntent = mBroadcastReceiver.getPendingIntent(); + final String cmdName = ACTION_LINGER_EXPIRED + "." + mNetworkAgentInfo.network.netId; + mWakeupMessage = new WakeupMessage(mContext, getHandler(), cmdName, CMD_LINGER_EXPIRED); long wakeupTime = SystemClock.elapsedRealtime() + mLingerDelayMs; - mAlarmManager.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP, wakeupTime, - // Give a specific window so we aren't subject to unknown inexactitude. - mLingerDelayMs / 6, mIntent); + mWakeupMessage.schedule(wakeupTime); } @Override @@ -592,8 +588,6 @@ public class NetworkMonitor extends StateMachine { } return NOT_HANDLED; case CMD_LINGER_EXPIRED: - if (message.arg1 != mLingerToken) - return HANDLED; mConnectivityServiceHandler.sendMessage( obtainMessage(EVENT_NETWORK_LINGER_COMPLETE, mNetworkAgentInfo)); return HANDLED; @@ -624,8 +618,7 @@ public class NetworkMonitor extends StateMachine { @Override public void exit() { - mAlarmManager.cancel(mIntent); - mContext.unregisterReceiver(mBroadcastReceiver); + mWakeupMessage.cancel(); } } diff --git a/services/core/java/com/android/server/pm/EphemeralApplicationRegistry.java b/services/core/java/com/android/server/pm/EphemeralApplicationRegistry.java new file mode 100644 index 000000000000..878635083b3a --- /dev/null +++ b/services/core/java/com/android/server/pm/EphemeralApplicationRegistry.java @@ -0,0 +1,698 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.pm; + +import android.content.Context; +import android.content.pm.EphemeralApplicationInfo; +import android.content.pm.PackageParser; +import android.content.pm.PackageUserState; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Binder; +import android.os.Environment; +import android.provider.Settings; +import android.util.AtomicFile; +import android.util.Slog; +import android.util.SparseArray; +import android.util.Xml; +import com.android.internal.annotations.GuardedBy; +import com.android.internal.util.ArrayUtils; +import com.android.internal.util.XmlUtils; +import libcore.io.IoUtils; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +/** + * This class is a part of the package manager service that is responsible + * for managing data associated with ephemeral apps such as cached uninstalled + * ephemeral apps and ephemeral apps' cookies. + */ +class EphemeralApplicationRegistry { + private static final boolean DEBUG = false; + + private static final String LOG_TAG = "EphemeralAppRegistry"; + + private static final long DEFAULT_UNINSTALLED_EPHEMERAL_APP_CACHE_DURATION_MILLIS = + DEBUG ? 60 * 1000L /* one min */ : 30 * 24 * 60 * 60 * 1000L; /* one month */ + + private final static char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); + + private static final String EPHEMERAL_APPS_FOLDER = "ephemeral"; + private static final String EPHEMERAL_APP_ICON_FILE = "icon.png"; + private static final String EPHEMERAL_APP_COOKIE_FILE_PREFIX = "cookie_"; + private static final String EPHEMERAL_APP_COOKIE_FILE_SIFFIX = ".dat"; + private static final String EPHEMERAL_APP_METADATA_FILE = "metadata.xml"; + + private static final String TAG_PACKAGE = "package"; + private static final String TAG_PERMS = "perms"; + private static final String TAG_PERM = "perm"; + + private static final String ATTR_LABEL = "label"; + private static final String ATTR_NAME = "name"; + private static final String ATTR_GRANTED = "granted"; + + private final PackageManagerService mService; + + @GuardedBy("mService.mPackages") + private SparseArray<List<UninstalledEphemeralAppState>> mUninstalledEphemeralApps; + + public EphemeralApplicationRegistry(PackageManagerService service) { + mService = service; + } + + public byte[] getEphemeralApplicationCookieLPw(String packageName, int userId) { + pruneUninstalledEphemeralAppsLPw(userId); + + File cookieFile = peekEphemeralCookieFile(packageName, userId); + if (cookieFile != null && cookieFile.exists()) { + try { + return IoUtils.readFileAsByteArray(cookieFile.toString()); + } catch (IOException e) { + Slog.w(LOG_TAG, "Error reading cookie file: " + cookieFile); + } + } + return null; + } + + public boolean setEphemeralApplicationCookieLPw(String packageName, + byte[] cookie, int userId) { + pruneUninstalledEphemeralAppsLPw(userId); + + PackageParser.Package pkg = mService.mPackages.get(packageName); + if (pkg == null) { + return false; + } + + if (!isValidCookie(mService.mContext, cookie)) { + return false; + } + + File appDir = getEphemeralApplicationDir(pkg.packageName, userId); + if (!appDir.exists() && !appDir.mkdirs()) { + return false; + } + + File cookieFile = computeEphemeralCookieFile(pkg, userId); + if (cookieFile.exists() && !cookieFile.delete()) { + return false; + } + + try (FileOutputStream fos = new FileOutputStream(cookieFile)) { + fos.write(cookie, 0, cookie.length); + } catch (IOException e) { + Slog.w(LOG_TAG, "Error writing cookie file: " + cookieFile); + return false; + } + return true; + } + + public Bitmap getEphemeralApplicationIconLPw(String packageName, int userId) { + pruneUninstalledEphemeralAppsLPw(userId); + + File iconFile = new File(getEphemeralApplicationDir(packageName, userId), + EPHEMERAL_APP_ICON_FILE); + if (iconFile.exists()) { + return BitmapFactory.decodeFile(iconFile.toString()); + } + return null; + } + + public List<EphemeralApplicationInfo> getEphemeralApplicationsLPw(int userId) { + pruneUninstalledEphemeralAppsLPw(userId); + + List<EphemeralApplicationInfo> result = getInstalledEphemeralApplicationsLPr(userId); + result.addAll(getUninstalledEphemeralApplicationsLPr(userId)); + return result; + } + + public void onPackageInstalledLPw(PackageParser.Package pkg) { + PackageSetting ps = (PackageSetting) pkg.mExtras; + if (ps == null) { + return; + } + for (int userId : UserManagerService.getInstance().getUserIds()) { + pruneUninstalledEphemeralAppsLPw(userId); + + // Ignore not installed apps + if (mService.mPackages.get(pkg.packageName) == null || !ps.getInstalled(userId)) { + continue; + } + + // Propagate permissions before removing any state + propagateEphemeralAppPermissionsIfNeeded(pkg, userId); + + // Remove the in-memory state + if (mUninstalledEphemeralApps != null) { + List<UninstalledEphemeralAppState> uninstalledAppStates = + mUninstalledEphemeralApps.get(userId); + if (uninstalledAppStates != null) { + final int appCount = uninstalledAppStates.size(); + for (int i = 0; i < appCount; i++) { + UninstalledEphemeralAppState uninstalledAppState = + uninstalledAppStates.get(i); + if (uninstalledAppState.mEphemeralApplicationInfo + .getPackageName().equals(pkg.packageName)) { + uninstalledAppStates.remove(i); + break; + } + } + } + } + + // Remove the on-disk state except the cookie + File ephemeralAppDir = getEphemeralApplicationDir(pkg.packageName, userId); + new File(ephemeralAppDir, EPHEMERAL_APP_METADATA_FILE).delete(); + new File(ephemeralAppDir, EPHEMERAL_APP_ICON_FILE).delete(); + + // If app signature changed - wipe the cookie + File currentCookieFile = peekEphemeralCookieFile(pkg.packageName, userId); + if (currentCookieFile == null) { + continue; + } + File expectedCookeFile = computeEphemeralCookieFile(pkg, userId); + if (!currentCookieFile.equals(expectedCookeFile)) { + Slog.i(LOG_TAG, "Signature for package " + pkg.packageName + + " changed - dropping cookie"); + currentCookieFile.delete(); + } + } + } + + public void onPackageUninstalledLPw(PackageParser.Package pkg) { + PackageSetting ps = (PackageSetting) pkg.mExtras; + if (ps == null) { + return; + } + for (int userId : UserManagerService.getInstance().getUserIds()) { + pruneUninstalledEphemeralAppsLPw(userId); + + if (mService.mPackages.get(pkg.packageName) != null && ps.getInstalled(userId)) { + continue; + } + + if (pkg.applicationInfo.isEphemeralApp()) { + // Add a record for an uninstalled ephemeral app + addUninstalledEphemeralAppLPw(pkg, userId); + } else { + // Deleting an app prunes all ephemeral state such as cookie + deleteDir(getEphemeralApplicationDir(pkg.packageName, userId)); + } + } + } + + public void onUserRemovedLPw(int userId) { + if (mUninstalledEphemeralApps != null) { + mUninstalledEphemeralApps.remove(userId); + } + deleteDir(getEphemeralApplicationsDir(userId)); + } + + private void addUninstalledEphemeralAppLPw(PackageParser.Package pkg, int userId) { + EphemeralApplicationInfo uninstalledApp = createEphemeralAppInfoForPackage(pkg, userId); + if (uninstalledApp == null) { + return; + } + if (mUninstalledEphemeralApps == null) { + mUninstalledEphemeralApps = new SparseArray<>(); + } + List<UninstalledEphemeralAppState> uninstalledAppStates = + mUninstalledEphemeralApps.get(userId); + if (uninstalledAppStates == null) { + uninstalledAppStates = new ArrayList<>(); + mUninstalledEphemeralApps.put(userId, uninstalledAppStates); + } + UninstalledEphemeralAppState uninstalledAppState = new UninstalledEphemeralAppState( + uninstalledApp, System.currentTimeMillis()); + uninstalledAppStates.add(uninstalledAppState); + + writeUninstalledEphemeralAppMetadata(uninstalledApp, userId); + writeEphemeralApplicationIconLPw(pkg, userId); + } + + private void writeEphemeralApplicationIconLPw(PackageParser.Package pkg, int userId) { + File appDir = getEphemeralApplicationDir(pkg.packageName, userId); + if (!appDir.exists()) { + return; + } + + Drawable icon = pkg.applicationInfo.loadIcon(mService.mContext.getPackageManager()); + + final Bitmap bitmap; + if (icon instanceof BitmapDrawable) { + bitmap = ((BitmapDrawable) icon).getBitmap(); + } else { + bitmap = Bitmap.createBitmap(icon.getIntrinsicWidth(), + icon.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + icon.draw(canvas); + } + + File iconFile = new File(getEphemeralApplicationDir(pkg.packageName, userId), + EPHEMERAL_APP_ICON_FILE); + + try (FileOutputStream out = new FileOutputStream(iconFile)) { + bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); + } catch (Exception e) { + Slog.e(LOG_TAG, "Error writing ephemeral app icon", e); + } + } + + private void pruneUninstalledEphemeralAppsLPw(int userId) { + final long maxCacheDurationMillis = Settings.Global.getLong( + mService.mContext.getContentResolver(), + Settings.Global.UNINSTALLED_EPHEMERAL_APP_CACHE_DURATION_MILLIS, + DEFAULT_UNINSTALLED_EPHEMERAL_APP_CACHE_DURATION_MILLIS); + + // Prune in-memory state + if (mUninstalledEphemeralApps != null) { + List<UninstalledEphemeralAppState> uninstalledAppStates = + mUninstalledEphemeralApps.get(userId); + if (uninstalledAppStates != null) { + final int appCount = uninstalledAppStates.size(); + for (int j = appCount - 1; j >= 0; j--) { + UninstalledEphemeralAppState uninstalledAppState = uninstalledAppStates.get(j); + final long elapsedCachingMillis = System.currentTimeMillis() + - uninstalledAppState.mTimestamp; + if (elapsedCachingMillis > maxCacheDurationMillis) { + uninstalledAppStates.remove(j); + } + } + if (uninstalledAppStates.isEmpty()) { + mUninstalledEphemeralApps.remove(userId); + } + } + } + + // Prune on-disk state + File ephemeralAppsDir = getEphemeralApplicationsDir(userId); + if (!ephemeralAppsDir.exists()) { + return; + } + File[] files = ephemeralAppsDir.listFiles(); + if (files == null) { + return; + } + for (File ephemeralDir : files) { + if (!ephemeralDir.isDirectory()) { + continue; + } + + File metadataFile = new File(ephemeralDir, EPHEMERAL_APP_METADATA_FILE); + if (!metadataFile.exists()) { + continue; + } + + final long elapsedCachingMillis = System.currentTimeMillis() + - metadataFile.lastModified(); + if (elapsedCachingMillis > maxCacheDurationMillis) { + deleteDir(ephemeralDir); + } + } + } + + private List<EphemeralApplicationInfo> getInstalledEphemeralApplicationsLPr(int userId) { + List<EphemeralApplicationInfo> result = null; + + final int packageCount = mService.mPackages.size(); + for (int i = 0; i < packageCount; i++) { + PackageParser.Package pkg = mService.mPackages.valueAt(i); + if (!pkg.applicationInfo.isEphemeralApp()) { + continue; + } + EphemeralApplicationInfo info = createEphemeralAppInfoForPackage(pkg, userId); + if (info == null) { + continue; + } + if (result == null) { + result = new ArrayList<>(); + } + result.add(info); + } + + return result; + } + + private EphemeralApplicationInfo createEphemeralAppInfoForPackage( + PackageParser.Package pkg, int userId) { + PackageSetting ps = (PackageSetting) pkg.mExtras; + if (ps == null) { + return null; + } + PackageUserState userState = ps.readUserState(userId); + if (userState == null || !userState.installed || userState.hidden) { + return null; + } + + String[] requestedPermissions = new String[pkg.requestedPermissions.size()]; + pkg.requestedPermissions.toArray(requestedPermissions); + + Set<String> permissions = ps.getPermissionsState().getPermissions(userId); + String[] grantedPermissions = new String[permissions.size()]; + permissions.toArray(grantedPermissions); + + return new EphemeralApplicationInfo(pkg.applicationInfo, + requestedPermissions, grantedPermissions); + } + + private List<EphemeralApplicationInfo> getUninstalledEphemeralApplicationsLPr(int userId) { + List<UninstalledEphemeralAppState> uninstalledAppStates = + getUninstalledEphemeralAppStatesLPr(userId); + if (uninstalledAppStates == null || uninstalledAppStates.isEmpty()) { + return Collections.emptyList(); + } + + List<EphemeralApplicationInfo> uninstalledApps = new ArrayList<>(); + final int stateCount = uninstalledAppStates.size(); + for (int i = 0; i < stateCount; i++) { + UninstalledEphemeralAppState uninstalledAppState = uninstalledAppStates.get(i); + uninstalledApps.add(uninstalledAppState.mEphemeralApplicationInfo); + } + return uninstalledApps; + } + + private void propagateEphemeralAppPermissionsIfNeeded(PackageParser.Package pkg, int userId) { + EphemeralApplicationInfo appInfo = getOrParseUninstalledEphemeralAppInfo(pkg.packageName, userId); + if (appInfo == null) { + return; + } + if (ArrayUtils.isEmpty(appInfo.getGrantedPermissions())) { + return; + } + final long identity = Binder.clearCallingIdentity(); + try { + for (String grantedPermission : appInfo.getGrantedPermissions()) { + mService.grantRuntimePermission(pkg.packageName, grantedPermission, userId); + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + private EphemeralApplicationInfo getOrParseUninstalledEphemeralAppInfo(String packageName, + int userId) { + if (mUninstalledEphemeralApps != null) { + List<UninstalledEphemeralAppState> uninstalledAppStates = + mUninstalledEphemeralApps.get(userId); + if (uninstalledAppStates != null) { + final int appCount = uninstalledAppStates.size(); + for (int i = 0; i < appCount; i++) { + UninstalledEphemeralAppState uninstalledAppState = uninstalledAppStates.get(i); + if (uninstalledAppState.mEphemeralApplicationInfo + .getPackageName().equals(packageName)) { + return uninstalledAppState.mEphemeralApplicationInfo; + } + } + } + } + + File metadataFile = new File(getEphemeralApplicationDir(packageName, userId), + EPHEMERAL_APP_METADATA_FILE); + UninstalledEphemeralAppState uninstalledAppState = parseMetadataFile(metadataFile); + if (uninstalledAppState == null) { + return null; + } + + return uninstalledAppState.mEphemeralApplicationInfo; + } + + private List<UninstalledEphemeralAppState> getUninstalledEphemeralAppStatesLPr(int userId) { + List<UninstalledEphemeralAppState> uninstalledAppStates = null; + if (mUninstalledEphemeralApps != null) { + uninstalledAppStates = mUninstalledEphemeralApps.get(userId); + if (uninstalledAppStates != null) { + return uninstalledAppStates; + } + } + + File ephemeralAppsDir = getEphemeralApplicationsDir(userId); + if (ephemeralAppsDir.exists()) { + File[] files = ephemeralAppsDir.listFiles(); + if (files != null) { + for (File ephemeralDir : files) { + if (!ephemeralDir.isDirectory()) { + continue; + } + File metadataFile = new File(ephemeralDir, + EPHEMERAL_APP_METADATA_FILE); + UninstalledEphemeralAppState uninstalledAppState = + parseMetadataFile(metadataFile); + if (uninstalledAppState == null) { + continue; + } + if (uninstalledAppStates == null) { + uninstalledAppStates = new ArrayList<>(); + } + uninstalledAppStates.add(uninstalledAppState); + } + } + } + + if (uninstalledAppStates != null) { + if (mUninstalledEphemeralApps == null) { + mUninstalledEphemeralApps = new SparseArray<>(); + } + mUninstalledEphemeralApps.put(userId, uninstalledAppStates); + } + + return uninstalledAppStates; + } + + private static boolean isValidCookie(Context context, byte[] cookie) { + if (ArrayUtils.isEmpty(cookie)) { + return true; + } + return cookie.length <= context.getPackageManager().getEphemeralCookieMaxSizeBytes(); + } + + private static UninstalledEphemeralAppState parseMetadataFile(File metadataFile) { + if (!metadataFile.exists()) { + return null; + } + FileInputStream in; + try { + in = new AtomicFile(metadataFile).openRead(); + } catch (FileNotFoundException fnfe) { + Slog.i(LOG_TAG, "No ephemeral metadata file"); + return null; + } + + final File ephemeralDir = metadataFile.getParentFile(); + final long timestamp = metadataFile.lastModified(); + final String packageName = ephemeralDir.getName(); + + try { + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(in, StandardCharsets.UTF_8.name()); + return new UninstalledEphemeralAppState( + parseMetadata(parser, packageName), timestamp); + } catch (XmlPullParserException | IOException e) { + throw new IllegalStateException("Failed parsing ephemeral" + + " metadata file: " + metadataFile, e); + } finally { + IoUtils.closeQuietly(in); + } + } + + private static File computeEphemeralCookieFile(PackageParser.Package pkg, int userId) { + File appDir = getEphemeralApplicationDir(pkg.packageName, userId); + String cookieFile = EPHEMERAL_APP_COOKIE_FILE_PREFIX + computePackageCertDigest(pkg) + + EPHEMERAL_APP_COOKIE_FILE_SIFFIX; + return new File(appDir, cookieFile); + } + + private static File peekEphemeralCookieFile(String packageName, int userId) { + File appDir = getEphemeralApplicationDir(packageName, userId); + if (!appDir.exists()) { + return null; + } + for (File file : appDir.listFiles()) { + if (!file.isDirectory() + && file.getName().startsWith(EPHEMERAL_APP_COOKIE_FILE_PREFIX) + && file.getName().endsWith(EPHEMERAL_APP_COOKIE_FILE_SIFFIX)) { + return file; + } + } + return null; + } + + private static EphemeralApplicationInfo parseMetadata(XmlPullParser parser, String packageName) + throws IOException, XmlPullParserException { + final int outerDepth = parser.getDepth(); + while (XmlUtils.nextElementWithin(parser, outerDepth)) { + if (TAG_PACKAGE.equals(parser.getName())) { + return parsePackage(parser, packageName); + } + } + return null; + } + + private static EphemeralApplicationInfo parsePackage(XmlPullParser parser, String packageName) + throws IOException, XmlPullParserException { + String label = parser.getAttributeValue(null, ATTR_LABEL); + + List<String> outRequestedPermissions = new ArrayList<>(); + List<String> outGrantedPermissions = new ArrayList<>(); + + final int outerDepth = parser.getDepth(); + while (XmlUtils.nextElementWithin(parser, outerDepth)) { + if (TAG_PERMS.equals(parser.getName())) { + parsePermissions(parser, outRequestedPermissions, outGrantedPermissions); + } + } + + String[] requestedPermissions = new String[outRequestedPermissions.size()]; + outRequestedPermissions.toArray(requestedPermissions); + + String[] grantedPermissions = new String[outGrantedPermissions.size()]; + outGrantedPermissions.toArray(grantedPermissions); + + return new EphemeralApplicationInfo(packageName, label, + requestedPermissions, grantedPermissions); + } + + private static void parsePermissions(XmlPullParser parser, List<String> outRequestedPermissions, + List<String> outGrantedPermissions) throws IOException, XmlPullParserException { + final int outerDepth = parser.getDepth(); + while (XmlUtils.nextElementWithin(parser,outerDepth)) { + if (TAG_PERM.equals(parser.getName())) { + String permission = XmlUtils.readStringAttribute(parser, ATTR_NAME); + outRequestedPermissions.add(permission); + if (XmlUtils.readBooleanAttribute(parser, ATTR_GRANTED)) { + outGrantedPermissions.add(permission); + } + } + } + } + + private void writeUninstalledEphemeralAppMetadata( + EphemeralApplicationInfo ephemeralApp, int userId) { + File appDir = getEphemeralApplicationDir(ephemeralApp.getPackageName(), userId); + if (!appDir.exists() && !appDir.mkdirs()) { + return; + } + + File metadataFile = new File(appDir, EPHEMERAL_APP_METADATA_FILE); + + AtomicFile destination = new AtomicFile(metadataFile); + FileOutputStream out = null; + try { + out = destination.startWrite(); + + XmlSerializer serializer = Xml.newSerializer(); + serializer.setOutput(out, StandardCharsets.UTF_8.name()); + serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); + + serializer.startDocument(null, true); + + serializer.startTag(null, TAG_PACKAGE); + serializer.attribute(null, ATTR_LABEL, ephemeralApp.loadLabel( + mService.mContext.getPackageManager()).toString()); + + serializer.startTag(null, TAG_PERMS); + for (String permission : ephemeralApp.getRequestedPermissions()) { + serializer.startTag(null, TAG_PERM); + serializer.attribute(null, ATTR_NAME, permission); + if (ArrayUtils.contains(ephemeralApp.getGrantedPermissions(), permission)) { + serializer.attribute(null, ATTR_GRANTED, String.valueOf(true)); + } + serializer.endTag(null, TAG_PERM); + } + serializer.endTag(null, TAG_PERMS); + + serializer.endTag(null, TAG_PACKAGE); + + serializer.endDocument(); + destination.finishWrite(out); + } catch (Throwable t) { + Slog.wtf(LOG_TAG, "Failed to write ephemeral state, restoring backup", t); + destination.failWrite(out); + } finally { + IoUtils.closeQuietly(out); + } + } + + private static String computePackageCertDigest(PackageParser.Package pkg) { + MessageDigest messageDigest; + try { + messageDigest = MessageDigest.getInstance("SHA256"); + } catch (NoSuchAlgorithmException e) { + /* can't happen */ + return null; + } + + messageDigest.update(pkg.mSignatures[0].toByteArray()); + + final byte[] digest = messageDigest.digest(); + final int digestLength = digest.length; + final int charCount = 2 * digestLength; + + final char[] chars = new char[charCount]; + for (int i = 0; i < digestLength; i++) { + final int byteHex = digest[i] & 0xFF; + chars[i * 2] = HEX_ARRAY[byteHex >>> 4]; + chars[i * 2 + 1] = HEX_ARRAY[byteHex & 0x0F]; + } + return new String(chars); + } + + private static File getEphemeralApplicationsDir(int userId) { + return new File(Environment.getUserSystemDirectory(userId), + EPHEMERAL_APPS_FOLDER); + } + + private static File getEphemeralApplicationDir(String packageName, int userId) { + return new File (getEphemeralApplicationsDir(userId), packageName); + } + + private static void deleteDir(File dir) { + File[] files = dir.listFiles(); + if (files != null) { + for (File file : dir.listFiles()) { + deleteDir(file); + } + } + dir.delete(); + } + + private static final class UninstalledEphemeralAppState { + final EphemeralApplicationInfo mEphemeralApplicationInfo; + final long mTimestamp; + + public UninstalledEphemeralAppState(EphemeralApplicationInfo ephemeralApp, + long timestamp) { + mEphemeralApplicationInfo = ephemeralApp; + mTimestamp = timestamp; + } + } +} diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index f65dba1fc2f9..3a8a9882f403 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -34,7 +34,6 @@ import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET; import static android.content.pm.PackageManager.INSTALL_EXTERNAL; import static android.content.pm.PackageManager.INSTALL_FAILED_ALREADY_EXISTS; import static android.content.pm.PackageManager.INSTALL_FAILED_CONFLICTING_PROVIDER; -import static android.content.pm.PackageManager.INSTALL_FAILED_DEXOPT; import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE; import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PERMISSION; import static android.content.pm.PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID; @@ -94,8 +93,6 @@ import android.app.AppGlobals; import android.app.IActivityManager; import android.app.admin.IDevicePolicyManager; import android.app.backup.IBackupManager; -import android.app.usage.UsageStats; -import android.app.usage.UsageStatsManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -108,6 +105,7 @@ import android.content.ServiceConnection; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.AppsQueryHelper; +import android.content.pm.EphemeralApplicationInfo; import android.content.pm.FeatureInfo; import android.content.pm.IOnPermissionsChangeListener; import android.content.pm.IPackageDataObserver; @@ -147,6 +145,7 @@ import android.content.pm.VerificationParams; import android.content.pm.VerifierDeviceIdentity; import android.content.pm.VerifierInfo; import android.content.res.Resources; +import android.graphics.Bitmap; import android.hardware.display.DisplayManager; import android.net.Uri; import android.os.Debug; @@ -203,6 +202,7 @@ import android.util.SparseIntArray; import android.util.Xml; import android.view.Display; +import com.android.internal.annotations.GuardedBy; import dalvik.system.DexFile; import dalvik.system.VMRuntime; @@ -210,7 +210,6 @@ import libcore.io.IoUtils; import libcore.util.EmptyArray; import com.android.internal.R; -import com.android.internal.annotations.GuardedBy; import com.android.internal.app.EphemeralResolveInfo; import com.android.internal.app.IMediaContainerService; import com.android.internal.app.ResolverActivity; @@ -515,6 +514,8 @@ public class PackageManagerService extends IPackageManager.Stub { // If a recursive restorecon of /data/data/<pkg> is needed. private boolean mShouldRestoreconData = SELinuxMMAC.shouldRestorecon(); + private final EphemeralApplicationRegistry mEphemeralApplicationRegistry; + public static final class SharedLibraryEntry { public final String path; public final String apk; @@ -1399,6 +1400,10 @@ public class PackageManagerService extends IPackageManager.Stub { args.installGrantPermissions); } + synchronized (mPackages) { + mEphemeralApplicationRegistry.onPackageInstalledLPw(res.pkg); + } + // Determine the set of users who are adding this // package for the first time vs. those who are seeing // an update. @@ -2408,6 +2413,8 @@ public class PackageManagerService extends IPackageManager.Stub { mEphemeralInstallerComponent = null; mEphemeralResolverConnection = null; } + + mEphemeralApplicationRegistry = new EphemeralApplicationRegistry(this); } // synchronized (mPackages) } // synchronized (mInstallLock) @@ -5787,6 +5794,82 @@ public class PackageManagerService extends IPackageManager.Stub { } } + @Override + public ParceledListSlice<EphemeralApplicationInfo> getEphemeralApplications(int userId) { + mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_EPHEMERAL_APPS, + "getEphemeralApplications"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + "getEphemeralApplications"); + synchronized (mPackages) { + List<EphemeralApplicationInfo> ephemeralApps = mEphemeralApplicationRegistry + .getEphemeralApplicationsLPw(userId); + if (ephemeralApps != null) { + return new ParceledListSlice<>(ephemeralApps); + } + } + return null; + } + + @Override + public boolean isEphemeralApplication(String packageName, int userId) { + enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + "isEphemeral"); + if (!isCallerSameApp(packageName)) { + return false; + } + synchronized (mPackages) { + PackageParser.Package pkg = mPackages.get(packageName); + if (pkg != null) { + return pkg.applicationInfo.isEphemeralApp(); + } + } + return false; + } + + @Override + public byte[] getEphemeralApplicationCookie(String packageName, int userId) { + enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + "getCookie"); + if (!isCallerSameApp(packageName)) { + return null; + } + synchronized (mPackages) { + return mEphemeralApplicationRegistry.getEphemeralApplicationCookieLPw( + packageName, userId); + } + } + + @Override + public boolean setEphemeralApplicationCookie(String packageName, byte[] cookie, int userId) { + enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + "setCookie"); + if (!isCallerSameApp(packageName)) { + return false; + } + synchronized (mPackages) { + return mEphemeralApplicationRegistry.setEphemeralApplicationCookieLPw( + packageName, cookie, userId); + } + } + + @Override + public Bitmap getEphemeralApplicationIcon(String packageName, int userId) { + mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_EPHEMERAL_APPS, + "getEphemeralApplicationIcon"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + "getEphemeralApplicationIcon"); + synchronized (mPackages) { + return mEphemeralApplicationRegistry.getEphemeralApplicationIconLPw( + packageName, userId); + } + } + + private boolean isCallerSameApp(String packageName) { + PackageParser.Package pkg = mPackages.get(packageName); + return pkg != null + && UserHandle.getAppId(Binder.getCallingUid()) == pkg.applicationInfo.uid; + } + public List<ApplicationInfo> getPersistentApplications(int flags) { final ArrayList<ApplicationInfo> finalList = new ArrayList<ApplicationInfo>(); @@ -9714,6 +9797,15 @@ public class PackageManagerService extends IPackageManager.Stub { if (r1.system != r2.system) { return r1.system ? -1 : 1; } + if (r1.activityInfo != null) { + return r1.activityInfo.packageName.compareTo(r2.activityInfo.packageName); + } + if (r1.serviceInfo != null) { + return r1.serviceInfo.packageName.compareTo(r2.serviceInfo.packageName); + } + if (r1.providerInfo != null) { + return r1.providerInfo.packageName.compareTo(r2.providerInfo.packageName); + } return 0; } }; @@ -12273,8 +12365,7 @@ public class PackageManagerService extends IPackageManager.Stub { // First find the old package info and check signatures synchronized(mPackages) { oldPackage = mPackages.get(pkgName); - final boolean oldIsEphemeral - = ((oldPackage.applicationInfo.flags & ApplicationInfo.FLAG_EPHEMERAL) != 0); + final boolean oldIsEphemeral = oldPackage.applicationInfo.isEphemeralApp(); if (isEphemeral && !oldIsEphemeral) { // can't downgrade from full to ephemeral Slog.w(TAG, "Can't replace app with ephemeral: " + pkgName); @@ -13093,11 +13184,11 @@ public class PackageManagerService extends IPackageManager.Stub { } private static boolean isEphemeral(PackageParser.Package pkg) { - return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_EPHEMERAL) != 0; + return pkg.applicationInfo.isEphemeralApp(); } private static boolean isEphemeral(PackageSetting ps) { - return (ps.pkgFlags & ApplicationInfo.FLAG_EPHEMERAL) != 0; + return ps.pkg != null && isEphemeral(ps.pkg); } private static boolean isSystemApp(PackageParser.Package pkg) { @@ -13298,11 +13389,14 @@ public class PackageManagerService extends IPackageManager.Stub { boolean removedForAllUsers = false; boolean systemUpdate = false; + PackageParser.Package uninstalledPkg; + // for the uninstall-updates case and restricted profiles, remember the per- // userhandle installed state int[] allUsers; boolean[] perUserInstalled; synchronized (mPackages) { + uninstalledPkg = mPackages.get(packageName); PackageSetting ps = mSettings.mPackages.get(packageName); allUsers = sUserManager.getUserIds(); perUserInstalled = new boolean[allUsers.length]; @@ -13317,8 +13411,13 @@ public class PackageManagerService extends IPackageManager.Stub { true, allUsers, perUserInstalled, flags | REMOVE_CHATTY, info, true); systemUpdate = info.isRemovedPackageSystemUpdate; - if (res && !systemUpdate && mPackages.get(packageName) == null) { - removedForAllUsers = true; + synchronized (mPackages) { + if (res) { + if (!systemUpdate && mPackages.get(packageName) == null) { + removedForAllUsers = true; + } + mEphemeralApplicationRegistry.onPackageUninstalledLPw(uninstalledPkg); + } } if (DEBUG_REMOVE) Slog.d(TAG, "delete res: systemUpdate=" + systemUpdate + " removedForAllUsers=" + removedForAllUsers); @@ -16453,7 +16552,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (userDir.exists()) continue; try { - sm.prepareUserStorage(volumeUuid, user.id, user.serialNumber); + sm.prepareUserStorage(volumeUuid, user.id, user.serialNumber, user.isEphemeral()); UserManagerService.enforceSerialNumber(userDir, user.serialNumber); } catch (IOException e) { Log.wtf(TAG, "Failed to create user directory on " + volumeUuid, e); @@ -16840,15 +16939,14 @@ public class PackageManagerService extends IPackageManager.Stub { mUserNeedsBadging.delete(userHandle); mSettings.removeUserLPw(userHandle); mPendingBroadcasts.remove(userHandle); + mEphemeralApplicationRegistry.onUserRemovedLPw(userHandle); } synchronized (mInstallLock) { - if (mInstaller != null) { - final StorageManager storage = mContext.getSystemService(StorageManager.class); - for (VolumeInfo vol : storage.getWritablePrivateVolumes()) { - final String volumeUuid = vol.getFsUuid(); - if (DEBUG_INSTALL) Slog.d(TAG, "Removing user data on volume " + volumeUuid); - mInstaller.removeUserDataDirs(volumeUuid, userHandle); - } + final StorageManager storage = mContext.getSystemService(StorageManager.class); + for (VolumeInfo vol : storage.getWritablePrivateVolumes()) { + final String volumeUuid = vol.getFsUuid(); + if (DEBUG_INSTALL) Slog.d(TAG, "Removing user data on volume " + volumeUuid); + mInstaller.removeUserDataDirs(volumeUuid, userHandle); } synchronized (mPackages) { removeUnusedPackagesLILPw(userManager, userHandle); @@ -16910,17 +17008,13 @@ public class PackageManagerService extends IPackageManager.Stub { /** Called by UserManagerService */ void createNewUser(int userHandle) { - if (mInstaller != null) { - synchronized (mInstallLock) { - synchronized (mPackages) { - mInstaller.createUserConfig(userHandle); - mSettings.createNewUserLILPw(this, mInstaller, userHandle); - } - } - synchronized (mPackages) { - applyFactoryDefaultBrowserLPw(userHandle); - primeDomainVerificationsLPw(userHandle); - } + synchronized (mInstallLock) { + mInstaller.createUserConfig(userHandle); + mSettings.createNewUserLI(this, mInstaller, userHandle); + } + synchronized (mPackages) { + applyFactoryDefaultBrowserLPw(userHandle); + primeDomainVerificationsLPw(userHandle); } } diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index f9ed7607f024..b18c84678a8e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -103,11 +103,11 @@ class PackageManagerShellCommand extends ShellCommand { return runUninstall(); case "resolve-activity": return runResolveActivity(); - case "query-intent-activities": + case "query-activities": return runQueryIntentActivities(); - case "query-intent-services": + case "query-services": return runQueryIntentServices(); - case "query-intent-receivers": + case "query-receivers": return runQueryIntentReceivers(); default: return handleDefaultCommands(cmd); @@ -1043,13 +1043,13 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" -s: short summary"); pw.println(" -d: only list dangerous permissions"); pw.println(" -u: list only the permissions users will see"); - pw.println(" resolve-intent [--user USER_ID] INTENT"); + pw.println(" resolve-activity [--user USER_ID] INTENT"); pw.println(" Prints the activity that resolves to the given Intent."); - pw.println(" query-intent-activities [--user USER_ID] INTENT"); + pw.println(" query-activities [--user USER_ID] INTENT"); pw.println(" Prints all activities that can handle the given Intent."); - pw.println(" query-intent-services [--user USER_ID] INTENT"); + pw.println(" query-services [--user USER_ID] INTENT"); pw.println(" Prints all services that can handle the given Intent."); - pw.println(" query-intent-receivers [--user USER_ID] INTENT"); + pw.println(" query-receivers [--user USER_ID] INTENT"); pw.println(" Prints all broadcast receivers that can handle the given Intent."); pw.println(); Intent.printIntentArgsHelp(pw , ""); diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 99aa30bed5a9..22f8e96ce69d 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -3644,21 +3644,47 @@ final class Settings { } } - void createNewUserLILPw(PackageManagerService service, Installer installer, int userHandle) { - for (PackageSetting ps : mPackages.values()) { - if (ps.pkg == null || ps.pkg.applicationInfo == null) { + void createNewUserLI(@NonNull PackageManagerService service, @NonNull Installer installer, + int userHandle) { + String[] volumeUuids; + String[] names; + int[] uids; + String[] seinfos; + int packagesCount; + synchronized (mPackages) { + Collection<PackageSetting> packages = mPackages.values(); + packagesCount = packages.size(); + volumeUuids = new String[packagesCount]; + names = new String[packagesCount]; + uids = new int[packagesCount]; + seinfos = new String[packagesCount]; + Iterator<PackageSetting> packagesIterator = packages.iterator(); + for (int i = 0; i < packagesCount; i++) { + PackageSetting ps = packagesIterator.next(); + if (ps.pkg == null || ps.pkg.applicationInfo == null) { + continue; + } + // Only system apps are initially installed. + ps.setInstalled(ps.isSystem(), userHandle); + // Need to create a data directory for all apps under this user. Accumulate all + // required args and call the installer after mPackages lock has been released + volumeUuids[i] = ps.volumeUuid; + names[i] = ps.name; + uids[i] = UserHandle.getUid(userHandle, ps.appId); + seinfos[i] = ps.pkg.applicationInfo.seinfo; + } + } + for (int i = 0; i < packagesCount; i++) { + if (names[i] == null) { continue; } - // Only system apps are initially installed. - ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle); - // Need to create a data directory for all apps under this user. - installer.createUserData(ps.volumeUuid, ps.name, - UserHandle.getUid(userHandle, ps.appId), userHandle, - ps.pkg.applicationInfo.seinfo); + installer.createUserData(volumeUuids[i], names[i], uids[i], userHandle, seinfos[i]); + } + synchronized (mPackages) { + applyDefaultPreferredAppsLPw(service, userHandle); + writePackageRestrictionsLPr(userHandle); + writePackageListLPr(userHandle); } - applyDefaultPreferredAppsLPw(service, userHandle); - writePackageRestrictionsLPr(userHandle); - writePackageListLPr(userHandle); } void removeUserLPw(int userId) { diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 5910c1068b7d..0b59c16b5839 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -16,6 +16,7 @@ package com.android.server.pm; +import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; @@ -58,6 +59,7 @@ import android.system.Os; import android.system.OsConstants; import android.util.AtomicFile; import android.util.Log; +import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; @@ -90,6 +92,7 @@ import java.util.ArrayList; import java.util.List; import libcore.io.IoUtils; +import libcore.util.Objects; /** * Service for {@link UserManager}. @@ -107,6 +110,7 @@ public class UserManagerService extends IUserManager.Stub { private static final boolean DBG_WITH_STACKTRACE = false; // DO NOT SUBMIT WITH TRUE private static final String TAG_NAME = "name"; + private static final String TAG_ACCOUNT = "account"; private static final String ATTR_FLAGS = "flags"; private static final String ATTR_ICON_PATH = "icon"; private static final String ATTR_ID = "id"; @@ -178,6 +182,14 @@ public class UserManagerService extends IUserManager.Stub { private final SparseArray<UserInfo> mUsers = new SparseArray<>(); /** + * This collection contains each user's account name if the user chose to set one up + * during the initial user creation process. Keeping this information separate from mUsers + * to avoid accidentally leak it. + */ + @GuardedBy("mUsersLock") + private final SparseArray<String> mUserAccounts = new SparseArray<>(); + + /** * User restrictions set via UserManager. This doesn't include restrictions set by * device owner / profile owners. * @@ -306,13 +318,13 @@ public class UserManagerService extends IUserManager.Stub { } void systemReady() { - // Prune out any partially created/partially removed users. + // Prune out any partially created, partially removed and ephemeral users. ArrayList<UserInfo> partials = new ArrayList<>(); synchronized (mUsersLock) { final int userSize = mUsers.size(); for (int i = 0; i < userSize; i++) { UserInfo ui = mUsers.valueAt(i); - if ((ui.partial || ui.guestToRemove) && i != 0) { + if ((ui.partial || ui.guestToRemove || ui.isEphemeral()) && i != 0) { partials.add(ui); } } @@ -336,6 +348,33 @@ public class UserManagerService extends IUserManager.Stub { } @Override + public String getUserAccount(int userId) { + checkManageUserAndAcrossUsersFullPermission("get user account"); + synchronized (mUsersLock) { + return mUserAccounts.get(userId); + } + } + + @Override + public void setUserAccount(int userId, String accountName) { + checkManageUserAndAcrossUsersFullPermission("set user account"); + UserInfo userToUpdate = null; + synchronized (mPackagesLock) { + synchronized (mUsersLock) { + String currentAccount = mUserAccounts.get(userId); + if (!Objects.equal(currentAccount, accountName)) { + mUserAccounts.put(userId, accountName); + userToUpdate = mUsers.get(userId); + } + } + + if (userToUpdate != null) { + writeUserLP(userToUpdate); + } + } + } + + @Override public UserInfo getPrimaryUser() { checkManageUsersPermission("query users"); synchronized (mUsersLock) { @@ -845,6 +884,15 @@ public class UserManagerService extends IUserManager.Stub { } @Override + public boolean hasBaseUserRestriction(String restrictionKey, int userId) { + checkManageUsersPermission("hasBaseUserRestriction"); + synchronized (mRestrictionsLock) { + Bundle bundle = mBaseUserRestrictions.get(userId); + return (bundle != null && bundle.getBoolean(restrictionKey, false)); + } + } + + @Override public void setUserRestriction(String key, boolean value, int userId) { checkManageUsersPermission("setUserRestriction"); synchronized (mRestrictionsLock) { @@ -1043,6 +1091,30 @@ public class UserManagerService extends IUserManager.Stub { /** * Enforces that only the system UID or root's UID or apps that have the + * {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS} and + * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL INTERACT_ACROSS_USERS_FULL} + * permissions can make certain calls to the UserManager. + * + * @param message used as message if SecurityException is thrown + * @throws SecurityException if the caller does not have enough privilege. + */ + private static final void checkManageUserAndAcrossUsersFullPermission(String message) { + final int uid = Binder.getCallingUid(); + if (uid != Process.SYSTEM_UID && uid != 0 + && ActivityManager.checkComponentPermission( + Manifest.permission.MANAGE_USERS, + uid, -1, true) != PackageManager.PERMISSION_GRANTED + && ActivityManager.checkComponentPermission( + Manifest.permission.INTERACT_ACROSS_USERS_FULL, + uid, -1, true) != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException( + "You need MANAGE_USERS and INTERACT_ACROSS_USERS_FULL permission to: " + + message); + } + } + + /** + * Enforces that only the system UID or root's UID or apps that have the * {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS} * permission can make certain calls to the UserManager. * @@ -1059,13 +1131,6 @@ public class UserManagerService extends IUserManager.Stub { } } - private static void checkSystemOrRoot(String message) { - final int uid = Binder.getCallingUid(); - if (uid != Process.SYSTEM_UID && uid != 0) { - throw new SecurityException("Only system may call: " + message); - } - } - private void writeBitmapLP(UserInfo info, Bitmap bitmap) { try { File dir = new File(mUsersDir, Integer.toString(info.id)); @@ -1147,11 +1212,14 @@ public class UserManagerService extends IUserManager.Stub { final String name = parser.getName(); if (name.equals(TAG_USER)) { String id = parser.getAttributeValue(null, ATTR_ID); - UserInfo user = readUserLP(Integer.parseInt(id)); + Pair<UserInfo, String> userPair = readUserLP(Integer.parseInt(id)); - if (user != null) { + if (userPair != null) { + UserInfo user = userPair.first; + String account = userPair.second; synchronized (mUsersLock) { mUsers.put(user.id, user); + mUserAccounts.put(user.id, account); if (mNextSerialNumber < 0 || mNextSerialNumber <= user.id) { mNextSerialNumber = user.id + 1; } @@ -1351,6 +1419,17 @@ public class UserManagerService extends IUserManager.Stub { mDevicePolicyLocalUserRestrictions.get(userInfo.id), TAG_DEVICE_POLICY_RESTRICTIONS); } + // Update the account field if it is set. + String account; + synchronized (mUsersLock) { + account = mUserAccounts.get(userInfo.id); + } + if (account != null) { + serializer.startTag(null, TAG_ACCOUNT); + serializer.text(account); + serializer.endTag(null, TAG_ACCOUNT); + } + serializer.endTag(null, TAG_USER); serializer.endDocument(); @@ -1423,10 +1502,11 @@ public class UserManagerService extends IUserManager.Stub { } } - private UserInfo readUserLP(int id) { + private Pair<UserInfo, String> readUserLP(int id) { int flags = 0; int serialNumber = id; String name = null; + String account = null; String iconPath = null; long creationTime = 0L; long lastLoggedInTime = 0L; @@ -1495,6 +1575,11 @@ public class UserManagerService extends IUserManager.Stub { UserRestrictionsUtils.readRestrictions(parser, baseRestrictions); } else if (TAG_DEVICE_POLICY_RESTRICTIONS.equals(tag)) { UserRestrictionsUtils.readRestrictions(parser, localRestrictions); + } else if (TAG_ACCOUNT.equals(tag)) { + type = parser.next(); + if (type == XmlPullParser.TEXT) { + account = parser.getText(); + } } } } @@ -1511,7 +1596,7 @@ public class UserManagerService extends IUserManager.Stub { mBaseUserRestrictions.put(id, baseRestrictions); mDevicePolicyLocalUserRestrictions.put(id, localRestrictions); } - return userInfo; + return new Pair<>(userInfo, account); } catch (IOException ioe) { } catch (XmlPullParserException pe) { @@ -1666,6 +1751,10 @@ public class UserManagerService extends IUserManager.Stub { } } } + + if (parent != null && parent.isEphemeral()) { + flags |= UserInfo.FLAG_EPHEMERAL; + } userId = getNextAvailableId(); userInfo = new UserInfo(userId, name, null, flags); userInfo.serialNumber = mNextSerialNumber++; @@ -1694,12 +1783,13 @@ public class UserManagerService extends IUserManager.Stub { } } final StorageManager storage = mContext.getSystemService(StorageManager.class); - storage.createUserKey(userId, userInfo.serialNumber); + storage.createUserKey(userId, userInfo.serialNumber, userInfo.isEphemeral()); for (VolumeInfo vol : storage.getWritablePrivateVolumes()) { final String volumeUuid = vol.getFsUuid(); try { final File userDir = Environment.getDataUserDirectory(volumeUuid, userId); - storage.prepareUserStorage(volumeUuid, userId, userInfo.serialNumber); + storage.prepareUserStorage( + volumeUuid, userId, userInfo.serialNumber, userInfo.isEphemeral()); enforceSerialNumber(userDir, userInfo.serialNumber); } catch (IOException e) { Log.wtf(LOG_TAG, "Failed to create user directory on " + volumeUuid, e); @@ -1933,6 +2023,7 @@ public class UserManagerService extends IUserManager.Stub { // Remove this user from the list synchronized (mUsersLock) { mUsers.remove(userHandle); + mUserAccounts.delete(userHandle); mIsUserManaged.delete(userHandle); } synchronized (mRestrictionsLock) { @@ -2493,6 +2584,11 @@ public class UserManagerService extends IUserManager.Stub { pw, " ", mCachedEffectiveUserRestrictions.get(user.id)); } pw.println(); + String accountName = mUserAccounts.get(userId); + if (accountName != null) { + pw.print(" Account name: " + accountName); + pw.println(); + } } } pw.println(" Device policy global restrictions:"); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index fe427d36e36b..b9a9d6e88622 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -396,6 +396,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mDeskDockEnablesAccelerometer; int mLidKeyboardAccessibility; int mLidNavigationAccessibility; + boolean mLidControlsScreenLock; boolean mLidControlsSleep; int mShortPressOnPowerBehavior; int mLongPressOnPowerBehavior; @@ -1440,6 +1441,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { com.android.internal.R.integer.config_lidKeyboardAccessibility); mLidNavigationAccessibility = mContext.getResources().getInteger( com.android.internal.R.integer.config_lidNavigationAccessibility); + mLidControlsScreenLock = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_lidControlsScreenLock); mLidControlsSleep = mContext.getResources().getBoolean( com.android.internal.R.bool.config_lidControlsSleep); mTranslucentDecorEnabled = mContext.getResources().getBoolean( @@ -6378,6 +6381,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { mPowerManager.goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_LID_SWITCH, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE); + } else if (mLidState == LID_CLOSED && mLidControlsScreenLock) { + mWindowManagerFuncs.lockDeviceNow(); } synchronized (mLock) { @@ -6970,6 +6975,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(prefix); pw.print("mLidKeyboardAccessibility="); pw.print(mLidKeyboardAccessibility); pw.print(" mLidNavigationAccessibility="); pw.print(mLidNavigationAccessibility); + pw.print(" mLidControlsScreenLock="); pw.println(mLidControlsScreenLock); pw.print(" mLidControlsSleep="); pw.println(mLidControlsSleep); pw.print(prefix); pw.print("mShortPressOnPowerBehavior="); pw.print(mShortPressOnPowerBehavior); diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index a4b42763b1ce..e6b649e70bdf 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -16,6 +16,9 @@ package com.android.server.wm; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; + import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.Service; @@ -219,7 +222,7 @@ final class AccessibilityController { */ private static final class DisplayMagnifier { - private static final String LOG_TAG = "DisplayMagnifier"; + private static final String LOG_TAG = TAG_WITH_CLASS_NAME ? "DisplayMagnifier" : TAG_WM; private static final boolean DEBUG_WINDOW_TRANSITIONS = false; private static final boolean DEBUG_ROTATION = false; @@ -925,7 +928,8 @@ final class AccessibilityController { * user can see on the screen. */ private static final class WindowsForAccessibilityObserver { - private static final String LOG_TAG = "WindowsForAccessibilityObserver"; + private static final String LOG_TAG = TAG_WITH_CLASS_NAME ? + "WindowsForAccessibilityObserver" : TAG_WM; private static final boolean DEBUG = false; diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index d3941258de5a..a7a4ed1a56dc 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -39,6 +39,8 @@ import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpe import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation; import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation; import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.annotation.Nullable; import android.content.Context; @@ -46,7 +48,6 @@ import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Rect; import android.os.Debug; -import android.os.Handler; import android.os.IBinder; import android.os.IRemoteCallback; import android.os.RemoteException; @@ -73,6 +74,7 @@ import com.android.server.wm.WindowManagerService.H; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Arrays; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -82,10 +84,10 @@ import java.util.concurrent.Executors; // mOpeningApps and mClosingApps are the lists of tokens that will be // made visible or hidden at the next transition. public class AppTransition implements Dump { - private static final String TAG = "AppTransition"; + private static final String TAG = TAG_WITH_CLASS_NAME ? "AppTransition" : TAG_WM; private static final boolean DEBUG_APP_TRANSITIONS = - WindowManagerService.DEBUG_APP_TRANSITIONS; - private static final boolean DEBUG_ANIM = WindowManagerService.DEBUG_ANIM; + WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; + private static final boolean DEBUG_ANIM = WindowManagerDebugConfig.DEBUG_ANIM; private static final int CLIP_REVEAL_TRANSLATION_Y_DP = 8; /** Not set up for a transition. */ @@ -308,6 +310,16 @@ public class AppTransition implements Dump { return mNextAppTransitionScaleUp; } + boolean isNextAppTransitionThumbnailUp() { + return mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP || + mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_ASPECT_SCALE_UP; + } + + boolean isNextAppTransitionThumbnailDown() { + return mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN || + mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_ASPECT_SCALE_DOWN; + } + /** * @return true if and only if we are currently fetching app transition specs from the future * passed into {@link #overridePendingAppTransitionMultiThumbFuture} diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java index 4861acc14121..ab47f07262bd 100644 --- a/services/core/java/com/android/server/wm/AppWindowAnimator.java +++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java @@ -16,9 +16,12 @@ package com.android.server.wm; -import static com.android.server.wm.WindowManagerService.DEBUG_ANIM; -import static com.android.server.wm.WindowManagerService.DEBUG_LAYERS; -import static com.android.server.wm.WindowManagerService.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.TYPE_LAYER_OFFSET; import android.graphics.Matrix; @@ -35,7 +38,7 @@ import java.io.PrintWriter; import java.util.ArrayList; public class AppWindowAnimator { - static final String TAG = "AppWindowAnimator"; + static final String TAG = TAG_WITH_CLASS_NAME ? "AppWindowAnimator" : TAG_WM; private static final int PROLONG_ANIMATION_DISABLED = 0; static final int PROLONG_ANIMATION_AT_END = 1; @@ -410,8 +413,7 @@ public class AppWindowAnimator { final int NW = mAllAppWinAnimators.size(); for (int i=0; i<NW; i++) { WindowStateAnimator winAnimator = mAllAppWinAnimators.get(i); - if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, - "performing show on: " + winAnimator); + if (DEBUG_VISIBILITY) Slog.v(TAG, "performing show on: " + winAnimator); winAnimator.performShowLocked(); isAnimating |= winAnimator.isAnimating(); } diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 23ad1a81bdf1..fd5c7047c4fd 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -17,9 +17,12 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; -import static com.android.server.wm.WindowManagerService.DEBUG_ANIM; -import static com.android.server.wm.WindowManagerService.DEBUG_APP_TRANSITIONS; -import static com.android.server.wm.WindowManagerService.TAG; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import com.android.server.input.InputApplicationHandle; import com.android.server.wm.WindowManagerService.H; @@ -44,6 +47,8 @@ class AppTokenList extends ArrayList<AppWindowToken> { * really activity) that is displaying windows. */ class AppWindowToken extends WindowToken { + private static final String TAG = TAG_WITH_CLASS_NAME ? "AppWindowToken" : TAG_WM; + // Non-null only for application tokens. final IApplicationToken appToken; @@ -152,7 +157,7 @@ class AppWindowToken extends WindowToken { continue; } try { - if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, + if (DEBUG_VISIBILITY) Slog.v(TAG, "Setting visibility of " + win + ": " + (!clientHidden)); win.mClient.dispatchAppVisibility(!clientHidden); } catch (RemoteException e) { @@ -170,7 +175,7 @@ class AppWindowToken extends WindowToken { int numDrawn = 0; boolean nowGone = true; - if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, + if (DEBUG_VISIBILITY) Slog.v(TAG, "Update reported visibility: " + this); final int N = allAppWindows.size(); for (int i=0; i<N; i++) { @@ -181,12 +186,12 @@ class AppWindowToken extends WindowToken { || win.mDestroying) { continue; } - if (WindowManagerService.DEBUG_VISIBILITY) { - Slog.v(WindowManagerService.TAG, "Win " + win + ": isDrawn=" + if (DEBUG_VISIBILITY) { + Slog.v(TAG, "Win " + win + ": isDrawn=" + win.isDrawnLw() + ", isAnimating=" + win.mWinAnimator.isAnimating()); if (!win.isDrawnLw()) { - Slog.v(WindowManagerService.TAG, "Not displayed: s=" + + Slog.v(TAG, "Not displayed: s=" + win.mWinAnimator.mSurfaceController + " pv=" + win.mPolicyVisibility + " mDrawState=" + win.mWinAnimator.mDrawState @@ -220,7 +225,7 @@ class AppWindowToken extends WindowToken { nowVisible = reportedVisible; } } - if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, "VIS " + this + ": interesting=" + if (DEBUG_VISIBILITY) Slog.v(TAG, "VIS " + this + ": interesting=" + numInteresting + " visible=" + numVisible); if (nowDrawn != reportedDrawn) { if (nowDrawn) { @@ -231,8 +236,8 @@ class AppWindowToken extends WindowToken { reportedDrawn = nowDrawn; } if (nowVisible != reportedVisible) { - if (WindowManagerService.DEBUG_VISIBILITY) Slog.v( - WindowManagerService.TAG, "Visibility changed in " + this + if (DEBUG_VISIBILITY) Slog.v( + TAG, "Visibility changed in " + this + ": vis=" + nowVisible); reportedVisible = nowVisible; Message m = service.mH.obtainMessage( @@ -295,7 +300,7 @@ class AppWindowToken extends WindowToken { final Task task = mTask; if (task != null) { if (!task.removeAppToken(this)) { - Slog.e(WindowManagerService.TAG, "removeAppFromTaskLocked: token=" + this + Slog.e(TAG, "removeAppFromTaskLocked: token=" + this + " not found."); } task.mStack.mExitingAppTokens.remove(this); @@ -330,7 +335,7 @@ class AppWindowToken extends WindowToken { return; } - if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG, + if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG_WM, "Restoring saved surfaces: " + this + ", allDrawn=" + allDrawn); mAnimatingWithSavedSurface = true; @@ -357,8 +362,8 @@ class AppWindowToken extends WindowToken { // and never beyond allAppWindows bounds. winNdx = Math.min(winNdx - 1, allAppWindows.size() - 1)) { WindowState win = allAppWindows.get(winNdx); - if (WindowManagerService.DEBUG_WINDOW_MOVEMENT) { - Slog.w(WindowManagerService.TAG, "removeAllWindows: removing win=" + win); + if (DEBUG_WINDOW_MOVEMENT) { + Slog.w(TAG, "removeAllWindows: removing win=" + win); } service.removeWindowLocked(win); @@ -377,8 +382,8 @@ class AppWindowToken extends WindowToken { winNdx = Math.min(winNdx - 1, allAppWindows.size() - 1)) { WindowState win = allAppWindows.get(winNdx); if (win.mAppDied) { - if (WindowManagerService.DEBUG_WINDOW_MOVEMENT) { - Slog.w(WindowManagerService.TAG, "removeAllDeadWindows: " + win); + if (DEBUG_WINDOW_MOVEMENT) { + Slog.w(TAG, "removeAllDeadWindows: " + win); } // Set mDestroying, we don't want any animation or delayed removal here. win.mDestroying = true; diff --git a/services/core/java/com/android/server/wm/BlackFrame.java b/services/core/java/com/android/server/wm/BlackFrame.java index 7b08354799a1..5c29a0aabd37 100644 --- a/services/core/java/com/android/server/wm/BlackFrame.java +++ b/services/core/java/com/android/server/wm/BlackFrame.java @@ -16,6 +16,13 @@ package com.android.server.wm; +import static android.graphics.PixelFormat.OPAQUE; +import static android.view.SurfaceControl.FX_SURFACE_DIM; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; + import java.io.PrintWriter; import android.graphics.Matrix; @@ -44,21 +51,20 @@ public class BlackFrame { int w = r-l; int h = b-t; - if (WindowManagerService.DEBUG_SURFACE_TRACE) { + if (DEBUG_SURFACE_TRACE) { surface = new WindowSurfaceController.SurfaceTrace(session, "BlackSurface(" + l + ", " + t + ")", - w, h, PixelFormat.OPAQUE, SurfaceControl.FX_SURFACE_DIM | SurfaceControl.HIDDEN); + w, h, OPAQUE, FX_SURFACE_DIM | SurfaceControl.HIDDEN); } else { surface = new SurfaceControl(session, "BlackSurface", - w, h, PixelFormat.OPAQUE, SurfaceControl.FX_SURFACE_DIM | SurfaceControl.HIDDEN); + w, h, OPAQUE, FX_SURFACE_DIM | SurfaceControl.HIDDEN); } surface.setAlpha(1); surface.setLayerStack(layerStack); surface.setLayer(layer); surface.show(); - if (WindowManagerService.SHOW_TRANSACTIONS || - WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(WindowManagerService.TAG, + if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG_WM, " BLACK " + surface + ": CREATE layer=" + layer); } @@ -76,7 +82,7 @@ public class BlackFrame { mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y], mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]); if (false) { - Slog.i(WindowManagerService.TAG, "Black Surface @ (" + left + "," + top + "): (" + Slog.i(TAG_WM, "Black Surface @ (" + left + "," + top + "): (" + mTmpFloats[Matrix.MTRANS_X] + "," + mTmpFloats[Matrix.MTRANS_Y] + ") matrix=[" + mTmpFloats[Matrix.MSCALE_X] + "," @@ -149,10 +155,8 @@ public class BlackFrame { if (mBlackSurfaces != null) { for (int i=0; i<mBlackSurfaces.length; i++) { if (mBlackSurfaces[i] != null) { - if (WindowManagerService.SHOW_TRANSACTIONS || - WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i( - WindowManagerService.TAG, - " BLACK " + mBlackSurfaces[i].surface + ": DESTROY"); + if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG_WM, + " BLACK " + mBlackSurfaces[i].surface + ": DESTROY"); mBlackSurfaces[i].surface.destroy(); mBlackSurfaces[i] = null; } diff --git a/services/core/java/com/android/server/wm/CircularDisplayMask.java b/services/core/java/com/android/server/wm/CircularDisplayMask.java index 33cec6402743..ae4154131079 100644 --- a/services/core/java/com/android/server/wm/CircularDisplayMask.java +++ b/services/core/java/com/android/server/wm/CircularDisplayMask.java @@ -17,6 +17,9 @@ package com.android.server.wm; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.graphics.Canvas; import android.graphics.Color; @@ -26,15 +29,15 @@ import android.graphics.Point; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; +import android.util.Slog; import android.view.Display; import android.view.Surface; import android.view.Surface.OutOfResourcesException; import android.view.SurfaceControl; import android.view.SurfaceSession; -import android.util.Slog; class CircularDisplayMask { - private static final String TAG = "CircularDisplayMask"; + private static final String TAG = TAG_WITH_CLASS_NAME ? "CircularDisplayMask" : TAG_WM; // size of the chin private int mScreenOffset = 0; @@ -64,7 +67,7 @@ class CircularDisplayMask { SurfaceControl ctrl = null; try { - if (WindowManagerService.DEBUG_SURFACE_TRACE) { + if (DEBUG_SURFACE_TRACE) { ctrl = new WindowSurfaceController.SurfaceTrace(session, "CircularDisplayMask", mScreenSize.x, mScreenSize.y, PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); diff --git a/services/core/java/com/android/server/wm/DimLayer.java b/services/core/java/com/android/server/wm/DimLayer.java index 4b3620f07fbc..6657a7b03489 100644 --- a/services/core/java/com/android/server/wm/DimLayer.java +++ b/services/core/java/com/android/server/wm/DimLayer.java @@ -16,6 +16,12 @@ package com.android.server.wm; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; + import android.graphics.PixelFormat; import android.graphics.Rect; import android.os.SystemClock; @@ -26,7 +32,7 @@ import android.view.SurfaceControl; import java.io.PrintWriter; public class DimLayer { - private static final String TAG = "DimLayer"; + private static final String TAG = TAG_WITH_CLASS_NAME ? "DimLayer" : TAG_WM; private static final boolean DEBUG = false; public static final float RESIZING_HINT_ALPHA = 0.5f; @@ -81,7 +87,7 @@ public class DimLayer { if (DEBUG) Slog.v(TAG, "Ctor: displayId=" + displayId); SurfaceControl.openTransaction(); try { - if (WindowManagerService.DEBUG_SURFACE_TRACE) { + if (DEBUG_SURFACE_TRACE) { mDimSurface = new WindowSurfaceController.SurfaceTrace(service.mFxSession, "DimSurface", 16, 16, PixelFormat.OPAQUE, @@ -91,12 +97,11 @@ public class DimLayer { 16, 16, PixelFormat.OPAQUE, SurfaceControl.FX_SURFACE_DIM | SurfaceControl.HIDDEN); } - if (WindowManagerService.SHOW_TRANSACTIONS || - WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(TAG, - " DIM " + mDimSurface + ": CREATE"); + if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG, + " DIM " + mDimSurface + ": CREATE"); mDimSurface.setLayerStack(displayId); } catch (Exception e) { - Slog.e(WindowManagerService.TAG, "Exception creating Dim surface", e); + Slog.e(TAG_WM, "Exception creating Dim surface", e); } finally { SurfaceControl.closeTransaction(); } diff --git a/services/core/java/com/android/server/wm/DimLayerController.java b/services/core/java/com/android/server/wm/DimLayerController.java index bd30bd585bdb..6d1cec4a9f10 100644 --- a/services/core/java/com/android/server/wm/DimLayerController.java +++ b/services/core/java/com/android/server/wm/DimLayerController.java @@ -1,6 +1,8 @@ package com.android.server.wm; -import static com.android.server.wm.WindowManagerService.DEBUG_DIM_LAYER; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DIM_LAYER; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.LAYER_OFFSET_DIM; import android.graphics.Rect; @@ -16,7 +18,7 @@ import java.io.PrintWriter; * as well as other use cases (such as dimming above a dead window). */ class DimLayerController { - private static final String TAG = "DimLayerController"; + private static final String TAG = TAG_WITH_CLASS_NAME ? "DimLayerController" : TAG_WM; /** Amount of time in milliseconds to animate the dim surface from one value to another, * when no window animation is driving it. */ diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 898a9a414903..9b64481a56b7 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -19,8 +19,8 @@ package com.android.server.wm; import static android.app.ActivityManager.StackId.DOCKED_STACK_ID; import static android.app.ActivityManager.StackId.HOME_STACK_ID; import static android.app.ActivityManager.StackId.PINNED_STACK_ID; -import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; -import static com.android.server.wm.WindowManagerService.TAG; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowState.RESIZE_HANDLE_WIDTH_IN_DP; import android.app.ActivityManager.StackId; @@ -180,7 +180,7 @@ class DisplayContent { TaskStack getHomeStack() { if (mHomeStack == null && mDisplayId == Display.DEFAULT_DISPLAY) { - Slog.e(TAG, "getHomeStack: Returning null from this=" + this); + Slog.e(TAG_WM, "getHomeStack: Returning null from this=" + this); } return mHomeStack; } @@ -239,12 +239,12 @@ class DisplayContent { void moveStack(TaskStack stack, boolean toTop) { if (StackId.isAlwaysOnTop(stack.mStackId) && !toTop) { // This stack is always-on-top silly... - Slog.w(TAG, "Ignoring move of always-on-top stack=" + stack + " to bottom"); + Slog.w(TAG_WM, "Ignoring move of always-on-top stack=" + stack + " to bottom"); return; } if (!mStacks.remove(stack)) { - Slog.wtf(TAG, "moving stack that was not added: " + stack, new Throwable()); + Slog.wtf(TAG_WM, "moving stack that was not added: " + stack, new Throwable()); } int addIndex = toTop ? mStacks.size() : 0; @@ -422,7 +422,7 @@ class DisplayContent { for (int i = 0; i < windows.size(); i++) { final WindowState win = windows.get(i); if (win.isHiddenFromUserLocked()) { - if (DEBUG_VISIBILITY) Slog.w(TAG, "user changing, hiding " + win + if (DEBUG_VISIBILITY) Slog.w(TAG_WM, "user changing, hiding " + win + ", attrs=" + win.mAttrs.type + ", belonging to " + win.mOwnerUid); win.hideLw(false); } diff --git a/services/core/java/com/android/server/wm/DisplaySettings.java b/services/core/java/com/android/server/wm/DisplaySettings.java index 80526f28ea20..7f7968610151 100644 --- a/services/core/java/com/android/server/wm/DisplaySettings.java +++ b/services/core/java/com/android/server/wm/DisplaySettings.java @@ -16,16 +16,17 @@ package com.android.server.wm; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; + import android.graphics.Rect; import android.os.Environment; import android.util.AtomicFile; import android.util.Slog; import android.util.Xml; + import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.XmlUtils; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlSerializer; import java.io.File; import java.io.FileInputStream; @@ -35,11 +36,15 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + /** * Current persistent settings about a display */ public class DisplaySettings { - private static final String TAG = WindowManagerService.TAG; + private static final String TAG = TAG_WITH_CLASS_NAME ? "DisplaySettings" : TAG_WM; private final AtomicFile mFile; private final HashMap<String, Entry> mEntries = new HashMap<String, Entry>(); diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 32c9b2a654da..8f3d3e30ad1a 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -27,13 +27,15 @@ import static android.view.WindowManager.DOCKED_BOTTOM; import static android.view.WindowManager.DOCKED_LEFT; import static android.view.WindowManager.DOCKED_RIGHT; import static android.view.WindowManager.DOCKED_TOP; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; /** * Keeps information about the docked stack divider. */ public class DockedStackDividerController { - private static final String TAG = "DockedStackDividerController"; + private static final String TAG = TAG_WITH_CLASS_NAME ? "DockedStackDividerController" : TAG_WM; private final DisplayContent mDisplayContent; private final int mDividerWindowWidth; diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java index 0ef0e582a842..da894818519a 100644 --- a/services/core/java/com/android/server/wm/DragState.java +++ b/services/core/java/com/android/server/wm/DragState.java @@ -16,22 +16,15 @@ package com.android.server.wm; -import android.graphics.Matrix; -import android.view.animation.AlphaAnimation; -import android.view.animation.Animation; -import android.view.animation.AnimationSet; -import android.view.animation.DecelerateInterpolator; -import android.view.animation.Interpolator; -import android.view.animation.ScaleAnimation; -import android.view.animation.Transformation; -import android.view.animation.TranslateAnimation; -import com.android.server.input.InputApplicationHandle; -import com.android.server.input.InputWindowHandle; -import com.android.server.wm.WindowManagerService.DragInputEventReceiver; -import com.android.server.wm.WindowManagerService.H; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DRAG; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.content.ClipData; import android.content.ClipDescription; +import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; @@ -47,6 +40,19 @@ import android.view.InputChannel; import android.view.SurfaceControl; import android.view.View; import android.view.WindowManager; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.view.animation.AnimationSet; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; +import android.view.animation.ScaleAnimation; +import android.view.animation.Transformation; +import android.view.animation.TranslateAnimation; + +import com.android.server.input.InputApplicationHandle; +import com.android.server.input.InputWindowHandle; +import com.android.server.wm.WindowManagerService.DragInputEventReceiver; +import com.android.server.wm.WindowManagerService.H; import java.util.ArrayList; @@ -114,9 +120,9 @@ class DragState { */ void register(Display display) { mDisplay = display; - if (WindowManagerService.DEBUG_DRAG) Slog.d(WindowManagerService.TAG, "registering drag input channel"); + if (DEBUG_DRAG) Slog.d(TAG_WM, "registering drag input channel"); if (mClientChannel != null) { - Slog.e(WindowManagerService.TAG, "Duplicate register of drag input channel"); + Slog.e(TAG_WM, "Duplicate register of drag input channel"); } else { InputChannel[] channels = InputChannel.openInputChannelPair("drag"); mServerChannel = channels[0]; @@ -161,17 +167,17 @@ class DragState { mDragWindowHandle.frameBottom = p.y; // Pause rotations before a drag. - if (WindowManagerService.DEBUG_ORIENTATION) { - Slog.d(WindowManagerService.TAG, "Pausing rotation during drag"); + if (DEBUG_ORIENTATION) { + Slog.d(TAG_WM, "Pausing rotation during drag"); } mService.pauseRotationLocked(); } } void unregister() { - if (WindowManagerService.DEBUG_DRAG) Slog.d(WindowManagerService.TAG, "unregistering drag input channel"); + if (DEBUG_DRAG) Slog.d(TAG_WM, "unregistering drag input channel"); if (mClientChannel == null) { - Slog.e(WindowManagerService.TAG, "Unregister of nonexistent drag input channel"); + Slog.e(TAG_WM, "Unregister of nonexistent drag input channel"); } else { mService.mInputManager.unregisterInputChannel(mServerChannel); mInputEventReceiver.dispose(); @@ -185,8 +191,8 @@ class DragState { mDragApplicationHandle = null; // Resume rotations after a drag. - if (WindowManagerService.DEBUG_ORIENTATION) { - Slog.d(WindowManagerService.TAG, "Resuming rotation after drag"); + if (DEBUG_ORIENTATION) { + Slog.d(TAG_WM, "Resuming rotation after drag"); } mService.resumeRotationLocked(); } @@ -210,8 +216,8 @@ class DragState { mNotifiedWindows.clear(); mDragInProgress = true; - if (WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "broadcasting DRAG_STARTED at (" + touchX + ", " + touchY + ")"); + if (DEBUG_DRAG) { + Slog.d(TAG_WM, "broadcasting DRAG_STARTED at (" + touchX + ", " + touchY + ")"); } final WindowList windows = mService.getWindowListLocked(mDisplay); @@ -238,8 +244,8 @@ class DragState { if ((mFlags & View.DRAG_FLAG_GLOBAL) == 0) { final IBinder winBinder = newWin.mClient.asBinder(); if (winBinder != mLocalWin) { - if (WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "Not dispatching local DRAG_STARTED to " + newWin); + if (DEBUG_DRAG) { + Slog.d(TAG_WM, "Not dispatching local DRAG_STARTED to " + newWin); } return; } @@ -253,7 +259,7 @@ class DragState { // track each window that we've notified that the drag is starting mNotifiedWindows.add(newWin); } catch (RemoteException e) { - Slog.w(WindowManagerService.TAG, "Unable to drag-start window " + newWin); + Slog.w(TAG_WM, "Unable to drag-start window " + newWin); } finally { // if the callee was local, the dispatch has already recycled the event if (Process.myPid() != newWin.mSession.mPid) { @@ -275,8 +281,8 @@ class DragState { return; } } - if (WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "need to send DRAG_STARTED to new window " + newWin); + if (DEBUG_DRAG) { + Slog.d(TAG_WM, "need to send DRAG_STARTED to new window " + newWin); } sendDragStartedLw(newWin, mCurrentX, mCurrentY, mDataDescription); } @@ -285,8 +291,8 @@ class DragState { private void broadcastDragEndedLw() { final int myPid = Process.myPid(); - if (WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "broadcasting DRAG_ENDED"); + if (DEBUG_DRAG) { + Slog.d(TAG_WM, "broadcasting DRAG_ENDED"); } for (WindowState ws : mNotifiedWindows) { float x = 0; @@ -301,7 +307,7 @@ class DragState { try { ws.mClient.dispatchDragEvent(evt); } catch (RemoteException e) { - Slog.w(WindowManagerService.TAG, "Unable to drag-end window " + ws); + Slog.w(TAG_WM, "Unable to drag-end window " + ws); } // if the current window is in the same process, // the dispatch has already recycled the event @@ -356,24 +362,24 @@ class DragState { final int myPid = Process.myPid(); // Move the surface to the given touch - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i( - WindowManagerService.TAG, ">>> OPEN TRANSACTION notifyMoveLw"); + if (SHOW_LIGHT_TRANSACTIONS) Slog.i( + TAG_WM, ">>> OPEN TRANSACTION notifyMoveLw"); SurfaceControl.openTransaction(); try { mSurfaceControl.setPosition(x - mThumbOffsetX, y - mThumbOffsetY); - if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " DRAG " + if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " DRAG " + mSurfaceControl + ": pos=(" + (int)(x - mThumbOffsetX) + "," + (int)(y - mThumbOffsetY) + ")"); } finally { SurfaceControl.closeTransaction(); - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i( - WindowManagerService.TAG, "<<< CLOSE TRANSACTION notifyMoveLw"); + if (SHOW_LIGHT_TRANSACTIONS) Slog.i( + TAG_WM, "<<< CLOSE TRANSACTION notifyMoveLw"); } // Tell the affected window WindowState touchedWin = getTouchedWinAtPointLw(x, y); if (touchedWin == null) { - if (WindowManagerService.DEBUG_DRAG) Slog.d(WindowManagerService.TAG, "No touched win at x=" + x + " y=" + y); + if (DEBUG_DRAG) Slog.d(TAG_WM, "No touched win at x=" + x + " y=" + y); return; } if ((mFlags & View.DRAG_FLAG_GLOBAL) == 0) { @@ -387,8 +393,8 @@ class DragState { try { // have we dragged over a new window? if ((touchedWin != mTargetWindow) && (mTargetWindow != null)) { - if (WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "sending DRAG_EXITED to " + mTargetWindow); + if (DEBUG_DRAG) { + Slog.d(TAG_WM, "sending DRAG_EXITED to " + mTargetWindow); } // force DRAG_EXITED_EVENT if appropriate DragEvent evt = obtainDragEvent(mTargetWindow, DragEvent.ACTION_DRAG_EXITED, @@ -399,8 +405,8 @@ class DragState { } } if (touchedWin != null) { - if (false && WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "sending DRAG_LOCATION to " + touchedWin); + if (false && DEBUG_DRAG) { + Slog.d(TAG_WM, "sending DRAG_LOCATION to " + touchedWin); } DragEvent evt = obtainDragEvent(touchedWin, DragEvent.ACTION_DRAG_LOCATION, x, y, null, null, null, null, false); @@ -410,7 +416,7 @@ class DragState { } } } catch (RemoteException e) { - Slog.w(WindowManagerService.TAG, "can't send drag notification to windows"); + Slog.w(TAG_WM, "can't send drag notification to windows"); } mTargetWindow = touchedWin; } @@ -437,8 +443,8 @@ class DragState { return true; } - if (WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "sending DROP to " + touchedWin); + if (DEBUG_DRAG) { + Slog.d(TAG_WM, "sending DROP to " + touchedWin); } final int myPid = Process.myPid(); final IBinder token = touchedWin.mClient.asBinder(); @@ -452,7 +458,7 @@ class DragState { Message msg = mService.mH.obtainMessage(H.DRAG_END_TIMEOUT, token); mService.mH.sendMessageDelayed(msg, 5000); } catch (RemoteException e) { - Slog.w(WindowManagerService.TAG, "can't send drop notification to win " + touchedWin); + Slog.w(TAG_WM, "can't send drop notification to win " + touchedWin); return true; } finally { if (myPid != touchedWin.mSession.mPid) { @@ -566,4 +572,4 @@ class DragState { set.start(); // Will start on the first call to getTransformation. return set; } -}
\ No newline at end of file +} diff --git a/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java b/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java index 0a372d817e1c..3186d3dc8e5b 100644 --- a/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java +++ b/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java @@ -17,6 +17,10 @@ package com.android.server.wm; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; + import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; @@ -32,7 +36,7 @@ import android.view.SurfaceControl; import android.view.SurfaceSession; class EmulatorDisplayOverlay { - private static final String TAG = "EmulatorDisplayOverlay"; + private static final String TAG = TAG_WITH_CLASS_NAME ? "EmulatorDisplayOverlay" : TAG_WM; // Display dimensions private Point mScreenSize; @@ -53,7 +57,7 @@ class EmulatorDisplayOverlay { SurfaceControl ctrl = null; try { - if (WindowManagerService.DEBUG_SURFACE_TRACE) { + if (DEBUG_SURFACE_TRACE) { ctrl = new WindowSurfaceController.SurfaceTrace(session, "EmulatorDisplayOverlay", mScreenSize.x, mScreenSize.y, PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 55111361a1a6..e42658e5a2f7 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -16,9 +16,11 @@ package com.android.server.wm; -import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; -import static com.android.server.wm.WindowManagerService.DEBUG_FOCUS_LIGHT; -import static com.android.server.wm.WindowManagerService.DEBUG_INPUT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DRAG; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.app.ActivityManagerNative; import android.graphics.Rect; @@ -79,7 +81,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { synchronized (mService.mWindowMap) { WindowState windowState = (WindowState) inputWindowHandle.windowState; if (windowState != null) { - Slog.i(WindowManagerService.TAG, "WINDOW DIED " + windowState); + Slog.i(TAG_WM, "WINDOW DIED " + windowState); mService.removeWindowLocked(windowState); } } @@ -108,7 +110,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { } if (windowState != null) { - Slog.i(WindowManagerService.TAG, "Input event dispatching timed out " + Slog.i(TAG_WM, "Input event dispatching timed out " + "sending to " + windowState.mAttrs.getTitle() + ". Reason: " + reason); // Figure out whether this window is layered above system windows. @@ -118,11 +120,11 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); aboveSystem = windowState.mBaseLayer > systemAlertLayer; } else if (appWindowToken != null) { - Slog.i(WindowManagerService.TAG, "Input event dispatching timed out " + Slog.i(TAG_WM, "Input event dispatching timed out " + "sending to application " + appWindowToken.stringName + ". Reason: " + reason); } else { - Slog.i(WindowManagerService.TAG, "Input event dispatching timed out " + Slog.i(TAG_WM, "Input event dispatching timed out " + ". Reason: " + reason); } @@ -212,7 +214,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { } if (DEBUG_INPUT) { - Slog.d(WindowManagerService.TAG, "addInputWindowHandle: " + Slog.d(TAG_WM, "addInputWindowHandle: " + child + ", " + inputWindowHandle); } addInputWindowHandleLw(inputWindowHandle); @@ -235,7 +237,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { } mUpdateInputWindowsNeeded = false; - if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED updateInputWindowsLw"); + if (false) Slog.d(TAG_WM, ">>>>>> ENTERED updateInputWindowsLw"); // Populate the input window list with information about all of the windows that // could potentially receive input. @@ -247,28 +249,28 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { // If there's a drag in flight, provide a pseudowindow to catch drag input final boolean inDrag = (mService.mDragState != null); if (inDrag) { - if (WindowManagerService.DEBUG_DRAG) { - Log.d(WindowManagerService.TAG, "Inserting drag window"); + if (DEBUG_DRAG) { + Log.d(TAG_WM, "Inserting drag window"); } final InputWindowHandle dragWindowHandle = mService.mDragState.mDragWindowHandle; if (dragWindowHandle != null) { addInputWindowHandleLw(dragWindowHandle); } else { - Slog.w(WindowManagerService.TAG, "Drag is in progress but there is no " + Slog.w(TAG_WM, "Drag is in progress but there is no " + "drag window handle."); } } final boolean inPositioning = (mService.mTaskPositioner != null); if (inPositioning) { - if (WindowManagerService.DEBUG_TASK_POSITIONING) { - Log.d(WindowManagerService.TAG, "Inserting window handle for repositioning"); + if (DEBUG_TASK_POSITIONING) { + Log.d(TAG_WM, "Inserting window handle for repositioning"); } final InputWindowHandle dragWindowHandle = mService.mTaskPositioner.mDragWindowHandle; if (dragWindowHandle != null) { addInputWindowHandleLw(dragWindowHandle); } else { - Slog.e(WindowManagerService.TAG, + Slog.e(TAG_WM, "Repositioning is in progress but there is no drag window handle."); } } @@ -328,7 +330,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { // Clear the list in preparation for the next round. clearInputWindowHandlesLw(); - if (false) Slog.d(WindowManagerService.TAG, "<<<<<<< EXITED updateInputWindowsLw"); + if (false) Slog.d(TAG_WM, "<<<<<<< EXITED updateInputWindowsLw"); } /* Notifies that the input device configuration has changed. */ @@ -416,7 +418,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { */ public void setInputFocusLw(WindowState newWindow, boolean updateInputWindows) { if (DEBUG_FOCUS_LIGHT || DEBUG_INPUT) { - Slog.d(WindowManagerService.TAG, "Input focus has changed to " + newWindow); + Slog.d(TAG_WM, "Input focus has changed to " + newWindow); } if (newWindow != mInputFocus) { @@ -452,7 +454,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { public void pauseDispatchingLw(WindowToken window) { if (! window.paused) { if (DEBUG_INPUT) { - Slog.v(WindowManagerService.TAG, "Pausing WindowToken " + window); + Slog.v(TAG_WM, "Pausing WindowToken " + window); } window.paused = true; @@ -463,7 +465,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { public void resumeDispatchingLw(WindowToken window) { if (window.paused) { if (DEBUG_INPUT) { - Slog.v(WindowManagerService.TAG, "Resuming WindowToken " + window); + Slog.v(TAG_WM, "Resuming WindowToken " + window); } window.paused = false; @@ -474,7 +476,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { public void freezeInputDispatchingLw() { if (! mInputDispatchFrozen) { if (DEBUG_INPUT) { - Slog.v(WindowManagerService.TAG, "Freezing input dispatching"); + Slog.v(TAG_WM, "Freezing input dispatching"); } mInputDispatchFrozen = true; @@ -485,7 +487,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { public void thawInputDispatchingLw() { if (mInputDispatchFrozen) { if (DEBUG_INPUT) { - Slog.v(WindowManagerService.TAG, "Thawing input dispatching"); + Slog.v(TAG_WM, "Thawing input dispatching"); } mInputDispatchFrozen = false; @@ -496,7 +498,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { public void setEventDispatchingLw(boolean enabled) { if (mInputDispatchEnabled != enabled) { if (DEBUG_INPUT) { - Slog.v(WindowManagerService.TAG, "Setting event dispatching to " + enabled); + Slog.v(TAG_WM, "Setting event dispatching to " + enabled); } mInputDispatchEnabled = enabled; diff --git a/services/core/java/com/android/server/wm/KeyguardDisableHandler.java b/services/core/java/com/android/server/wm/KeyguardDisableHandler.java index 37d811f3f2e3..377071d4c46b 100644 --- a/services/core/java/com/android/server/wm/KeyguardDisableHandler.java +++ b/services/core/java/com/android/server/wm/KeyguardDisableHandler.java @@ -16,6 +16,9 @@ package com.android.server.wm; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; + import android.app.ActivityManagerNative; import android.app.admin.DevicePolicyManager; import android.content.Context; @@ -29,7 +32,7 @@ import android.util.Pair; import android.view.WindowManagerPolicy; public class KeyguardDisableHandler extends Handler { - private static final String TAG = "KeyguardDisableHandler"; + private static final String TAG = TAG_WITH_CLASS_NAME ? "KeyguardDisableHandler" : TAG_WM; private static final int ALLOW_DISABLE_YES = 1; private static final int ALLOW_DISABLE_NO = 0; diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index 3158c470980d..c118a214077a 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -16,11 +16,16 @@ package com.android.server.wm; -import java.io.PrintWriter; - +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER; -import static com.android.server.wm.WindowSurfaceController.SurfaceTrace; import static com.android.server.wm.WindowStateAnimator.WINDOW_FREEZE_LAYER; +import static com.android.server.wm.WindowSurfaceController.SurfaceTrace; + import android.content.Context; import android.graphics.Matrix; import android.graphics.PixelFormat; @@ -28,16 +33,18 @@ import android.graphics.Rect; import android.util.Slog; import android.view.Display; import android.view.DisplayInfo; -import android.view.Surface.OutOfResourcesException; import android.view.Surface; +import android.view.Surface.OutOfResourcesException; import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.Transformation; +import java.io.PrintWriter; + class ScreenRotationAnimation { - static final String TAG = "ScreenRotationAnimation"; + static final String TAG = TAG_WITH_CLASS_NAME ? "ScreenRotationAnimation" : TAG_WM; static final boolean DEBUG_STATE = false; static final boolean DEBUG_TRANSFORMS = false; static final boolean TWO_PHASE_ANIMATION = false; @@ -244,7 +251,7 @@ class ScreenRotationAnimation { mOriginalHeight = originalHeight; if (!inTransaction) { - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i(WindowManagerService.TAG, + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, ">>> OPEN TRANSACTION ScreenRotationAnimation"); SurfaceControl.openTransaction(); } @@ -256,7 +263,7 @@ class ScreenRotationAnimation { flags |= SurfaceControl.SECURE; } - if (WindowManagerService.DEBUG_SURFACE_TRACE) { + if (DEBUG_SURFACE_TRACE) { mSurfaceControl = new SurfaceTrace(session, "ScreenshotSurface", mWidth, mHeight, PixelFormat.OPAQUE, flags); @@ -282,15 +289,14 @@ class ScreenRotationAnimation { Slog.w(TAG, "Unable to allocate freeze surface", e); } - if (WindowManagerService.SHOW_TRANSACTIONS || - WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(WindowManagerService.TAG, - " FREEZE " + mSurfaceControl + ": CREATE"); + if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG_WM, + " FREEZE " + mSurfaceControl + ": CREATE"); setRotationInTransaction(originalRotation); } finally { if (!inTransaction) { SurfaceControl.closeTransaction(); - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i(WindowManagerService.TAG, + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, "<<< CLOSE TRANSACTION ScreenRotationAnimation"); } } @@ -537,8 +543,8 @@ class ScreenRotationAnimation { final int layerStack = mDisplayContent.getDisplay().getLayerStack(); if (USE_CUSTOM_BLACK_FRAME && mCustomBlackFrame == null) { - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( - WindowManagerService.TAG, + if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( + TAG_WM, ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation"); SurfaceControl.openTransaction(); @@ -561,15 +567,15 @@ class ScreenRotationAnimation { Slog.w(TAG, "Unable to allocate black surface", e); } finally { SurfaceControl.closeTransaction(); - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( - WindowManagerService.TAG, + if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( + TAG_WM, "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation"); } } if (!customAnim && mExitingBlackFrame == null) { - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( - WindowManagerService.TAG, + if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( + TAG_WM, ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation"); SurfaceControl.openTransaction(); try { @@ -601,15 +607,15 @@ class ScreenRotationAnimation { Slog.w(TAG, "Unable to allocate black surface", e); } finally { SurfaceControl.closeTransaction(); - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( - WindowManagerService.TAG, + if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( + TAG_WM, "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation"); } } if (customAnim && mEnteringBlackFrame == null) { - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( - WindowManagerService.TAG, + if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( + TAG_WM, ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation"); SurfaceControl.openTransaction(); @@ -623,8 +629,8 @@ class ScreenRotationAnimation { Slog.w(TAG, "Unable to allocate black surface", e); } finally { SurfaceControl.closeTransaction(); - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( - WindowManagerService.TAG, + if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i( + TAG_WM, "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation"); } } @@ -657,8 +663,8 @@ class ScreenRotationAnimation { public void kill() { if (DEBUG_STATE) Slog.v(TAG, "Kill!"); if (mSurfaceControl != null) { - if (WindowManagerService.SHOW_TRANSACTIONS || - WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(WindowManagerService.TAG, + if (SHOW_TRANSACTIONS || + SHOW_SURFACE_ALLOC) Slog.i(TAG_WM, " FREEZE " + mSurfaceControl + ": DESTROY"); mSurfaceControl.destroy(); mSurfaceControl = null; diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 6e2e8308ba63..1b6957d9e554 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -16,12 +16,11 @@ package com.android.server.wm; -import android.view.IWindowId; -import android.view.IWindowSessionCallback; -import com.android.internal.view.IInputContext; -import com.android.internal.view.IInputMethodClient; -import com.android.internal.view.IInputMethodManager; -import com.android.server.wm.WindowManagerService.H; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DRAG; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.content.ClipData; import android.content.Context; @@ -39,13 +38,20 @@ import android.os.UserHandle; import android.util.Slog; import android.view.Display; import android.view.IWindow; +import android.view.IWindowId; import android.view.IWindowSession; +import android.view.IWindowSessionCallback; import android.view.InputChannel; import android.view.Surface; import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.WindowManager; +import com.android.internal.view.IInputContext; +import com.android.internal.view.IInputMethodClient; +import com.android.internal.view.IInputMethodManager; +import com.android.server.wm.WindowManagerService.H; + import java.io.PrintWriter; /** @@ -131,7 +137,7 @@ final class Session extends IWindowSession.Stub } catch (RuntimeException e) { // Log all 'real' exceptions thrown to the caller if (!(e instanceof SecurityException)) { - Slog.wtf(WindowManagerService.TAG, "Window Session Crash", e); + Slog.wtf(TAG_WM, "Window Session Crash", e); } throw e; } @@ -200,13 +206,13 @@ final class Session extends IWindowSession.Stub Rect outVisibleInsets, Rect outStableInsets, Rect outsets, Configuration outConfig, Surface outSurface) { - if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED relayout from " + if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from " + Binder.getCallingPid()); int res = mService.relayoutWindow(this, window, seq, attrs, requestedWidth, requestedHeight, viewFlags, flags, outFrame, outOverscanInsets, outContentInsets, outVisibleInsets, outStableInsets, outsets, outConfig, outSurface); - if (false) Slog.d(WindowManagerService.TAG, "<<<<<< EXITING relayout to " + if (false) Slog.d(TAG_WM, "<<<<<< EXITING relayout to " + Binder.getCallingPid()); return res; } @@ -235,7 +241,7 @@ final class Session extends IWindowSession.Stub public void finishDrawing(IWindow window) { if (WindowManagerService.localLOGV) Slog.v( - WindowManagerService.TAG, "IWindow finishDrawing called for " + window); + TAG_WM, "IWindow finishDrawing called for " + window); mService.finishDrawingWindow(this, window); } @@ -275,24 +281,24 @@ final class Session extends IWindowSession.Stub public boolean performDrag(IWindow window, IBinder dragToken, float touchX, float touchY, float thumbCenterX, float thumbCenterY, ClipData data) { - if (WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "perform drag: win=" + window + " data=" + data); + if (DEBUG_DRAG) { + Slog.d(TAG_WM, "perform drag: win=" + window + " data=" + data); } synchronized (mService.mWindowMap) { if (mService.mDragState == null) { - Slog.w(WindowManagerService.TAG, "No drag prepared"); + Slog.w(TAG_WM, "No drag prepared"); throw new IllegalStateException("performDrag() without prepareDrag()"); } if (dragToken != mService.mDragState.mToken) { - Slog.w(WindowManagerService.TAG, "Performing mismatched drag"); + Slog.w(TAG_WM, "Performing mismatched drag"); throw new IllegalStateException("performDrag() does not match prepareDrag()"); } WindowState callingWin = mService.windowForClientLocked(null, window, false); if (callingWin == null) { - Slog.w(WindowManagerService.TAG, "Bad requesting window " + window); + Slog.w(TAG_WM, "Bad requesting window " + window); return false; // !!! TODO: throw here? } @@ -317,7 +323,7 @@ final class Session extends IWindowSession.Stub mService.mInputMonitor.updateInputWindowsLw(true /*force*/); if (!mService.mInputManager.transferTouchFocus(callingWin.mInputChannel, mService.mDragState.mServerChannel)) { - Slog.e(WindowManagerService.TAG, "Unable to transfer touch focus"); + Slog.e(TAG_WM, "Unable to transfer touch focus"); mService.mDragState.unregister(); mService.mDragState = null; mService.mInputMonitor.updateInputWindowsLw(true /*force*/); @@ -333,8 +339,8 @@ final class Session extends IWindowSession.Stub // Make the surface visible at the proper location final SurfaceControl surfaceControl = mService.mDragState.mSurfaceControl; - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i( - WindowManagerService.TAG, ">>> OPEN TRANSACTION performDrag"); + if (SHOW_LIGHT_TRANSACTIONS) Slog.i( + TAG_WM, ">>> OPEN TRANSACTION performDrag"); SurfaceControl.openTransaction(); try { surfaceControl.setPosition(touchX - thumbCenterX, @@ -344,8 +350,8 @@ final class Session extends IWindowSession.Stub surfaceControl.show(); } finally { SurfaceControl.closeTransaction(); - if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i( - WindowManagerService.TAG, "<<< CLOSE TRANSACTION performDrag"); + if (SHOW_LIGHT_TRANSACTIONS) Slog.i( + TAG_WM, "<<< CLOSE TRANSACTION performDrag"); } } @@ -353,16 +359,16 @@ final class Session extends IWindowSession.Stub } public boolean startMovingTask(IWindow window, float startX, float startY) { - if (WindowManagerService.DEBUG_TASK_POSITIONING) Slog.d( - WindowManagerService.TAG, "startMovingTask: {" + startX + "," + startY + "}"); + if (DEBUG_TASK_POSITIONING) Slog.d( + TAG_WM, "startMovingTask: {" + startX + "," + startY + "}"); return mService.startMovingTask(window, startX, startY); } public void reportDropResult(IWindow window, boolean consumed) { IBinder token = window.asBinder(); - if (WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "Drop result=" + consumed + " reported by " + token); + if (DEBUG_DRAG) { + Slog.d(TAG_WM, "Drop result=" + consumed + " reported by " + token); } synchronized (mService.mWindowMap) { @@ -371,13 +377,13 @@ final class Session extends IWindowSession.Stub if (mService.mDragState == null) { // Most likely the drop recipient ANRed and we ended the drag // out from under it. Log the issue and move on. - Slog.w(WindowManagerService.TAG, "Drop result given but no drag in progress"); + Slog.w(TAG_WM, "Drop result given but no drag in progress"); return; } if (mService.mDragState.mToken != token) { // We're in a drag, but the wrong window has responded. - Slog.w(WindowManagerService.TAG, "Invalid drop-result claim by " + window); + Slog.w(TAG_WM, "Invalid drop-result claim by " + window); throw new IllegalStateException("reportDropResult() by non-recipient"); } @@ -387,7 +393,7 @@ final class Session extends IWindowSession.Stub mService.mH.removeMessages(H.DRAG_END_TIMEOUT, window.asBinder()); WindowState callingWin = mService.windowForClientLocked(null, window, false); if (callingWin == null) { - Slog.w(WindowManagerService.TAG, "Bad result-reporting window " + window); + Slog.w(TAG_WM, "Bad result-reporting window " + window); return; // !!! TODO: throw here? } @@ -400,20 +406,20 @@ final class Session extends IWindowSession.Stub } public void cancelDragAndDrop(IBinder dragToken) { - if (WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "cancelDragAndDrop"); + if (DEBUG_DRAG) { + Slog.d(TAG_WM, "cancelDragAndDrop"); } synchronized (mService.mWindowMap) { long ident = Binder.clearCallingIdentity(); try { if (mService.mDragState == null) { - Slog.w(WindowManagerService.TAG, "cancelDragAndDrop() without prepareDrag()"); + Slog.w(TAG_WM, "cancelDragAndDrop() without prepareDrag()"); throw new IllegalStateException("cancelDragAndDrop() without prepareDrag()"); } if (mService.mDragState.mToken != dragToken) { - Slog.w(WindowManagerService.TAG, + Slog.w(TAG_WM, "cancelDragAndDrop() does not match prepareDrag()"); throw new IllegalStateException( "cancelDragAndDrop() does not match prepareDrag()"); @@ -428,14 +434,14 @@ final class Session extends IWindowSession.Stub } public void dragRecipientEntered(IWindow window) { - if (WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "Drag into new candidate view @ " + window.asBinder()); + if (DEBUG_DRAG) { + Slog.d(TAG_WM, "Drag into new candidate view @ " + window.asBinder()); } } public void dragRecipientExited(IWindow window) { - if (WindowManagerService.DEBUG_DRAG) { - Slog.d(WindowManagerService.TAG, "Drag from old candidate view @ " + window.asBinder()); + if (DEBUG_DRAG) { + Slog.d(TAG_WM, "Drag from old candidate view @ " + window.asBinder()); } } @@ -518,10 +524,10 @@ final class Session extends IWindowSession.Stub void windowAddedLocked() { if (mSurfaceSession == null) { if (WindowManagerService.localLOGV) Slog.v( - WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession"); + TAG_WM, "First window added to " + this + ", creating SurfaceSession"); mSurfaceSession = new SurfaceSession(); - if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i( - WindowManagerService.TAG, " NEW SURFACE SESSION " + mSurfaceSession); + if (SHOW_TRANSACTIONS) Slog.i( + TAG_WM, " NEW SURFACE SESSION " + mSurfaceSession); mService.mSessions.add(this); if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) { mService.dispatchNewAnimatorScaleLocked(this); @@ -540,14 +546,14 @@ final class Session extends IWindowSession.Stub mService.mSessions.remove(this); if (mSurfaceSession != null) { if (WindowManagerService.localLOGV) Slog.v( - WindowManagerService.TAG, "Last window removed from " + this + TAG_WM, "Last window removed from " + this + ", destroying " + mSurfaceSession); - if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i( - WindowManagerService.TAG, " KILL SURFACE SESSION " + mSurfaceSession); + if (SHOW_TRANSACTIONS) Slog.i( + TAG_WM, " KILL SURFACE SESSION " + mSurfaceSession); try { mSurfaceSession.kill(); } catch (Exception e) { - Slog.w(WindowManagerService.TAG, "Exception thrown when killing surface session " + Slog.w(TAG_WM, "Exception thrown when killing surface session " + mSurfaceSession + " in session " + this + ": " + e.toString()); } diff --git a/services/core/java/com/android/server/wm/StrictModeFlash.java b/services/core/java/com/android/server/wm/StrictModeFlash.java index fb5876b65aed..d1547eb04c78 100644 --- a/services/core/java/com/android/server/wm/StrictModeFlash.java +++ b/services/core/java/com/android/server/wm/StrictModeFlash.java @@ -17,6 +17,9 @@ package com.android.server.wm; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; + import android.graphics.Canvas; import android.graphics.Color; import android.graphics.PixelFormat; @@ -29,7 +32,7 @@ import android.view.SurfaceControl; import android.view.SurfaceSession; class StrictModeFlash { - private static final String TAG = "StrictModeFlash"; + private static final String TAG = TAG_WITH_CLASS_NAME ? "StrictModeFlash" : TAG_WM; private final SurfaceControl mSurfaceControl; private final Surface mSurface = new Surface(); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index e4f6c5645446..72a834315b5d 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -19,12 +19,11 @@ package com.android.server.wm; import static android.app.ActivityManager.StackId.DOCKED_STACK_ID; import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.HOME_STACK_ID; -import static android.app.ActivityManager.StackId.PINNED_STACK_ID; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.app.ActivityManager.RESIZE_MODE_SYSTEM_SCREEN_ROTATION; -import static com.android.server.wm.WindowManagerService.TAG; -import static com.android.server.wm.WindowManagerService.DEBUG_RESIZE; -import static com.android.server.wm.WindowManagerService.DEBUG_STACK; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_RESIZE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; import static com.android.server.wm.WindowManagerService.H.RESIZE_TASK; import static com.android.server.wm.WindowManagerService.H.SHOW_NON_RESIZEABLE_DOCK_TOAST; import static android.view.WindowManager.DOCKED_INVALID; @@ -156,11 +155,11 @@ class Task implements DimLayer.DimLayerUser { void removeLocked() { if (!mAppTokens.isEmpty() && mStack.isAnimating()) { - if (DEBUG_STACK) Slog.i(TAG, "removeTask: deferring removing taskId=" + mTaskId); + if (DEBUG_STACK) Slog.i(TAG_WM, "removeTask: deferring removing taskId=" + mTaskId); mDeferRemoval = true; return; } - if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + mTaskId); + if (DEBUG_STACK) Slog.i(TAG_WM, "removeTask: removing taskId=" + mTaskId); EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "removeTask"); mDeferRemoval = false; DisplayContent content = getDisplayContent(); @@ -175,7 +174,7 @@ class Task implements DimLayer.DimLayerUser { if (stack == mStack) { return; } - if (DEBUG_STACK) Slog.i(TAG, "moveTaskToStack: removing taskId=" + mTaskId + if (DEBUG_STACK) Slog.i(TAG_WM, "moveTaskToStack: removing taskId=" + mTaskId + " from stack=" + mStack); EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "moveTask"); if (mStack != null) { @@ -186,7 +185,7 @@ class Task implements DimLayer.DimLayerUser { void positionTaskInStack(TaskStack stack, int position, Rect bounds, Configuration config) { if (mStack != null && stack != mStack) { - if (DEBUG_STACK) Slog.i(TAG, "positionTaskInStack: removing taskId=" + mTaskId + if (DEBUG_STACK) Slog.i(TAG_WM, "positionTaskInStack: removing taskId=" + mTaskId + " from stack=" + mStack); EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "moveTask"); mStack.removeTask(this); @@ -464,7 +463,7 @@ class Task implements DimLayer.DimLayerUser { for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { final WindowState win = windows.get(winNdx); if (!resizingWindows.contains(win)) { - if (DEBUG_RESIZE) Slog.d(TAG, "setBounds: Resizing " + win); + if (DEBUG_RESIZE) Slog.d(TAG_WM, "setBounds: Resizing " + win); resizingWindows.add(win); } } diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java index 32c320560ce8..725bbbc78985 100644 --- a/services/core/java/com/android/server/wm/TaskPositioner.java +++ b/services/core/java/com/android/server/wm/TaskPositioner.java @@ -18,15 +18,18 @@ package com.android.server.wm; import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT; import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT; -import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; import static android.app.ActivityManager.RESIZE_MODE_USER; import static android.app.ActivityManager.RESIZE_MODE_USER_FORCED; +import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static com.android.server.wm.DimLayer.RESIZING_HINT_ALPHA; import static com.android.server.wm.DimLayer.RESIZING_HINT_DURATION_MS; -import static com.android.server.wm.WindowManagerService.DEBUG_TASK_POSITIONING; -import static com.android.server.wm.WindowManagerService.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.dipToPixel; import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_HEIGHT_IN_DP; import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_WIDTH_IN_DP; @@ -40,13 +43,13 @@ import android.os.RemoteException; import android.os.Trace; import android.util.DisplayMetrics; import android.util.Slog; +import android.view.BatchedInputEventReceiver; import android.view.Choreographer; import android.view.Display; import android.view.DisplayInfo; import android.view.InputChannel; import android.view.InputDevice; import android.view.InputEvent; -import android.view.BatchedInputEventReceiver; import android.view.MotionEvent; import android.view.SurfaceControl; import android.view.WindowManager; @@ -59,7 +62,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; class TaskPositioner implements DimLayer.DimLayerUser { - private static final String TAG = "TaskPositioner"; + private static final String TAG = TAG_WITH_CLASS_NAME ? "TaskPositioner" : TAG_WM; // The margin the pointer position has to be within the side of the screen to be // considered at the side of the screen. @@ -277,7 +280,7 @@ class TaskPositioner implements DimLayer.DimLayerUser { mDragWindowHandle.frameBottom = p.y; // Pause rotations before a drag. - if (WindowManagerService.DEBUG_ORIENTATION) { + if (DEBUG_ORIENTATION) { Slog.d(TAG, "Pausing rotation during re-position"); } mService.pauseRotationLocked(); @@ -321,7 +324,7 @@ class TaskPositioner implements DimLayer.DimLayerUser { mDragEnded = true; // Resume rotations after a drag. - if (WindowManagerService.DEBUG_ORIENTATION) { + if (DEBUG_ORIENTATION) { Slog.d(TAG, "Resuming rotation after re-position"); } mService.resumeRotationLocked(); diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 996fadfcb460..49d9efe68558 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -39,9 +39,9 @@ import static android.view.WindowManager.DOCKED_INVALID; import static android.view.WindowManager.DOCKED_LEFT; import static android.view.WindowManager.DOCKED_RIGHT; import static android.view.WindowManager.DOCKED_TOP; -import static com.android.server.wm.WindowManagerService.DEBUG_TASK_MOVEMENT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT; import static com.android.server.wm.WindowManagerService.H.RESIZE_STACK; -import static com.android.server.wm.WindowManagerService.TAG; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; public class TaskStack implements DimLayer.DimLayerUser { @@ -138,7 +138,7 @@ public class TaskStack implements DimLayer.DimLayerUser { task.setBounds(bounds, config); } } else { - Slog.wtf(TAG, "No config for task: " + task + ", is there a mismatch with AM?"); + Slog.wtf(TAG_WM, "No config for task: " + task + ", is there a mismatch with AM?"); } } return true; @@ -285,7 +285,7 @@ public class TaskStack implements DimLayer.DimLayerUser { // Reset position based on minimum/maximum possible positions. position = Math.min(Math.max(position, minPosition), maxPosition); - if (DEBUG_TASK_MOVEMENT) Slog.d(TAG, + if (DEBUG_TASK_MOVEMENT) Slog.d(TAG_WM, "positionTask: task=" + task + " position=" + position); mTasks.add(position, task); @@ -338,14 +338,14 @@ public class TaskStack implements DimLayer.DimLayerUser { } void moveTaskToTop(Task task) { - if (DEBUG_TASK_MOVEMENT) Slog.d(TAG, "moveTaskToTop: task=" + task + " Callers=" + if (DEBUG_TASK_MOVEMENT) Slog.d(TAG_WM, "moveTaskToTop: task=" + task + " Callers=" + Debug.getCallers(6)); mTasks.remove(task); addTask(task, true); } void moveTaskToBottom(Task task) { - if (DEBUG_TASK_MOVEMENT) Slog.d(TAG, "moveTaskToBottom: task=" + task); + if (DEBUG_TASK_MOVEMENT) Slog.d(TAG_WM, "moveTaskToBottom: task=" + task); mTasks.remove(task); addTask(task, false); } @@ -356,7 +356,7 @@ public class TaskStack implements DimLayer.DimLayerUser { * @param task The Task to delete. */ void removeTask(Task task) { - if (DEBUG_TASK_MOVEMENT) Slog.d(TAG, "removeTask: task=" + task); + if (DEBUG_TASK_MOVEMENT) Slog.d(TAG_WM, "removeTask: task=" + task); mTasks.remove(task); if (mDisplayContent != null) { if (mTasks.isEmpty()) { @@ -433,7 +433,7 @@ public class TaskStack implements DimLayer.DimLayerUser { final int dockedSide = dockedStack.getDockSide(); if (dockedSide == DOCKED_INVALID) { // Not sure how you got here...Only thing we can do is return current bounds. - Slog.e(TAG, "Failed to get valid docked side for docked stack=" + dockedStack); + Slog.e(TAG_WM, "Failed to get valid docked side for docked stack=" + dockedStack); outBounds.set(mBounds); return; } diff --git a/services/core/java/com/android/server/wm/ViewServer.java b/services/core/java/com/android/server/wm/ViewServer.java index 741cee3a06d3..ecf5652a1e69 100644 --- a/services/core/java/com/android/server/wm/ViewServer.java +++ b/services/core/java/com/android/server/wm/ViewServer.java @@ -17,6 +17,9 @@ package com.android.server.wm; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; + import android.util.Slog; import java.net.ServerSocket; @@ -47,7 +50,7 @@ class ViewServer implements Runnable { private static final int VIEW_SERVER_MAX_CONNECTIONS = 10; // Debug facility - private static final String LOG_TAG = "ViewServer"; + private static final String LOG_TAG = TAG_WITH_CLASS_NAME ? "ViewServer" : TAG_WM; private static final String VALUE_PROTOCOL_VERSION = "4"; private static final String VALUE_SERVER_VERSION = "4"; @@ -150,7 +153,7 @@ class ViewServer implements Runnable { * * @see #start() * @see #stop() - * @see WindowManagerService#isViewServerRunning() + * @see WindowManagerService#isViewServerRunning() */ boolean isRunning() { return mThread != null && mThread.isAlive(); diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index 8b984f03ebd0..3db9ae0c4c82 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -22,13 +22,15 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_SCRIM; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; -import static com.android.server.wm.WindowManagerService.DEBUG_ADD_REMOVE; -import static com.android.server.wm.WindowManagerService.DEBUG_APP_TRANSITIONS; -import static com.android.server.wm.WindowManagerService.DEBUG_LAYERS; -import static com.android.server.wm.WindowManagerService.DEBUG_WINDOW_MOVEMENT; -import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; -import static com.android.server.wm.WindowManagerService.DEBUG_WALLPAPER; -import static com.android.server.wm.WindowManagerService.DEBUG_WALLPAPER_LIGHT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.H.WALLPAPER_DRAW_PENDING_TIMEOUT; import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER; import static com.android.server.wm.WindowManagerService.TYPE_LAYER_OFFSET; @@ -51,7 +53,7 @@ import java.util.ArrayList; * NOTE: All methods in this class must be called with the window manager service lock held. */ class WallpaperController { - private static final String TAG = com.android.server.wm.WindowManagerService.TAG; + private static final String TAG = TAG_WITH_CLASS_NAME ? "WallpaperController" : TAG_WM; final private WindowManagerService mService; private final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<>(); diff --git a/services/core/java/com/android/server/wm/Watermark.java b/services/core/java/com/android/server/wm/Watermark.java index e226e3d73e47..171e575c1801 100644 --- a/services/core/java/com/android/server/wm/Watermark.java +++ b/services/core/java/com/android/server/wm/Watermark.java @@ -16,6 +16,8 @@ package com.android.server.wm; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; + import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PixelFormat; @@ -53,9 +55,9 @@ class Watermark { Watermark(Display display, DisplayMetrics dm, SurfaceSession session, String[] tokens) { if (false) { - Log.i(WindowManagerService.TAG, "*********************** WATERMARK"); + Log.i(TAG_WM, "*********************** WATERMARK"); for (int i=0; i<tokens.length; i++) { - Log.i(WindowManagerService.TAG, " TOKEN #" + i + ": " + tokens[i]); + Log.i(TAG_WM, " TOKEN #" + i + ": " + tokens[i]); } } @@ -78,7 +80,7 @@ class Watermark { } mText = builder.toString(); if (false) { - Log.i(WindowManagerService.TAG, "Final text: " + mText); + Log.i(TAG_WM, "Final text: " + mText); } int fontSize = WindowManagerService.getPropertyInt(tokens, 1, diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index f20c4e51a1bf..a6523a471ff2 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -21,15 +21,17 @@ import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; -import static com.android.server.wm.WindowManagerService.DEBUG_ANIM; -import static com.android.server.wm.WindowManagerService.DEBUG_FOCUS_LIGHT; -import static com.android.server.wm.WindowManagerService.DEBUG_KEYGUARD; -import static com.android.server.wm.WindowManagerService.DEBUG_LAYOUT_REPEATS; -import static com.android.server.wm.WindowManagerService.DEBUG_ORIENTATION; -import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; -import static com.android.server.wm.WindowManagerService.DEBUG_WALLPAPER; -import static com.android.server.wm.WindowManagerService.DEBUG_WINDOW_TRACE; -import static com.android.server.wm.WindowManagerService.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEYGUARD; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowSurfacePlacer.SET_FORCE_HIDING_CHANGED; import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE; import static com.android.server.wm.WindowSurfacePlacer.SET_UPDATE_ROTATION; @@ -56,7 +58,7 @@ import java.util.ArrayList; * on behalf of WindowManagerService. */ public class WindowAnimator { - private static final String TAG = "WindowAnimator"; + private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowAnimator" : TAG_WM; /** How long to give statusbar to clear the private keyguard flag when animating out */ private static final long KEYGUARD_ANIM_TIMEOUT_MS = 1000; diff --git a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java new file mode 100644 index 000000000000..a49bb31a239c --- /dev/null +++ b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package com.android.server.wm; + +/** + * Common class for the various debug {@link android.util.Log} output configuration in the window + * manager package. + */ +public class WindowManagerDebugConfig { + // All output logs in the window manager package use the {@link #TAG_WM} string for tagging + // their log output. This makes it easy to identify the origin of the log message when sifting + // through a large amount of log output from multiple sources. However, it also makes trying + // to figure-out the origin of a log message while debugging the window manager a little + // painful. By setting this constant to true, log messages from the window manager package + // will be tagged with their class names instead fot the generic tag. + static final boolean TAG_WITH_CLASS_NAME = false; + + // Default log tag for the window manager package. + static final String TAG_WM = "WindowManager"; + + static final boolean DEBUG_RESIZE = false; + static final boolean DEBUG = false; + static final boolean DEBUG_ADD_REMOVE = false; + static final boolean DEBUG_FOCUS = false; + static final boolean DEBUG_FOCUS_LIGHT = DEBUG_FOCUS || false; + static final boolean DEBUG_ANIM = false; + static final boolean DEBUG_KEYGUARD = false; + static final boolean DEBUG_LAYOUT = false; + static final boolean DEBUG_LAYERS = false; + static final boolean DEBUG_INPUT = false; + static final boolean DEBUG_INPUT_METHOD = false; + static final boolean DEBUG_VISIBILITY = false; + static final boolean DEBUG_WINDOW_MOVEMENT = false; + static final boolean DEBUG_TOKEN_MOVEMENT = false; + static final boolean DEBUG_ORIENTATION = false; + static final boolean DEBUG_APP_ORIENTATION = false; + static final boolean DEBUG_CONFIGURATION = false; + static final boolean DEBUG_APP_TRANSITIONS = false; + static final boolean DEBUG_STARTING_WINDOW = false; + static final boolean DEBUG_WALLPAPER = false; + static final boolean DEBUG_WALLPAPER_LIGHT = false || DEBUG_WALLPAPER; + static final boolean DEBUG_DRAG = false; + static final boolean DEBUG_SCREEN_ON = false; + static final boolean DEBUG_SCREENSHOT = false; + static final boolean DEBUG_BOOT = false; + static final boolean DEBUG_LAYOUT_REPEATS = true; + static final boolean DEBUG_SURFACE_TRACE = false; + static final boolean DEBUG_WINDOW_TRACE = false; + static final boolean DEBUG_TASK_MOVEMENT = false; + static final boolean DEBUG_TASK_POSITIONING = false; + static final boolean DEBUG_STACK = false; + static final boolean DEBUG_DISPLAY = false; + static final boolean DEBUG_POWER = false; + static final boolean DEBUG_DIM_LAYER = false; + static final boolean SHOW_SURFACE_ALLOC = false; + static final boolean SHOW_TRANSACTIONS = false; + static final boolean SHOW_VERBOSE_TRANSACTIONS = false && SHOW_TRANSACTIONS; + static final boolean SHOW_LIGHT_TRANSACTIONS = false || SHOW_TRANSACTIONS; + static final boolean HIDE_STACK_CRAWLS = true; + static final boolean DEBUG_WINDOW_CROP = false; +} diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 5237a13f94a8..0c606fefacb7 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -20,8 +20,8 @@ import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT; import static android.app.ActivityManager.StackId.DOCKED_STACK_ID; import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; import static android.app.StatusBarManager.DISABLE_MASK; -import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.view.WindowManager.DOCKED_INVALID; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; @@ -50,15 +50,47 @@ import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManagerGlobal.RELAYOUT_DEFER_SURFACE_DESTROY; import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED; import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; - import static com.android.server.wm.AppWindowAnimator.PROLONG_ANIMATION_AT_END; import static com.android.server.wm.AppWindowAnimator.PROLONG_ANIMATION_AT_START; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_ORIENTATION; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_BOOT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_CONFIGURATION; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DRAG; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT_METHOD; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEYGUARD; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_RESIZE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SCREENSHOT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SCREEN_ON; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TOKEN_MOVEMENT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.HIDE_STACK_CRAWLS; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_VERBOSE_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.Manifest; import android.animation.ValueAnimator; import android.annotation.NonNull; import android.annotation.Nullable; -import android.app.ActivityManager; import android.app.ActivityManager.StackId; import android.app.ActivityManagerNative; import android.app.AppOpsManager; @@ -122,8 +154,8 @@ import android.view.Display; import android.view.DisplayInfo; import android.view.DropPermissionHolder; import android.view.Gravity; -import android.view.IApplicationToken; import android.view.IAppTransitionAnimationSpecsFuture; +import android.view.IApplicationToken; import android.view.IDockDividerVisibilityListener; import android.view.IInputFilter; import android.view.IOnKeyguardExitResult; @@ -155,8 +187,8 @@ import android.view.WindowManagerPolicy.PointerEventListener; import android.view.animation.Animation; import android.widget.Toast; -import com.android.internal.app.IAssistScreenshotReceiver; import com.android.internal.R; +import com.android.internal.app.IAssistScreenshotReceiver; import com.android.internal.util.FastPrintWriter; import com.android.internal.view.IInputContext; import com.android.internal.view.IInputMethodClient; @@ -196,46 +228,6 @@ import java.util.List; /** {@hide} */ public class WindowManagerService extends IWindowManager.Stub implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs { - static final String TAG = "WindowManager"; - static final boolean DEBUG = false; - static final boolean DEBUG_ADD_REMOVE = false; - static final boolean DEBUG_FOCUS = false; - static final boolean DEBUG_FOCUS_LIGHT = DEBUG_FOCUS || false; - static final boolean DEBUG_ANIM = false; - static final boolean DEBUG_KEYGUARD = false; - static final boolean DEBUG_LAYOUT = false; - static final boolean DEBUG_RESIZE = false; - static final boolean DEBUG_LAYERS = false; - static final boolean DEBUG_INPUT = false; - static final boolean DEBUG_INPUT_METHOD = false; - static final boolean DEBUG_VISIBILITY = false; - static final boolean DEBUG_WINDOW_MOVEMENT = false; - static final boolean DEBUG_TOKEN_MOVEMENT = false; - static final boolean DEBUG_ORIENTATION = false; - static final boolean DEBUG_APP_ORIENTATION = false; - static final boolean DEBUG_CONFIGURATION = false; - static final boolean DEBUG_APP_TRANSITIONS = false; - static final boolean DEBUG_STARTING_WINDOW = false; - static final boolean DEBUG_WALLPAPER = false; - static final boolean DEBUG_WALLPAPER_LIGHT = false || DEBUG_WALLPAPER; - static final boolean DEBUG_DRAG = false; - static final boolean DEBUG_SCREEN_ON = false; - static final boolean DEBUG_SCREENSHOT = false; - static final boolean DEBUG_BOOT = false; - static final boolean DEBUG_LAYOUT_REPEATS = true; - static final boolean DEBUG_SURFACE_TRACE = false; - static final boolean DEBUG_WINDOW_TRACE = false; - static final boolean DEBUG_TASK_MOVEMENT = false; - static final boolean DEBUG_TASK_POSITIONING = false; - static final boolean DEBUG_STACK = false; - static final boolean DEBUG_DISPLAY = false; - static final boolean DEBUG_POWER = false; - static final boolean DEBUG_DIM_LAYER = false; - static final boolean SHOW_SURFACE_ALLOC = false; - static final boolean SHOW_TRANSACTIONS = false; - static final boolean SHOW_LIGHT_TRANSACTIONS = false || SHOW_TRANSACTIONS; - static final boolean SHOW_VERBOSE_TRANSACTIONS = false && SHOW_TRANSACTIONS; - static final boolean HIDE_STACK_CRAWLS = true; static final int LAYOUT_REPEAT_THRESHOLD = 4; static final boolean PROFILE_ORIENTATION = false; @@ -706,13 +698,13 @@ public class WindowManagerService extends IWindowManager.Stub switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: { if (DEBUG_DRAG) { - Slog.w(TAG, "Unexpected ACTION_DOWN in drag layer"); + Slog.w(TAG_WM, "Unexpected ACTION_DOWN in drag layer"); } } break; case MotionEvent.ACTION_MOVE: { if (mStylusButtonDownAtStart && !isStylusButtonDown) { - if (DEBUG_DRAG) Slog.d(TAG, "Button no longer pressed; dropping at " + if (DEBUG_DRAG) Slog.d(TAG_WM, "Button no longer pressed; dropping at " + newX + "," + newY); synchronized (mWindowMap) { endDrag = completeDropLw(newX, newY); @@ -726,7 +718,7 @@ public class WindowManagerService extends IWindowManager.Stub } break; case MotionEvent.ACTION_UP: { - if (DEBUG_DRAG) Slog.d(TAG, "Got UP on move channel; dropping at " + if (DEBUG_DRAG) Slog.d(TAG_WM, "Got UP on move channel; dropping at " + newX + "," + newY); synchronized (mWindowMap) { endDrag = completeDropLw(newX, newY); @@ -734,13 +726,13 @@ public class WindowManagerService extends IWindowManager.Stub } break; case MotionEvent.ACTION_CANCEL: { - if (DEBUG_DRAG) Slog.d(TAG, "Drag cancelled!"); + if (DEBUG_DRAG) Slog.d(TAG_WM, "Drag cancelled!"); endDrag = true; } break; } if (endDrag) { - if (DEBUG_DRAG) Slog.d(TAG, "Drag ended; tearing down state"); + if (DEBUG_DRAG) Slog.d(TAG_WM, "Drag ended; tearing down state"); // tell all the windows that the drag has ended synchronized (mWindowMap) { mDragState.endDragLw(); @@ -752,7 +744,7 @@ public class WindowManagerService extends IWindowManager.Stub handled = true; } } catch (Exception e) { - Slog.e(TAG, "Exception caught by drag handleMotion", e); + Slog.e(TAG_WM, "Exception caught by drag handleMotion", e); } finally { finishInputEvent(event, handled); } @@ -889,7 +881,7 @@ public class WindowManagerService extends IWindowManager.Stub LocalServices.addService(WindowManagerPolicy.class, mPolicy); - mPointerEventDispatcher = new PointerEventDispatcher(mInputManager.monitorInput(TAG)); + mPointerEventDispatcher = new PointerEventDispatcher(mInputManager.monitorInput(TAG_WM)); mFxSession = new SurfaceSession(); mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE); @@ -950,7 +942,7 @@ public class WindowManagerService extends IWindowManager.Stub updateShowImeWithHardKeyboard(); mHoldingScreenWakeLock = mPowerManager.newWakeLock( - PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, TAG); + PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, TAG_WM); mHoldingScreenWakeLock.setReferenceCounted(false); mAnimator = new WindowAnimator(this); @@ -988,7 +980,7 @@ public class WindowManagerService extends IWindowManager.Stub // The window manager only throws security exceptions, so let's // log all others. if (!(e instanceof SecurityException)) { - Slog.wtf(TAG, "Window Manager Crash", e); + Slog.wtf(TAG_WM, "Window Manager Crash", e); } throw e; } @@ -998,7 +990,7 @@ public class WindowManagerService extends IWindowManager.Stub final WindowList windows = pos.getWindowList(); final int i = windows.indexOf(pos); if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( - TAG, "Adding window " + window + " at " + TAG_WM, "Adding window " + window + " at " + (i+1) + " of " + windows.size() + " (after " + pos + ")"); windows.add(i+1, window); mWindowsChanged = true; @@ -1008,10 +1000,10 @@ public class WindowManagerService extends IWindowManager.Stub final WindowList windows = pos.getWindowList(); int i = windows.indexOf(pos); if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( - TAG, "Adding window " + window + " at " + TAG_WM, "Adding window " + window + " at " + i + " of " + windows.size() + " (before " + pos + ")"); if (i < 0) { - Slog.w(TAG, "placeWindowBefore: Unable to find " + pos + " in " + windows); + Slog.w(TAG_WM, "placeWindowBefore: Unable to find " + pos + " in " + windows); i = 0; } windows.add(i, window); @@ -1087,7 +1079,7 @@ public class WindowManagerService extends IWindowManager.Stub } // No windows from this token on this display - if (localLOGV) Slog.v(TAG, "Figuring out where to add app window " + client.asBinder() + if (localLOGV) Slog.v(TAG_WM, "Figuring out where to add app window " + client.asBinder() + " (token=" + token + ")"); // Figure out where the window should go, based on the // order of applications. @@ -1195,7 +1187,7 @@ public class WindowManagerService extends IWindowManager.Stub break; } } - if (DEBUG_FOCUS_LIGHT || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, + if (DEBUG_FOCUS_LIGHT || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Based on layer: Adding window " + win + " at " + (i + 1) + " of " + windows.size()); windows.add(i + 1, win); @@ -1227,7 +1219,7 @@ public class WindowManagerService extends IWindowManager.Stub //apptoken note that the window could be a floating window //that was created later or a window at the top of the list of //windows associated with this token. - if (DEBUG_FOCUS_LIGHT || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, + if (DEBUG_FOCUS_LIGHT || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "not Base app: Adding window " + win + " at " + (newIdx + 1) + " of " + windows.size()); windows.add(newIdx + 1, win); @@ -1265,7 +1257,7 @@ public class WindowManagerService extends IWindowManager.Stub } } i++; - if (DEBUG_FOCUS_LIGHT || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, + if (DEBUG_FOCUS_LIGHT || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Free window: Adding window " + win + " at " + i + " of " + windows.size()); windows.add(i, win); mWindowsChanged = true; @@ -1300,7 +1292,7 @@ public class WindowManagerService extends IWindowManager.Stub // in the same sublayer. if (wSublayer >= sublayer) { if (addToToken) { - if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); + if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Adding " + win + " to " + token); token.windows.add(i, win); } placeWindowBefore(wSublayer >= 0 ? attached : w, win); @@ -1311,7 +1303,7 @@ public class WindowManagerService extends IWindowManager.Stub // in the same sublayer. if (wSublayer > sublayer) { if (addToToken) { - if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); + if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Adding " + win + " to " + token); token.windows.add(i, win); } placeWindowBefore(w, win); @@ -1321,7 +1313,7 @@ public class WindowManagerService extends IWindowManager.Stub } if (i >= NA) { if (addToToken) { - if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); + if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Adding " + win + " to " + token); token.windows.add(win); } if (sublayer < 0) { @@ -1336,7 +1328,7 @@ public class WindowManagerService extends IWindowManager.Stub } private void addWindowToListInOrderLocked(final WindowState win, boolean addToToken) { - if (DEBUG_FOCUS_LIGHT) Slog.d(TAG, "addWindowToListInOrderLocked: win=" + win + + if (DEBUG_FOCUS_LIGHT) Slog.d(TAG_WM, "addWindowToListInOrderLocked: win=" + win + " Callers=" + Debug.getCallers(4)); if (win.mAttachedWindow == null) { final WindowToken token = win.mToken; @@ -1347,7 +1339,7 @@ public class WindowManagerService extends IWindowManager.Stub addFreeWindowToListLocked(win); } if (addToToken) { - if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); + if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Adding " + win + " to " + token); token.windows.add(tokenWindowsPos, win); } } else { @@ -1375,9 +1367,9 @@ public class WindowManagerService extends IWindowManager.Stub if (fl == 0 || fl == (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM) || type == TYPE_APPLICATION_STARTING || type == TYPE_DOCK_DIVIDER) { if (DEBUG_INPUT_METHOD) { - Slog.i(TAG, "isVisibleOrAdding " + w + ": " + w.isVisibleOrAdding()); + Slog.i(TAG_WM, "isVisibleOrAdding " + w + ": " + w.isVisibleOrAdding()); if (!w.isVisibleOrAdding()) { - Slog.i(TAG, " mSurfaceController=" + w.mWinAnimator.mSurfaceController + Slog.i(TAG_WM, " mSurfaceController=" + w.mWinAnimator.mSurfaceController + " relayoutCalled=" + w.mRelayoutCalled + " viewVis=" + w.mViewVisibility + " policyVis=" + w.mPolicyVisibility @@ -1385,7 +1377,7 @@ public class WindowManagerService extends IWindowManager.Stub + " attachHid=" + w.mAttachedHidden + " exiting=" + w.mExiting + " destroying=" + w.mDestroying); if (w.mAppToken != null) { - Slog.i(TAG, " mAppToken.hiddenRequested=" + w.mAppToken.hiddenRequested); + Slog.i(TAG_WM, " mAppToken.hiddenRequested=" + w.mAppToken.hiddenRequested); } } } @@ -1409,11 +1401,11 @@ public class WindowManagerService extends IWindowManager.Stub for (i = windows.size() - 1; i >= 0; --i) { WindowState win = windows.get(i); - if (DEBUG_INPUT_METHOD && willMove) Slog.i(TAG, "Checking window @" + i + if (DEBUG_INPUT_METHOD && willMove) Slog.i(TAG_WM, "Checking window @" + i + " " + win + " fl=0x" + Integer.toHexString(win.mAttrs.flags)); if (canBeImeTarget(win)) { w = win; - //Slog.i(TAG, "Putting input method here!"); + //Slog.i(TAG_WM, "Putting input method here!"); // Yet more tricksyness! If this window is a "starting" // window, we do actually want to be on top of it, but @@ -1435,7 +1427,7 @@ public class WindowManagerService extends IWindowManager.Stub // Now w is either mWindows[0] or an IME (or null if mWindows is empty). - if (DEBUG_INPUT_METHOD && willMove) Slog.v(TAG, "Proposed new IME target: " + w); + if (DEBUG_INPUT_METHOD && willMove) Slog.v(TAG_WM, "Proposed new IME target: " + w); // Now, a special case -- if the last target's window is in the // process of exiting, and is above the new target, keep on the @@ -1448,11 +1440,11 @@ public class WindowManagerService extends IWindowManager.Stub && curTarget.isDisplayedLw() && curTarget.isClosing() && (w == null || curTarget.mWinAnimator.mAnimLayer > w.mWinAnimator.mAnimLayer)) { - if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Current target higher, not changing"); + if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, "Current target higher, not changing"); return windows.indexOf(curTarget) + 1; } - if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Desired input method target=" + if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, "Desired input method target=" + w + " willMove=" + willMove); if (willMove && w != null) { @@ -1485,7 +1477,7 @@ public class WindowManagerService extends IWindowManager.Stub } if (highestTarget != null) { - if (DEBUG_INPUT_METHOD) Slog.v(TAG, mAppTransition + " " + highestTarget + if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, mAppTransition + " " + highestTarget + " animating=" + highestTarget.mWinAnimator.isAnimating() + " layer=" + highestTarget.mWinAnimator.mAnimLayer + " new layer=" + w.mWinAnimator.mAnimLayer); @@ -1510,10 +1502,10 @@ public class WindowManagerService extends IWindowManager.Stub } } - //Slog.i(TAG, "Placing input method @" + (i+1)); + //Slog.i(TAG_WM, "Placing input method @" + (i+1)); if (w != null) { if (willMove) { - if (DEBUG_INPUT_METHOD) Slog.w(TAG, "Moving IM target from " + curTarget + " to " + if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "Moving IM target from " + curTarget + " to " + w + (HIDE_STACK_CRAWLS ? "" : " Callers=" + Debug.getCallers(4))); mInputMethodTarget = w; mInputMethodTargetWaitingAnim = false; @@ -1526,7 +1518,7 @@ public class WindowManagerService extends IWindowManager.Stub return i+1; } if (willMove) { - if (DEBUG_INPUT_METHOD) Slog.w(TAG, "Moving IM target from " + curTarget + " to null." + if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "Moving IM target from " + curTarget + " to null." + (HIDE_STACK_CRAWLS ? "" : " Callers=" + Debug.getCallers(4))); mInputMethodTarget = null; setInputMethodAnimLayerAdjustment(0); @@ -1539,7 +1531,7 @@ public class WindowManagerService extends IWindowManager.Stub if (pos >= 0) { win.mTargetAppToken = mInputMethodTarget.mAppToken; if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( - TAG, "Adding input method window " + win + " at " + pos); + TAG_WM, "Adding input method window " + win + " at " + pos); // TODO(multidisplay): IMEs are only supported on the default display. getDefaultWindowListLocked().add(pos, win); mWindowsChanged = true; @@ -1552,19 +1544,19 @@ public class WindowManagerService extends IWindowManager.Stub } void setInputMethodAnimLayerAdjustment(int adj) { - if (DEBUG_LAYERS) Slog.v(TAG, "Setting im layer adj to " + adj); + if (DEBUG_LAYERS) Slog.v(TAG_WM, "Setting im layer adj to " + adj); mInputMethodAnimLayerAdjustment = adj; WindowState imw = mInputMethodWindow; if (imw != null) { imw.mWinAnimator.mAnimLayer = imw.mLayer + adj; - if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw + if (DEBUG_LAYERS) Slog.v(TAG_WM, "IM win " + imw + " anim layer: " + imw.mWinAnimator.mAnimLayer); int wi = imw.mChildWindows.size(); while (wi > 0) { wi--; WindowState cw = imw.mChildWindows.get(wi); cw.mWinAnimator.mAnimLayer = cw.mLayer + adj; - if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + cw + if (DEBUG_LAYERS) Slog.v(TAG_WM, "IM win " + cw + " anim layer: " + cw.mWinAnimator.mAnimLayer); } } @@ -1573,7 +1565,7 @@ public class WindowManagerService extends IWindowManager.Stub di --; imw = mInputMethodDialogs.get(di); imw.mWinAnimator.mAnimLayer = imw.mLayer + adj; - if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw + if (DEBUG_LAYERS) Slog.v(TAG_WM, "IM win " + imw + " anim layer: " + imw.mWinAnimator.mAnimLayer); } } @@ -1583,7 +1575,7 @@ public class WindowManagerService extends IWindowManager.Stub int wpos = windows.indexOf(win); if (wpos >= 0) { if (wpos < interestingPos) interestingPos--; - if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing at " + wpos + ": " + win); + if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "Temp removing at " + wpos + ": " + win); windows.remove(wpos); mWindowsChanged = true; int NC = win.mChildWindows.size(); @@ -1593,7 +1585,7 @@ public class WindowManagerService extends IWindowManager.Stub int cpos = windows.indexOf(cw); if (cpos >= 0) { if (cpos < interestingPos) interestingPos--; - if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing child at " + if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "Temp removing child at " + cpos + ": " + cw); windows.remove(cpos); } @@ -1610,7 +1602,7 @@ public class WindowManagerService extends IWindowManager.Stub WindowList windows = win.getWindowList(); int wpos = windows.indexOf(win); if (wpos >= 0) { - if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "ReAdd removing from " + wpos + ": " + win); + if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "ReAdd removing from " + wpos + ": " + win); windows.remove(wpos); mWindowsChanged = true; reAddWindowLocked(wpos, win); @@ -1621,7 +1613,7 @@ public class WindowManagerService extends IWindowManager.Stub int N = windows.size(); while (N > 0) { N--; - Slog.v(TAG, prefix + "#" + N + ": " + windows.get(N)); + Slog.v(TAG_WM, prefix + "#" + N + ": " + windows.get(N)); } } @@ -1631,12 +1623,12 @@ public class WindowManagerService extends IWindowManager.Stub // TODO(multidisplay): IMEs are only supported on the default display. WindowList windows = getDefaultWindowListLocked(); final int N = dialogs.size(); - if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Removing " + N + " dialogs w/pos=" + pos); + if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, "Removing " + N + " dialogs w/pos=" + pos); for (int i=0; i<N; i++) { pos = tmpRemoveWindowLocked(pos, dialogs.get(i)); } if (DEBUG_INPUT_METHOD) { - Slog.v(TAG, "Window list w/pos=" + pos); + Slog.v(TAG_WM, "Window list w/pos=" + pos); logWindowList(windows, " "); } @@ -1653,14 +1645,14 @@ public class WindowManagerService extends IWindowManager.Stub break; } } - if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Adding " + N + " dialogs at pos=" + pos); + if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, "Adding " + N + " dialogs at pos=" + pos); for (int i=0; i<N; i++) { WindowState win = dialogs.get(i); win.mTargetAppToken = targetAppToken; pos = reAddWindowLocked(pos, win); } if (DEBUG_INPUT_METHOD) { - Slog.v(TAG, "Final window list:"); + Slog.v(TAG_WM, "Final window list:"); logWindowList(windows, " "); } return; @@ -1670,7 +1662,7 @@ public class WindowManagerService extends IWindowManager.Stub win.mTargetAppToken = null; reAddWindowToListInOrderLocked(win); if (DEBUG_INPUT_METHOD) { - Slog.v(TAG, "No IM target, final list:"); + Slog.v(TAG_WM, "No IM target, final list:"); logWindowList(windows, " "); } } @@ -1736,18 +1728,18 @@ public class WindowManagerService extends IWindowManager.Stub if (imWin != null) { if (DEBUG_INPUT_METHOD) { - Slog.v(TAG, "Moving IM from " + imPos); + Slog.v(TAG_WM, "Moving IM from " + imPos); logWindowList(windows, " "); } imPos = tmpRemoveWindowLocked(imPos, imWin); if (DEBUG_INPUT_METHOD) { - Slog.v(TAG, "List after removing with new pos " + imPos + ":"); + Slog.v(TAG_WM, "List after removing with new pos " + imPos + ":"); logWindowList(windows, " "); } imWin.mTargetAppToken = mInputMethodTarget.mAppToken; reAddWindowLocked(imPos, imWin); if (DEBUG_INPUT_METHOD) { - Slog.v(TAG, "List after moving IM to " + imPos + ":"); + Slog.v(TAG_WM, "List after moving IM to " + imPos + ":"); logWindowList(windows, " "); } if (DN > 0) moveInputMethodDialogsLocked(imPos+1); @@ -1760,12 +1752,12 @@ public class WindowManagerService extends IWindowManager.Stub // because they aren't currently associated with a focus window. if (imWin != null) { - if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Moving IM from " + imPos); + if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, "Moving IM from " + imPos); tmpRemoveWindowLocked(0, imWin); imWin.mTargetAppToken = null; reAddWindowToListInOrderLocked(imWin); if (DEBUG_INPUT_METHOD) { - Slog.v(TAG, "List with no IM target:"); + Slog.v(TAG_WM, "List with no IM target:"); logWindowList(windows, " "); } if (DN > 0) moveInputMethodDialogsLocked(-1); @@ -1804,38 +1796,38 @@ public class WindowManagerService extends IWindowManager.Stub final DisplayContent displayContent = getDisplayContentLocked(displayId); if (displayContent == null) { - Slog.w(TAG, "Attempted to add window to a display that does not exist: " + Slog.w(TAG_WM, "Attempted to add window to a display that does not exist: " + displayId + ". Aborting."); return WindowManagerGlobal.ADD_INVALID_DISPLAY; } if (!displayContent.hasAccess(session.mUid)) { - Slog.w(TAG, "Attempted to add window to a display for which the application " + Slog.w(TAG_WM, "Attempted to add window to a display for which the application " + "does not have access: " + displayId + ". Aborting."); return WindowManagerGlobal.ADD_INVALID_DISPLAY; } if (mWindowMap.containsKey(client.asBinder())) { - Slog.w(TAG, "Window " + client + " is already added"); + Slog.w(TAG_WM, "Window " + client + " is already added"); return WindowManagerGlobal.ADD_DUPLICATE_ADD; } if (type >= FIRST_SUB_WINDOW && type <= LAST_SUB_WINDOW) { attachedWindow = windowForClientLocked(null, attrs.token, false); if (attachedWindow == null) { - Slog.w(TAG, "Attempted to add window with token that is not a window: " + Slog.w(TAG_WM, "Attempted to add window with token that is not a window: " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN; } if (attachedWindow.mAttrs.type >= FIRST_SUB_WINDOW && attachedWindow.mAttrs.type <= LAST_SUB_WINDOW) { - Slog.w(TAG, "Attempted to add window with token that is a sub-window: " + Slog.w(TAG_WM, "Attempted to add window with token that is a sub-window: " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN; } } if (type == TYPE_PRIVATE_PRESENTATION && !displayContent.isPrivate()) { - Slog.w(TAG, "Attempted to add private presentation window to a non-private display. Aborting."); + Slog.w(TAG_WM, "Attempted to add private presentation window to a non-private display. Aborting."); return WindowManagerGlobal.ADD_PERMISSION_DENIED; } @@ -1844,37 +1836,37 @@ public class WindowManagerService extends IWindowManager.Stub AppWindowToken atoken = null; if (token == null) { if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) { - Slog.w(TAG, "Attempted to add application window with unknown token " + Slog.w(TAG_WM, "Attempted to add application window with unknown token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } if (type == TYPE_INPUT_METHOD) { - Slog.w(TAG, "Attempted to add input method window with unknown token " + Slog.w(TAG_WM, "Attempted to add input method window with unknown token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } if (type == TYPE_VOICE_INTERACTION) { - Slog.w(TAG, "Attempted to add voice interaction window with unknown token " + Slog.w(TAG_WM, "Attempted to add voice interaction window with unknown token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } if (type == TYPE_WALLPAPER) { - Slog.w(TAG, "Attempted to add wallpaper window with unknown token " + Slog.w(TAG_WM, "Attempted to add wallpaper window with unknown token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } if (type == TYPE_DREAM) { - Slog.w(TAG, "Attempted to add Dream window with unknown token " + Slog.w(TAG_WM, "Attempted to add Dream window with unknown token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } if (type == TYPE_QS_DIALOG) { - Slog.w(TAG, "Attempted to add QS dialog window with unknown token " + Slog.w(TAG_WM, "Attempted to add QS dialog window with unknown token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } if (type == TYPE_ACCESSIBILITY_OVERLAY) { - Slog.w(TAG, "Attempted to add Accessibility overlay window with unknown token " + Slog.w(TAG_WM, "Attempted to add Accessibility overlay window with unknown token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } @@ -1883,52 +1875,52 @@ public class WindowManagerService extends IWindowManager.Stub } else if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) { atoken = token.appWindowToken; if (atoken == null) { - Slog.w(TAG, "Attempted to add window with non-application token " + Slog.w(TAG_WM, "Attempted to add window with non-application token " + token + ". Aborting."); return WindowManagerGlobal.ADD_NOT_APP_TOKEN; } else if (atoken.removed) { - Slog.w(TAG, "Attempted to add window with exiting application token " + Slog.w(TAG_WM, "Attempted to add window with exiting application token " + token + ". Aborting."); return WindowManagerGlobal.ADD_APP_EXITING; } if (type == TYPE_APPLICATION_STARTING && atoken.firstWindowDrawn) { // No need for this guy! if (DEBUG_STARTING_WINDOW || localLOGV) Slog.v( - TAG, "**** NO NEED TO START: " + attrs.getTitle()); + TAG_WM, "**** NO NEED TO START: " + attrs.getTitle()); return WindowManagerGlobal.ADD_STARTING_NOT_NEEDED; } } else if (type == TYPE_INPUT_METHOD) { if (token.windowType != TYPE_INPUT_METHOD) { - Slog.w(TAG, "Attempted to add input method window with bad token " + Slog.w(TAG_WM, "Attempted to add input method window with bad token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } } else if (type == TYPE_VOICE_INTERACTION) { if (token.windowType != TYPE_VOICE_INTERACTION) { - Slog.w(TAG, "Attempted to add voice interaction window with bad token " + Slog.w(TAG_WM, "Attempted to add voice interaction window with bad token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } } else if (type == TYPE_WALLPAPER) { if (token.windowType != TYPE_WALLPAPER) { - Slog.w(TAG, "Attempted to add wallpaper window with bad token " + Slog.w(TAG_WM, "Attempted to add wallpaper window with bad token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } } else if (type == TYPE_DREAM) { if (token.windowType != TYPE_DREAM) { - Slog.w(TAG, "Attempted to add Dream window with bad token " + Slog.w(TAG_WM, "Attempted to add Dream window with bad token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } } else if (type == TYPE_ACCESSIBILITY_OVERLAY) { if (token.windowType != TYPE_ACCESSIBILITY_OVERLAY) { - Slog.w(TAG, "Attempted to add Accessibility overlay window with bad token " + Slog.w(TAG_WM, "Attempted to add Accessibility overlay window with bad token " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } } else if (token.appWindowToken != null) { - Slog.w(TAG, "Non-null appWindowToken for system window of type=" + type); + Slog.w(TAG_WM, "Non-null appWindowToken for system window of type=" + type); // It is not valid to use an app token with other system types; we will // instead make a new token for it (as if null had been passed in for the token). attrs.token = null; @@ -1941,18 +1933,18 @@ public class WindowManagerService extends IWindowManager.Stub if (win.mDeathRecipient == null) { // Client has apparently died, so there is no reason to // continue. - Slog.w(TAG, "Adding window client " + client.asBinder() + Slog.w(TAG_WM, "Adding window client " + client.asBinder() + " that is dead, aborting."); return WindowManagerGlobal.ADD_APP_EXITING; } if (win.getDisplayContent() == null) { - Slog.w(TAG, "Adding window to Display that has been removed."); + Slog.w(TAG_WM, "Adding window to Display that has been removed."); return WindowManagerGlobal.ADD_INVALID_DISPLAY; } if (atoken != null && atoken.appDied) { - Slog.d(TAG, "App is now revived: " + atoken); + Slog.d(TAG_WM, "App is now revived: " + atoken); atoken.appDied = false; } @@ -1992,7 +1984,7 @@ public class WindowManagerService extends IWindowManager.Stub if (type == TYPE_APPLICATION_STARTING && token.appWindowToken != null) { token.appWindowToken.startingWindow = win; - if (DEBUG_STARTING_WINDOW) Slog.v (TAG, "addWindow: " + token.appWindowToken + if (DEBUG_STARTING_WINDOW) Slog.v (TAG_WM, "addWindow: " + token.appWindowToken + " startingWindow=" + win); } @@ -2073,7 +2065,7 @@ public class WindowManagerService extends IWindowManager.Stub } mInputMonitor.updateInputWindowsLw(false /*force*/); - if (localLOGV || DEBUG_ADD_REMOVE) Slog.v(TAG, "addWindow: New client " + if (localLOGV || DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "addWindow: New client " + client.asBinder() + ": window=" + win + " Callers=" + Debug.getCallers(5)); if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(false)) { @@ -2178,11 +2170,11 @@ public class WindowManagerService extends IWindowManager.Stub void removeWindowLocked(WindowState win) { final boolean startingWindow = win.mAttrs.type == TYPE_APPLICATION_STARTING; if (startingWindow) { - if (DEBUG_STARTING_WINDOW) Slog.d(TAG, "Starting window removed " + win); + if (DEBUG_STARTING_WINDOW) Slog.d(TAG_WM, "Starting window removed " + win); } if (localLOGV || DEBUG_FOCUS || DEBUG_FOCUS_LIGHT && win==mCurrentFocus) Slog.v( - TAG, "Remove " + win + " client=" + TAG_WM, "Remove " + win + " client=" + Integer.toHexString(System.identityHashCode(win.mClient.asBinder())) + ", surfaceController=" + win.mWinAnimator.mSurfaceController + " Callers=" + Debug.getCallers(4)); @@ -2192,7 +2184,7 @@ public class WindowManagerService extends IWindowManager.Stub win.disposeInputChannel(); if (DEBUG_APP_TRANSITIONS) Slog.v( - TAG, "Remove " + win + ": mSurfaceController=" + win.mWinAnimator.mSurfaceController + TAG_WM, "Remove " + win + ": mSurfaceController=" + win.mWinAnimator.mSurfaceController + " mExiting=" + win.mExiting + " isAnimating=" + win.mWinAnimator.isAnimating() + " app-animation=" @@ -2213,7 +2205,7 @@ public class WindowManagerService extends IWindowManager.Stub if (appToken != null && appToken.mWillReplaceWindow) { // This window is going to be replaced. We need to keep it around until the new one // gets added, then we will get rid of this one. - if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Preserving " + win + " until the new one is " + if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Preserving " + win + " until the new one is " + "added"); win.mExiting = true; appToken.mReplacingRemoveRequested = true; @@ -2225,7 +2217,7 @@ public class WindowManagerService extends IWindowManager.Stub wasVisible = win.isWinVisibleLw(); if (wasVisible && appToken != null && appToken.appDied) { - if (DEBUG_ADD_REMOVE) Slog.v(TAG, + if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Not removing " + win + " because app died while it's visible"); win.mAppDied = true; @@ -2300,7 +2292,7 @@ public class WindowManagerService extends IWindowManager.Stub for (int i=win.mChildWindows.size()-1; i>=0; i--) { WindowState cwin = win.mChildWindows.get(i); - Slog.w(TAG, "Force-removing child win " + cwin + " from container " + Slog.w(TAG_WM, "Force-removing child win " + cwin + " from container " + win); removeWindowInnerLocked(cwin); } @@ -2314,13 +2306,13 @@ public class WindowManagerService extends IWindowManager.Stub if (false) { RuntimeException e = new RuntimeException("here"); e.fillInStackTrace(); - Slog.w(TAG, "Removing window " + win, e); + Slog.w(TAG_WM, "Removing window " + win, e); } mPolicy.removeWindowLw(win); win.removeLocked(); - if (DEBUG_ADD_REMOVE) Slog.v(TAG, "removeWindowInnerLocked: " + win); + if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "removeWindowInnerLocked: " + win); mWindowMap.remove(win.mClient.asBinder()); if (win.mAppOp != AppOpsManager.OP_NONE) { mAppOps.finishOp(win.mAppOp, win.getOwningUid(), win.getOwningPackage()); @@ -2329,7 +2321,7 @@ public class WindowManagerService extends IWindowManager.Stub mPendingRemove.remove(win); mResizingWindows.remove(win); mWindowsChanged = true; - if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Final remove of window: " + win); + if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "Final remove of window: " + win); if (mInputMethodWindow == win) { mInputMethodWindow = null; @@ -2339,13 +2331,13 @@ public class WindowManagerService extends IWindowManager.Stub final WindowToken token = win.mToken; final AppWindowToken atoken = win.mAppToken; - if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + win + " from " + token); + if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Removing " + win + " from " + token); token.windows.remove(win); if (atoken != null) { atoken.allAppWindows.remove(win); } if (localLOGV) Slog.v( - TAG, "**** Removing window " + win + ": count=" + TAG_WM, "**** Removing window " + win + ": count=" + token.windows.size()); if (token.windows.size() == 0) { if (!token.explicit) { @@ -2357,13 +2349,13 @@ public class WindowManagerService extends IWindowManager.Stub if (atoken != null) { if (atoken.startingWindow == win) { - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Notify removed startingWindow " + win); + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Notify removed startingWindow " + win); scheduleRemoveStartingWindowLocked(atoken); } else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) { // If this is the last window and we had requested a starting // transition window, well there is no point now. - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Nulling last startingWindow"); + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Nulling last startingWindow"); atoken.startingData = null; } else if (atoken.allAppWindows.size() == 1 && atoken.startingView != null) { // If this is the last window except for a starting transition @@ -2419,18 +2411,18 @@ public class WindowManagerService extends IWindowManager.Stub static void logSurface(WindowState w, String msg, RuntimeException where) { String str = " SURFACE " + msg + ": " + w; if (where != null) { - Slog.i(TAG, str, where); + Slog.i(TAG_WM, str, where); } else { - Slog.i(TAG, str); + Slog.i(TAG_WM, str); } } static void logSurface(SurfaceControl s, String title, String msg, RuntimeException where) { String str = " SURFACE " + s + ": " + msg + " / " + title; if (where != null) { - Slog.i(TAG, str, where); + Slog.i(TAG_WM, str, where); } else { - Slog.i(TAG, str); + Slog.i(TAG_WM, str); } } @@ -2542,26 +2534,32 @@ public class WindowManagerService extends IWindowManager.Stub win.mAttrs.height = bottom - top; win.setWindowScale(win.mRequestedWidth, win.mRequestedHeight); - if (SHOW_TRANSACTIONS) { - Slog.i(TAG, ">>> OPEN TRANSACTION repositionChild"); - } + if (win.mHasSurface) { + if (SHOW_TRANSACTIONS) { + Slog.i(TAG_WM, ">>> OPEN TRANSACTION repositionChild"); + } + + SurfaceControl.openTransaction(); - SurfaceControl.openTransaction(); + try { - win.applyGravityAndUpdateFrame(); - win.mWinAnimator.computeShownFrameLocked(); + win.applyGravityAndUpdateFrame(); + win.mWinAnimator.computeShownFrameLocked(); - win.mWinAnimator.setSurfaceBoundariesLocked(false); + win.mWinAnimator.setSurfaceBoundariesLocked(false); - if (deferTransactionUntilFrame > 0) { - win.mWinAnimator.mSurfaceController.deferTransactionUntil( - win.mAttachedWindow.mWinAnimator.mSurfaceController.getHandle(), - deferTransactionUntilFrame); - } + if (deferTransactionUntilFrame > 0) { + win.mWinAnimator.mSurfaceController.deferTransactionUntil( + win.mAttachedWindow.mWinAnimator.mSurfaceController.getHandle(), + deferTransactionUntilFrame); + } - SurfaceControl.closeTransaction(); - if (SHOW_TRANSACTIONS) { - Slog.i(TAG, "<<< CLOSE TRANSACTION repositionChild"); + } finally { + SurfaceControl.closeTransaction(); + if (SHOW_TRANSACTIONS) { + Slog.i(TAG_WM, "<<< CLOSE TRANSACTION repositionChild"); + } + } } outFrame = win.mCompatFrame; @@ -2633,7 +2631,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": viewVisibility=" + viewVisibility + if (DEBUG_LAYOUT) Slog.v(TAG_WM, "Relayout " + win + ": viewVisibility=" + viewVisibility + " req=" + requestedWidth + "x" + requestedHeight + " " + win.mAttrs); winAnimator.mSurfaceDestroyDeferred = (flags & RELAYOUT_DEFER_SURFACE_DESTROY) != 0; win.mEnforceSizeCompat = @@ -2662,7 +2660,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_SCREEN_ON) { RuntimeException stack = new RuntimeException(); stack.fillInStackTrace(); - Slog.i(TAG, "Relayout " + win + ": oldVis=" + oldVisibility + Slog.i(TAG_WM, "Relayout " + win + ": oldVis=" + oldVisibility + " newVis=" + viewVisibility, stack); } if (viewVisibility == View.VISIBLE && @@ -2674,7 +2672,7 @@ public class WindowManagerService extends IWindowManager.Stub } catch (Exception e) { mInputMonitor.updateInputWindowsLw(true /*force*/); - Slog.w(TAG, "Exception thrown when creating surface for client " + Slog.w(TAG_WM, "Exception thrown when creating surface for client " + client + " (" + win.mAttrs.getTitle() + ")", e); Binder.restoreCallingIdentity(origId); @@ -2693,7 +2691,7 @@ public class WindowManagerService extends IWindowManager.Stub winAnimator.mEnteringAnimation = false; if (winAnimator.mSurfaceController != null && winAnimator.mSurfaceController.hasSurface()) { - if (DEBUG_VISIBILITY) Slog.i(TAG, "Relayout invis " + win + if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Relayout invis " + win + ": mExiting=" + win.mExiting); // If we are using a saved surface to do enter animation, just let the // animation run and don't destroy the surface. This could happen when @@ -2713,7 +2711,7 @@ public class WindowManagerService extends IWindowManager.Stub } outSurface.release(); - if (DEBUG_VISIBILITY) Slog.i(TAG, "Releasing surface in: " + win); + if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Releasing surface in: " + win); } if (focusMayChange) { @@ -2765,7 +2763,7 @@ public class WindowManagerService extends IWindowManager.Stub outStableInsets.set(win.mStableInsets); outOutsets.set(win.mOutsets); if (localLOGV) Slog.v( - TAG, "Relayout given client " + client.asBinder() + TAG_WM, "Relayout given client " + client.asBinder() + ", requestedWidth=" + requestedWidth + ", requestedHeight=" + requestedHeight + ", viewVisibility=" + viewVisibility @@ -2773,14 +2771,14 @@ public class WindowManagerService extends IWindowManager.Stub + ", surface=" + outSurface); if (localLOGV || DEBUG_FOCUS) Slog.v( - TAG, "Relayout of " + win + ": focusMayChange=" + focusMayChange); + TAG_WM, "Relayout of " + win + ": focusMayChange=" + focusMayChange); result |= mInTouchMode ? WindowManagerGlobal.RELAYOUT_RES_IN_TOUCH_MODE : 0; mInputMonitor.updateInputWindowsLw(true /*force*/); if (DEBUG_LAYOUT) { - Slog.v(TAG, "Relayout complete " + win + ": outFrame=" + outFrame.toShortString()); + Slog.v(TAG_WM, "Relayout complete " + win + ": outFrame=" + outFrame.toShortString()); } } @@ -2834,7 +2832,7 @@ public class WindowManagerService extends IWindowManager.Stub WindowSurfaceController surfaceController = winAnimator.createSurfaceLocked(); if (surfaceController != null) { surfaceController.getSurface(outSurface); - if (SHOW_TRANSACTIONS) Slog.i(TAG, " OUT SURFACE " + outSurface + ": copied"); + if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " OUT SURFACE " + outSurface + ": copied"); } else { // For some reason there isn't a surface. Clear the // caller's object so they see the same state. @@ -2930,7 +2928,7 @@ public class WindowManagerService extends IWindowManager.Stub try { synchronized (mWindowMap) { WindowState win = windowForClientLocked(session, client, false); - if (DEBUG_ADD_REMOVE) Slog.d(TAG, "finishDrawingWindow: " + win + " mDrawState=" + if (DEBUG_ADD_REMOVE) Slog.d(TAG_WM, "finishDrawingWindow: " + win + " mDrawState=" + (win != null ? win.mWinAnimator.drawStateToString() : "null")); if (win != null && win.mWinAnimator.finishDrawingLocked()) { if ((win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) { @@ -2956,7 +2954,7 @@ public class WindowManagerService extends IWindowManager.Stub DisplayInfo displayInfo = getDefaultDisplayInfoLocked(); final int width = displayInfo.appWidth; final int height = displayInfo.appHeight; - if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG, + if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG_WM, "applyAnimation: atoken=" + atoken); // Determine the visible rect to calculate the thumbnail clip @@ -2992,7 +2990,7 @@ public class WindowManagerService extends IWindowManager.Stub // screen gets the enter animation. Both appear in the mOpeningApps set. enter = false; } - if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "Loading animation for app transition." + if (DEBUG_APP_TRANSITIONS) Slog.d(TAG_WM, "Loading animation for app transition." + " transit=" + AppTransition.appTransitionToString(transit) + " enter=" + enter + " frame=" + frame + " insets=" + insets + " surfaceInsets=" + surfaceInsets); Animation a = mAppTransition.loadAnimation(lp, transit, enter, @@ -3005,7 +3003,7 @@ public class WindowManagerService extends IWindowManager.Stub e = new RuntimeException(); e.fillInStackTrace(); } - Slog.v(TAG, "Loaded animation " + a + " for " + atoken, e); + Slog.v(TAG_WM, "Loaded animation " + a + " for " + atoken, e); } final int containingWidth = frame.width(); final int containingHeight = frame.height(); @@ -3027,7 +3025,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { int t = tasks.size() - 1; if (t < 0) { - Slog.w(TAG, "validateAppTokens: empty task list"); + Slog.w(TAG_WM, "validateAppTokens: empty task list"); return; } @@ -3036,7 +3034,7 @@ public class WindowManagerService extends IWindowManager.Stub Task targetTask = mTaskIdToTask.get(taskId); DisplayContent displayContent = targetTask.getDisplayContent(); if (displayContent == null) { - Slog.w(TAG, "validateAppTokens: no Display for taskId=" + taskId); + Slog.w(TAG_WM, "validateAppTokens: no Display for taskId=" + taskId); return; } @@ -3050,7 +3048,7 @@ public class WindowManagerService extends IWindowManager.Stub DisplayContent lastDisplayContent = displayContent; displayContent = mTaskIdToTask.get(taskId).getDisplayContent(); if (displayContent != lastDisplayContent) { - Slog.w(TAG, "validateAppTokens: displayContent changed in TaskGroup list!"); + Slog.w(TAG_WM, "validateAppTokens: displayContent changed in TaskGroup list!"); return; } @@ -3076,9 +3074,9 @@ public class WindowManagerService extends IWindowManager.Stub } if (taskNdx >= 0 || t >= 0) { - Slog.w(TAG, "validateAppTokens: Mismatch! ActivityManager=" + tasks); - Slog.w(TAG, "validateAppTokens: Mismatch! WindowManager=" + localTasks); - Slog.w(TAG, "validateAppTokens: Mismatch! Callers=" + Debug.getCallers(4)); + Slog.w(TAG_WM, "validateAppTokens: Mismatch! ActivityManager=" + tasks); + Slog.w(TAG_WM, "validateAppTokens: Mismatch! WindowManager=" + localTasks); + Slog.w(TAG_WM, "validateAppTokens: Mismatch! Callers=" + Debug.getCallers(4)); } } } @@ -3101,7 +3099,7 @@ public class WindowManagerService extends IWindowManager.Stub + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() + " requires " + permission; - Slog.w(TAG, msg); + Slog.w(TAG_WM, msg); return false; } @@ -3127,7 +3125,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { WindowToken wtoken = mTokenMap.get(token); if (wtoken != null) { - Slog.w(TAG, "Attempted to add existing input method token: " + token); + Slog.w(TAG_WM, "Attempted to add existing input method token: " + token); return; } wtoken = new WindowToken(this, token, type, true); @@ -3197,7 +3195,7 @@ public class WindowManagerService extends IWindowManager.Stub mInputMonitor.updateInputWindowsLw(true /*force*/); } else { - Slog.w(TAG, "Attempted to remove non-existing token: " + token); + Slog.w(TAG_WM, "Attempted to remove non-existing token: " + token); } } Binder.restoreCallingIdentity(origId); @@ -3205,7 +3203,7 @@ public class WindowManagerService extends IWindowManager.Stub private Task createTaskLocked(int taskId, int stackId, int userId, AppWindowToken atoken, Rect bounds, Configuration config) { - if (DEBUG_STACK) Slog.i(TAG, "createTaskLocked: taskId=" + taskId + " stackId=" + stackId + if (DEBUG_STACK) Slog.i(TAG_WM, "createTaskLocked: taskId=" + taskId + " stackId=" + stackId + " atoken=" + atoken + " bounds=" + bounds); final TaskStack stack = mStackIdToStack.get(stackId); if (stack == null) { @@ -3238,14 +3236,14 @@ public class WindowManagerService extends IWindowManager.Stub try { inputDispatchingTimeoutNanos = token.getKeyDispatchingTimeout() * 1000000L; } catch (RemoteException ex) { - Slog.w(TAG, "Could not get dispatching timeout.", ex); + Slog.w(TAG_WM, "Could not get dispatching timeout.", ex); inputDispatchingTimeoutNanos = DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; } synchronized(mWindowMap) { AppWindowToken atoken = findAppWindowToken(token.asBinder()); if (atoken != null) { - Slog.w(TAG, "Attempted to add existing app token: " + token); + Slog.w(TAG_WM, "Attempted to add existing app token: " + token); return; } atoken = new AppWindowToken(this, token, voiceInteraction); @@ -3257,7 +3255,7 @@ public class WindowManagerService extends IWindowManager.Stub (ActivityInfo.CONFIG_SCREEN_SIZE | ActivityInfo.CONFIG_ORIENTATION)) != 0; atoken.mLaunchTaskBehind = launchTaskBehind; atoken.mCropWindowsToStack = cropWindowsToStack; - if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + atoken + if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "addAppToken: " + atoken + " to stack=" + stackId + " task=" + taskId + " at " + addPos); Task task = mTaskIdToTask.get(taskId); @@ -3285,7 +3283,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { final AppWindowToken atoken = findAppWindowToken(token); if (atoken == null) { - Slog.w(TAG, "Attempted to set task id of non-existing app token: " + token); + Slog.w(TAG_WM, "Attempted to set task id of non-existing app token: " + token); return; } final Task oldTask = atoken.mTask; @@ -3303,7 +3301,7 @@ public class WindowManagerService extends IWindowManager.Stub public int getOrientationLocked() { if (mDisplayFrozen) { if (mLastWindowForcedOrientation != SCREEN_ORIENTATION_UNSPECIFIED) { - if (DEBUG_ORIENTATION) Slog.v(TAG, + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Display is frozen, return " + mLastWindowForcedOrientation); // If the display is frozen, some activities may be in the middle // of restarting, and thus have removed their old window. If the @@ -3330,7 +3328,7 @@ public class WindowManagerService extends IWindowManager.Stub continue; } - if (DEBUG_ORIENTATION) Slog.v(TAG, win + " forcing orientation to " + req); + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, win + " forcing orientation to " + req); if (mPolicy.isKeyguardHostWindow(win.mAttrs)) { mLastKeyguardForcedOrientation = req; } @@ -3350,11 +3348,11 @@ public class WindowManagerService extends IWindowManager.Stub if (req == SCREEN_ORIENTATION_BEHIND) { req = mLastKeyguardForcedOrientation; } - if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + appShowWhenLocked + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Done at " + appShowWhenLocked + " -- show when locked, return " + req); return req; } - if (DEBUG_ORIENTATION) Slog.v(TAG, + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "No one is requesting an orientation when the screen is locked"); return mLastKeyguardForcedOrientation; } @@ -3384,12 +3382,12 @@ public class WindowManagerService extends IWindowManager.Stub for (int tokenNdx = firstToken; tokenNdx >= 0; --tokenNdx) { final AppWindowToken atoken = tokens.get(tokenNdx); - if (DEBUG_APP_ORIENTATION) Slog.v(TAG, "Checking app orientation: " + atoken); + if (DEBUG_APP_ORIENTATION) Slog.v(TAG_WM, "Checking app orientation: " + atoken); // if we're about to tear down this window and not seek for // the behind activity, don't use it for orientation if (!findingBehind && !atoken.hidden && atoken.hiddenRequested) { - if (DEBUG_ORIENTATION) Slog.v(TAG, + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Skipping " + atoken + " -- going to hide"); continue; } @@ -3399,7 +3397,7 @@ public class WindowManagerService extends IWindowManager.Stub // explicitly say to use the orientation behind it, and the last app was // full screen, then we'll stick with the user's orientation. if (lastOrientation != SCREEN_ORIENTATION_BEHIND && lastFullscreen) { - if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + atoken + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Done at " + atoken + " -- end of group, return " + lastOrientation); return lastOrientation; } @@ -3407,7 +3405,7 @@ public class WindowManagerService extends IWindowManager.Stub // We ignore any hidden applications on the top. if (atoken.hiddenRequested) { - if (DEBUG_ORIENTATION) Slog.v(TAG, + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Skipping " + atoken + " -- hidden on top"); continue; } @@ -3423,20 +3421,20 @@ public class WindowManagerService extends IWindowManager.Stub // orientation it has and ignores whatever is under it. lastFullscreen = atoken.appFullscreen; if (lastFullscreen && or != SCREEN_ORIENTATION_BEHIND) { - if (DEBUG_ORIENTATION) Slog.v(TAG, + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Done at " + atoken + " -- full screen, return " + or); return or; } // If this application has requested an explicit orientation, then use it. if (or != SCREEN_ORIENTATION_UNSPECIFIED && or != SCREEN_ORIENTATION_BEHIND) { - if (DEBUG_ORIENTATION) Slog.v(TAG, + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Done at " + atoken + " -- explicitly set, return " + or); return or; } findingBehind |= (or == SCREEN_ORIENTATION_BEHIND); } } - if (DEBUG_ORIENTATION) Slog.v(TAG, + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "No app is requesting an orientation, return " + mForcedAppOrientation); // The next app has not been requested to be visible, so we keep the current orientation // to prevent freezing/unfreezing the display too early. @@ -3567,7 +3565,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { AppWindowToken atoken = findAppWindowToken(token.asBinder()); if (atoken == null) { - Slog.w(TAG, "Attempted to set orientation of non-existing app token: " + token); + Slog.w(TAG_WM, "Attempted to set orientation of non-existing app token: " + token); return; } @@ -3607,14 +3605,14 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { final AppWindowToken newFocus; if (token == null) { - if (DEBUG_FOCUS_LIGHT) Slog.v(TAG, "Clearing focused app, was " + mFocusedApp); + if (DEBUG_FOCUS_LIGHT) Slog.v(TAG_WM, "Clearing focused app, was " + mFocusedApp); newFocus = null; } else { newFocus = findAppWindowToken(token); if (newFocus == null) { - Slog.w(TAG, "Attempted to set focus to non-existing app token: " + token); + Slog.w(TAG_WM, "Attempted to set focus to non-existing app token: " + token); } - if (DEBUG_FOCUS_LIGHT) Slog.v(TAG, "Set focused app to: " + newFocus + if (DEBUG_FOCUS_LIGHT) Slog.v(TAG_WM, "Set focused app to: " + newFocus + " old focus=" + mFocusedApp + " moveFocusNow=" + moveFocusNow); } @@ -3774,7 +3772,7 @@ public class WindowManagerService extends IWindowManager.Stub } synchronized(mWindowMap) { - if (DEBUG_APP_TRANSITIONS) Slog.w(TAG, "Execute app transition: " + mAppTransition + if (DEBUG_APP_TRANSITIONS) Slog.w(TAG_WM, "Execute app transition: " + mAppTransition + " Callers=" + Debug.getCallers(5)); if (mAppTransition.isTransitionSet()) { mAppTransition.setReady(); @@ -3800,12 +3798,12 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { if (DEBUG_STARTING_WINDOW) Slog.v( - TAG, "setAppStartingWindow: token=" + token + " pkg=" + pkg + TAG_WM, "setAppStartingWindow: token=" + token + " pkg=" + pkg + " transferFrom=" + transferFrom); AppWindowToken wtoken = findAppWindowToken(token); if (wtoken == null) { - Slog.w(TAG, "Attempted to set icon of non-existing app token: " + token); + Slog.w(TAG_WM, "Attempted to set icon of non-existing app token: " + token); return; } @@ -3834,7 +3832,7 @@ public class WindowManagerService extends IWindowManager.Stub // show a starting window -- the current effect (a full-screen // opaque starting window that fades away to the real contents // when it is ready) does not work for this. - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Checking theme of starting window: 0x" + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Checking theme of starting window: 0x" + Integer.toHexString(theme)); if (theme != 0) { AttributeCache.Entry ent = AttributeCache.instance().get(pkg, theme, @@ -3852,7 +3850,7 @@ public class WindowManagerService extends IWindowManager.Stub com.android.internal.R.styleable.Window_windowShowWallpaper, false); final boolean windowDisableStarting = ent.array.getBoolean( com.android.internal.R.styleable.Window_windowDisablePreview, false); - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Translucent=" + windowIsTranslucent + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Translucent=" + windowIsTranslucent + " Floating=" + windowIsFloating + " ShowWallpaper=" + windowShowWallpaper); if (windowIsTranslucent) { @@ -3875,14 +3873,14 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Creating StartingData"); + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Creating StartingData"); wtoken.startingData = new StartingData(pkg, theme, compatInfo, nonLocalizedLabel, labelRes, icon, logo, windowFlags); Message m = mH.obtainMessage(H.ADD_STARTING, wtoken); // Note: we really want to do sendMessageAtFrontOfQueue() because we // want to process the message ASAP, before any other queued // messages. - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Enqueueing ADD_STARTING"); + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Enqueueing ADD_STARTING"); mH.sendMessageAtFrontOfQueue(m); } } @@ -3901,7 +3899,7 @@ public class WindowManagerService extends IWindowManager.Stub // letting windows get shown immediately without any more transitions. mSkipAppTransitionAnimation = true; - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Moving existing starting " + startingWindow + " from " + ttoken + " to " + wtoken); final long origId = Binder.clearCallingIdentity(); @@ -3922,11 +3920,11 @@ public class WindowManagerService extends IWindowManager.Stub startingWindow.mAppToken = wtoken; if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE || DEBUG_STARTING_WINDOW) { - Slog.v(TAG, "Removing starting window: " + startingWindow); + Slog.v(TAG_WM, "Removing starting window: " + startingWindow); } startingWindow.getWindowList().remove(startingWindow); mWindowsChanged = true; - if (DEBUG_ADD_REMOVE) Slog.v(TAG, + if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Removing starting " + startingWindow + " from " + ttoken); ttoken.windows.remove(startingWindow); ttoken.allAppWindows.remove(startingWindow); @@ -3964,7 +3962,7 @@ public class WindowManagerService extends IWindowManager.Stub } else if (ttoken.startingData != null) { // The previous app was getting ready to show a // starting window, but hasn't yet done so. Steal it! - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Moving pending starting from " + ttoken + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Moving pending starting from " + ttoken + " to " + wtoken); wtoken.startingData = ttoken.startingData; ttoken.startingData = null; @@ -4047,7 +4045,7 @@ public class WindowManagerService extends IWindowManager.Stub (visible && wtoken.mWillReplaceWindow)) { boolean changed = false; if (DEBUG_APP_TRANSITIONS) Slog.v( - TAG, "Changing app " + wtoken + " hidden=" + wtoken.hidden + TAG_WM, "Changing app " + wtoken + " hidden=" + wtoken.hidden + " performLayout=" + performLayout); boolean runningAppAnimation = false; @@ -4075,7 +4073,7 @@ public class WindowManagerService extends IWindowManager.Stub continue; } - //Slog.i(TAG, "Window " + win + ": vis=" + win.isVisible()); + //Slog.i(TAG_WM, "Window " + win + ": vis=" + win.isVisible()); //win.dump(" "); if (visible) { if (!win.isVisibleNow()) { @@ -4121,7 +4119,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "setTokenVisibilityLocked: " + wtoken + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "setTokenVisibilityLocked: " + wtoken + ": hidden=" + wtoken.hidden + " hiddenRequested=" + wtoken.hiddenRequested); @@ -4170,11 +4168,11 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { wtoken = findAppWindowToken(token); if (wtoken == null) { - Slog.w(TAG, "Attempted to set visibility of non-existing app token: " + token); + Slog.w(TAG_WM, "Attempted to set visibility of non-existing app token: " + token); return; } - if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) Slog.v(TAG, "setAppVisibility(" + + if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) Slog.v(TAG_WM, "setAppVisibility(" + token + ", visible=" + visible + "): " + mAppTransition + " hidden=" + wtoken.hidden + " hiddenRequested=" + wtoken.hiddenRequested + " Callers=" + Debug.getCallers(6)); @@ -4202,7 +4200,7 @@ public class WindowManagerService extends IWindowManager.Stub if (!wtoken.mAppAnimator.usingTransferredAnimation && (!wtoken.startingDisplayed || mSkipAppTransitionAnimation)) { if (DEBUG_APP_TRANSITIONS) Slog.v( - TAG, "Setting dummy animation on: " + wtoken); + TAG_WM, "Setting dummy animation on: " + wtoken); wtoken.mAppAnimator.setDummyAnimation(); } wtoken.inPendingTransaction = true; @@ -4241,7 +4239,7 @@ public class WindowManagerService extends IWindowManager.Stub if (win != null) { final AppWindowToken focusedToken = win.mAppToken; if (focusedToken != null) { - if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "TRANSIT_TASK_OPEN_BEHIND, " + + if (DEBUG_APP_TRANSITIONS) Slog.d(TAG_WM, "TRANSIT_TASK_OPEN_BEHIND, " + " adding " + focusedToken + " to mOpeningApps"); // Force animation to be loaded. focusedToken.hidden = true; @@ -4264,7 +4262,7 @@ public class WindowManagerService extends IWindowManager.Stub void unsetAppFreezingScreenLocked(AppWindowToken wtoken, boolean unfreezeSurfaceNow, boolean force) { if (wtoken.mAppAnimator.freezingScreen) { - if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + wtoken + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Clear freezing of " + wtoken + " force=" + force); final int N = wtoken.allAppWindows.size(); boolean unfrozeWindows = false; @@ -4274,7 +4272,7 @@ public class WindowManagerService extends IWindowManager.Stub w.mAppFreezing = false; if (w.mHasSurface && !w.mOrientationChanging && mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_TIMEOUT) { - if (DEBUG_ORIENTATION) Slog.v(TAG, "set mOrientationChanging of " + w); + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "set mOrientationChanging of " + w); w.mOrientationChanging = true; mWindowPlacerLocked.mOrientationChangeComplete = false; } @@ -4284,7 +4282,7 @@ public class WindowManagerService extends IWindowManager.Stub } } if (force || unfrozeWindows) { - if (DEBUG_ORIENTATION) Slog.v(TAG, "No longer freezing: " + wtoken); + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "No longer freezing: " + wtoken); wtoken.mAppAnimator.freezingScreen = false; wtoken.mAppAnimator.lastFreezeDuration = (int)(SystemClock.elapsedRealtime() - mDisplayFreezeTime); @@ -4307,7 +4305,7 @@ public class WindowManagerService extends IWindowManager.Stub e = new RuntimeException(); e.fillInStackTrace(); } - Slog.i(TAG, "Set freezing of " + wtoken.appToken + Slog.i(TAG_WM, "Set freezing of " + wtoken.appToken + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.mAppAnimator.freezingScreen, e); } @@ -4339,13 +4337,13 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { if (configChanges == 0 && okToDisplay()) { - if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping set freeze of " + token); + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Skipping set freeze of " + token); return; } AppWindowToken wtoken = findAppWindowToken(token); if (wtoken == null || wtoken.appToken == null) { - Slog.w(TAG, "Attempted to freeze screen with non-existing app token: " + wtoken); + Slog.w(TAG_WM, "Attempted to freeze screen with non-existing app token: " + wtoken); return; } final long origId = Binder.clearCallingIdentity(); @@ -4367,7 +4365,7 @@ public class WindowManagerService extends IWindowManager.Stub return; } final long origId = Binder.clearCallingIdentity(); - if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + token + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Clear freezing of " + token + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.mAppAnimator.freezingScreen); unsetAppFreezingScreenLocked(wtoken, true, force); Binder.restoreCallingIdentity(origId); @@ -4389,7 +4387,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { WindowToken basewtoken = mTokenMap.remove(token); if (basewtoken != null && (wtoken=basewtoken.appWindowToken) != null) { - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Removing app token: " + wtoken); + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "Removing app token: " + wtoken); delayed = setTokenVisibilityLocked(wtoken, null, false, AppTransition.TRANSIT_UNSET, true, wtoken.voiceInteraction); wtoken.inPendingTransaction = false; @@ -4402,15 +4400,15 @@ public class WindowManagerService extends IWindowManager.Stub delayed = true; } if (DEBUG_APP_TRANSITIONS) Slog.v( - TAG, "Removing app " + wtoken + " delayed=" + delayed + TAG_WM, "Removing app " + wtoken + " delayed=" + delayed + " animation=" + wtoken.mAppAnimator.animation + " animating=" + wtoken.mAppAnimator.animating); - if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, "removeAppToken: " + if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG_WM, "removeAppToken: " + wtoken + " delayed=" + delayed + " Callers=" + Debug.getCallers(4)); final TaskStack stack = wtoken.mTask.mStack; if (delayed && !wtoken.allAppWindows.isEmpty()) { // set the token aside because it has an active animation to be finished - if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, + if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG_WM, "removeAppToken make exiting: " + wtoken); stack.mExitingAppTokens.add(wtoken); wtoken.mIsExiting = true; @@ -4429,13 +4427,13 @@ public class WindowManagerService extends IWindowManager.Stub } unsetAppFreezingScreenLocked(wtoken, true, true); if (mFocusedApp == wtoken) { - if (DEBUG_FOCUS_LIGHT) Slog.v(TAG, "Removing focused app token:" + wtoken); + if (DEBUG_FOCUS_LIGHT) Slog.v(TAG_WM, "Removing focused app token:" + wtoken); mFocusedApp = null; updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/); mInputMonitor.setFocusedAppLw(null); } } else { - Slog.w(TAG, "Attempted to remove non-existing app token: " + token); + Slog.w(TAG_WM, "Attempted to remove non-existing app token: " + token); } if (!delayed && wtoken != null) { @@ -4455,7 +4453,7 @@ public class WindowManagerService extends IWindowManager.Stub return; } if (wtoken != null && wtoken.startingWindow != null) { - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, Debug.getCallers(1) + + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, Debug.getCallers(1) + ": Schedule remove starting " + wtoken + (wtoken != null ? " startingWindow=" + wtoken.startingWindow : "")); Message m = mH.obtainMessage(H.REMOVE_STARTING, wtoken); @@ -4467,16 +4465,16 @@ public class WindowManagerService extends IWindowManager.Stub final int numStacks = mStackIdToStack.size(); for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { final TaskStack stack = mStackIdToStack.valueAt(stackNdx); - Slog.v(TAG, " Stack #" + stack.mStackId + " tasks from bottom to top:"); + Slog.v(TAG_WM, " Stack #" + stack.mStackId + " tasks from bottom to top:"); final ArrayList<Task> tasks = stack.getTasks(); final int numTasks = tasks.size(); for (int taskNdx = 0; taskNdx < numTasks; ++taskNdx) { final Task task = tasks.get(taskNdx); - Slog.v(TAG, " Task #" + task.mTaskId + " activities from bottom to top:"); + Slog.v(TAG_WM, " Task #" + task.mTaskId + " activities from bottom to top:"); AppTokenList tokens = task.mAppTokens; final int numTokens = tokens.size(); for (int tokenNdx = 0; tokenNdx < numTokens; ++tokenNdx) { - Slog.v(TAG, " activity #" + tokenNdx + ": " + tokens.get(tokenNdx).token); + Slog.v(TAG_WM, " activity #" + tokenNdx + ": " + tokens.get(tokenNdx).token); } } } @@ -4486,10 +4484,10 @@ public class WindowManagerService extends IWindowManager.Stub final int numDisplays = mDisplayContents.size(); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx); - Slog.v(TAG, " Display #" + displayContent.getDisplayId()); + Slog.v(TAG_WM, " Display #" + displayContent.getDisplayId()); final WindowList windows = displayContent.getWindowList(); for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { - Slog.v(TAG, " #" + winNdx + ": " + windows.get(winNdx)); + Slog.v(TAG_WM, " #" + winNdx + ": " + windows.get(winNdx)); } } } @@ -4502,21 +4500,21 @@ public class WindowManagerService extends IWindowManager.Stub for (int j=0; j<NCW; j++) { WindowState cwin = win.mChildWindows.get(j); if (!winAdded && cwin.mSubLayer >= 0) { - if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding child window at " + if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "Re-adding child window at " + index + ": " + cwin); win.mRebuilding = false; windows.add(index, win); index++; winAdded = true; } - if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at " + if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "Re-adding window at " + index + ": " + cwin); cwin.mRebuilding = false; windows.add(index, cwin); index++; } if (!winAdded) { - if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at " + if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "Re-adding window at " + index + ": " + win); win.mRebuilding = false; windows.add(index, win); @@ -4623,7 +4621,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { Task task = mTaskIdToTask.get(taskId); if (task == null) { - Slog.e(TAG, "moveTaskToBottom: taskId=" + taskId + Slog.e(TAG_WM, "moveTaskToBottom: taskId=" + taskId + " not found in mTaskIdToTask"); return; } @@ -4667,7 +4665,7 @@ public class WindowManagerService extends IWindowManager.Stub if (displayContent != null) { TaskStack stack = mStackIdToStack.get(stackId); if (stack == null) { - if (DEBUG_STACK) Slog.d(TAG, "attachStack: stackId=" + stackId); + if (DEBUG_STACK) Slog.d(TAG_WM, "attachStack: stackId=" + stackId); stack = new TaskStack(this, stackId); mStackIdToStack.put(stackId, stack); } @@ -4723,7 +4721,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { Task task = mTaskIdToTask.get(taskId); if (task == null) { - if (DEBUG_STACK) Slog.i(TAG, "removeTask: could not find taskId=" + taskId); + if (DEBUG_STACK) Slog.i(TAG_WM, "removeTask: could not find taskId=" + taskId); return; } task.removeLocked(); @@ -4752,11 +4750,11 @@ public class WindowManagerService extends IWindowManager.Stub public void addTask(int taskId, int stackId, boolean toTop) { synchronized (mWindowMap) { - if (DEBUG_STACK) Slog.i(TAG, "addTask: adding taskId=" + taskId + if (DEBUG_STACK) Slog.i(TAG_WM, "addTask: adding taskId=" + taskId + " to " + (toTop ? "top" : "bottom")); Task task = mTaskIdToTask.get(taskId); if (task == null) { - if (DEBUG_STACK) Slog.i(TAG, "addTask: could not find taskId=" + taskId); + if (DEBUG_STACK) Slog.i(TAG_WM, "addTask: could not find taskId=" + taskId); return; } TaskStack stack = mStackIdToStack.get(stackId); @@ -4769,16 +4767,16 @@ public class WindowManagerService extends IWindowManager.Stub public void moveTaskToStack(int taskId, int stackId, boolean toTop) { synchronized (mWindowMap) { - if (DEBUG_STACK) Slog.i(TAG, "moveTaskToStack: moving taskId=" + taskId + if (DEBUG_STACK) Slog.i(TAG_WM, "moveTaskToStack: moving taskId=" + taskId + " to stackId=" + stackId + " at " + (toTop ? "top" : "bottom")); Task task = mTaskIdToTask.get(taskId); if (task == null) { - if (DEBUG_STACK) Slog.i(TAG, "moveTaskToStack: could not find taskId=" + taskId); + if (DEBUG_STACK) Slog.i(TAG_WM, "moveTaskToStack: could not find taskId=" + taskId); return; } TaskStack stack = mStackIdToStack.get(stackId); if (stack == null) { - if (DEBUG_STACK) Slog.i(TAG, "moveTaskToStack: could not find stackId=" + stackId); + if (DEBUG_STACK) Slog.i(TAG_WM, "moveTaskToStack: could not find stackId=" + stackId); return; } task.moveTaskToStack(stack, toTop); @@ -4803,7 +4801,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { Task task = mTaskIdToTask.get(taskId); if (task == null) { - if (DEBUG_STACK) Slog.i(TAG, "scheduleShowToast: could not find taskId=" + taskId); + if (DEBUG_STACK) Slog.i(TAG_WM, "scheduleShowToast: could not find taskId=" + taskId); return; } task.setShowNonResizeableDockToast(); @@ -4849,17 +4847,17 @@ public class WindowManagerService extends IWindowManager.Stub public void positionTaskInStack(int taskId, int stackId, int position, Rect bounds, Configuration config) { synchronized (mWindowMap) { - if (DEBUG_STACK) Slog.i(TAG, "positionTaskInStack: positioning taskId=" + taskId + if (DEBUG_STACK) Slog.i(TAG_WM, "positionTaskInStack: positioning taskId=" + taskId + " in stackId=" + stackId + " at " + position); Task task = mTaskIdToTask.get(taskId); if (task == null) { - if (DEBUG_STACK) Slog.i(TAG, + if (DEBUG_STACK) Slog.i(TAG_WM, "positionTaskInStack: could not find taskId=" + taskId); return; } TaskStack stack = mStackIdToStack.get(stackId); if (stack == null) { - if (DEBUG_STACK) Slog.i(TAG, + if (DEBUG_STACK) Slog.i(TAG_WM, "positionTaskInStack: could not find stackId=" + stackId); return; } @@ -5000,7 +4998,7 @@ public class WindowManagerService extends IWindowManager.Stub // If this isn't coming from the system then don't allow disabling the lockscreen // to bypass security. if (Binder.getCallingUid() != Process.SYSTEM_UID && isKeyguardSecure()) { - Log.d(TAG, "current mode is SecurityMode, ignore hide keyguard"); + Log.d(TAG_WM, "current mode is SecurityMode, ignore hide keyguard"); return; } @@ -5091,7 +5089,7 @@ public class WindowManagerService extends IWindowManager.Stub != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Requires DISABLE_KEYGUARD permission"); } - if (DEBUG_KEYGUARD) Slog.d(TAG, "keyguardGoingAway: disableWinAnim=" + if (DEBUG_KEYGUARD) Slog.d(TAG_WM, "keyguardGoingAway: disableWinAnim=" + disableWindowAnimations + " kgToNotifShade=" + keyguardGoingToNotificationShade); synchronized (mWindowMap) { mAnimator.mKeyguardGoingAway = true; @@ -5102,14 +5100,14 @@ public class WindowManagerService extends IWindowManager.Stub } public void keyguardWaitingForActivityDrawn() { - if (DEBUG_KEYGUARD) Slog.d(TAG, "keyguardWaitingForActivityDrawn"); + if (DEBUG_KEYGUARD) Slog.d(TAG_WM, "keyguardWaitingForActivityDrawn"); synchronized (mWindowMap) { mKeyguardWaitingForActivityDrawn = true; } } public void notifyActivityDrawnForKeyguard() { - if (DEBUG_KEYGUARD) Slog.d(TAG, "notifyActivityDrawnForKeyguard: waiting=" + if (DEBUG_KEYGUARD) Slog.d(TAG_WM, "notifyActivityDrawnForKeyguard: waiting=" + mKeyguardWaitingForActivityDrawn + " Callers=" + Debug.getCallers(5)); synchronized (mWindowMap) { if (mKeyguardWaitingForActivityDrawn) { @@ -5260,6 +5258,12 @@ public class WindowManagerService extends IWindowManager.Stub // Called by window manager policy. Not exposed externally. @Override + public void lockDeviceNow() { + lockNow(null); + } + + // Called by window manager policy. Not exposed externally. + @Override public int getCameraLensCoverState() { int sw = mInputManager.getSwitchState(-1, InputDevice.SOURCE_ANY, InputManagerService.SW_CAMERA_LENS_COVER); @@ -5331,7 +5335,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_BOOT) { RuntimeException here = new RuntimeException("here"); here.fillInStackTrace(); - Slog.i(TAG, "enableScreenAfterBoot: mDisplayEnabled=" + mDisplayEnabled + Slog.i(TAG_WM, "enableScreenAfterBoot: mDisplayEnabled=" + mDisplayEnabled + " mForceDisplayEnabled=" + mForceDisplayEnabled + " mShowingBootMessages=" + mShowingBootMessages + " mSystemBooted=" + mSystemBooted, here); @@ -5362,7 +5366,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_BOOT) { RuntimeException here = new RuntimeException("here"); here.fillInStackTrace(); - Slog.i(TAG, "enableScreenIfNeededLocked: mDisplayEnabled=" + mDisplayEnabled + Slog.i(TAG_WM, "enableScreenIfNeededLocked: mDisplayEnabled=" + mDisplayEnabled + " mForceDisplayEnabled=" + mForceDisplayEnabled + " mShowingBootMessages=" + mShowingBootMessages + " mSystemBooted=" + mSystemBooted, here); @@ -5381,7 +5385,7 @@ public class WindowManagerService extends IWindowManager.Stub if (mDisplayEnabled) { return; } - Slog.w(TAG, "***** BOOT TIMEOUT: forcing display enabled"); + Slog.w(TAG_WM, "***** BOOT TIMEOUT: forcing display enabled"); mForceDisplayEnabled = true; } performEnableScreen(); @@ -5420,7 +5424,7 @@ public class WindowManagerService extends IWindowManager.Stub } if (DEBUG_SCREEN_ON || DEBUG_BOOT) { - Slog.i(TAG, "******** booted=" + mSystemBooted + " msg=" + mShowingBootMessages + Slog.i(TAG_WM, "******** booted=" + mSystemBooted + " msg=" + mShowingBootMessages + " haveBoot=" + haveBootMsg + " haveApp=" + haveApp + " haveWall=" + haveWallpaper + " wallEnabled=" + wallpaperEnabled + " haveKeyguard=" + haveKeyguard); @@ -5445,7 +5449,7 @@ public class WindowManagerService extends IWindowManager.Stub public void performEnableScreen() { synchronized(mWindowMap) { - if (DEBUG_BOOT) Slog.i(TAG, "performEnableScreen: mDisplayEnabled=" + mDisplayEnabled + if (DEBUG_BOOT) Slog.i(TAG_WM, "performEnableScreen: mDisplayEnabled=" + mDisplayEnabled + " mForceDisplayEnabled=" + mForceDisplayEnabled + " mShowingBootMessages=" + mShowingBootMessages + " mSystemBooted=" + mSystemBooted @@ -5469,7 +5473,7 @@ public class WindowManagerService extends IWindowManager.Stub try { IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger"); if (surfaceFlinger != null) { - //Slog.i(TAG, "******* TELLING SURFACE FLINGER WE ARE BOOTED!"); + //Slog.i(TAG_WM, "******* TELLING SURFACE FLINGER WE ARE BOOTED!"); Parcel data = Parcel.obtain(); data.writeInterfaceToken("android.ui.ISurfaceComposer"); surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHED @@ -5477,20 +5481,20 @@ public class WindowManagerService extends IWindowManager.Stub data.recycle(); } } catch (RemoteException ex) { - Slog.e(TAG, "Boot completed: SurfaceFlinger is dead!"); + Slog.e(TAG_WM, "Boot completed: SurfaceFlinger is dead!"); } mBootAnimationStopped = true; } if (!mForceDisplayEnabled && !checkBootAnimationCompleteLocked()) { - if (DEBUG_BOOT) Slog.i(TAG, "performEnableScreen: Waiting for anim complete"); + if (DEBUG_BOOT) Slog.i(TAG_WM, "performEnableScreen: Waiting for anim complete"); return; } EventLog.writeEvent(EventLogTags.WM_BOOT_ANIMATION_DONE, SystemClock.uptimeMillis()); Trace.asyncTraceEnd(Trace.TRACE_TAG_WINDOW_MANAGER, "Stop bootanim", 0); mDisplayEnabled = true; - if (DEBUG_SCREEN_ON || DEBUG_BOOT) Slog.i(TAG, "******************** ENABLING SCREEN!"); + if (DEBUG_SCREEN_ON || DEBUG_BOOT) Slog.i(TAG_WM, "******************** ENABLING SCREEN!"); // Enable input dispatch. mInputMonitor.setEventDispatchingLw(mEventDispatchingEnabled); @@ -5512,10 +5516,10 @@ public class WindowManagerService extends IWindowManager.Stub mH.removeMessages(H.CHECK_IF_BOOT_ANIMATION_FINISHED); mH.sendEmptyMessageDelayed(H.CHECK_IF_BOOT_ANIMATION_FINISHED, BOOT_ANIMATION_POLL_INTERVAL); - if (DEBUG_BOOT) Slog.i(TAG, "checkBootAnimationComplete: Waiting for anim complete"); + if (DEBUG_BOOT) Slog.i(TAG_WM, "checkBootAnimationComplete: Waiting for anim complete"); return false; } - if (DEBUG_BOOT) Slog.i(TAG, "checkBootAnimationComplete: Animation complete!"); + if (DEBUG_BOOT) Slog.i(TAG_WM, "checkBootAnimationComplete: Animation complete!"); return true; } @@ -5525,7 +5529,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_BOOT) { RuntimeException here = new RuntimeException("here"); here.fillInStackTrace(); - Slog.i(TAG, "showBootMessage: msg=" + msg + " always=" + always + Slog.i(TAG_WM, "showBootMessage: msg=" + msg + " always=" + always + " mAllowBootMessages=" + mAllowBootMessages + " mShowingBootMessages=" + mShowingBootMessages + " mSystemBooted=" + mSystemBooted, here); @@ -5554,7 +5558,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_BOOT) { RuntimeException here = new RuntimeException("here"); here.fillInStackTrace(); - Slog.i(TAG, "hideBootMessagesLocked: mDisplayEnabled=" + mDisplayEnabled + Slog.i(TAG_WM, "hideBootMessagesLocked: mDisplayEnabled=" + mDisplayEnabled + " mForceDisplayEnabled=" + mForceDisplayEnabled + " mShowingBootMessages=" + mShowingBootMessages + " mSystemBooted=" + mSystemBooted, here); @@ -5605,7 +5609,7 @@ public class WindowManagerService extends IWindowManager.Stub public void showCircularMask(boolean visible) { synchronized(mWindowMap) { - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, ">>> OPEN TRANSACTION showCircularMask(visible=" + visible + ")"); SurfaceControl.openTransaction(); try { @@ -5631,7 +5635,7 @@ public class WindowManagerService extends IWindowManager.Stub } } finally { SurfaceControl.closeTransaction(); - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, "<<< CLOSE TRANSACTION showCircularMask(visible=" + visible + ")"); } } @@ -5640,7 +5644,7 @@ public class WindowManagerService extends IWindowManager.Stub public void showEmulatorDisplayOverlay() { synchronized(mWindowMap) { - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, ">>> OPEN TRANSACTION showEmulatorDisplayOverlay"); SurfaceControl.openTransaction(); try { @@ -5656,7 +5660,7 @@ public class WindowManagerService extends IWindowManager.Stub mEmulatorDisplayOverlay.setVisibility(true); } finally { SurfaceControl.closeTransaction(); - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, "<<< CLOSE TRANSACTION showEmulatorDisplayOverlay"); } } @@ -5695,7 +5699,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (SHOW_VERBOSE_TRANSACTIONS) Slog.i(TAG, + if (SHOW_VERBOSE_TRANSACTIONS) Slog.i(TAG_WM, ">>> OPEN TRANSACTION showStrictModeViolation"); SurfaceControl.openTransaction(); try { @@ -5707,7 +5711,7 @@ public class WindowManagerService extends IWindowManager.Stub mStrictModeFlash.setVisibility(on); } finally { SurfaceControl.closeTransaction(); - if (SHOW_VERBOSE_TRANSACTIONS) Slog.i(TAG, + if (SHOW_VERBOSE_TRANSACTIONS) Slog.i(TAG_WM, "<<< CLOSE TRANSACTION showStrictModeViolation"); } } @@ -5794,7 +5798,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { displayContent = getDisplayContentLocked(displayId); if (displayContent == null) { - if (DEBUG_SCREENSHOT) Slog.i(TAG, "Screenshot of " + appToken + if (DEBUG_SCREENSHOT) Slog.i(TAG_WM, "Screenshot of " + appToken + ": returning null. No Display for displayId=" + displayId); return null; } @@ -5803,7 +5807,7 @@ public class WindowManagerService extends IWindowManager.Stub int dw = displayInfo.logicalWidth; int dh = displayInfo.logicalHeight; if (dw == 0 || dh == 0) { - if (DEBUG_SCREENSHOT) Slog.i(TAG, "Screenshot of " + appToken + if (DEBUG_SCREENSHOT) Slog.i(TAG_WM, "Screenshot of " + appToken + ": returning null. logical widthxheight=" + dw + "x" + dh); return null; } @@ -5925,21 +5929,21 @@ public class WindowManagerService extends IWindowManager.Stub if (appToken != null && appWin == null) { // Can't find a window to snapshot. - if (DEBUG_SCREENSHOT) Slog.i(TAG, + if (DEBUG_SCREENSHOT) Slog.i(TAG_WM, "Screenshot: Couldn't find a surface matching " + appToken); return null; } if (!screenshotReady) { if (retryCount > MAX_SCREENSHOT_RETRIES) { - Slog.i(TAG, "Screenshot max retries " + retryCount + " of " + appToken + + Slog.i(TAG_WM, "Screenshot max retries " + retryCount + " of " + appToken + " appWin=" + (appWin == null ? "null" : (appWin + " drawState=" + appWin.mWinAnimator.mDrawState))); return null; } // Delay and hope that window gets drawn. - if (DEBUG_SCREENSHOT) Slog.i(TAG, "Screenshot: No image ready for " + appToken + if (DEBUG_SCREENSHOT) Slog.i(TAG_WM, "Screenshot: No image ready for " + appToken + ", " + appWin + " drawState=" + appWin.mWinAnimator.mDrawState); continue; } @@ -5950,7 +5954,7 @@ public class WindowManagerService extends IWindowManager.Stub // taken. if (maxLayer == 0) { - if (DEBUG_SCREENSHOT) Slog.i(TAG, "Screenshot of " + appToken + if (DEBUG_SCREENSHOT) Slog.i(TAG_WM, "Screenshot of " + appToken + ": returning null maxLayer=" + maxLayer); return null; } @@ -5998,11 +6002,11 @@ public class WindowManagerService extends IWindowManager.Stub convertCropForSurfaceFlinger(crop, rot, dw, dh); if (DEBUG_SCREENSHOT) { - Slog.i(TAG, "Screenshot: " + dw + "x" + dh + " from " + minLayer + " to " + Slog.i(TAG_WM, "Screenshot: " + dw + "x" + dh + " from " + minLayer + " to " + maxLayer + " appToken=" + appToken); for (int i = 0; i < windows.size(); i++) { WindowState win = windows.get(i); - Slog.i(TAG, win + ": " + win.mLayer + Slog.i(TAG_WM, win + ": " + win.mLayer + " animLayer=" + win.mWinAnimator.mAnimLayer + " surfaceLayer=" + win.mWinAnimator.mSurfaceController.getLayer()); } @@ -6012,13 +6016,13 @@ public class WindowManagerService extends IWindowManager.Stub mAnimator.getScreenRotationAnimationLocked(Display.DEFAULT_DISPLAY); final boolean inRotation = screenRotationAnimation != null && screenRotationAnimation.isAnimating(); - if (DEBUG_SCREENSHOT && inRotation) Slog.v(TAG, + if (DEBUG_SCREENSHOT && inRotation) Slog.v(TAG_WM, "Taking screenshot while rotating"); bm = SurfaceControl.screenshot(crop, width, height, minLayer, maxLayer, inRotation, rot); if (bm == null) { - Slog.w(TAG, "Screenshot failure taking screenshot for (" + dw + "x" + dh + Slog.w(TAG_WM, "Screenshot failure taking screenshot for (" + dw + "x" + dh + ") to layer " + maxLayer); return null; } @@ -6040,7 +6044,7 @@ public class WindowManagerService extends IWindowManager.Stub } } if (allBlack) { - Slog.i(TAG, "Screenshot " + appWin + " was monochrome(" + + Slog.i(TAG_WM, "Screenshot " + appWin + " was monochrome(" + Integer.toHexString(firstColor) + ")! mSurfaceLayer=" + (appWin != null ? appWin.mWinAnimator.mSurfaceController.getLayer() : "null") + @@ -6072,7 +6076,7 @@ public class WindowManagerService extends IWindowManager.Stub + "rotation constant."); } - if (DEBUG_ORIENTATION) Slog.v(TAG, "freezeRotation: mRotation=" + mRotation); + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "freezeRotation: mRotation=" + mRotation); long origId = Binder.clearCallingIdentity(); try { @@ -6096,7 +6100,7 @@ public class WindowManagerService extends IWindowManager.Stub throw new SecurityException("Requires SET_ORIENTATION permission"); } - if (DEBUG_ORIENTATION) Slog.v(TAG, "thawRotation: mRotation=" + mRotation); + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "thawRotation: mRotation=" + mRotation); long origId = Binder.clearCallingIdentity(); try { @@ -6150,7 +6154,7 @@ public class WindowManagerService extends IWindowManager.Stub } public void updateRotationUnchecked(boolean alwaysSendConfiguration, boolean forceRelayout) { - if(DEBUG_ORIENTATION) Slog.v(TAG, "updateRotationUnchecked(" + if(DEBUG_ORIENTATION) Slog.v(TAG_WM, "updateRotationUnchecked(" + "alwaysSendConfiguration=" + alwaysSendConfiguration + ")"); long origId = Binder.clearCallingIdentity(); @@ -6181,7 +6185,7 @@ public class WindowManagerService extends IWindowManager.Stub if (mDeferredRotationPauseCount > 0) { // Rotation updates have been paused temporarily. Defer the update until // updates have been resumed. - if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, rotation is paused."); + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Deferring rotation, rotation is paused."); return false; } @@ -6191,13 +6195,13 @@ public class WindowManagerService extends IWindowManager.Stub // Rotation updates cannot be performed while the previous rotation change // animation is still in progress. Skip this update. We will try updating // again after the animation is finished and the display is unfrozen. - if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, animation in progress."); + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Deferring rotation, animation in progress."); return false; } if (!mDisplayEnabled) { // No point choosing a rotation if the display is not enabled. - if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, display is not enabled."); + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Deferring rotation, display is not enabled."); return false; } @@ -6211,7 +6215,7 @@ public class WindowManagerService extends IWindowManager.Stub mForcedAppOrientation, rotation); if (DEBUG_ORIENTATION) { - Slog.v(TAG, "Application requested orientation " + Slog.v(TAG_WM, "Application requested orientation " + mForcedAppOrientation + ", got rotation " + rotation + " which has " + (altOrientation ? "incompatible" : "compatible") + " metrics"); @@ -6223,7 +6227,7 @@ public class WindowManagerService extends IWindowManager.Stub } if (DEBUG_ORIENTATION) { - Slog.v(TAG, + Slog.v(TAG_WM, "Rotation changed to " + rotation + (altOrientation ? " (alt)" : "") + " from " + mRotation + (mAltOrientation ? " (alt)" : "") + ", forceApp=" + mForcedAppOrientation); @@ -6260,7 +6264,7 @@ public class WindowManagerService extends IWindowManager.Stub final DisplayInfo displayInfo = displayContent.getDisplayInfo(); if (!inTransaction) { if (SHOW_TRANSACTIONS) { - Slog.i(TAG, ">>> OPEN TRANSACTION setRotationUnchecked"); + Slog.i(TAG_WM, ">>> OPEN TRANSACTION setRotationUnchecked"); } SurfaceControl.openTransaction(); } @@ -6282,7 +6286,7 @@ public class WindowManagerService extends IWindowManager.Stub if (!inTransaction) { SurfaceControl.closeTransaction(); if (SHOW_LIGHT_TRANSACTIONS) { - Slog.i(TAG, "<<< CLOSE TRANSACTION setRotationUnchecked"); + Slog.i(TAG_WM, "<<< CLOSE TRANSACTION setRotationUnchecked"); } } } @@ -6295,7 +6299,7 @@ public class WindowManagerService extends IWindowManager.Stub w.mAppToken.destroySavedSurfaces(); } if (w.mHasSurface) { - if (DEBUG_ORIENTATION) Slog.v(TAG, "Set mOrientationChanging of " + w); + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Set mOrientationChanging of " + w); w.mOrientationChanging = true; mWindowPlacerLocked.mOrientationChangeComplete = false; } @@ -6465,7 +6469,7 @@ public class WindowManagerService extends IWindowManager.Stub try { return mViewServer.start(); } catch (IOException e) { - Slog.w(TAG, "View server did not start"); + Slog.w(TAG_WM, "View server did not start"); } } return false; @@ -6475,7 +6479,7 @@ public class WindowManagerService extends IWindowManager.Stub mViewServer = new ViewServer(this, port); return mViewServer.start(); } catch (IOException e) { - Slog.w(TAG, "View server did not start"); + Slog.w(TAG_WM, "View server did not start"); } return false; } @@ -6709,7 +6713,7 @@ public class WindowManagerService extends IWindowManager.Stub } } catch (Exception e) { - Slog.w(TAG, "Could not send command " + command + " with parameters " + parameters, e); + Slog.w(TAG_WM, "Could not send command " + command + " with parameters " + parameters, e); success = false; } finally { if (data != null) { @@ -6980,7 +6984,7 @@ public class WindowManagerService extends IWindowManager.Stub displayContent.mBaseDisplayRect.set(0, 0, dw, dh); if (false) { - Slog.i(TAG, "Set app display size: " + appWidth + " x " + appHeight); + Slog.i(TAG_WM, "Set app display size: " + appWidth + " x " + appHeight); } mCompatibleScreenScale = CompatibilityInfo.computeCompatibleScaling(mDisplayMetrics, @@ -7123,7 +7127,7 @@ public class WindowManagerService extends IWindowManager.Stub } private void startScrollingTask(DisplayContent displayContent, int startX, int startY) { - if (DEBUG_TASK_POSITIONING) Slog.d(TAG, + if (DEBUG_TASK_POSITIONING) Slog.d(TAG_WM, "startScrollingTask: " + "{" + startX + ", " + startY + "}"); Task task = null; @@ -7158,22 +7162,22 @@ public class WindowManagerService extends IWindowManager.Stub private boolean startPositioningLocked( WindowState win, boolean resize, float startX, float startY) { - if (DEBUG_TASK_POSITIONING) Slog.d(TAG, "startPositioningLocked: " + if (DEBUG_TASK_POSITIONING) Slog.d(TAG_WM, "startPositioningLocked: " + "win=" + win + ", resize=" + resize + ", {" + startX + ", " + startY + "}"); if (win == null || win.getAppToken() == null) { - Slog.w(TAG, "startPositioningLocked: Bad window " + win); + Slog.w(TAG_WM, "startPositioningLocked: Bad window " + win); return false; } if (win.mInputChannel == null) { - Slog.wtf(TAG, "startPositioningLocked: " + win + " has no input channel, " + Slog.wtf(TAG_WM, "startPositioningLocked: " + win + " has no input channel, " + " probably being removed"); return false; } final DisplayContent displayContent = win.getDisplayContent(); if (displayContent == null) { - Slog.w(TAG, "startPositioningLocked: Invalid display content " + win); + Slog.w(TAG_WM, "startPositioningLocked: Invalid display content " + win); return false; } @@ -7183,7 +7187,7 @@ public class WindowManagerService extends IWindowManager.Stub mInputMonitor.updateInputWindowsLw(true /*force*/); if (!mInputManager.transferTouchFocus( win.mInputChannel, mTaskPositioner.mServerChannel)) { - Slog.e(TAG, "startPositioningLocked: Unable to transfer touch focus"); + Slog.e(TAG_WM, "startPositioningLocked: Unable to transfer touch focus"); mTaskPositioner.unregister(); mTaskPositioner = null; mInputMonitor.updateInputWindowsLw(true /*force*/); @@ -7196,7 +7200,7 @@ public class WindowManagerService extends IWindowManager.Stub private void finishPositioning() { if (DEBUG_TASK_POSITIONING) { - Slog.d(TAG, "finishPositioning"); + Slog.d(TAG_WM, "finishPositioning"); } synchronized (mWindowMap) { if (mTaskPositioner != null) { @@ -7214,7 +7218,7 @@ public class WindowManagerService extends IWindowManager.Stub IBinder prepareDragSurface(IWindow window, SurfaceSession session, int flags, int width, int height, Surface outSurface) { if (DEBUG_DRAG) { - Slog.d(TAG, "prepare drag surface: w=" + width + " h=" + height + Slog.d(TAG_WM, "prepare drag surface: w=" + width + " h=" + height + " flags=" + Integer.toHexString(flags) + " win=" + window + " asbinder=" + window.asBinder()); } @@ -7241,7 +7245,7 @@ public class WindowManagerService extends IWindowManager.Stub } surface.setAlpha(alpha); - if (SHOW_TRANSACTIONS) Slog.i(TAG, " DRAG " + if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " DRAG " + surface + ": CREATE"); outSurface.copyFrom(surface); final IBinder winBinder = window.asBinder(); @@ -7257,10 +7261,10 @@ public class WindowManagerService extends IWindowManager.Stub Message msg = mH.obtainMessage(H.DRAG_START_TIMEOUT, winBinder); mH.sendMessageDelayed(msg, 5000); } else { - Slog.w(TAG, "Drag already in progress"); + Slog.w(TAG_WM, "Drag already in progress"); } } catch (OutOfResourcesException e) { - Slog.e(TAG, "Can't allocate drag surface w=" + width + " h=" + height, e); + Slog.e(TAG_WM, "Can't allocate drag surface w=" + width + " h=" + height, e); if (mDragState != null) { mDragState.reset(); mDragState = null; @@ -7339,7 +7343,7 @@ public class WindowManagerService extends IWindowManager.Stub public boolean detectSafeMode() { if (!mInputMonitor.waitForInputDevicesReady( INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS)) { - Slog.w(TAG, "Devices still not ready after waiting " + Slog.w(TAG_WM, "Devices still not ready after waiting " + INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS + " milliseconds before attempting to detect safe mode."); } @@ -7363,10 +7367,10 @@ public class WindowManagerService extends IWindowManager.Stub } catch (IllegalArgumentException e) { } if (mSafeMode) { - Log.i(TAG, "SAFE MODE ENABLED (menu=" + menuState + " s=" + sState + Log.i(TAG_WM, "SAFE MODE ENABLED (menu=" + menuState + " s=" + sState + " dpad=" + dpadState + " trackball=" + trackballState + ")"); } else { - Log.i(TAG, "SAFE MODE not enabled"); + Log.i(TAG_WM, "SAFE MODE not enabled"); } mPolicy.setSafeMode(mSafeMode); return mSafeMode; @@ -7487,7 +7491,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void handleMessage(Message msg) { if (DEBUG_WINDOW_TRACE) { - Slog.v(TAG, "handleMessage: entry what=" + msg.what); + Slog.v(TAG_WM, "handleMessage: entry what=" + msg.what); } switch (msg.what) { case REPORT_FOCUS_CHANGE: { @@ -7510,11 +7514,11 @@ public class WindowManagerService extends IWindowManager.Stub return; } mLastFocus = newFocus; - if (DEBUG_FOCUS_LIGHT) Slog.i(TAG, "Focus moving from " + lastFocus + + if (DEBUG_FOCUS_LIGHT) Slog.i(TAG_WM, "Focus moving from " + lastFocus + " to " + newFocus); if (newFocus != null && lastFocus != null && !newFocus.isDisplayedLw()) { - //Slog.i(TAG, "Delaying loss of focus..."); + //Slog.i(TAG_WM, "Delaying loss of focus..."); mLosingFocus.add(lastFocus); lastFocus = null; } @@ -7529,13 +7533,13 @@ public class WindowManagerService extends IWindowManager.Stub //System.out.println("Changing focus from " + lastFocus // + " to " + newFocus); if (newFocus != null) { - if (DEBUG_FOCUS_LIGHT) Slog.i(TAG, "Gaining focus: " + newFocus); + if (DEBUG_FOCUS_LIGHT) Slog.i(TAG_WM, "Gaining focus: " + newFocus); newFocus.reportFocusChangedSerialized(true, mInTouchMode); notifyFocusChanged(); } if (lastFocus != null) { - if (DEBUG_FOCUS_LIGHT) Slog.i(TAG, "Losing focus: " + lastFocus); + if (DEBUG_FOCUS_LIGHT) Slog.i(TAG_WM, "Losing focus: " + lastFocus); lastFocus.reportFocusChangedSerialized(false, mInTouchMode); } } break; @@ -7550,7 +7554,7 @@ public class WindowManagerService extends IWindowManager.Stub final int N = losers.size(); for (int i=0; i<N; i++) { - if (DEBUG_FOCUS_LIGHT) Slog.i(TAG, "Losing delayed focus: " + + if (DEBUG_FOCUS_LIGHT) Slog.i(TAG_WM, "Losing delayed focus: " + losers.get(i)); losers.get(i).reportFocusChangedSerialized(false, mInTouchMode); } @@ -7571,7 +7575,7 @@ public class WindowManagerService extends IWindowManager.Stub return; } - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Add starting " + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Add starting " + wtoken + ": pkg=" + sd.pkg); View view = null; @@ -7580,7 +7584,7 @@ public class WindowManagerService extends IWindowManager.Stub wtoken.token, sd.pkg, sd.theme, sd.compatInfo, sd.nonLocalizedLabel, sd.labelRes, sd.icon, sd.logo, sd.windowFlags); } catch (Exception e) { - Slog.w(TAG, "Exception when adding starting window", e); + Slog.w(TAG_WM, "Exception when adding starting window", e); } if (view != null) { @@ -7591,7 +7595,7 @@ public class WindowManagerService extends IWindowManager.Stub // If the window was successfully added, then // we need to remove it. if (wtoken.startingWindow != null) { - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Aborted starting " + wtoken + ": removed=" + wtoken.removed + " startingData=" + wtoken.startingData); @@ -7602,7 +7606,7 @@ public class WindowManagerService extends IWindowManager.Stub } else { wtoken.startingView = view; } - if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG, + if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG_WM, "Added starting " + wtoken + ": startingWindow=" + wtoken.startingWindow + " startingView=" @@ -7613,7 +7617,7 @@ public class WindowManagerService extends IWindowManager.Stub try { mPolicy.removeStartingWindow(wtoken.token, view); } catch (Exception e) { - Slog.w(TAG, "Exception when removing starting window", e); + Slog.w(TAG_WM, "Exception when removing starting window", e); } } } @@ -7624,7 +7628,7 @@ public class WindowManagerService extends IWindowManager.Stub IBinder token = null; View view = null; synchronized (mWindowMap) { - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Remove starting " + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting " + wtoken + ": startingWindow=" + wtoken.startingWindow + " startingView=" + wtoken.startingView); @@ -7641,7 +7645,7 @@ public class WindowManagerService extends IWindowManager.Stub try { mPolicy.removeStartingWindow(token, view); } catch (Exception e) { - Slog.w(TAG, "Exception when removing starting window", e); + Slog.w(TAG_WM, "Exception when removing starting window", e); } } } break; @@ -7657,7 +7661,7 @@ public class WindowManagerService extends IWindowManager.Stub } AppWindowToken wtoken = mFinishedStarting.remove(N-1); - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Finished starting " + wtoken + ": startingWindow=" + wtoken.startingWindow + " startingView=" + wtoken.startingView); @@ -7677,7 +7681,7 @@ public class WindowManagerService extends IWindowManager.Stub try { mPolicy.removeStartingWindow(token, view); } catch (Exception e) { - Slog.w(TAG, "Exception when removing starting window", e); + Slog.w(TAG_WM, "Exception when removing starting window", e); } } } break; @@ -7687,7 +7691,7 @@ public class WindowManagerService extends IWindowManager.Stub try { if (DEBUG_VISIBILITY) Slog.v( - TAG, "Reporting drawn in " + wtoken); + TAG_WM, "Reporting drawn in " + wtoken); wtoken.appToken.windowsDrawn(); } catch (RemoteException ex) { } @@ -7701,7 +7705,7 @@ public class WindowManagerService extends IWindowManager.Stub try { if (DEBUG_VISIBILITY) Slog.v( - TAG, "Reporting visible in " + wtoken + TAG_WM, "Reporting visible in " + wtoken + " visible=" + nowVisible + " gone=" + nowGone); if (nowVisible) { @@ -7716,7 +7720,7 @@ public class WindowManagerService extends IWindowManager.Stub case WINDOW_FREEZE_TIMEOUT: { // TODO(multidisplay): Can non-default displays rotate? synchronized (mWindowMap) { - Slog.w(TAG, "Window freeze timeout expired."); + Slog.w(TAG_WM, "Window freeze timeout expired."); mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_TIMEOUT; final WindowList windows = getDefaultWindowListLocked(); int i = windows.size(); @@ -7727,7 +7731,7 @@ public class WindowManagerService extends IWindowManager.Stub w.mOrientationChanging = false; w.mLastFreezeDuration = (int)(SystemClock.elapsedRealtime() - mDisplayFreezeTime); - Slog.w(TAG, "Force clearing orientation change: " + w); + Slog.w(TAG_WM, "Force clearing orientation change: " + w); } } mWindowPlacerLocked.performSurfacePlacement(); @@ -7739,7 +7743,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { if (mAppTransition.isTransitionSet() || !mOpeningApps.isEmpty() || !mClosingApps.isEmpty()) { - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** APP TRANSITION TIMEOUT." + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "*** APP TRANSITION TIMEOUT." + " isTransitionSet()=" + mAppTransition.isTransitionSet() + " mOpeningApps.size()=" + mOpeningApps.size() + " mClosingApps.size()=" + mClosingApps.size()); @@ -7788,7 +7792,7 @@ public class WindowManagerService extends IWindowManager.Stub case APP_FREEZE_TIMEOUT: { synchronized (mWindowMap) { - Slog.w(TAG, "App freeze timeout expired."); + Slog.w(TAG_WM, "App freeze timeout expired."); mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_TIMEOUT; final int numStacks = mStackIdToStack.size(); for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { @@ -7799,7 +7803,7 @@ public class WindowManagerService extends IWindowManager.Stub for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) { AppWindowToken tok = tokens.get(tokenNdx); if (tok.mAppAnimator.freezingScreen) { - Slog.w(TAG, "Force clearing freeze: " + tok); + Slog.w(TAG_WM, "Force clearing freeze: " + tok); unsetAppFreezingScreenLocked(tok, true, true); } } @@ -7839,7 +7843,7 @@ public class WindowManagerService extends IWindowManager.Stub case DRAG_START_TIMEOUT: { IBinder win = (IBinder)msg.obj; if (DEBUG_DRAG) { - Slog.w(TAG, "Timeout starting drag by win " + win); + Slog.w(TAG_WM, "Timeout starting drag by win " + win); } synchronized (mWindowMap) { // !!! TODO: ANR the app that has failed to start the drag in time @@ -7856,7 +7860,7 @@ public class WindowManagerService extends IWindowManager.Stub case DRAG_END_TIMEOUT: { IBinder win = (IBinder)msg.obj; if (DEBUG_DRAG) { - Slog.w(TAG, "Timeout ending drag to win " + win); + Slog.w(TAG_WM, "Timeout ending drag to win " + win); } synchronized (mWindowMap) { // !!! TODO: ANR the drag-receiving app @@ -7881,7 +7885,7 @@ public class WindowManagerService extends IWindowManager.Stub case WAITING_FOR_DRAWN_TIMEOUT: { Runnable callback = null; synchronized (mWindowMap) { - Slog.w(TAG, "Timeout waiting for drawn: undrawn=" + mWaitingForDrawn); + Slog.w(TAG_WM, "Timeout waiting for drawn: undrawn=" + mWaitingForDrawn); mWaitingForDrawn.clear(); callback = mWaitingForDrawnCallback; mWaitingForDrawnCallback = null; @@ -8006,7 +8010,7 @@ public class WindowManagerService extends IWindowManager.Stub case CHECK_IF_BOOT_ANIMATION_FINISHED: { final boolean bootAnimationComplete; synchronized (mWindowMap) { - if (DEBUG_BOOT) Slog.i(TAG, "CHECK_IF_BOOT_ANIMATION_FINISHED:"); + if (DEBUG_BOOT) Slog.i(TAG_WM, "CHECK_IF_BOOT_ANIMATION_FINISHED:"); bootAnimationComplete = checkBootAnimationCompleteLocked(); } if (bootAnimationComplete) { @@ -8063,7 +8067,7 @@ public class WindowManagerService extends IWindowManager.Stub break; } if (DEBUG_WINDOW_TRACE) { - Slog.v(TAG, "handleMessage: exit"); + Slog.v(TAG_WM, "handleMessage: exit"); } } } @@ -8098,9 +8102,9 @@ public class WindowManagerService extends IWindowManager.Stub // TODO(multidisplay): IMEs are only supported on the default display. WindowState imFocus = getDefaultWindowListLocked().get(idx-1); if (DEBUG_INPUT_METHOD) { - Slog.i(TAG, "Desired input method target: " + imFocus); - Slog.i(TAG, "Current focus: " + mCurrentFocus); - Slog.i(TAG, "Last focus: " + mLastFocus); + Slog.i(TAG_WM, "Desired input method target: " + imFocus); + Slog.i(TAG_WM, "Current focus: " + mCurrentFocus); + Slog.i(TAG_WM, "Last focus: " + mLastFocus); } if (imFocus != null) { // This may be a starting window, in which case we still want @@ -8112,18 +8116,18 @@ public class WindowManagerService extends IWindowManager.Stub for (int i=0; i<imFocus.mAppToken.windows.size(); i++) { WindowState w = imFocus.mAppToken.windows.get(i); if (w != imFocus) { - Log.i(TAG, "Switching to real app window: " + w); + Log.i(TAG_WM, "Switching to real app window: " + w); imFocus = w; break; } } } if (DEBUG_INPUT_METHOD) { - Slog.i(TAG, "IM target client: " + imFocus.mSession.mClient); + Slog.i(TAG_WM, "IM target client: " + imFocus.mSession.mClient); if (imFocus.mSession.mClient != null) { - Slog.i(TAG, "IM target client binder: " + Slog.i(TAG_WM, "IM target client binder: " + imFocus.mSession.mClient.asBinder()); - Slog.i(TAG, "Requesting client binder: " + client.asBinder()); + Slog.i(TAG_WM, "Requesting client binder: " + client.asBinder()); } } if (imFocus.mSession.mClient != null && @@ -8236,7 +8240,7 @@ public class WindowManagerService extends IWindowManager.Stub } private void setForcedDisplayScalingModeLocked(DisplayContent displayContent, int mode) { - Slog.i(TAG, "Using display scaling mode: " + (mode == 0 ? "auto" : "off")); + Slog.i(TAG_WM, "Using display scaling mode: " + (mode == 0 ? "auto" : "off")); displayContent.mDisplayScalingDisabled = (mode != 0); reconfigureDisplayLocked(displayContent); } @@ -8257,7 +8261,7 @@ public class WindowManagerService extends IWindowManager.Stub height = Integer.parseInt(sizeStr.substring(pos+1)); if (displayContent.mBaseDisplayWidth != width || displayContent.mBaseDisplayHeight != height) { - Slog.i(TAG, "FORCED DISPLAY SIZE: " + width + "x" + height); + Slog.i(TAG_WM, "FORCED DISPLAY SIZE: " + width + "x" + height); displayContent.mBaseDisplayWidth = width; displayContent.mBaseDisplayHeight = height; } @@ -8277,7 +8281,7 @@ public class WindowManagerService extends IWindowManager.Stub try { density = Integer.parseInt(densityStr); if (displayContent.mBaseDisplayDensity != density) { - Slog.i(TAG, "FORCED DISPLAY DENSITY: " + density); + Slog.i(TAG_WM, "FORCED DISPLAY DENSITY: " + density); displayContent.mBaseDisplayDensity = density; } } catch (NumberFormatException ex) { @@ -8288,14 +8292,14 @@ public class WindowManagerService extends IWindowManager.Stub int mode = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.DISPLAY_SCALING_FORCE, 0); if (mode != 0) { - Slog.i(TAG, "FORCED DISPLAY SCALING DISABLED"); + Slog.i(TAG_WM, "FORCED DISPLAY SCALING DISABLED"); displayContent.mDisplayScalingDisabled = true; } } // displayContent must not be null private void setForcedDisplaySizeLocked(DisplayContent displayContent, int width, int height) { - Slog.i(TAG, "Using new display size: " + width + "x" + height); + Slog.i(TAG_WM, "Using new display size: " + width + "x" + height); displayContent.mBaseDisplayWidth = width; displayContent.mBaseDisplayHeight = height; reconfigureDisplayLocked(displayContent); @@ -8378,7 +8382,7 @@ public class WindowManagerService extends IWindowManager.Stub // displayContent must not be null private void setForcedDisplayDensityLocked(DisplayContent displayContent, int density) { - Slog.i(TAG, "Using new display density: " + density); + Slog.i(TAG_WM, "Using new display density: " + density); displayContent.mBaseDisplayDensity = density; reconfigureDisplayLocked(displayContent); } @@ -8495,14 +8499,14 @@ public class WindowManagerService extends IWindowManager.Stub boolean throwOnError) { WindowState win = mWindowMap.get(client); if (localLOGV) Slog.v( - TAG, "Looking up client " + client + ": " + win); + TAG_WM, "Looking up client " + client + ": " + win); if (win == null) { RuntimeException ex = new IllegalArgumentException( "Requested window " + client + " does not exist"); if (throwOnError) { throw ex; } - Slog.w(TAG, "Failed looking up window", ex); + Slog.w(TAG_WM, "Failed looking up window", ex); return null; } if (session != null && win.mSession != session) { @@ -8512,7 +8516,7 @@ public class WindowManagerService extends IWindowManager.Stub if (throwOnError) { throw ex; } - Slog.w(TAG, "Failed looking up window", ex); + Slog.w(TAG_WM, "Failed looking up window", ex); return null; } @@ -8543,7 +8547,7 @@ public class WindowManagerService extends IWindowManager.Stub win.mRebuilding = true; mRebuildTmp[numRemoved] = win; mWindowsChanged = true; - if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Rebuild removing window: " + win); + if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "Rebuild removing window: " + win); NW--; numRemoved++; continue; @@ -8594,7 +8598,7 @@ public class WindowManagerService extends IWindowManager.Stub i -= lastBelow; if (i != numRemoved) { displayContent.layoutNeeded = true; - Slog.w(TAG, "On display=" + displayContent.getDisplayId() + " Rebuild removed " + + Slog.w(TAG_WM, "On display=" + displayContent.getDisplayId() + " Rebuild removed " + numRemoved + " windows but added " + i, new RuntimeException("here").fillInStackTrace()); for (i=0; i<numRemoved; i++) { @@ -8604,14 +8608,14 @@ public class WindowManagerService extends IWindowManager.Stub PrintWriter pw = new FastPrintWriter(sw, false, 1024); ws.dump(pw, "", true); pw.flush(); - Slog.w(TAG, "This window was lost: " + ws); - Slog.w(TAG, sw.toString()); + Slog.w(TAG_WM, "This window was lost: " + ws); + Slog.w(TAG_WM, sw.toString()); ws.mWinAnimator.destroySurfaceLocked(); } } - Slog.w(TAG, "Current app token list:"); + Slog.w(TAG_WM, "Current app token list:"); dumpAppTokensLocked(); - Slog.w(TAG, "Final window list:"); + Slog.w(TAG_WM, "Final window list:"); dumpWindowsLocked(); } Arrays.fill(mRebuildTmp, null); @@ -8623,7 +8627,7 @@ public class WindowManagerService extends IWindowManager.Stub int curLayer = 0; int i; - if (DEBUG_LAYERS) Slog.v(TAG, "Assigning layers based on windows=" + windows, + if (DEBUG_LAYERS) Slog.v(TAG_WM, "Assigning layers based on windows=" + windows, new RuntimeException("here").fillInStackTrace()); boolean anyLayerChanged = false; @@ -8672,7 +8676,7 @@ public class WindowManagerService extends IWindowManager.Stub // Force an animation pass just to update the mDimLayer layer. scheduleAnimationLocked(); } - if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": " + if (DEBUG_LAYERS) Slog.v(TAG_WM, "Assign layer " + w + ": " + "mBase=" + w.mBaseLayer + " mLayer=" + w.mLayer + (wtoken == null ? @@ -8701,8 +8705,8 @@ public class WindowManagerService extends IWindowManager.Stub } if (!force) { final TaskStack stack = w.getStack(); - if (stack != null && StackId.isAlwaysOnTop(stack.mStackId)) { - // If the window's stack is always on top, we want to make it above other windows + if (stack != null && (StackId.shouldIncreaseApplicationWindowLayer(stack.mStackId))) { + // For pinned and docked stack window, we want to make them above other windows // also when these windows are animating. force = true; } @@ -8718,7 +8722,7 @@ public class WindowManagerService extends IWindowManager.Stub // it frozen/off until this window draws at its new // orientation. if (!okToDisplay() && mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_TIMEOUT) { - if (DEBUG_ORIENTATION) Slog.v(TAG, "Changing surface while display frozen: " + w); + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Changing surface while display frozen: " + w); w.mOrientationChanging = true; w.mLastFreezeDuration = 0; mWindowPlacerLocked.mOrientationChangeComplete = false; @@ -8763,7 +8767,7 @@ public class WindowManagerService extends IWindowManager.Stub rebuildAppWindowListLocked(); changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; - if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, + if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG_WM, "Wallpaper layer changed: assigning layers + relayout"); moveInputMethodWindowsIfNeededLocked(true); mWindowPlacerLocked.mWallpaperMayChange = true; @@ -8781,11 +8785,11 @@ public class WindowManagerService extends IWindowManager.Stub w.setInsetsChanged(); boolean configChanged = w.isConfigChanged(); if (DEBUG_CONFIGURATION && configChanged) { - Slog.v(TAG, "Win " + w + " config changed: " + Slog.v(TAG_WM, "Win " + w + " config changed: " + mCurConfiguration); } final boolean dragResizingChanged = w.isDragResizeChanged(); - if (localLOGV) Slog.v(TAG, "Resizing " + w + if (localLOGV) Slog.v(TAG_WM, "Resizing " + w + ": configChanged=" + configChanged + " dragResizingChanged=" + dragResizingChanged + " last=" + w.mLastFrame + " frame=" + w.mFrame); @@ -8797,7 +8801,7 @@ public class WindowManagerService extends IWindowManager.Stub || configChanged || dragResizingChanged) { if (DEBUG_RESIZE || DEBUG_ORIENTATION) { - Slog.v(TAG, "Resize reasons for w=" + w + ": " + Slog.v(TAG_WM, "Resize reasons for w=" + w + ": " + " contentInsetsChanged=" + w.mContentInsetsChanged + " " + w.mContentInsets.toShortString() + " visibleInsetsChanged=" + w.mVisibleInsetsChanged @@ -8831,7 +8835,7 @@ public class WindowManagerService extends IWindowManager.Stub // application when it has finished drawing. if (w.mOrientationChanging || dragResizingChanged) { if (DEBUG_SURFACE_TRACE || DEBUG_ANIM || DEBUG_ORIENTATION || DEBUG_RESIZE) { - Slog.v(TAG, "Orientation or resize start waiting for draw" + Slog.v(TAG_WM, "Orientation or resize start waiting for draw" + ", mDrawState=DRAW_PENDING in " + w + ", surfaceController " + winAnimator.mSurfaceController); } @@ -8842,13 +8846,13 @@ public class WindowManagerService extends IWindowManager.Stub } } if (!mResizingWindows.contains(w)) { - if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, + if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG_WM, "Resizing window " + w); mResizingWindows.add(w); } } else if (w.mOrientationChanging) { if (w.isDrawnLw()) { - if (DEBUG_ORIENTATION) Slog.v(TAG, + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Orientation not waiting for draw in " + w + ", surfaceController " + winAnimator.mSurfaceController); w.mOrientationChanging = false; @@ -8865,22 +8869,22 @@ public class WindowManagerService extends IWindowManager.Stub } for (int j = mWaitingForDrawn.size() - 1; j >= 0; j--) { WindowState win = mWaitingForDrawn.get(j); - if (DEBUG_SCREEN_ON) Slog.i(TAG, "Waiting for drawn " + win + + if (DEBUG_SCREEN_ON) Slog.i(TAG_WM, "Waiting for drawn " + win + ": removed=" + win.mRemoved + " visible=" + win.isVisibleLw() + " mHasSurface=" + win.mHasSurface + " drawState=" + win.mWinAnimator.mDrawState); if (win.mRemoved || !win.mHasSurface || !win.mPolicyVisibility) { // Window has been removed or hidden; no draw will now happen, so stop waiting. - if (DEBUG_SCREEN_ON) Slog.w(TAG, "Aborted waiting for drawn: " + win); + if (DEBUG_SCREEN_ON) Slog.w(TAG_WM, "Aborted waiting for drawn: " + win); mWaitingForDrawn.remove(win); } else if (win.hasDrawnLw()) { // Window is now drawn (and shown). - if (DEBUG_SCREEN_ON) Slog.d(TAG, "Window drawn win=" + win); + if (DEBUG_SCREEN_ON) Slog.d(TAG_WM, "Window drawn win=" + win); mWaitingForDrawn.remove(win); } } if (mWaitingForDrawn.isEmpty()) { - if (DEBUG_SCREEN_ON) Slog.d(TAG, "All windows drawn!"); + if (DEBUG_SCREEN_ON) Slog.d(TAG_WM, "All windows drawn!"); mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT); mH.sendEmptyMessage(H.ALL_WINDOWS_DRAWN); } @@ -8960,7 +8964,7 @@ public class WindowManagerService extends IWindowManager.Stub // window list to make sure we haven't left any dangling surfaces // around. - Slog.i(TAG, "Out of memory for surface! Looking for leaks..."); + Slog.i(TAG_WM, "Out of memory for surface! Looking for leaks..."); final int numDisplays = mDisplayContents.size(); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList(); @@ -8970,7 +8974,7 @@ public class WindowManagerService extends IWindowManager.Stub WindowStateAnimator wsa = ws.mWinAnimator; if (wsa.mSurfaceController != null) { if (!mSessions.contains(wsa.mSession)) { - Slog.w(TAG, "LEAKED SURFACE (session doesn't exist): " + Slog.w(TAG_WM, "LEAKED SURFACE (session doesn't exist): " + ws + " surface=" + wsa.mSurfaceController + " token=" + ws.mToken + " pid=" + ws.mSession.mPid @@ -8980,7 +8984,7 @@ public class WindowManagerService extends IWindowManager.Stub mForceRemoves.add(ws); leakedSurface = true; } else if (ws.mAppToken != null && ws.mAppToken.clientHidden) { - Slog.w(TAG, "LEAKED SURFACE (app token hidden): " + Slog.w(TAG_WM, "LEAKED SURFACE (app token hidden): " + ws + " surface=" + wsa.mSurfaceController + " token=" + ws.mAppToken + " saved=" + ws.mAppToken.hasSavedSurface()); @@ -8994,7 +8998,7 @@ public class WindowManagerService extends IWindowManager.Stub } if (!leakedSurface) { - Slog.w(TAG, "No leaked surfaces; killing applicatons!"); + Slog.w(TAG_WM, "No leaked surfaces; killing applicatons!"); SparseIntArray pidCandidates = new SparseIntArray(); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList(); @@ -9027,7 +9031,7 @@ public class WindowManagerService extends IWindowManager.Stub if (leakedSurface || killedApps) { // We managed to reclaim some memory, so get rid of the trouble // surface and ask the app to request another one. - Slog.w(TAG, "Looks like we have reclaimed some memory, clearing surface for retry."); + Slog.w(TAG_WM, "Looks like we have reclaimed some memory, clearing surface for retry."); if (surfaceController != null) { if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) logSurface(winAnimator.mWin, "RECOVER DESTROY", null); @@ -9066,7 +9070,7 @@ public class WindowManagerService extends IWindowManager.Stub newFocus = computeFocusedWindowLocked(); } - if (DEBUG_FOCUS_LIGHT || localLOGV) Slog.v(TAG, "Changing focus from " + + if (DEBUG_FOCUS_LIGHT || localLOGV) Slog.v(TAG_WM, "Changing focus from " + mCurrentFocus + " to " + newFocus + " Callers=" + Debug.getCallers(4)); final WindowState oldFocus = mCurrentFocus; mCurrentFocus = newFocus; @@ -9126,7 +9130,7 @@ public class WindowManagerService extends IWindowManager.Stub final WindowState win = windows.get(i); if (localLOGV || DEBUG_FOCUS) Slog.v( - TAG, "Looking for focus: " + i + TAG_WM, "Looking for focus: " + i + " = " + win + ", flags=" + win.mAttrs.flags + ", canReceive=" + win.canReceiveKeys()); @@ -9139,7 +9143,7 @@ public class WindowManagerService extends IWindowManager.Stub // If this window's application has been removed, just skip it. if (wtoken != null && (wtoken.removed || wtoken.sendingToBottom)) { - if (DEBUG_FOCUS) Slog.v(TAG, "Skipping " + wtoken + " because " + if (DEBUG_FOCUS) Slog.v(TAG_WM, "Skipping " + wtoken + " because " + (wtoken.removed ? "removed" : "sendingToBottom")); continue; } @@ -9160,7 +9164,7 @@ public class WindowManagerService extends IWindowManager.Stub if (mFocusedApp == token && token.stackCanReceiveKeys()) { // Whoops, we are below the focused app whose stack can receive keys... // No focus for you!!! - if (localLOGV || DEBUG_FOCUS_LIGHT) Slog.v(TAG, + if (localLOGV || DEBUG_FOCUS_LIGHT) Slog.v(TAG_WM, "findFocusedWindow: Reached focused app=" + mFocusedApp); return null; } @@ -9172,12 +9176,12 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (DEBUG_FOCUS_LIGHT) Slog.v(TAG, "findFocusedWindow: Found new focus @ " + i + + if (DEBUG_FOCUS_LIGHT) Slog.v(TAG_WM, "findFocusedWindow: Found new focus @ " + i + " = " + win); return win; } - if (DEBUG_FOCUS_LIGHT) Slog.v(TAG, "findFocusedWindow: No focusable windows."); + if (DEBUG_FOCUS_LIGHT) Slog.v(TAG_WM, "findFocusedWindow: No focusable windows."); return null; } @@ -9253,7 +9257,7 @@ public class WindowManagerService extends IWindowManager.Stub if (mWaitingForConfig || mAppsFreezingScreen > 0 || mWindowsFreezingScreen == WINDOWS_FREEZING_SCREENS_ACTIVE || mClientFreezingScreen || !mOpeningApps.isEmpty()) { - if (DEBUG_ORIENTATION) Slog.d(TAG, + if (DEBUG_ORIENTATION) Slog.d(TAG_WM, "stopFreezingDisplayLocked: Returning mWaitingForConfig=" + mWaitingForConfig + ", mAppsFreezingScreen=" + mAppsFreezingScreen + ", mWindowsFreezingScreen=" + mWindowsFreezingScreen @@ -9271,7 +9275,7 @@ public class WindowManagerService extends IWindowManager.Stub sb.append(" due to "); sb.append(mLastFinishedFreezeSource); } - Slog.i(TAG, sb.toString()); + Slog.i(TAG_WM, sb.toString()); mH.removeMessages(H.APP_FREEZE_TIMEOUT); mH.removeMessages(H.CLIENT_FREEZE_TIMEOUT); if (PROFILE_ORIENTATION) { @@ -9286,7 +9290,7 @@ public class WindowManagerService extends IWindowManager.Stub mAnimator.getScreenRotationAnimationLocked(displayId); if (CUSTOM_SCREEN_ROTATION && screenRotationAnimation != null && screenRotationAnimation.hasScreenshot()) { - if (DEBUG_ORIENTATION) Slog.i(TAG, "**** Dismissing screen rotation animation"); + if (DEBUG_ORIENTATION) Slog.i(TAG_WM, "**** Dismissing screen rotation animation"); // TODO(multidisplay): rotation on main screen only. DisplayInfo displayInfo = displayContent.getDisplayInfo(); // Get rotation animation again, with new top window @@ -9332,7 +9336,7 @@ public class WindowManagerService extends IWindowManager.Stub mScreenFrozenLock.release(); if (updateRotation) { - if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation"); + if (DEBUG_ORIENTATION) Slog.d(TAG_WM, "Performing post-rotate rotation"); configChanged |= updateRotationUncheckedLocked(false); } @@ -10071,7 +10075,7 @@ public class WindowManagerService extends IWindowManager.Stub private DisplayContent newDisplayContentLocked(final Display display) { DisplayContent displayContent = new DisplayContent(display, this); final int displayId = display.getDisplayId(); - if (DEBUG_DISPLAY) Slog.v(TAG, "Adding display=" + display); + if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Adding display=" + display); mDisplayContents.put(displayId, displayContent); DisplayInfo displayInfo = displayContent.getDisplayInfo(); @@ -10175,7 +10179,7 @@ public class WindowManagerService extends IWindowManager.Stub displayContent.mDeferredRemoval = true; return; } - if (DEBUG_DISPLAY) Slog.v(TAG, "Removing display=" + displayContent); + if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Removing display=" + displayContent); mDisplayContents.delete(displayId); displayContent.close(); if (displayId == Display.DEFAULT_DISPLAY) { @@ -10212,10 +10216,10 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { AppWindowToken appWindowToken = findAppWindowToken(token); if (appWindowToken == null || !appWindowToken.isVisible()) { - Slog.w(TAG, "Attempted to set replacing window on non-existing app token " + token); + Slog.w(TAG_WM, "Attempted to set replacing window on non-existing app token " + token); return; } - if (DEBUG_ADD_REMOVE) Slog.d(TAG, "Marking app token " + appWindowToken + if (DEBUG_ADD_REMOVE) Slog.d(TAG_WM, "Marking app token " + appWindowToken + " as replacing window."); appWindowToken.mWillReplaceWindow = true; appWindowToken.mHasReplacedWindow = false; @@ -10225,7 +10229,7 @@ public class WindowManagerService extends IWindowManager.Stub // Set-up dummy animation so we can start treating windows associated with this // token like they are in transition before the new app window is ready for us to // run the real transition animation. - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "setReplacingWindow() Setting dummy animation on: " + appWindowToken); appWindowToken.mAppAnimator.setDummyAnimation(); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index c9ded3a46a6f..0fc714263b78 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -83,16 +83,18 @@ import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; -import static com.android.server.wm.WindowManagerService.DEBUG_ADD_REMOVE; -import static com.android.server.wm.WindowManagerService.DEBUG_ANIM; -import static com.android.server.wm.WindowManagerService.DEBUG_APP_TRANSITIONS; -import static com.android.server.wm.WindowManagerService.DEBUG_CONFIGURATION; -import static com.android.server.wm.WindowManagerService.DEBUG_FOCUS_LIGHT; -import static com.android.server.wm.WindowManagerService.DEBUG_LAYOUT; -import static com.android.server.wm.WindowManagerService.DEBUG_ORIENTATION; -import static com.android.server.wm.WindowManagerService.DEBUG_POWER; -import static com.android.server.wm.WindowManagerService.DEBUG_RESIZE; -import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_CONFIGURATION; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_RESIZE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; class WindowList extends ArrayList<WindowState> { } @@ -101,7 +103,7 @@ class WindowList extends ArrayList<WindowState> { * A window in the window manager. */ final class WindowState implements WindowManagerPolicy.WindowState { - static final String TAG = "WindowState"; + static final String TAG = TAG_WITH_CLASS_NAME ? "WindowState" : TAG_WM; // The minimal size of a window within the usable area of the freeform stack. // TODO(multi-window): fix the min sizes when we have mininum width/height support, @@ -257,13 +259,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { */ int mTouchableInsets = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; - /** - * This is rectangle of the window's surface that is not covered by - * system decorations. - */ - final Rect mSystemDecorRect = new Rect(); - final Rect mLastSystemDecorRect = new Rect(); - // Current transformation being applied. float mGlobalScale=1; float mInvGlobalScale=1; @@ -479,8 +474,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { + WindowManagerService.TYPE_LAYER_OFFSET; mSubLayer = mPolicy.subWindowTypeToLayerLw(a.type); mAttachedWindow = attachedWindow; - if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + this + " to " - + mAttachedWindow); + if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + this + " to " + mAttachedWindow); final WindowList childWindows = mAttachedWindow.mChildWindows; final int numChildWindows = childWindows.size(); @@ -626,7 +620,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { final int ph = mContainingFrame.height(); if (!mParentFrame.equals(pf)) { - //Slog.i(TAG, "Window " + this + " content frame from " + mParentFrame + //Slog.i(TAG_WM, "Window " + this + " content frame from " + mParentFrame // + " to " + pf); mParentFrame.set(pf); mContentChanged = true; @@ -1242,7 +1236,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { disposeInputChannel(); if (mAttachedWindow != null) { - if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + this + " from " + mAttachedWindow); + if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + this + " from " + mAttachedWindow); mAttachedWindow.mChildWindows.remove(this); } mWinAnimator.destroyDeferredSurfaceLocked(); @@ -1700,9 +1694,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { } public void destroySavedSurface() { - if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG, - "Destroying saved surface: " + this); - + if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG, "Destroying saved surface: " + this); if (mSurfaceSaved) { mWinAnimator.destroySurfaceLocked(); } @@ -2086,13 +2078,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw); pw.print(" last="); mLastFrame.printShortString(pw); pw.println(); - pw.print(prefix); pw.print("mSystemDecorRect="); mSystemDecorRect.printShortString(pw); - pw.print(" last="); mLastSystemDecorRect.printShortString(pw); - if (mWinAnimator.mHasClipRect) { - pw.print(" mLastClipRect="); - mWinAnimator.mLastClipRect.printShortString(pw); - } - pw.println(); } if (mEnforceSizeCompat) { pw.print(prefix); pw.print("mCompatFrame="); mCompatFrame.printShortString(pw); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 1790fb36a6ee..7cd67d098db8 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -20,15 +20,21 @@ import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; import static android.view.WindowManager.LayoutParams.FLAG_SCALED; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; -import static com.android.server.wm.WindowManagerService.DEBUG_ANIM; -import static com.android.server.wm.WindowManagerService.DEBUG_LAYERS; -import static com.android.server.wm.WindowManagerService.DEBUG_ORIENTATION; -import static com.android.server.wm.WindowManagerService.DEBUG_STARTING_WINDOW; -import static com.android.server.wm.WindowManagerService.DEBUG_SURFACE_TRACE; -import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; -import static com.android.server.wm.WindowManagerService.SHOW_LIGHT_TRANSACTIONS; -import static com.android.server.wm.WindowManagerService.SHOW_SURFACE_ALLOC; -import static com.android.server.wm.WindowManagerService.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_CROP; +import static com.android.server.wm.WindowManagerDebugConfig.HIDE_STACK_CRAWLS; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER; import static com.android.server.wm.WindowManagerService.localLOGV; import static com.android.server.wm.WindowState.DRAG_RESIZE_MODE_FREEFORM; @@ -64,7 +70,7 @@ import java.io.PrintWriter; * Keep track of animations and surface operations for a single WindowState. **/ class WindowStateAnimator { - static final String TAG = "WindowStateAnimator"; + static final String TAG = TAG_WITH_CLASS_NAME ? "WindowStateAnimator" : TAG_WM; static final int WINDOW_FREEZE_LAYER = TYPE_LAYER_MULTIPLIER * 200; // Unchanging local convenience fields. @@ -123,6 +129,13 @@ class WindowStateAnimator { Rect mLastClipRect = new Rect(); Rect mTmpStackBounds = new Rect(); + /** + * This is rectangle of the window's surface that is not covered by + * system decorations. + */ + private final Rect mSystemDecorRect = new Rect(); + private final Rect mLastSystemDecorRect = new Rect(); + // Used to save animation distances between the time they are calculated and when they are used. private int mAnimDx; private int mAnimDy; @@ -402,7 +415,7 @@ class WindowStateAnimator { finishExit(); final int displayId = mWin.getDisplayId(); mAnimator.setPendingLayoutChanges(displayId, WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM); - if (WindowManagerService.DEBUG_LAYOUT_REPEATS) + if (DEBUG_LAYOUT_REPEATS) mService.mWindowPlacerLocked.debugLayoutRepeats( "WindowStateAnimator", mAnimator.getPendingLayoutChanges(displayId)); @@ -414,7 +427,7 @@ class WindowStateAnimator { } void finishExit() { - if (WindowManagerService.DEBUG_ANIM) Slog.v( + if (DEBUG_ANIM) Slog.v( TAG, "finishExit in " + this + ": exiting=" + mWin.mExiting + " remove=" + mWin.mRemoveOnExit @@ -594,7 +607,7 @@ class WindowStateAnimator { } // We may abort, so initialize to defaults. - w.mLastSystemDecorRect.set(0, 0, 0, 0); + mLastSystemDecorRect.set(0, 0, 0, 0); mHasClipRect = false; mClipRect.set(0, 0, 0, 0); mLastClipRect.set(0, 0, 0, 0); @@ -660,7 +673,7 @@ class WindowStateAnimator { // Start a new transaction and apply position & offset. final int layerStack = w.getDisplayContent().getDisplay().getLayerStack(); - if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, + if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, "POS " + mTmpSize.left + ", " + mTmpSize.top, null); mSurfaceController.setPositionAndLayer(mTmpSize.left, mTmpSize.top, layerStack, mAnimLayer); @@ -750,7 +763,7 @@ class WindowStateAnimator { try { if (DEBUG_VISIBILITY) { RuntimeException e = null; - if (!WindowManagerService.HIDE_STACK_CRAWLS) { + if (!HIDE_STACK_CRAWLS) { e = new RuntimeException(); e.fillInStackTrace(); } @@ -762,7 +775,7 @@ class WindowStateAnimator { if (mPendingDestroySurface != null) { if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { RuntimeException e = null; - if (!WindowManagerService.HIDE_STACK_CRAWLS) { + if (!HIDE_STACK_CRAWLS) { e = new RuntimeException(); e.fillInStackTrace(); } @@ -775,7 +788,7 @@ class WindowStateAnimator { } else { if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { RuntimeException e = null; - if (!WindowManagerService.HIDE_STACK_CRAWLS) { + if (!HIDE_STACK_CRAWLS) { e = new RuntimeException(); e.fillInStackTrace(); } @@ -811,7 +824,7 @@ class WindowStateAnimator { if (mPendingDestroySurface != null) { if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { RuntimeException e = null; - if (!WindowManagerService.HIDE_STACK_CRAWLS) { + if (!HIDE_STACK_CRAWLS) { e = new RuntimeException(); e.fillInStackTrace(); } @@ -850,7 +863,7 @@ class WindowStateAnimator { wallpaperAnimator.mAnimation != null && !wallpaperAnimator.mAnimation.getDetachWallpaper()) { attachedTransformation = wallpaperAnimator.mTransformation; - if (WindowManagerService.DEBUG_WALLPAPER && attachedTransformation != null) { + if (DEBUG_WALLPAPER && attachedTransformation != null) { Slog.v(TAG, "WP target attached xform: " + attachedTransformation); } } @@ -860,7 +873,7 @@ class WindowStateAnimator { && wpAppAnimator.animation != null && !wpAppAnimator.animation.getDetachWallpaper()) { appTransformation = wpAppAnimator.transformation; - if (WindowManagerService.DEBUG_WALLPAPER && appTransformation != null) { + if (DEBUG_WALLPAPER && appTransformation != null) { Slog.v(TAG, "WP target app xform: " + appTransformation); } } @@ -931,7 +944,7 @@ class WindowStateAnimator { // (a 2x2 matrix + an offset) // Here we must not transform the position of the surface // since it is already included in the transformation. - //Slog.i(TAG, "Transform: " + matrix); + //Slog.i(TAG_WM, "Transform: " + matrix); mHaveMatrix = true; tmpMatrix.getValues(tmpFloats); @@ -953,7 +966,7 @@ class WindowStateAnimator { || (!PixelFormat.formatHasAlpha(mWin.mAttrs.format) || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDsDy, mDtDy) && x == frame.left && y == frame.top))) { - //Slog.i(TAG, "Applying alpha transform"); + //Slog.i(TAG_WM, "Applying alpha transform"); if (selfTransformation) { mShownAlpha *= mTransformation.getAlpha(); } @@ -971,7 +984,7 @@ class WindowStateAnimator { mShownAlpha *= screenRotationAnimation.getEnterTransformation().getAlpha(); } } else { - //Slog.i(TAG, "Not applying alpha transform"); + //Slog.i(TAG_WM, "Not applying alpha transform"); } if ((DEBUG_SURFACE_TRACE || WindowManagerService.localLOGV) @@ -1043,8 +1056,9 @@ class WindowStateAnimator { } } - private void applyDecorRect(final Rect decorRect) { + private void calculateSystemDecorRect() { final WindowState w = mWin; + final Rect decorRect = w.mDecorFrame; final int width = w.mFrame.width(); final int height = w.mFrame.height(); @@ -1053,11 +1067,17 @@ class WindowStateAnimator { final int top = w.mYOffset + w.mFrame.top; // Initialize the decor rect to the entire frame. - w.mSystemDecorRect.set(0, 0, width, height); + mSystemDecorRect.set(0, 0, width, height); - // Intersect with the decor rect, offsetted by window position. - w.mSystemDecorRect.intersect(decorRect.left - left, decorRect.top - top, - decorRect.right - left, decorRect.bottom - top); + // If a freeform window is animating from a position where it would be cutoff, it would be + // cutoff during the animation. We don't want that, so for the duration of the animation + // we ignore the decor cropping and depend on layering to position windows correctly. + final boolean cropToDecor = !(w.inFreeformWorkspace() && w.isAnimatingLw()); + if (cropToDecor) { + // Intersect with the decor rect, offsetted by window position. + mSystemDecorRect.intersect(decorRect.left - left, decorRect.top - top, + decorRect.right - left, decorRect.bottom - top); + } // If size compatibility is being applied to the window, the // surface is scaled relative to the screen. Also apply this @@ -1067,10 +1087,10 @@ class WindowStateAnimator { // much and hide part of the window that should be seen. if (w.mEnforceSizeCompat && w.mInvGlobalScale != 1.0f) { final float scale = w.mInvGlobalScale; - w.mSystemDecorRect.left = (int) (w.mSystemDecorRect.left * scale - 0.5f); - w.mSystemDecorRect.top = (int) (w.mSystemDecorRect.top * scale - 0.5f); - w.mSystemDecorRect.right = (int) ((w.mSystemDecorRect.right+1) * scale - 0.5f); - w.mSystemDecorRect.bottom = (int) ((w.mSystemDecorRect.bottom+1) * scale - 0.5f); + mSystemDecorRect.left = (int) (mSystemDecorRect.left * scale - 0.5f); + mSystemDecorRect.top = (int) (mSystemDecorRect.top * scale - 0.5f); + mSystemDecorRect.right = (int) ((mSystemDecorRect.right+1) * scale - 0.5f); + mSystemDecorRect.bottom = (int) ((mSystemDecorRect.bottom+1) * scale - 0.5f); } } @@ -1081,30 +1101,34 @@ class WindowStateAnimator { return; } final DisplayInfo displayInfo = displayContent.getDisplayInfo(); + if (DEBUG_WINDOW_CROP) Slog.d(TAG, "Updating crop for window: " + w + ", " + "mLastCrop=" + + mLastClipRect); // Need to recompute a new system decor rect each time. if (!w.isDefaultDisplay()) { // On a different display there is no system decor. Crop the window // by the screen boundaries. - w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height()); - w.mSystemDecorRect.intersect(-w.mCompatFrame.left, -w.mCompatFrame.top, + mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height()); + mSystemDecorRect.intersect(-w.mCompatFrame.left, -w.mCompatFrame.top, displayInfo.logicalWidth - w.mCompatFrame.left, displayInfo.logicalHeight - w.mCompatFrame.top); } else if (w.mLayer >= mService.mSystemDecorLayer) { // Above the decor layer is easy, just use the entire window. - w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height()); + mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height()); } else if (w.mDecorFrame.isEmpty()) { // Windows without policy decor aren't cropped. - w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height()); + mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height()); } else if (w.mAttrs.type == LayoutParams.TYPE_WALLPAPER && mAnimator.isAnimating()) { // If we're animating, the wallpaper crop should only be updated at the end of the // animation. - mTmpClipRect.set(w.mSystemDecorRect); - applyDecorRect(w.mDecorFrame); - w.mSystemDecorRect.union(mTmpClipRect); + mTmpClipRect.set(mSystemDecorRect); + calculateSystemDecorRect(); + mSystemDecorRect.union(mTmpClipRect); } else { // Crop to the system decor specified by policy. - applyDecorRect(w.mDecorFrame); + calculateSystemDecorRect(); + if (DEBUG_WINDOW_CROP) Slog.d(TAG, "Applying decor to crop for " + w + ", mDecorFrame=" + + w.mDecorFrame + ", mSystemDecorRect=" + mSystemDecorRect); } final boolean fullscreen = w.isFrameFullscreen(displayInfo); @@ -1118,7 +1142,9 @@ class WindowStateAnimator { } else { // We use the clip rect as provided by the tranformation for non-fullscreen windows to // avoid premature clipping with the system decor rect. - clipRect.set((mHasClipRect && !fullscreen) ? mClipRect : w.mSystemDecorRect); + clipRect.set((mHasClipRect && !fullscreen) ? mClipRect : mSystemDecorRect); + if (DEBUG_WINDOW_CROP) Slog.d(TAG, "Initial clip rect: " + clipRect + ", mHasClipRect=" + + mHasClipRect + ", fullscreen=" + fullscreen); } // Expand the clip rect for surface insets. final WindowManager.LayoutParams attrs = w.mAttrs; @@ -1138,6 +1164,7 @@ class WindowStateAnimator { clipRect.offset(attrs.surfaceInsets.left, attrs.surfaceInsets.top); adjustCropToStackBounds(w, clipRect, isFreeformResizing); + if (DEBUG_WINDOW_CROP) Slog.d(TAG, "Clip rect after stack adjustment=" + mClipRect); w.transformFromScreenToSurfaceSpace(clipRect); @@ -1155,13 +1182,14 @@ class WindowStateAnimator { } // We don't apply the stack bounds crop if: - // 1. The window is currently animating docked mode, otherwise the animating window will be - // suddenly cut off. + // 1. The window is currently animating docked mode or in freeform mode, otherwise the + // animating window will be suddenly (docked) or for whole animation (freeform) cut off. // 2. The window that is being replaced during animation, because it was living in a // different stack. If we suddenly crop it to the new stack bounds, it might get cut off. // We don't want it to happen, so we let it ignore the stack bounds until it gets removed. // The window that will replace it will abide them. - if (isAnimating() && (appToken.mWillReplaceWindow || w.inDockedWorkspace())) { + if (isAnimating() && (appToken.mWillReplaceWindow || w.inDockedWorkspace() + || w.inFreeformWorkspace())) { return; } @@ -1263,7 +1291,7 @@ class WindowStateAnimator { mLastDtDy = mDtDy; w.mLastHScale = w.mHScale; w.mLastVScale = w.mVScale; - if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, + if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, "controller=" + mSurfaceController + "alpha=" + mShownAlpha + " layer=" + mAnimLayer + " matrix=[" + mDsDx + "*" + w.mHScale @@ -1461,10 +1489,8 @@ class WindowStateAnimator { mWin.mAppToken.removeAllDeadWindows(); if (mWin.mAppToken.startingData != null) { - if (WindowManagerService.DEBUG_STARTING_WINDOW || - WindowManagerService.DEBUG_ANIM) Slog.v(TAG, - "Finish starting " + mWin.mToken - + ": first real window is shown, no animation"); + if (DEBUG_STARTING_WINDOW || DEBUG_ANIM) Slog.v(TAG, "Finish starting " + + mWin.mToken + ": first real window is shown, no animation"); // If this initial window is animating, stop it -- we // will do an animation to reveal it from behind the // starting window, so there is no need for it to also @@ -1575,16 +1601,16 @@ class WindowStateAnimator { a = mService.mAppTransition.loadAnimationAttr(mWin.mAttrs, attr); } } - if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG, + if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: win=" + this + " anim=" + anim + " attr=0x" + Integer.toHexString(attr) + " a=" + a + " transit=" + transit + " isEntrance=" + isEntrance + " Callers " + Debug.getCallers(3)); if (a != null) { - if (WindowManagerService.DEBUG_ANIM) { + if (DEBUG_ANIM) { RuntimeException e = null; - if (!WindowManagerService.HIDE_STACK_CRAWLS) { + if (!HIDE_STACK_CRAWLS) { e = new RuntimeException(); e.fillInStackTrace(); } @@ -1643,6 +1669,12 @@ class WindowStateAnimator { if (dumpAll) { pw.print(prefix); pw.print("mDrawState="); pw.print(drawStateToString()); pw.print(prefix); pw.print(" mLastHidden="); pw.println(mLastHidden); + pw.print(prefix); pw.print("mSystemDecorRect="); mSystemDecorRect.printShortString(pw); + pw.print(" last="); mLastSystemDecorRect.printShortString(pw); + if (mHasClipRect) { + pw.print(" mLastClipRect="); mLastClipRect.printShortString(pw); + } + pw.println(); } if (mPendingDestroySurface != null) { diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index f8b8d6ced8d8..bd2912d0c5e6 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -16,12 +16,14 @@ package com.android.server.wm; -import static com.android.server.wm.WindowManagerService.SHOW_TRANSACTIONS; -import static com.android.server.wm.WindowManagerService.SHOW_LIGHT_TRANSACTIONS; -import static com.android.server.wm.WindowManagerService.SHOW_SURFACE_ALLOC; -import static com.android.server.wm.WindowManagerService.DEBUG_SURFACE_TRACE; -import static com.android.server.wm.WindowManagerService.HIDE_STACK_CRAWLS; -import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.HIDE_STACK_CRAWLS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.graphics.Point; import android.graphics.PointF; @@ -41,7 +43,7 @@ import java.io.PrintWriter; import java.util.ArrayList; class WindowSurfaceController { - static final String TAG = "WindowSurfaceController"; + static final String TAG = TAG_WITH_CLASS_NAME ? "WindowSurfaceController" : TAG_WM; final WindowStateAnimator mAnimator; @@ -392,7 +394,7 @@ class WindowSurfaceController { } static class SurfaceTrace extends SurfaceControl { - private final static String SURFACE_TAG = "SurfaceTrace"; + private final static String SURFACE_TAG = TAG_WITH_CLASS_NAME ? "SurfaceTrace" : TAG_WM; private final static boolean LOG_SURFACE_TRACE = DEBUG_SURFACE_TRACE; final static ArrayList<SurfaceTrace> sSurfaces = new ArrayList<SurfaceTrace>(); diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 3ae3be5955dc..50bdf257d7ee 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -15,24 +15,24 @@ import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; -import static com.android.server.wm.WindowManagerService.DEBUG; -import static com.android.server.wm.WindowManagerService.DEBUG_ADD_REMOVE; -import static com.android.server.wm.WindowManagerService.DEBUG_APP_TRANSITIONS; -import static com.android.server.wm.WindowManagerService.DEBUG_LAYOUT; -import static com.android.server.wm.WindowManagerService.DEBUG_LAYOUT_REPEATS; -import static com.android.server.wm.WindowManagerService.DEBUG_ORIENTATION; -import static com.android.server.wm.WindowManagerService.DEBUG_POWER; -import static com.android.server.wm.WindowManagerService.DEBUG_STARTING_WINDOW; -import static com.android.server.wm.WindowManagerService.DEBUG_TOKEN_MOVEMENT; -import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; -import static com.android.server.wm.WindowManagerService.DEBUG_WALLPAPER_LIGHT; -import static com.android.server.wm.WindowManagerService.DEBUG_WINDOW_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TOKEN_MOVEMENT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE; import static com.android.server.wm.WindowManagerService.H.*; import static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD; import static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION; -import static com.android.server.wm.WindowManagerService.SHOW_LIGHT_TRANSACTIONS; -import static com.android.server.wm.WindowManagerService.SHOW_TRANSACTIONS; -import static com.android.server.wm.WindowManagerService.TAG; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES; import static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE; @@ -54,7 +54,7 @@ import android.view.DisplayInfo; import android.view.Surface; import android.view.SurfaceControl; import android.view.View; -import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; import android.view.animation.Animation; import java.io.PrintWriter; @@ -112,6 +112,12 @@ class WindowSurfacePlacer { private boolean mTraversalScheduled; private int mDeferDepth = 0; + private static final class LayerAndToken { + public int layer; + public AppWindowToken token; + } + private final LayerAndToken mTmpLayerAndToken = new LayerAndToken(); + public WindowSurfacePlacer(WindowManagerService service) { mService = service; mWallpaperControllerLocked = mService.mWallpaperControllerLocked; @@ -153,7 +159,7 @@ class WindowSurfacePlacer { if (DEBUG) { throw new RuntimeException("Recursive call!"); } - Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout. Callers=" + Slog.w(TAG_WM, "performLayoutAndPlaceSurfacesLocked called while in layout. Callers=" + Debug.getCallers(3)); return; } @@ -179,10 +185,10 @@ class WindowSurfacePlacer { // Wait a little bit for things to settle down, and off we go. while (!mService.mForceRemoves.isEmpty()) { WindowState ws = mService.mForceRemoves.remove(0); - Slog.i(TAG, "Force removing: " + ws); + Slog.i(TAG_WM, "Force removing: " + ws); mService.removeWindowInnerLocked(ws); } - Slog.w(TAG, + Slog.w(TAG_WM, "Due to memory failure, waiting a bit for next layout"); Object tmp = new Object(); synchronized (tmp) { @@ -202,7 +208,7 @@ class WindowSurfacePlacer { if (++mLayoutRepeatCount < 6) { requestTraversal(); } else { - Slog.e(TAG, "Performed 6 layouts in a row. Skipping"); + Slog.e(TAG_WM, "Performed 6 layouts in a row. Skipping"); mLayoutRepeatCount = 0; } } else { @@ -215,7 +221,7 @@ class WindowSurfacePlacer { } } catch (RuntimeException e) { mInLayout = false; - Slog.wtf(TAG, "Unhandled exception while laying out windows", e); + Slog.wtf(TAG_WM, "Unhandled exception while laying out windows", e); } Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); @@ -223,7 +229,7 @@ class WindowSurfacePlacer { void debugLayoutRepeats(final String msg, int pendingLayoutChanges) { if (mLayoutRepeatCount >= LAYOUT_REPEAT_THRESHOLD) { - Slog.v(TAG, "Layouts looping: " + msg + + Slog.v(TAG_WM, "Layouts looping: " + msg + ", mPendingLayoutChanges = 0x" + Integer.toHexString(pendingLayoutChanges)); } } @@ -231,7 +237,7 @@ class WindowSurfacePlacer { // "Something has changed! Let's make it correct now." private void performSurfacePlacementInner(boolean recoveringMemory) { if (DEBUG_WINDOW_TRACE) { - Slog.v(TAG, + Slog.v(TAG_WM, "performSurfacePlacementInner: entry. Called by " + Debug.getCallers(3)); } @@ -276,16 +282,16 @@ class WindowSurfacePlacer { final int defaultDw = defaultInfo.logicalWidth; final int defaultDh = defaultInfo.logicalHeight; - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces"); SurfaceControl.openTransaction(); try { applySurfaceChangesTransaction(recoveringMemory, numDisplays, defaultDw, defaultDh); } catch (RuntimeException e) { - Slog.wtf(TAG, "Unhandled exception in Window Manager", e); + Slog.wtf(TAG_WM, "Unhandled exception in Window Manager", e); } finally { SurfaceControl.closeTransaction(); - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces"); } @@ -332,7 +338,7 @@ class WindowSurfacePlacer { if (mWallpaperMayChange) { if (DEBUG_WALLPAPER_LIGHT) - Slog.v(TAG, "Wallpaper may change! Adjusting"); + Slog.v(TAG_WM, "Wallpaper may change! Adjusting"); defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("WallpaperMayChange", defaultDisplay.pendingLayoutChanges); @@ -368,7 +374,7 @@ class WindowSurfacePlacer { } if (DEBUG_ORIENTATION && mService.mDisplayFrozen) - Slog.v(TAG, + Slog.v(TAG_WM, "With display frozen, orientationChangeComplete=" + mOrientationChangeComplete); if (mOrientationChangeComplete) { @@ -429,7 +435,7 @@ class WindowSurfacePlacer { token.mAppAnimator.clearAnimation(); token.mAppAnimator.animating = false; if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) - Slog.v(TAG, + Slog.v(TAG_WM, "performLayout: App token exiting now removed" + token); token.removeAppFromTaskLocked(); } @@ -475,7 +481,7 @@ class WindowSurfacePlacer { || Settings.Global.getInt(mService.mContext.getContentResolver(), Settings.Global.THEATER_MODE_ON, 0) == 0) { if (DEBUG_VISIBILITY || DEBUG_POWER) { - Slog.v(TAG, "Turning screen on after layout!"); + Slog.v(TAG_WM, "Turning screen on after layout!"); } mService.mPowerManager.wakeUp(SystemClock.uptimeMillis(), "android.server.wm:TURN_ON"); @@ -484,7 +490,7 @@ class WindowSurfacePlacer { } if (mUpdateRotation) { - if (DEBUG_ORIENTATION) Slog.d(TAG, + if (DEBUG_ORIENTATION) Slog.d(TAG_WM, "Performing post-rotate rotation"); if (mService.updateRotationUncheckedLocked(false)) { mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION); @@ -538,7 +544,7 @@ class WindowSurfacePlacer { mService.scheduleAnimationLocked(); - if (DEBUG_WINDOW_TRACE) Slog.e(TAG, + if (DEBUG_WINDOW_TRACE) Slog.e(TAG_WM, "performSurfacePlacementInner exit: animating=" + mService.mAnimator.isAnimating()); } @@ -582,7 +588,7 @@ class WindowSurfacePlacer { do { repeats++; if (repeats > 6) { - Slog.w(TAG, "Animation repeat aborted after too many iterations"); + Slog.w(TAG_WM, "Animation repeat aborted after too many iterations"); displayContent.layoutNeeded = false; break; } @@ -598,7 +604,7 @@ class WindowSurfacePlacer { if (isDefaultDisplay && (displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_CONFIG) != 0) { - if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout"); + if (DEBUG_LAYOUT) Slog.v(TAG_WM, "Computing new config from layout"); if (mService.updateOrientationFromAppTokensLocked(true)) { displayContent.layoutNeeded = true; mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION); @@ -614,7 +620,7 @@ class WindowSurfacePlacer { performLayoutLockedInner(displayContent, repeats == 1, false /* updateInputWindows */); } else { - Slog.w(TAG, "Layout repeat skipped after too many iterations"); + Slog.w(TAG_WM, "Layout repeat skipped after too many iterations"); } // FIRST AND ONE HALF LOOP: Make WindowManagerPolicy think @@ -700,7 +706,7 @@ class WindowSurfacePlacer { } } - //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); + //Slog.i(TAG_WM, "Window " + this + " clearing mContentChanged - done placing"); w.mContentChanged = false; // Moved from updateWindowsAndWallpaperLocked(). @@ -722,7 +728,7 @@ class WindowSurfacePlacer { } if ((w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) { if (DEBUG_WALLPAPER_LIGHT) - Slog.v(TAG, "First draw done in potential wallpaper target " + w); + Slog.v(TAG_WM, "First draw done in potential wallpaper target " + w); mWallpaperMayChange = true; displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; if (DEBUG_LAYOUT_REPEATS) { @@ -743,7 +749,7 @@ class WindowSurfacePlacer { final AppWindowToken atoken = w.mAppToken; if (DEBUG_STARTING_WINDOW && atoken != null && w == atoken.startingWindow) { - Slog.d(TAG, "updateWindows: starting " + w + Slog.d(TAG_WM, "updateWindows: starting " + w + " isOnScreen=" + w.isOnScreen() + " allDrawn=" + atoken.allDrawn + " freezingScreen=" + atoken.mAppAnimator.freezingScreen); } @@ -757,11 +763,11 @@ class WindowSurfacePlacer { || winAnimator.mAttrType == TYPE_BASE_APPLICATION) && !w.mExiting && !w.mDestroying) { if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) { - Slog.v(TAG, "Eval win " + w + ": isDrawn=" + Slog.v(TAG_WM, "Eval win " + w + ": isDrawn=" + w.isDrawnLw() + ", isAnimating=" + winAnimator.isAnimating()); if (!w.isDrawnLw()) { - Slog.v(TAG, "Not displayed: s=" + Slog.v(TAG_WM, "Not displayed: s=" + winAnimator.mSurfaceController + " pv=" + w.mPolicyVisibility + " mDrawState=" + winAnimator.drawStateToString() @@ -776,7 +782,7 @@ class WindowSurfacePlacer { if (w.isDrawnLw()) { atoken.numDrawnWindows++; if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) - Slog.v(TAG, "tokenMayBeDrawn: " + atoken + Slog.v(TAG_WM, "tokenMayBeDrawn: " + atoken + " freezingScreen=" + atoken.mAppAnimator.freezingScreen + " mAppFreezing=" + w.mAppFreezing); @@ -844,8 +850,8 @@ class WindowSurfacePlacer { int i; if (DEBUG_LAYOUT) { - Slog.v(TAG, "-------------------------------------"); - Slog.v(TAG, "performLayout: needed=" + Slog.v(TAG_WM, "-------------------------------------"); + Slog.v(TAG_WM, "performLayout: needed=" + displayContent.layoutNeeded + " dw=" + dw + " dh=" + dh); } @@ -878,18 +884,18 @@ class WindowSurfacePlacer { || win.isGoneForLayoutLw(); if (DEBUG_LAYOUT && !win.mLayoutAttached) { - Slog.v(TAG, "1ST PASS " + win + Slog.v(TAG_WM, "1ST PASS " + win + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame + " mLayoutAttached=" + win.mLayoutAttached + " screen changed=" + win.isConfigChanged()); final AppWindowToken atoken = win.mAppToken; - if (gone) Slog.v(TAG, " GONE: mViewVisibility=" + if (gone) Slog.v(TAG_WM, " GONE: mViewVisibility=" + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled + " hidden=" + win.mRootToken.hidden + " hiddenRequested=" + (atoken != null && atoken.hiddenRequested) + " mAttachedHidden=" + win.mAttachedHidden); - else Slog.v(TAG, " VIS: mViewVisibility=" + else Slog.v(TAG_WM, " VIS: mViewVisibility=" + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled + " hidden=" + win.mRootToken.hidden + " hiddenRequested=" @@ -909,7 +915,7 @@ class WindowSurfacePlacer { win.mAppToken.layoutConfigChanges)))) { if (!win.mLayoutAttached) { if (initial) { - //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); + //Slog.i(TAG_WM, "Window " + this + " clearing mContentChanged - initial"); win.mContentChanged = false; } if (win.mAttrs.type == TYPE_DREAM) { @@ -929,7 +935,7 @@ class WindowSurfacePlacer { displayContent.mDimLayerController.updateDimLayer(task); } - if (DEBUG_LAYOUT) Slog.v(TAG, + if (DEBUG_LAYOUT) Slog.v(TAG_WM, " LAYOUT: mFrame=" + win.mFrame + " mContainingFrame=" + win.mContainingFrame + " mDisplayFrame=" @@ -950,7 +956,7 @@ class WindowSurfacePlacer { final WindowState win = windows.get(i); if (win.mLayoutAttached) { - if (DEBUG_LAYOUT) Slog.v(TAG, + if (DEBUG_LAYOUT) Slog.v(TAG_WM, "2ND PASS " + win + " mHaveFrame=" + win.mHaveFrame + " mViewVisibility=" + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled); // If this view is GONE, then skip it -- keep the current @@ -964,14 +970,14 @@ class WindowSurfacePlacer { if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled) || !win.mHaveFrame || win.mLayoutNeeded) { if (initial) { - //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); + //Slog.i(TAG_WM, "Window " + this + " clearing mContentChanged - initial"); win.mContentChanged = false; } win.mLayoutNeeded = false; win.prelayout(); mService.mPolicy.layoutWindowLw(win, win.mAttachedWindow); win.mLayoutSeq = seq; - if (DEBUG_LAYOUT) Slog.v(TAG, + if (DEBUG_LAYOUT) Slog.v(TAG_WM, " LAYOUT: mFrame=" + win.mFrame + " mContainingFrame=" + win.mContainingFrame + " mDisplayFrame=" + win.mDisplayFrame); } @@ -1002,7 +1008,7 @@ class WindowSurfacePlacer { if (!transitionGoodToGo(appsCount)) { return 0; } - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "**** GOOD TO GO"); int transit = mService.mAppTransition.getAppTransition(); if (mService.mSkipAppTransitionAnimation) { transit = AppTransition.TRANSIT_UNSET; @@ -1018,7 +1024,7 @@ class WindowSurfacePlacer { // The top-most window will supply the layout params, // and we will determine it below. - WindowManager.LayoutParams animLp = null; + LayoutParams animLp = null; int bestAnimLayer = -1; boolean fullscreenAnim = false; boolean voiceInteraction = false; @@ -1094,61 +1100,56 @@ class WindowSurfacePlacer { // example, when this transition is being done behind // the lock screen. if (!mService.mPolicy.allowAppAnimationsLw()) { - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "Animations disallowed by keyguard or dream."); animLp = null; } processApplicationsAnimatingInPlace(transit); - AppWindowToken topClosingApp = null; - int topClosingLayer = 0; - appsCount = mService.mClosingApps.size(); - for (i = 0; i < appsCount; i++) { - AppWindowToken wtoken = mService.mClosingApps.valueAt(i); - final AppWindowAnimator appAnimator = wtoken.mAppAnimator; - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, - "Now closing app " + wtoken); - appAnimator.clearThumbnail(); - appAnimator.animation = null; - wtoken.inPendingTransaction = false; - mService.setTokenVisibilityLocked(wtoken, animLp, false, transit, false, - voiceInteraction); - wtoken.updateReportedVisibilityLocked(); - // Force the allDrawn flag, because we want to start - // this guy's animations regardless of whether it's - // gotten drawn. - wtoken.allDrawn = true; - wtoken.deferClearAllDrawn = false; - // Ensure that apps that are mid-starting are also scheduled to have their - // starting windows removed after the animation is complete - if (wtoken.startingWindow != null && !wtoken.startingWindow.mExiting) { - mService.scheduleRemoveStartingWindowLocked(wtoken); - } - mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); + handleClosingApps(transit, animLp, voiceInteraction, mTmpLayerAndToken); + final AppWindowToken topClosingApp = mTmpLayerAndToken.token; + final int topClosingLayer = mTmpLayerAndToken.layer; - if (animLp != null) { - int layer = -1; - for (int j = 0; j < wtoken.windows.size(); j++) { - WindowState win = wtoken.windows.get(j); - if (win.mWinAnimator.mAnimLayer > layer) { - layer = win.mWinAnimator.mAnimLayer; - } - } - if (topClosingApp == null || layer > topClosingLayer) { - topClosingApp = wtoken; - topClosingLayer = layer; - } - } + final AppWindowToken topOpeningApp = handleOpeningApps(transit, + animLp, voiceInteraction, topClosingLayer); + + final AppWindowAnimator openingAppAnimator = (topOpeningApp == null) ? null : + topOpeningApp.mAppAnimator; + final AppWindowAnimator closingAppAnimator = (topClosingApp == null) ? null : + topClosingApp.mAppAnimator; + + mService.mAppTransition.goodToGo(openingAppAnimator, closingAppAnimator); + mService.mAppTransition.postAnimationCallback(); + mService.mAppTransition.clear(); + + mService.mOpeningApps.clear(); + mService.mClosingApps.clear(); + + // This has changed the visibility of windows, so perform + // a new layout to get them all up-to-date. + mService.getDefaultDisplayContentLocked().layoutNeeded = true; + + // TODO(multidisplay): IMEs are only supported on the default display. + if (windows == mService.getDefaultWindowListLocked() + && !mService.moveInputMethodWindowsIfNeededLocked(true)) { + mService.assignLayersLocked(windows); } + mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, + true /*updateInputWindows*/); + mService.mFocusMayChange = false; + mService.notifyActivityDrawnForKeyguard(); + return FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG; + } + private AppWindowToken handleOpeningApps(int transit, LayoutParams animLp, + boolean voiceInteraction, int topClosingLayer) { AppWindowToken topOpeningApp = null; - appsCount = mService.mOpeningApps.size(); - for (i = 0; i < appsCount; i++) { + final int appsCount = mService.mOpeningApps.size(); + for (int i = 0; i < appsCount; i++) { AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); final AppWindowAnimator appAnimator = wtoken.mAppAnimator; - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, - "Now opening app" + wtoken); + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "Now opening app" + wtoken); if (!appAnimator.usingTransferredAnimation) { appAnimator.clearThumbnail(); @@ -1170,14 +1171,14 @@ class WindowSurfacePlacer { for (int j = 0; j < windowsCount; j++) { appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); } - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, ">>> OPEN TRANSACTION handleAppTransitionReadyLocked()"); SurfaceControl.openTransaction(); try { mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked()); } finally { SurfaceControl.closeTransaction(); - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, "<<< CLOSE TRANSACTION handleAppTransitionReadyLocked()"); } mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); @@ -1203,48 +1204,69 @@ class WindowSurfacePlacer { topOpeningLayer = layer; } } - createThumbnailAppAnimator(transit, wtoken, topOpeningLayer, topClosingLayer); + if (mService.mAppTransition.isNextAppTransitionThumbnailUp()) { + createThumbnailAppAnimator(transit, wtoken, topOpeningLayer, topClosingLayer); + } wtoken.restoreSavedSurfaces(); } + return topOpeningApp; + } - AppWindowAnimator openingAppAnimator = (topOpeningApp == null) ? null : - topOpeningApp.mAppAnimator; - AppWindowAnimator closingAppAnimator = (topClosingApp == null) ? null : - topClosingApp.mAppAnimator; - - mService.mAppTransition.goodToGo(openingAppAnimator, closingAppAnimator); - mService.mAppTransition.postAnimationCallback(); - mService.mAppTransition.clear(); - - mService.mOpeningApps.clear(); - mService.mClosingApps.clear(); - - // This has changed the visibility of windows, so perform - // a new layout to get them all up-to-date. - mService.getDefaultDisplayContentLocked().layoutNeeded = true; + private void handleClosingApps(int transit, LayoutParams animLp, boolean voiceInteraction, + LayerAndToken layerAndToken) { + final int appsCount; + appsCount = mService.mClosingApps.size(); + for (int i = 0; i < appsCount; i++) { + AppWindowToken wtoken = mService.mClosingApps.valueAt(i); + final AppWindowAnimator appAnimator = wtoken.mAppAnimator; + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "Now closing app " + wtoken); + appAnimator.clearThumbnail(); + appAnimator.animation = null; + wtoken.inPendingTransaction = false; + mService.setTokenVisibilityLocked(wtoken, animLp, false, transit, false, + voiceInteraction); + wtoken.updateReportedVisibilityLocked(); + // Force the allDrawn flag, because we want to start + // this guy's animations regardless of whether it's + // gotten drawn. + wtoken.allDrawn = true; + wtoken.deferClearAllDrawn = false; + // Ensure that apps that are mid-starting are also scheduled to have their + // starting windows removed after the animation is complete + if (wtoken.startingWindow != null && !wtoken.startingWindow.mExiting) { + mService.scheduleRemoveStartingWindowLocked(wtoken); + } + mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); - // TODO(multidisplay): IMEs are only supported on the default display. - if (windows == mService.getDefaultWindowListLocked() - && !mService.moveInputMethodWindowsIfNeededLocked(true)) { - mService.assignLayersLocked(windows); + if (animLp != null) { + int layer = -1; + for (int j = 0; j < wtoken.windows.size(); j++) { + WindowState win = wtoken.windows.get(j); + if (win.mWinAnimator.mAnimLayer > layer) { + layer = win.mWinAnimator.mAnimLayer; + } + } + if (layerAndToken.token == null || layer > layerAndToken.layer) { + layerAndToken.token = wtoken; + layerAndToken.layer = layer; + } + } + if (mService.mAppTransition.isNextAppTransitionThumbnailDown()) { + createThumbnailAppAnimator(transit, wtoken, 0, layerAndToken.layer); + } } - mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, - true /*updateInputWindows*/); - mService.mFocusMayChange = false; - mService.notifyActivityDrawnForKeyguard(); - return FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG; } private boolean transitionGoodToGo(int appsCount) { - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "Checking " + appsCount + " opening apps (frozen=" + mService.mDisplayFrozen + " timeout=" + mService.mAppTransition.isTimeout() + ")..."); if (!mService.mAppTransition.isTimeout()) { for (int i = 0; i < appsCount; i++) { AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "Check opening app=" + wtoken + ": allDrawn=" + wtoken.allDrawn + " startingDisplayed=" + wtoken.startingDisplayed + " startingMoved=" @@ -1260,7 +1282,7 @@ class WindowSurfacePlacer { // We also need to wait for the specs to be fetched, if needed. if (mService.mAppTransition.isFetchingAppTransitionsSpecs()) { - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "isFetchingAppTransitionSpecs=true"); + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "isFetchingAppTransitionSpecs=true"); return false; } @@ -1281,7 +1303,7 @@ class WindowSurfacePlacer { ? null : wallpaperTarget; final ArraySet<AppWindowToken> openingApps = mService.mOpeningApps; final ArraySet<AppWindowToken> closingApps = mService.mClosingApps; - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "New wallpaper target=" + wallpaperTarget + ", oldWallpaper=" + oldWallpaper + ", lower target=" + lowerWallpaperTarget @@ -1291,7 +1313,7 @@ class WindowSurfacePlacer { mService.mAnimateWallpaperWithTarget = false; if (closingAppHasWallpaper && openingAppHasWallpaper) { if (DEBUG_APP_TRANSITIONS) - Slog.v(TAG, "Wallpaper animation!"); + Slog.v(TAG_WM, "Wallpaper animation!"); switch (transit) { case AppTransition.TRANSIT_ACTIVITY_OPEN: case AppTransition.TRANSIT_TASK_OPEN: @@ -1304,14 +1326,14 @@ class WindowSurfacePlacer { transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; break; } - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "New transit: " + AppTransition.appTransitionToString(transit)); } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty() && !openingApps.contains(oldWallpaper.mAppToken) && closingApps.contains(oldWallpaper.mAppToken)) { // We are transitioning from an activity with a wallpaper to one without. transit = AppTransition.TRANSIT_WALLPAPER_CLOSE; - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "New transit away from wallpaper: " + AppTransition.appTransitionToString(transit)); } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw() && @@ -1319,7 +1341,7 @@ class WindowSurfacePlacer { // We are transitioning from an activity without // a wallpaper to now showing the wallpaper transit = AppTransition.TRANSIT_WALLPAPER_OPEN; - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "New transit into wallpaper: " + AppTransition.appTransitionToString(transit)); } else { @@ -1333,7 +1355,7 @@ class WindowSurfacePlacer { * @param dispInfo info of the display that the window's obscuring state is checked against. */ private void handleNotObscuredLocked(final WindowState w, final DisplayInfo dispInfo) { - final WindowManager.LayoutParams attrs = w.mAttrs; + final LayoutParams attrs = w.mAttrs; final int attrFlags = attrs.flags; final boolean canBeSeen = w.isDisplayedLw(); @@ -1414,7 +1436,7 @@ class WindowSurfacePlacer { int numInteresting = wtoken.numInterestingWindows; if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) { if (DEBUG_VISIBILITY) - Slog.v(TAG, "allDrawn: " + wtoken + Slog.v(TAG_WM, "allDrawn: " + wtoken + " interesting=" + numInteresting + " drawn=" + wtoken.numDrawnWindows); wtoken.allDrawn = true; @@ -1443,7 +1465,7 @@ class WindowSurfacePlacer { final AppWindowToken wtoken = win.mAppToken; final AppWindowAnimator appAnimator = wtoken.mAppAnimator; if (DEBUG_APP_TRANSITIONS) - Slog.v(TAG, "Now animating app in place " + wtoken); + Slog.v(TAG_WM, "Now animating app in place " + wtoken); appAnimator.clearThumbnail(); appAnimator.animation = null; mService.updateTokenInPlaceLocked(wtoken, transit); @@ -1469,7 +1491,7 @@ class WindowSurfacePlacer { final int taskId = appToken.mTask.mTaskId; Bitmap thumbnailHeader = mService.mAppTransition.getAppTransitionThumbnailHeader(taskId); if (thumbnailHeader == null || thumbnailHeader.getConfig() == Bitmap.Config.ALPHA_8) { - if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "No thumbnail header bitmap for: " + taskId); + if (DEBUG_APP_TRANSITIONS) Slog.d(TAG_WM, "No thumbnail header bitmap for: " + taskId); return; } // This thumbnail animation is very special, we need to have @@ -1487,7 +1509,7 @@ class WindowSurfacePlacer { PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); surfaceControl.setLayerStack(display.getLayerStack()); if (SHOW_TRANSACTIONS) { - Slog.i(TAG, " THUMBNAIL " + surfaceControl + ": CREATE"); + Slog.i(TAG_WM, " THUMBNAIL " + surfaceControl + ": CREATE"); } // Draw the thumbnail onto the surface @@ -1530,7 +1552,7 @@ class WindowSurfacePlacer { openingAppAnimator.thumbnailX = mTmpStartRect.left; openingAppAnimator.thumbnailY = mTmpStartRect.top; } catch (Surface.OutOfResourcesException e) { - Slog.e(TAG, "Can't allocate thumbnail/Canvas surface w=" + Slog.e(TAG_WM, "Can't allocate thumbnail/Canvas surface w=" + dirty.width() + " h=" + dirty.height(), e); openingAppAnimator.clearThumbnail(); } diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index 4ac91353861e..7894ccfe09a1 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -16,6 +16,9 @@ package com.android.server.wm; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; + import android.os.IBinder; import android.util.Slog; @@ -77,8 +80,7 @@ class WindowToken { void removeAllWindows() { for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { WindowState win = windows.get(winNdx); - if (WindowManagerService.DEBUG_WINDOW_MOVEMENT) Slog.w(WindowManagerService.TAG, - "removeAllWindows: removing win=" + win); + if (DEBUG_WINDOW_MOVEMENT) Slog.w(TAG_WM, "removeAllWindows: removing win=" + win); win.mService.removeWindowLocked(win); } windows.clear(); @@ -106,4 +108,4 @@ class WindowToken { } return stringName; } -}
\ No newline at end of file +} diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index eed5419218ad..5cf8ac0e2c8d 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -3541,6 +3541,18 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } + private void enforceCanManageInstalledKeys(ComponentName who) { + if (who == null) { + if (!isCallerDelegatedCertInstaller()) { + throw new SecurityException("who == null, but caller is not cert installer"); + } + } else { + synchronized (this) { + getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); + } + } + } + private boolean isCallerDelegatedCertInstaller() { final int callingUid = mInjector.binderGetCallingUid(); final int userHandle = UserHandle.getUserId(callingUid); @@ -3630,27 +3642,20 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public boolean installKeyPair(ComponentName who, byte[] privKey, byte[] cert, String alias) { - if (who == null) { - if (!isCallerDelegatedCertInstaller()) { - throw new SecurityException("who == null, but caller is not cert installer"); - } - } else { - synchronized (this) { - getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); - } - } + enforceCanManageInstalledKeys(who); + final UserHandle userHandle = new UserHandle(UserHandle.getCallingUserId()); final long id = mInjector.binderClearCallingIdentity(); try { - final KeyChainConnection keyChainConnection = KeyChain.bindAsUser(mContext, userHandle); - try { - IKeyChainService keyChain = keyChainConnection.getService(); - return keyChain.installKeyPair(privKey, cert, alias); - } catch (RemoteException e) { - Log.e(LOG_TAG, "Installing certificate", e); - } finally { - keyChainConnection.close(); - } + final KeyChainConnection keyChainConnection = KeyChain.bindAsUser(mContext, userHandle); + try { + IKeyChainService keyChain = keyChainConnection.getService(); + return keyChain.installKeyPair(privKey, cert, alias); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Installing certificate", e); + } finally { + keyChainConnection.close(); + } } catch (InterruptedException e) { Log.w(LOG_TAG, "Interrupted while installing certificate", e); Thread.currentThread().interrupt(); @@ -3661,6 +3666,31 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } @Override + public boolean removeKeyPair(ComponentName who, String alias) { + enforceCanManageInstalledKeys(who); + + final UserHandle userHandle = new UserHandle(UserHandle.getCallingUserId()); + final long id = Binder.clearCallingIdentity(); + try { + final KeyChainConnection keyChainConnection = KeyChain.bindAsUser(mContext, userHandle); + try { + IKeyChainService keyChain = keyChainConnection.getService(); + return keyChain.removeKeyPair(alias); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Removing keypair", e); + } finally { + keyChainConnection.close(); + } + } catch (InterruptedException e) { + Log.w(LOG_TAG, "Interrupted while removing keypair", e); + Thread.currentThread().interrupt(); + } finally { + Binder.restoreCallingIdentity(id); + } + return false; + } + + @Override public void choosePrivateKeyAlias(final int uid, final Uri uri, final String alias, final IBinder response) { // Caller UID needs to be trusted, so we restrict this method to SYSTEM_UID callers. diff --git a/services/net/java/android/net/dhcp/DhcpClient.java b/services/net/java/android/net/dhcp/DhcpClient.java index e7e99c4e847a..812d9b625a8f 100644 --- a/services/net/java/android/net/dhcp/DhcpClient.java +++ b/services/net/java/android/net/dhcp/DhcpClient.java @@ -20,8 +20,8 @@ import com.android.internal.util.HexDump; import com.android.internal.util.Protocol; import com.android.internal.util.State; import com.android.internal.util.StateMachine; +import com.android.internal.util.WakeupMessage; -import android.app.AlarmManager; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -128,7 +128,6 @@ public class DhcpClient extends BaseDhcpStateMachine { // System services / libraries we use. private final Context mContext; - private final AlarmManager mAlarmManager; private final Random mRandom; private final INetworkManagementService mNMService; @@ -143,10 +142,10 @@ public class DhcpClient extends BaseDhcpStateMachine { // State variables. private final StateMachine mController; - private final AlarmListener mKickAlarm; - private final AlarmListener mTimeoutAlarm; - private final AlarmListener mRenewAlarm; - private final AlarmListener mOneshotTimeoutAlarm; + private final WakeupMessage mKickAlarm; + private final WakeupMessage mTimeoutAlarm; + private final WakeupMessage mRenewAlarm; + private final WakeupMessage mOneshotTimeoutAlarm; private final String mIfaceName; private boolean mRegisteredForPreDhcpNotification; @@ -174,6 +173,11 @@ public class DhcpClient extends BaseDhcpStateMachine { private State mWaitBeforeStartState = new WaitBeforeStartState(mDhcpInitState); private State mWaitBeforeRenewalState = new WaitBeforeRenewalState(mDhcpRenewingState); + private WakeupMessage makeWakeupMessage(String cmdName, int cmd) { + cmdName = DhcpClient.class.getSimpleName() + "." + mIfaceName + "." + cmdName; + return new WakeupMessage(mContext, getHandler(), cmdName, cmd); + } + private DhcpClient(Context context, StateMachine controller, String iface) { super(TAG); @@ -197,22 +201,21 @@ public class DhcpClient extends BaseDhcpStateMachine { setInitialState(mStoppedState); - mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); mNMService = INetworkManagementService.Stub.asInterface(b); mRandom = new Random(); // Used to schedule packet retransmissions. - mKickAlarm = new AlarmListener("KICK", CMD_KICK); + mKickAlarm = makeWakeupMessage("KICK", CMD_KICK); // Used to time out PacketRetransmittingStates. - mTimeoutAlarm = new AlarmListener("TIMEOUT", CMD_TIMEOUT); + mTimeoutAlarm = makeWakeupMessage("TIMEOUT", CMD_TIMEOUT); // Used to schedule DHCP renews. - mRenewAlarm = new AlarmListener("RENEW", DhcpStateMachine.CMD_RENEW_DHCP); + mRenewAlarm = makeWakeupMessage("RENEW", DhcpStateMachine.CMD_RENEW_DHCP); // Used to tell the caller when its request (CMD_START_DHCP or CMD_RENEW_DHCP) timed out. // TODO: when the legacy DHCP client is gone, make the client fully asynchronous and // remove this. - mOneshotTimeoutAlarm = new AlarmListener("ONESHOT_TIMEOUT", CMD_ONESHOT_TIMEOUT); + mOneshotTimeoutAlarm = makeWakeupMessage("ONESHOT_TIMEOUT", CMD_ONESHOT_TIMEOUT); } @Override @@ -227,32 +230,6 @@ public class DhcpClient extends BaseDhcpStateMachine { return client; } - /** - * An AlarmListener that sends the specified command to the state machine. - */ - private class AlarmListener implements AlarmManager.OnAlarmListener { - private final int cmd; - private final String name; - - public AlarmListener(final String cmdName, final int cmd) { - this.cmd = cmd; - this.name = DhcpClient.class.getSimpleName() + "." + mIfaceName + "." + cmdName; - } - - public void set(long alarmTime) { - mAlarmManager.setExact( - AlarmManager.ELAPSED_REALTIME_WAKEUP, alarmTime, name, this, getHandler()); - } - - public void cancel() { - mAlarmManager.cancel(this); - } - - public void onAlarm() { - sendMessage(cmd); - } - } - private boolean initInterface() { try { mIface = NetworkInterface.getByName(mIfaceName); @@ -412,11 +389,11 @@ public class DhcpClient extends BaseDhcpStateMachine { } private void scheduleRenew() { - mAlarmManager.cancel(mRenewAlarm); + mRenewAlarm.cancel(); if (mDhcpLeaseExpiry != 0) { long now = SystemClock.elapsedRealtime(); long alarmTime = (now + mDhcpLeaseExpiry) / 2; - mRenewAlarm.set(alarmTime); + mRenewAlarm.schedule(alarmTime); Log.d(TAG, "Scheduling renewal in " + ((alarmTime - now) / 1000) + "s"); } else { Log.d(TAG, "Infinite lease, no renewal needed"); @@ -548,7 +525,7 @@ public class DhcpClient extends BaseDhcpStateMachine { // one state, so we can just use the state timeout. private void scheduleOneshotTimeout() { final long alarmTime = SystemClock.elapsedRealtime() + DHCP_TIMEOUT_MS; - mOneshotTimeoutAlarm.set(alarmTime); + mOneshotTimeoutAlarm.schedule(alarmTime); } class StoppedState extends LoggingState { @@ -713,8 +690,7 @@ public class DhcpClient extends BaseDhcpStateMachine { long now = SystemClock.elapsedRealtime(); long timeout = jitterTimer(mTimer); long alarmTime = now + timeout; - mKickAlarm.cancel(); - mKickAlarm.set(alarmTime); + mKickAlarm.schedule(alarmTime); mTimer *= 2; if (mTimer > MAX_TIMEOUT_MS) { mTimer = MAX_TIMEOUT_MS; @@ -724,7 +700,7 @@ public class DhcpClient extends BaseDhcpStateMachine { protected void maybeInitTimeout() { if (mTimeout > 0) { long alarmTime = SystemClock.elapsedRealtime() + mTimeout; - mTimeoutAlarm.set(alarmTime); + mTimeoutAlarm.schedule(alarmTime); } } } diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java index 9e701385d59d..48a11c5cb7f1 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java @@ -16,9 +16,12 @@ package com.android.server.pm; +import android.content.pm.UserInfo; import android.os.Bundle; import android.os.FileUtils; import android.os.Parcelable; +import android.os.UserHandle; +import android.os.UserManager; import android.test.AndroidTestCase; import android.util.AtomicFile; @@ -29,6 +32,7 @@ import java.util.Arrays; public class UserManagerServiceTest extends AndroidTestCase { private static String[] STRING_ARRAY = new String[] {"<tag", "<![CDATA["}; private File restrictionsFile; + private int tempUserId = UserHandle.USER_NULL; @Override protected void setUp() throws Exception { @@ -40,6 +44,9 @@ public class UserManagerServiceTest extends AndroidTestCase { @Override protected void tearDown() throws Exception { restrictionsFile.delete(); + if (tempUserId != UserHandle.USER_NULL) { + UserManager.get(mContext).removeUser(tempUserId); + } super.tearDown(); } @@ -55,6 +62,16 @@ public class UserManagerServiceTest extends AndroidTestCase { assertBundle(bundle); } + public void testAddUserWithAccount() { + UserManager um = UserManager.get(mContext); + UserInfo user = um.createUser("Test User", 0); + assertNotNull(user); + tempUserId = user.id; + String accountName = "Test Account"; + um.setUserAccount(tempUserId, accountName); + assertEquals(accountName, um.getUserAccount(tempUserId)); + } + private Bundle createBundle() { Bundle result = new Bundle(); // Tests for 6 allowed types: Integer, Boolean, String, String[], Bundle and Parcelable[] diff --git a/services/usb/java/com/android/server/usb/UsbSettingsManager.java b/services/usb/java/com/android/server/usb/UsbSettingsManager.java index 4786d11fb4b4..7976cb895780 100644 --- a/services/usb/java/com/android/server/usb/UsbSettingsManager.java +++ b/services/usb/java/com/android/server/usb/UsbSettingsManager.java @@ -52,12 +52,10 @@ import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import java.io.File; -import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; @@ -984,14 +982,7 @@ class UsbSettingsManager { public boolean hasPermission(UsbDevice device) { synchronized (mLock) { int uid = Binder.getCallingUid(); - int androidMediaUid; - try { - androidMediaUid = mPackageManager.getApplicationInfo("com.android.mtp", 0).uid; - } catch (NameNotFoundException e) { - androidMediaUid = -1; - } - if (uid == Process.SYSTEM_UID || UserHandle.getAppId(uid) == androidMediaUid || - mDisablePermissionDialogs) { + if (uid == Process.SYSTEM_UID || mDisablePermissionDialogs) { return true; } SparseBooleanArray uidList = mDevicePermissionMap.get(device.getDeviceName()); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index 109d214e1167..3efd0fb7ad7a 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -266,8 +266,6 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne pw.print(" Session service="); pw.println(mInfo.getSessionService()); pw.println(" Service info:"); mInfo.getServiceInfo().dump(new PrintWriterPrinter(pw), " "); - pw.println(" Application info:"); - mInfo.getServiceInfo().applicationInfo.dump(new PrintWriterPrinter(pw), " "); pw.print(" Recognition service="); pw.println(mInfo.getRecognitionService()); pw.print(" Settings activity="); pw.println(mInfo.getSettingsActivity()); pw.print(" Supports assist="); pw.println(mInfo.getSupportsAssist()); diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index b5b4e5f54506..9eb166596132 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -247,6 +247,14 @@ public class TelecomManager { "android.telecom.extra.CONNECTION_SERVICE"; /** + * Optional extra for communicating the call technology used by a + * {@link com.android.internal.telephony.Connection} to Telecom + * @hide + */ + public static final String EXTRA_CALL_TECHNOLOGY_TYPE = + "android.telecom.extra.CALL_TECHNOLOGY_TYPE"; + + /** * An optional {@link android.content.Intent#ACTION_CALL} intent extra denoting the * package name of the app specifying an alternative gateway for the call. * The value is a string. diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index c7f3d0a86e11..6ffc02614657 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -385,6 +385,11 @@ public class CarrierConfigManager { public static final String KEY_VVM_TYPE_STRING = "vvm_type_string"; /** + * Whether cellular data is required to access visual voicemail. + */ + public static final String KEY_VVM_CELLULAR_DATA_REQUIRED_BOOLEAN = "vvm_cellular_data_required"; + + /** * The package name of the carrier's visual voicemail app to ensure that dialer visual voicemail * and carrier visual voicemail are not active at the same time. */ @@ -599,6 +604,7 @@ public class CarrierConfigManager { sDefaults.putString(KEY_VVM_DESTINATION_NUMBER_STRING, ""); sDefaults.putInt(KEY_VVM_PORT_NUMBER_INT, 0); sDefaults.putString(KEY_VVM_TYPE_STRING, ""); + sDefaults.putBoolean(KEY_VVM_CELLULAR_DATA_REQUIRED_BOOLEAN,false); sDefaults.putString(KEY_CARRIER_VVM_PACKAGE_NAME_STRING, ""); sDefaults.putBoolean(KEY_CI_ACTION_ON_SYS_UPDATE_BOOL, false); sDefaults.putString(KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING, ""); @@ -673,12 +679,15 @@ public class CarrierConfigManager { @Nullable public PersistableBundle getConfigForSubId(int subId) { try { - return getICarrierConfigLoader().getConfigForSubId(subId); + ICarrierConfigLoader loader = getICarrierConfigLoader(); + if (loader == null) { + Rlog.w(TAG, "Error getting config for subId " + subId + + " ICarrierConfigLoader is null"); + return null; + } + return loader.getConfigForSubId(subId); } catch (RemoteException ex) { - Rlog.e(TAG, "Error getting config for subId " + Integer.toString(subId) + ": " - + ex.toString()); - } catch (NullPointerException ex) { - Rlog.e(TAG, "Error getting config for subId " + Integer.toString(subId) + ": " + Rlog.e(TAG, "Error getting config for subId " + subId + ": " + ex.toString()); } return null; @@ -714,11 +723,15 @@ public class CarrierConfigManager { */ public void notifyConfigChangedForSubId(int subId) { try { - getICarrierConfigLoader().notifyConfigChangedForSubId(subId); + ICarrierConfigLoader loader = getICarrierConfigLoader(); + if (loader == null) { + Rlog.w(TAG, "Error reloading config for subId=" + subId + + " ICarrierConfigLoader is null"); + return; + } + loader.notifyConfigChangedForSubId(subId); } catch (RemoteException ex) { Rlog.e(TAG, "Error reloading config for subId=" + subId + ": " + ex.toString()); - } catch (NullPointerException ex) { - Rlog.e(TAG, "Error reloading config for subId=" + subId + ": " + ex.toString()); } } @@ -734,11 +747,15 @@ public class CarrierConfigManager { @SystemApi public void updateConfigForPhoneId(int phoneId, String simState) { try { - getICarrierConfigLoader().updateConfigForPhoneId(phoneId, simState); + ICarrierConfigLoader loader = getICarrierConfigLoader(); + if (loader == null) { + Rlog.w(TAG, "Error updating config for phoneId=" + phoneId + + " ICarrierConfigLoader is null"); + return; + } + loader.updateConfigForPhoneId(phoneId, simState); } catch (RemoteException ex) { Rlog.e(TAG, "Error updating config for phoneId=" + phoneId + ": " + ex.toString()); - } catch (NullPointerException ex) { - Rlog.e(TAG, "Error updating config for phoneId=" + phoneId + ": " + ex.toString()); } } @@ -754,6 +771,7 @@ public class CarrierConfigManager { } /** @hide */ + @Nullable private ICarrierConfigLoader getICarrierConfigLoader() { return ICarrierConfigLoader.Stub .asInterface(ServiceManager.getService(Context.CARRIER_CONFIG_SERVICE)); diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 17c24af8992c..f7c63d167602 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -16,6 +16,7 @@ package android.test.mock; +import android.annotation.NonNull; import android.app.PackageInstallObserver; import android.content.ComponentName; import android.content.Intent; @@ -24,6 +25,7 @@ import android.content.IntentSender; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ContainerEncryptionParams; +import android.content.pm.EphemeralApplicationInfo; import android.content.pm.FeatureInfo; import android.content.pm.IPackageDataObserver; import android.content.pm.IPackageDeleteObserver; @@ -286,6 +288,38 @@ public class MockPackageManager extends PackageManager { throw new UnsupportedOperationException(); } + /** @hide */ + @Override + public List<EphemeralApplicationInfo> getEphemeralApplications() { + throw new UnsupportedOperationException(); + } + + /** @hide */ + @Override + public Drawable getEphemeralApplicationIcon(String packageName) { + throw new UnsupportedOperationException(); + } + + @Override + public byte[] getEphemeralCookie() { + return new byte[0]; + } + + @Override + public boolean isEphemeralApplication() { + return false; + } + + @Override + public int getEphemeralCookieMaxSizeBytes() { + return 0; + } + + @Override + public boolean setEphemeralCookie(@NonNull byte[] cookie) { + return false; + } + @Override public ResolveInfo resolveActivity(Intent intent, int flags) { throw new UnsupportedOperationException(); diff --git a/tools/aapt/Bundle.h b/tools/aapt/Bundle.h index c29bb482c159..c4495509614e 100644 --- a/tools/aapt/Bundle.h +++ b/tools/aapt/Bundle.h @@ -127,6 +127,12 @@ public: const android::String8& getPlatformBuildVersionName() { return mPlatformVersionName; } void setPlatformBuildVersionName(const android::String8& name) { mPlatformVersionName = name; } + const android::String8& getPrivateSymbolsPackage() const { return mPrivateSymbolsPackage; } + + void setPrivateSymbolsPackage(const android::String8& package) { + mPrivateSymbolsPackage = package; + } + bool getUTF16StringsOption() { return mWantUTF16 || !isMinSdkAtLeast(SDK_FROYO); } @@ -333,6 +339,7 @@ private: bool mBuildAppAsSharedLibrary; android::String8 mPlatformVersionCode; android::String8 mPlatformVersionName; + android::String8 mPrivateSymbolsPackage; /* file specification */ int mArgc; diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp index 64112867a4b4..c424cc516b56 100644 --- a/tools/aapt/Main.cpp +++ b/tools/aapt/Main.cpp @@ -220,7 +220,9 @@ void usage(void) " Prevents symbols from being generated for strings that do not have a default\n" " localization\n" " --no-version-vectors\n" - " Do not automatically generate versioned copies of vector XML resources.\n", + " Do not automatically generate versioned copies of vector XML resources.\n" + " --private-symbols\n" + " Java package name to use when generating R.java for private resources.\n", gDefaultIgnoreAssets); } @@ -689,6 +691,16 @@ int main(int argc, char* const argv[]) bundle.setPseudolocalize(PSEUDO_ACCENTED | PSEUDO_BIDI); } else if (strcmp(cp, "-no-version-vectors") == 0) { bundle.setNoVersionVectors(true); + } else if (strcmp(cp, "-private-symbols") == 0) { + argc--; + argv++; + if (!argc) { + fprintf(stderr, "ERROR: No argument supplied for " + "'--private-symbols' option\n"); + wantUsage = true; + goto bail; + } + bundle.setPrivateSymbolsPackage(String8(argv[0])); } else { fprintf(stderr, "ERROR: Unknown option '-%s'\n", cp); wantUsage = true; diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index fb0fe38da1ff..576f076f4a3f 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -1161,6 +1161,12 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil printf("Creating resources for package %s\n", assets->getPackage().string()); } + // Set the private symbols package if it was declared. + // This can also be declared in XML as <private-symbols name="package" /> + if (bundle->getPrivateSymbolsPackage().size() != 0) { + assets->setSymbolsPrivatePackage(bundle->getPrivateSymbolsPackage()); + } + ResourceTable::PackageType packageType = ResourceTable::App; if (bundle->getBuildSharedLibrary()) { packageType = ResourceTable::SharedLibrary; diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp index 0e470d924f5a..e87c7d40f1d4 100644 --- a/tools/aapt/ResourceTable.cpp +++ b/tools/aapt/ResourceTable.cpp @@ -1141,7 +1141,15 @@ status_t compileResourceFile(Bundle* bundle, } pkg = String16(block.getAttributeStringValue(pkgIdx, &len)); if (!localHasErrors) { - assets->setSymbolsPrivatePackage(String8(pkg)); + SourcePos(in->getPrintableSource(), block.getLineNumber()).warning( + "<private-symbols> is deprecated. Use the command line flag " + "--private-symbols instead.\n"); + if (assets->havePrivateSymbols()) { + SourcePos(in->getPrintableSource(), block.getLineNumber()).warning( + "private symbol package already specified. Ignoring...\n"); + } else { + assets->setSymbolsPrivatePackage(String8(pkg)); + } } while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { diff --git a/tools/aapt2/flatten/TableFlattener.cpp b/tools/aapt2/flatten/TableFlattener.cpp index f42e6b7b126f..46ee914c150a 100644 --- a/tools/aapt2/flatten/TableFlattener.cpp +++ b/tools/aapt2/flatten/TableFlattener.cpp @@ -23,7 +23,7 @@ #include "flatten/TableFlattener.h" #include "util/BigBuffer.h" -#include <base/macros.h> +#include <android-base/macros.h> #include <type_traits> #include <numeric> diff --git a/tools/aapt2/unflatten/BinaryResourceParser.cpp b/tools/aapt2/unflatten/BinaryResourceParser.cpp index 5cc7aa7cdc3e..46b520592f25 100644 --- a/tools/aapt2/unflatten/BinaryResourceParser.cpp +++ b/tools/aapt2/unflatten/BinaryResourceParser.cpp @@ -27,7 +27,7 @@ #include <androidfw/ResourceTypes.h> #include <androidfw/TypeWrappers.h> -#include <base/macros.h> +#include <android-base/macros.h> #include <map> #include <string> diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java index e3a19e76a3ef..bab25c0a395e 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java @@ -16,6 +16,7 @@ package com.android.layoutlib.bridge.android; +import android.annotation.NonNull; import android.app.PackageInstallObserver; import android.content.ComponentName; import android.content.Intent; @@ -24,6 +25,7 @@ import android.content.IntentSender; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ContainerEncryptionParams; +import android.content.pm.EphemeralApplicationInfo; import android.content.pm.FeatureInfo; import android.content.pm.IPackageDataObserver; import android.content.pm.IPackageDeleteObserver; @@ -251,6 +253,36 @@ public class BridgePackageManager extends PackageManager { } @Override + public List<EphemeralApplicationInfo> getEphemeralApplications() { + return null; + } + + @Override + public Drawable getEphemeralApplicationIcon(String packageName) { + throw new UnsupportedOperationException(); + } + + @Override + public byte[] getEphemeralCookie() { + return new byte[0]; + } + + @Override + public boolean isEphemeralApplication() { + return false; + } + + @Override + public int getEphemeralCookieMaxSizeBytes() { + return 0; + } + + @Override + public boolean setEphemeralCookie(@NonNull byte[] cookie) { + return false; + } + + @Override public String[] getSystemSharedLibraryNames() { return new String[0]; } |