diff options
309 files changed, 2804 insertions, 1722 deletions
diff --git a/api/current.txt b/api/current.txt index 70ea1c577134..ebda35c7a87c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -2024,6 +2024,8 @@ package android { field public static final int TextAppearance_Material_Widget_ActionMode_Title = 16974355; // 0x1030213 field public static final int TextAppearance_Material_Widget_ActionMode_Title_Inverse = 16974356; // 0x1030214 field public static final int TextAppearance_Material_Widget_Button = 16974357; // 0x1030215 + field public static final int TextAppearance_Material_Widget_Button_Borderless_Colored = 16974559; // 0x10302df + field public static final int TextAppearance_Material_Widget_Button_Colored = 16974558; // 0x10302de field public static final int TextAppearance_Material_Widget_Button_Inverse = 16974548; // 0x10302d4 field public static final int TextAppearance_Material_Widget_DropDownHint = 16974358; // 0x1030216 field public static final int TextAppearance_Material_Widget_DropDownItem = 16974359; // 0x1030217 @@ -6455,7 +6457,7 @@ package android.app.usage { public class NetworkStatsManager { method public android.app.usage.NetworkStats queryDetails(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; method public android.app.usage.NetworkStats queryDetailsForUid(int, java.lang.String, long, long, int) throws android.os.RemoteException, java.lang.SecurityException; - method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int); + method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int) throws java.lang.SecurityException; method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; method public android.app.usage.NetworkStats.Bucket querySummaryForDevice(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; @@ -23624,7 +23626,6 @@ package android.net { method public boolean isConnected(); method public boolean isConnectedOrConnecting(); method public boolean isFailover(); - method public boolean isMetered(); method public boolean isRoaming(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.net.NetworkInfo> CREATOR; @@ -28267,7 +28268,7 @@ package android.os { field public static final int LOLLIPOP = 21; // 0x15 field public static final int LOLLIPOP_MR1 = 22; // 0x16 field public static final int M = 23; // 0x17 - field public static final int N = 10000; // 0x2710 + field public static final int N = 24; // 0x18 } public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable { @@ -34401,7 +34402,7 @@ package android.service.carrier { field public static final int DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK = 1; // 0x1 field public static final int RECEIVE_OPTIONS_DEFAULT = 0; // 0x0 field public static final int RECEIVE_OPTIONS_DROP = 1; // 0x1 - field public static final int RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_ENCRYPTED_STORAGE_UNAVAILABLE = 2; // 0x2 + field public static final int RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE = 2; // 0x2 field public static final int SEND_FLAG_REQUEST_DELIVERY_STATUS = 1; // 0x1 field public static final int SEND_STATUS_ERROR = 2; // 0x2 field public static final int SEND_STATUS_OK = 0; // 0x0 @@ -34569,7 +34570,7 @@ package android.service.media { package android.service.notification { - public class Condition implements android.os.Parcelable { + public final class Condition implements android.os.Parcelable { ctor public Condition(android.net.Uri, java.lang.String, int); ctor public Condition(android.net.Uri, java.lang.String, java.lang.String, java.lang.String, int, int, int); ctor public Condition(android.os.Parcel); @@ -34606,7 +34607,7 @@ package android.service.notification { method public void onRequestConditions(int); method public abstract void onSubscribe(android.net.Uri); method public abstract void onUnsubscribe(android.net.Uri); - field public static final java.lang.String EXTRA_RULE_ID = "android.content.automatic.ruleId"; + field public static final java.lang.String EXTRA_RULE_ID = "android.service.notification.extra.RULE_ID"; field public static final java.lang.String META_DATA_CONFIGURATION_ACTIVITY = "android.service.zen.automatic.configurationActivity"; field public static final java.lang.String META_DATA_RULE_INSTANCE_LIMIT = "android.service.zen.automatic.ruleInstanceLimit"; field public static final java.lang.String META_DATA_RULE_TYPE = "android.service.zen.automatic.ruleType"; @@ -36608,11 +36609,9 @@ package android.telecom { package android.telephony { public class CarrierConfigManager { - method public android.os.PersistableBundle getConfig(int); method public android.os.PersistableBundle getConfig(); - method public deprecated android.os.PersistableBundle getConfigForSubId(int); - method public void notifyConfigChanged(int); - method public deprecated void notifyConfigChangedForSubId(int); + method public android.os.PersistableBundle getConfigForSubId(int); + method public void notifyConfigChangedForSubId(int); field public static final java.lang.String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED"; field public static final java.lang.String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool"; field public static final java.lang.String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool"; @@ -37204,69 +37203,47 @@ package android.telephony { public class TelephonyManager { method public boolean canChangeDtmfToneLength(); + method public android.telephony.TelephonyManager createForSubscriptionId(int); method public java.util.List<android.telephony.CellInfo> getAllCellInfo(); method public int getCallState(); - method public int getCallState(int); method public android.telephony.CellLocation getCellLocation(); method public int getDataActivity(); - method public int getDataNetworkType(int); + method public int getDataNetworkType(); method public int getDataState(); method public java.lang.String getDeviceId(); method public java.lang.String getDeviceId(int); method public java.lang.String getDeviceSoftwareVersion(); method public java.lang.String getGroupIdLevel1(); - method public java.lang.String getGroupIdLevel1(int); method public java.lang.String getIccAuthentication(int, int, java.lang.String); - method public java.lang.String getIccAuthentication(int, int, int, java.lang.String); - method public java.lang.String getLine1AlphaTag(int); method public java.lang.String getLine1Number(); - method public java.lang.String getLine1Number(int); method public java.lang.String getMmsUAProfUrl(); method public java.lang.String getMmsUserAgent(); method public deprecated java.util.List<android.telephony.NeighboringCellInfo> getNeighboringCellInfo(); method public java.lang.String getNetworkCountryIso(); - method public java.lang.String getNetworkCountryIso(int); method public java.lang.String getNetworkOperator(); - method public java.lang.String getNetworkOperator(int); method public java.lang.String getNetworkOperatorName(); - method public java.lang.String getNetworkOperatorName(int); method public int getNetworkType(); - method public int getNetworkType(int); method public int getPhoneCount(); method public int getPhoneType(); method public java.lang.String getSimCountryIso(); - method public java.lang.String getSimCountryIso(int); method public java.lang.String getSimOperator(); - method public java.lang.String getSimOperator(int); method public java.lang.String getSimOperatorName(); - method public java.lang.String getSimOperatorName(int); method public java.lang.String getSimSerialNumber(); - method public java.lang.String getSimSerialNumber(int); method public int getSimState(); method public java.lang.String getSubscriberId(); - method public java.lang.String getSubscriberId(int); method public java.lang.String getVoiceMailAlphaTag(); - method public java.lang.String getVoiceMailAlphaTag(int); method public java.lang.String getVoiceMailNumber(); - method public java.lang.String getVoiceMailNumber(int); - method public int getVoiceNetworkType(int); + method public int getVoiceNetworkType(); method public android.net.Uri getVoicemailRingtoneUri(android.telecom.PhoneAccountHandle); method public boolean hasCarrierPrivileges(); - method public boolean hasCarrierPrivileges(int); method public boolean hasIccCard(); method public boolean iccCloseLogicalChannel(int); - method public boolean iccCloseLogicalChannel(int, int); method public byte[] iccExchangeSimIO(int, int, int, int, int, java.lang.String); - method public byte[] iccExchangeSimIO(int, int, int, int, int, int, java.lang.String); method public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannel(java.lang.String); - method public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannel(int, java.lang.String); method public java.lang.String iccTransmitApduBasicChannel(int, int, int, int, int, java.lang.String); - method public java.lang.String iccTransmitApduBasicChannel(int, int, int, int, int, int, java.lang.String); method public java.lang.String iccTransmitApduLogicalChannel(int, int, int, int, int, int, java.lang.String); - method public java.lang.String iccTransmitApduLogicalChannel(int, int, int, int, int, int, int, java.lang.String); method public boolean isHearingAidCompatibilitySupported(); method public boolean isNetworkRoaming(); - method public boolean isNetworkRoaming(int); method public boolean isSmsCapable(); method public boolean isTtyModeSupported(); method public boolean isVoiceCapable(); @@ -37274,15 +37251,10 @@ package android.telephony { method public boolean isWorldPhone(); method public void listen(android.telephony.PhoneStateListener, int); method public java.lang.String sendEnvelopeWithStatus(java.lang.String); - method public java.lang.String sendEnvelopeWithStatus(int, java.lang.String); method public boolean setLine1NumberForDisplay(java.lang.String, java.lang.String); - method public boolean setLine1NumberForDisplay(int, java.lang.String, java.lang.String); method public boolean setOperatorBrandOverride(java.lang.String); - method public boolean setOperatorBrandOverride(int, java.lang.String); method public boolean setPreferredNetworkTypeToGlobal(); - method public boolean setPreferredNetworkTypeToGlobal(int); method public boolean setVoiceMailNumber(java.lang.String, java.lang.String); - method public boolean setVoiceMailNumber(int, java.lang.String, java.lang.String); field public static final java.lang.String ACTION_CONFIGURE_VOICEMAIL = "android.telephony.action.CONFIGURE_VOICEMAIL"; field public static final java.lang.String ACTION_PHONE_STATE_CHANGED = "android.intent.action.PHONE_STATE"; field public static final java.lang.String ACTION_RESPOND_VIA_MESSAGE = "android.intent.action.RESPOND_VIA_MESSAGE"; @@ -37763,7 +37735,7 @@ package android.test.mock { ctor public MockApplication(); } - public deprecated class MockContentProvider extends android.content.ContentProvider { + public class MockContentProvider extends android.content.ContentProvider { ctor protected MockContentProvider(); ctor public MockContentProvider(android.content.Context); ctor public MockContentProvider(android.content.Context, java.lang.String, java.lang.String, android.content.pm.PathPermission[]); @@ -37775,13 +37747,13 @@ package android.test.mock { method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); } - public deprecated class MockContentResolver extends android.content.ContentResolver { + public class MockContentResolver extends android.content.ContentResolver { ctor public MockContentResolver(); ctor public MockContentResolver(android.content.Context); method public void addProvider(java.lang.String, android.content.ContentProvider); } - public deprecated class MockContext extends android.content.Context { + public class MockContext extends android.content.Context { ctor public MockContext(); method public boolean bindService(android.content.Intent, android.content.ServiceConnection, int); method public int checkCallingOrSelfPermission(java.lang.String); @@ -42388,7 +42360,6 @@ package android.view { method public boolean hasNestedScrollingParent(); method public boolean hasOnClickListeners(); method public boolean hasOverlappingRendering(); - method public boolean hasPointerCapture(); method public boolean hasTransientState(); method public boolean hasWindowFocus(); method public static android.view.View inflate(android.content.Context, int, android.view.ViewGroup); @@ -42501,6 +42472,7 @@ package android.view { method protected boolean overScrollBy(int, int, int, int, int, int, int, int, boolean); method public boolean performAccessibilityAction(int, android.os.Bundle); method public boolean performClick(); + method public boolean performContextClick(float, float); method public boolean performContextClick(); method public boolean performHapticFeedback(int); method public boolean performHapticFeedback(int, int); @@ -42518,7 +42490,6 @@ package android.view { method public void postOnAnimation(java.lang.Runnable); method public void postOnAnimationDelayed(java.lang.Runnable, long); method public void refreshDrawableState(); - method public void releasePointerCapture(); method public boolean removeCallbacks(java.lang.Runnable); method public void removeOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener); method public void removeOnLayoutChangeListener(android.view.View.OnLayoutChangeListener); @@ -42529,7 +42500,6 @@ package android.view { method public boolean requestFocus(int, android.graphics.Rect); method public final boolean requestFocusFromTouch(); method public void requestLayout(); - method public void requestPointerCapture(); method public boolean requestRectangleOnScreen(android.graphics.Rect); method public boolean requestRectangleOnScreen(android.graphics.Rect, boolean); method public final void requestUnbufferedDispatch(android.view.MotionEvent); diff --git a/api/removed.txt b/api/removed.txt index 42c64ea62cce..0ff247640749 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -31,37 +31,6 @@ package android.app.admin { } -package android.app.usage { - - public class DataUsagePolicy { - field public final int networkType; - field public final java.lang.String[] subscriberIds; - field public final long thresholdInBytes; - field public final int[] uids; - } - - public static class DataUsagePolicy.Builder { - ctor public DataUsagePolicy.Builder(); - method public android.app.usage.DataUsagePolicy.Builder addSubscriberId(java.lang.String); - method public android.app.usage.DataUsagePolicy.Builder addUid(int); - method public android.app.usage.DataUsagePolicy build(); - method public android.app.usage.DataUsagePolicy.Builder setNetworkType(int); - method public android.app.usage.DataUsagePolicy.Builder setThreshold(long); - } - - public class NetworkStatsManager { - method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback, android.os.Handler); - method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.UsageCallback, android.os.Handler); - method public void unregisterDataUsageCallback(android.app.usage.NetworkStatsManager.DataUsageCallback); - } - - public static abstract class NetworkStatsManager.DataUsageCallback { - ctor public NetworkStatsManager.DataUsageCallback(); - method public deprecated void onLimitReached(); - } - -} - package android.content { public abstract class Context { diff --git a/api/system-current.txt b/api/system-current.txt index a6f612d195bf..0b6ac73f755d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -2136,6 +2136,8 @@ package android { field public static final int TextAppearance_Material_Widget_ActionMode_Title = 16974355; // 0x1030213 field public static final int TextAppearance_Material_Widget_ActionMode_Title_Inverse = 16974356; // 0x1030214 field public static final int TextAppearance_Material_Widget_Button = 16974357; // 0x1030215 + field public static final int TextAppearance_Material_Widget_Button_Borderless_Colored = 16974559; // 0x10302df + field public static final int TextAppearance_Material_Widget_Button_Colored = 16974558; // 0x10302de field public static final int TextAppearance_Material_Widget_Button_Inverse = 16974548; // 0x10302d4 field public static final int TextAppearance_Material_Widget_DropDownHint = 16974358; // 0x1030216 field public static final int TextAppearance_Material_Widget_DropDownItem = 16974359; // 0x1030217 @@ -6736,7 +6738,7 @@ package android.app.usage { public class NetworkStatsManager { method public android.app.usage.NetworkStats queryDetails(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; method public android.app.usage.NetworkStats queryDetailsForUid(int, java.lang.String, long, long, int) throws android.os.RemoteException, java.lang.SecurityException; - method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int); + method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int) throws java.lang.SecurityException; method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; method public android.app.usage.NetworkStats.Bucket querySummaryForDevice(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; @@ -25446,7 +25448,6 @@ package android.net { method public boolean isConnected(); method public boolean isConnectedOrConnecting(); method public boolean isFailover(); - method public boolean isMetered(); method public boolean isRoaming(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.net.NetworkInfo> CREATOR; @@ -30706,7 +30707,7 @@ package android.os { field public static final int LOLLIPOP = 21; // 0x15 field public static final int LOLLIPOP_MR1 = 22; // 0x16 field public static final int M = 23; // 0x17 - field public static final int N = 10000; // 0x2710 + field public static final int N = 24; // 0x18 } public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable { @@ -37107,7 +37108,7 @@ package android.service.carrier { field public static final int DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK = 1; // 0x1 field public static final int RECEIVE_OPTIONS_DEFAULT = 0; // 0x0 field public static final int RECEIVE_OPTIONS_DROP = 1; // 0x1 - field public static final int RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_ENCRYPTED_STORAGE_UNAVAILABLE = 2; // 0x2 + field public static final int RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE = 2; // 0x2 field public static final int SEND_FLAG_REQUEST_DELIVERY_STATUS = 1; // 0x1 field public static final int SEND_STATUS_ERROR = 2; // 0x2 field public static final int SEND_STATUS_OK = 0; // 0x0 @@ -37292,7 +37293,7 @@ package android.service.notification { field public static final java.lang.String NEEDS_AUTOGROUPING_KEY = "autogroup_needed"; } - public class Condition implements android.os.Parcelable { + public final class Condition implements android.os.Parcelable { ctor public Condition(android.net.Uri, java.lang.String, int); ctor public Condition(android.net.Uri, java.lang.String, java.lang.String, java.lang.String, int, int, int); ctor public Condition(android.os.Parcel); @@ -37329,7 +37330,7 @@ package android.service.notification { method public void onRequestConditions(int); method public abstract void onSubscribe(android.net.Uri); method public abstract void onUnsubscribe(android.net.Uri); - field public static final java.lang.String EXTRA_RULE_ID = "android.content.automatic.ruleId"; + field public static final java.lang.String EXTRA_RULE_ID = "android.service.notification.extra.RULE_ID"; field public static final java.lang.String META_DATA_CONFIGURATION_ACTIVITY = "android.service.zen.automatic.configurationActivity"; field public static final java.lang.String META_DATA_RULE_INSTANCE_LIMIT = "android.service.zen.automatic.ruleInstanceLimit"; field public static final java.lang.String META_DATA_RULE_TYPE = "android.service.zen.automatic.ruleType"; @@ -39539,12 +39540,10 @@ package android.telecom { package android.telephony { public class CarrierConfigManager { - method public android.os.PersistableBundle getConfig(int); method public android.os.PersistableBundle getConfig(); - method public deprecated android.os.PersistableBundle getConfigForSubId(int); + method public android.os.PersistableBundle getConfigForSubId(int); method public static android.os.PersistableBundle getDefaultConfig(); - method public void notifyConfigChanged(int); - method public deprecated void notifyConfigChangedForSubId(int); + method public void notifyConfigChangedForSubId(int); method public void updateConfigForPhoneId(int, java.lang.String); field public static final java.lang.String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED"; field public static final java.lang.String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool"; @@ -40141,6 +40140,7 @@ package android.telephony { method public boolean canChangeDtmfToneLength(); method public int checkCarrierPrivilegesForPackage(java.lang.String); method public int checkCarrierPrivilegesForPackageAnyPhone(java.lang.String); + method public android.telephony.TelephonyManager createForSubscriptionId(int); method public void dial(java.lang.String); method public boolean disableDataConnectivity(); method public boolean enableDataConnectivity(); @@ -40148,7 +40148,6 @@ package android.telephony { method public boolean endCall(); method public java.util.List<android.telephony.CellInfo> getAllCellInfo(); method public int getCallState(); - method public int getCallState(int); method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent); method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int); method public java.lang.String getCdmaMdn(); @@ -40161,68 +40160,46 @@ package android.telephony { method public int getDataActivity(); method public boolean getDataEnabled(); method public boolean getDataEnabled(int); - method public int getDataNetworkType(int); + method public int getDataNetworkType(); method public int getDataState(); method public java.lang.String getDeviceId(); method public java.lang.String getDeviceId(int); method public java.lang.String getDeviceSoftwareVersion(); method public java.lang.String getGroupIdLevel1(); - method public java.lang.String getGroupIdLevel1(int); method public java.lang.String getIccAuthentication(int, int, java.lang.String); - method public java.lang.String getIccAuthentication(int, int, int, java.lang.String); - method public java.lang.String getLine1AlphaTag(int); method public java.lang.String getLine1Number(); - method public java.lang.String getLine1Number(int); method public java.lang.String getMmsUAProfUrl(); method public java.lang.String getMmsUserAgent(); method public deprecated java.util.List<android.telephony.NeighboringCellInfo> getNeighboringCellInfo(); method public java.lang.String getNetworkCountryIso(); - method public java.lang.String getNetworkCountryIso(int); method public java.lang.String getNetworkOperator(); - method public java.lang.String getNetworkOperator(int); method public java.lang.String getNetworkOperatorName(); - method public java.lang.String getNetworkOperatorName(int); method public int getNetworkType(); - method public int getNetworkType(int); method public int getPhoneCount(); method public int getPhoneType(); method public java.lang.String getSimCountryIso(); - method public java.lang.String getSimCountryIso(int); method public java.lang.String getSimOperator(); - method public java.lang.String getSimOperator(int); method public java.lang.String getSimOperatorName(); - method public java.lang.String getSimOperatorName(int); method public java.lang.String getSimSerialNumber(); - method public java.lang.String getSimSerialNumber(int); method public int getSimState(); method public java.lang.String getSubscriberId(); - method public java.lang.String getSubscriberId(int); method public java.lang.String getVoiceMailAlphaTag(); - method public java.lang.String getVoiceMailAlphaTag(int); method public java.lang.String getVoiceMailNumber(); - method public java.lang.String getVoiceMailNumber(int); - method public int getVoiceNetworkType(int); + method public int getVoiceNetworkType(); method public android.net.Uri getVoicemailRingtoneUri(android.telecom.PhoneAccountHandle); method public boolean handlePinMmi(java.lang.String); method public boolean handlePinMmiForSubscriber(int, java.lang.String); method public boolean hasCarrierPrivileges(); - method public boolean hasCarrierPrivileges(int); method public boolean hasIccCard(); method public boolean iccCloseLogicalChannel(int); - method public boolean iccCloseLogicalChannel(int, int); method public byte[] iccExchangeSimIO(int, int, int, int, int, java.lang.String); - method public byte[] iccExchangeSimIO(int, int, int, int, int, int, java.lang.String); method public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannel(java.lang.String); - method public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannel(int, java.lang.String); method public java.lang.String iccTransmitApduBasicChannel(int, int, int, int, int, java.lang.String); - method public java.lang.String iccTransmitApduBasicChannel(int, int, int, int, int, int, java.lang.String); method public java.lang.String iccTransmitApduLogicalChannel(int, int, int, int, int, int, java.lang.String); - method public java.lang.String iccTransmitApduLogicalChannel(int, int, int, int, int, int, int, java.lang.String); method public boolean isDataConnectivityPossible(); method public boolean isHearingAidCompatibilitySupported(); method public boolean isIdle(); method public boolean isNetworkRoaming(); - method public boolean isNetworkRoaming(int); method public boolean isOffhook(); method public boolean isRadioOn(); method public boolean isRinging(); @@ -40235,19 +40212,14 @@ package android.telephony { method public void listen(android.telephony.PhoneStateListener, int); method public boolean needsOtaServiceProvisioning(); method public java.lang.String sendEnvelopeWithStatus(java.lang.String); - method public java.lang.String sendEnvelopeWithStatus(int, java.lang.String); method public void setDataEnabled(boolean); method public void setDataEnabled(int, boolean); method public boolean setLine1NumberForDisplay(java.lang.String, java.lang.String); - method public boolean setLine1NumberForDisplay(int, java.lang.String, java.lang.String); method public boolean setOperatorBrandOverride(java.lang.String); - method public boolean setOperatorBrandOverride(int, java.lang.String); method public boolean setPreferredNetworkTypeToGlobal(); - method public boolean setPreferredNetworkTypeToGlobal(int); method public boolean setRadio(boolean); method public boolean setRadioPower(boolean); method public boolean setVoiceMailNumber(java.lang.String, java.lang.String); - method public boolean setVoiceMailNumber(int, java.lang.String, java.lang.String); method public void silenceRinger(); method public boolean supplyPin(java.lang.String); method public int[] supplyPinReportResult(java.lang.String); @@ -40749,7 +40721,7 @@ package android.test.mock { ctor public MockApplication(); } - public deprecated class MockContentProvider extends android.content.ContentProvider { + public class MockContentProvider extends android.content.ContentProvider { ctor protected MockContentProvider(); ctor public MockContentProvider(android.content.Context); ctor public MockContentProvider(android.content.Context, java.lang.String, java.lang.String, android.content.pm.PathPermission[]); @@ -40761,13 +40733,13 @@ package android.test.mock { method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); } - public deprecated class MockContentResolver extends android.content.ContentResolver { + public class MockContentResolver extends android.content.ContentResolver { ctor public MockContentResolver(); ctor public MockContentResolver(android.content.Context); method public void addProvider(java.lang.String, android.content.ContentProvider); } - public deprecated class MockContext extends android.content.Context { + public class MockContext extends android.content.Context { ctor public MockContext(); method public boolean bindService(android.content.Intent, android.content.ServiceConnection, int); method public int checkCallingOrSelfPermission(java.lang.String); @@ -45386,7 +45358,6 @@ package android.view { method public boolean hasNestedScrollingParent(); method public boolean hasOnClickListeners(); method public boolean hasOverlappingRendering(); - method public boolean hasPointerCapture(); method public boolean hasTransientState(); method public boolean hasWindowFocus(); method public static android.view.View inflate(android.content.Context, int, android.view.ViewGroup); @@ -45499,6 +45470,7 @@ package android.view { method protected boolean overScrollBy(int, int, int, int, int, int, int, int, boolean); method public boolean performAccessibilityAction(int, android.os.Bundle); method public boolean performClick(); + method public boolean performContextClick(float, float); method public boolean performContextClick(); method public boolean performHapticFeedback(int); method public boolean performHapticFeedback(int, int); @@ -45516,7 +45488,6 @@ package android.view { method public void postOnAnimation(java.lang.Runnable); method public void postOnAnimationDelayed(java.lang.Runnable, long); method public void refreshDrawableState(); - method public void releasePointerCapture(); method public boolean removeCallbacks(java.lang.Runnable); method public void removeOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener); method public void removeOnLayoutChangeListener(android.view.View.OnLayoutChangeListener); @@ -45527,7 +45498,6 @@ package android.view { method public boolean requestFocus(int, android.graphics.Rect); method public final boolean requestFocusFromTouch(); method public void requestLayout(); - method public void requestPointerCapture(); method public boolean requestRectangleOnScreen(android.graphics.Rect); method public boolean requestRectangleOnScreen(android.graphics.Rect, boolean); method public final void requestUnbufferedDispatch(android.view.MotionEvent); diff --git a/api/system-removed.txt b/api/system-removed.txt index 4873605d4e1d..715312fdf6d4 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -29,37 +29,6 @@ package android.app.admin { } -package android.app.usage { - - public class DataUsagePolicy { - field public final int networkType; - field public final java.lang.String[] subscriberIds; - field public final long thresholdInBytes; - field public final int[] uids; - } - - public static class DataUsagePolicy.Builder { - ctor public DataUsagePolicy.Builder(); - method public android.app.usage.DataUsagePolicy.Builder addSubscriberId(java.lang.String); - method public android.app.usage.DataUsagePolicy.Builder addUid(int); - method public android.app.usage.DataUsagePolicy build(); - method public android.app.usage.DataUsagePolicy.Builder setNetworkType(int); - method public android.app.usage.DataUsagePolicy.Builder setThreshold(long); - } - - public class NetworkStatsManager { - method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback, android.os.Handler); - method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.UsageCallback, android.os.Handler); - method public void unregisterDataUsageCallback(android.app.usage.NetworkStatsManager.DataUsageCallback); - } - - public static abstract class NetworkStatsManager.DataUsageCallback { - ctor public NetworkStatsManager.DataUsageCallback(); - method public deprecated void onLimitReached(); - } - -} - package android.content { public abstract class Context { diff --git a/api/test-current.txt b/api/test-current.txt index 37bc7afb69ef..d277fd7ae733 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -2024,6 +2024,8 @@ package android { field public static final int TextAppearance_Material_Widget_ActionMode_Title = 16974355; // 0x1030213 field public static final int TextAppearance_Material_Widget_ActionMode_Title_Inverse = 16974356; // 0x1030214 field public static final int TextAppearance_Material_Widget_Button = 16974357; // 0x1030215 + field public static final int TextAppearance_Material_Widget_Button_Borderless_Colored = 16974559; // 0x10302df + field public static final int TextAppearance_Material_Widget_Button_Colored = 16974558; // 0x10302de field public static final int TextAppearance_Material_Widget_Button_Inverse = 16974548; // 0x10302d4 field public static final int TextAppearance_Material_Widget_DropDownHint = 16974358; // 0x1030216 field public static final int TextAppearance_Material_Widget_DropDownItem = 16974359; // 0x1030217 @@ -6461,7 +6463,7 @@ package android.app.usage { public class NetworkStatsManager { method public android.app.usage.NetworkStats queryDetails(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; method public android.app.usage.NetworkStats queryDetailsForUid(int, java.lang.String, long, long, int) throws android.os.RemoteException, java.lang.SecurityException; - method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int); + method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int) throws java.lang.SecurityException; method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; method public android.app.usage.NetworkStats.Bucket querySummaryForDevice(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException; @@ -23693,7 +23695,6 @@ package android.net { method public boolean isConnected(); method public boolean isConnectedOrConnecting(); method public boolean isFailover(); - method public boolean isMetered(); method public boolean isRoaming(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.net.NetworkInfo> CREATOR; @@ -28336,7 +28337,7 @@ package android.os { field public static final int LOLLIPOP = 21; // 0x15 field public static final int LOLLIPOP_MR1 = 22; // 0x16 field public static final int M = 23; // 0x17 - field public static final int N = 10000; // 0x2710 + field public static final int N = 24; // 0x18 } public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable { @@ -34478,7 +34479,7 @@ package android.service.carrier { field public static final int DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK = 1; // 0x1 field public static final int RECEIVE_OPTIONS_DEFAULT = 0; // 0x0 field public static final int RECEIVE_OPTIONS_DROP = 1; // 0x1 - field public static final int RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_ENCRYPTED_STORAGE_UNAVAILABLE = 2; // 0x2 + field public static final int RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE = 2; // 0x2 field public static final int SEND_FLAG_REQUEST_DELIVERY_STATUS = 1; // 0x1 field public static final int SEND_STATUS_ERROR = 2; // 0x2 field public static final int SEND_STATUS_OK = 0; // 0x0 @@ -34646,7 +34647,7 @@ package android.service.media { package android.service.notification { - public class Condition implements android.os.Parcelable { + public final class Condition implements android.os.Parcelable { ctor public Condition(android.net.Uri, java.lang.String, int); ctor public Condition(android.net.Uri, java.lang.String, java.lang.String, java.lang.String, int, int, int); ctor public Condition(android.os.Parcel); @@ -34683,7 +34684,7 @@ package android.service.notification { method public void onRequestConditions(int); method public abstract void onSubscribe(android.net.Uri); method public abstract void onUnsubscribe(android.net.Uri); - field public static final java.lang.String EXTRA_RULE_ID = "android.content.automatic.ruleId"; + field public static final java.lang.String EXTRA_RULE_ID = "android.service.notification.extra.RULE_ID"; field public static final java.lang.String META_DATA_CONFIGURATION_ACTIVITY = "android.service.zen.automatic.configurationActivity"; field public static final java.lang.String META_DATA_RULE_INSTANCE_LIMIT = "android.service.zen.automatic.ruleInstanceLimit"; field public static final java.lang.String META_DATA_RULE_TYPE = "android.service.zen.automatic.ruleType"; @@ -36685,11 +36686,9 @@ package android.telecom { package android.telephony { public class CarrierConfigManager { - method public android.os.PersistableBundle getConfig(int); method public android.os.PersistableBundle getConfig(); - method public deprecated android.os.PersistableBundle getConfigForSubId(int); - method public void notifyConfigChanged(int); - method public deprecated void notifyConfigChangedForSubId(int); + method public android.os.PersistableBundle getConfigForSubId(int); + method public void notifyConfigChangedForSubId(int); field public static final java.lang.String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED"; field public static final java.lang.String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool"; field public static final java.lang.String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool"; @@ -37281,69 +37280,47 @@ package android.telephony { public class TelephonyManager { method public boolean canChangeDtmfToneLength(); + method public android.telephony.TelephonyManager createForSubscriptionId(int); method public java.util.List<android.telephony.CellInfo> getAllCellInfo(); method public int getCallState(); - method public int getCallState(int); method public android.telephony.CellLocation getCellLocation(); method public int getDataActivity(); - method public int getDataNetworkType(int); + method public int getDataNetworkType(); method public int getDataState(); method public java.lang.String getDeviceId(); method public java.lang.String getDeviceId(int); method public java.lang.String getDeviceSoftwareVersion(); method public java.lang.String getGroupIdLevel1(); - method public java.lang.String getGroupIdLevel1(int); method public java.lang.String getIccAuthentication(int, int, java.lang.String); - method public java.lang.String getIccAuthentication(int, int, int, java.lang.String); - method public java.lang.String getLine1AlphaTag(int); method public java.lang.String getLine1Number(); - method public java.lang.String getLine1Number(int); method public java.lang.String getMmsUAProfUrl(); method public java.lang.String getMmsUserAgent(); method public deprecated java.util.List<android.telephony.NeighboringCellInfo> getNeighboringCellInfo(); method public java.lang.String getNetworkCountryIso(); - method public java.lang.String getNetworkCountryIso(int); method public java.lang.String getNetworkOperator(); - method public java.lang.String getNetworkOperator(int); method public java.lang.String getNetworkOperatorName(); - method public java.lang.String getNetworkOperatorName(int); method public int getNetworkType(); - method public int getNetworkType(int); method public int getPhoneCount(); method public int getPhoneType(); method public java.lang.String getSimCountryIso(); - method public java.lang.String getSimCountryIso(int); method public java.lang.String getSimOperator(); - method public java.lang.String getSimOperator(int); method public java.lang.String getSimOperatorName(); - method public java.lang.String getSimOperatorName(int); method public java.lang.String getSimSerialNumber(); - method public java.lang.String getSimSerialNumber(int); method public int getSimState(); method public java.lang.String getSubscriberId(); - method public java.lang.String getSubscriberId(int); method public java.lang.String getVoiceMailAlphaTag(); - method public java.lang.String getVoiceMailAlphaTag(int); method public java.lang.String getVoiceMailNumber(); - method public java.lang.String getVoiceMailNumber(int); - method public int getVoiceNetworkType(int); + method public int getVoiceNetworkType(); method public android.net.Uri getVoicemailRingtoneUri(android.telecom.PhoneAccountHandle); method public boolean hasCarrierPrivileges(); - method public boolean hasCarrierPrivileges(int); method public boolean hasIccCard(); method public boolean iccCloseLogicalChannel(int); - method public boolean iccCloseLogicalChannel(int, int); method public byte[] iccExchangeSimIO(int, int, int, int, int, java.lang.String); - method public byte[] iccExchangeSimIO(int, int, int, int, int, int, java.lang.String); method public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannel(java.lang.String); - method public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannel(int, java.lang.String); method public java.lang.String iccTransmitApduBasicChannel(int, int, int, int, int, java.lang.String); - method public java.lang.String iccTransmitApduBasicChannel(int, int, int, int, int, int, java.lang.String); method public java.lang.String iccTransmitApduLogicalChannel(int, int, int, int, int, int, java.lang.String); - method public java.lang.String iccTransmitApduLogicalChannel(int, int, int, int, int, int, int, java.lang.String); method public boolean isHearingAidCompatibilitySupported(); method public boolean isNetworkRoaming(); - method public boolean isNetworkRoaming(int); method public boolean isSmsCapable(); method public boolean isTtyModeSupported(); method public boolean isVoiceCapable(); @@ -37351,15 +37328,10 @@ package android.telephony { method public boolean isWorldPhone(); method public void listen(android.telephony.PhoneStateListener, int); method public java.lang.String sendEnvelopeWithStatus(java.lang.String); - method public java.lang.String sendEnvelopeWithStatus(int, java.lang.String); method public boolean setLine1NumberForDisplay(java.lang.String, java.lang.String); - method public boolean setLine1NumberForDisplay(int, java.lang.String, java.lang.String); method public boolean setOperatorBrandOverride(java.lang.String); - method public boolean setOperatorBrandOverride(int, java.lang.String); method public boolean setPreferredNetworkTypeToGlobal(); - method public boolean setPreferredNetworkTypeToGlobal(int); method public boolean setVoiceMailNumber(java.lang.String, java.lang.String); - method public boolean setVoiceMailNumber(int, java.lang.String, java.lang.String); field public static final java.lang.String ACTION_CONFIGURE_VOICEMAIL = "android.telephony.action.CONFIGURE_VOICEMAIL"; field public static final java.lang.String ACTION_PHONE_STATE_CHANGED = "android.intent.action.PHONE_STATE"; field public static final java.lang.String ACTION_RESPOND_VIA_MESSAGE = "android.intent.action.RESPOND_VIA_MESSAGE"; @@ -37840,7 +37812,7 @@ package android.test.mock { ctor public MockApplication(); } - public deprecated class MockContentProvider extends android.content.ContentProvider { + public class MockContentProvider extends android.content.ContentProvider { ctor protected MockContentProvider(); ctor public MockContentProvider(android.content.Context); ctor public MockContentProvider(android.content.Context, java.lang.String, java.lang.String, android.content.pm.PathPermission[]); @@ -37852,13 +37824,13 @@ package android.test.mock { method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); } - public deprecated class MockContentResolver extends android.content.ContentResolver { + public class MockContentResolver extends android.content.ContentResolver { ctor public MockContentResolver(); ctor public MockContentResolver(android.content.Context); method public void addProvider(java.lang.String, android.content.ContentProvider); } - public deprecated class MockContext extends android.content.Context { + public class MockContext extends android.content.Context { ctor public MockContext(); method public boolean bindService(android.content.Intent, android.content.ServiceConnection, int); method public int checkCallingOrSelfPermission(java.lang.String); @@ -42467,7 +42439,6 @@ package android.view { method public boolean hasNestedScrollingParent(); method public boolean hasOnClickListeners(); method public boolean hasOverlappingRendering(); - method public boolean hasPointerCapture(); method public boolean hasTransientState(); method public boolean hasWindowFocus(); method public static android.view.View inflate(android.content.Context, int, android.view.ViewGroup); @@ -42580,6 +42551,7 @@ package android.view { method protected boolean overScrollBy(int, int, int, int, int, int, int, int, boolean); method public boolean performAccessibilityAction(int, android.os.Bundle); method public boolean performClick(); + method public boolean performContextClick(float, float); method public boolean performContextClick(); method public boolean performHapticFeedback(int); method public boolean performHapticFeedback(int, int); @@ -42597,7 +42569,6 @@ package android.view { method public void postOnAnimation(java.lang.Runnable); method public void postOnAnimationDelayed(java.lang.Runnable, long); method public void refreshDrawableState(); - method public void releasePointerCapture(); method public boolean removeCallbacks(java.lang.Runnable); method public void removeOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener); method public void removeOnLayoutChangeListener(android.view.View.OnLayoutChangeListener); @@ -42608,7 +42579,6 @@ package android.view { method public boolean requestFocus(int, android.graphics.Rect); method public final boolean requestFocusFromTouch(); method public void requestLayout(); - method public void requestPointerCapture(); method public boolean requestRectangleOnScreen(android.graphics.Rect); method public boolean requestRectangleOnScreen(android.graphics.Rect, boolean); method public final void requestUnbufferedDispatch(android.view.MotionEvent); diff --git a/api/test-removed.txt b/api/test-removed.txt index 42c64ea62cce..0ff247640749 100644 --- a/api/test-removed.txt +++ b/api/test-removed.txt @@ -31,37 +31,6 @@ package android.app.admin { } -package android.app.usage { - - public class DataUsagePolicy { - field public final int networkType; - field public final java.lang.String[] subscriberIds; - field public final long thresholdInBytes; - field public final int[] uids; - } - - public static class DataUsagePolicy.Builder { - ctor public DataUsagePolicy.Builder(); - method public android.app.usage.DataUsagePolicy.Builder addSubscriberId(java.lang.String); - method public android.app.usage.DataUsagePolicy.Builder addUid(int); - method public android.app.usage.DataUsagePolicy build(); - method public android.app.usage.DataUsagePolicy.Builder setNetworkType(int); - method public android.app.usage.DataUsagePolicy.Builder setThreshold(long); - } - - public class NetworkStatsManager { - method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback, android.os.Handler); - method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.UsageCallback, android.os.Handler); - method public void unregisterDataUsageCallback(android.app.usage.NetworkStatsManager.DataUsageCallback); - } - - public static abstract class NetworkStatsManager.DataUsageCallback { - ctor public NetworkStatsManager.DataUsageCallback(); - method public deprecated void onLimitReached(); - } - -} - package android.content { public abstract class Context { diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 30753c1632ff..7198146bee0f 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -5007,8 +5007,11 @@ public final class ActivityThread { return; } } - throw new AssertionError("chosen locale " + bestLocale + " must be present in LocaleList: " - + newLocaleList.toLanguageTags()); + + // The app may have overridden the LocaleList with its own Locale + // (not present in the available list). Push the chosen Locale + // to the front of the list. + LocaleList.setDefault(new LocaleList(bestLocale, newLocaleList)); } private void handleBindApplication(AppBindData data) { diff --git a/core/java/android/app/usage/DataUsagePolicy.java b/core/java/android/app/usage/DataUsagePolicy.java deleted file mode 100644 index ee6b60c371f6..000000000000 --- a/core/java/android/app/usage/DataUsagePolicy.java +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Copyright (C) 2016 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.app.usage; - -import android.net.ConnectivityManager; -import android.os.Parcel; -import android.os.Parcelable; -import android.util.IntArray; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; - -/** - * Defines a policy for data usage callbacks, made through {@link DataUsagePolicy.Builder} and used - * to be notified on data usage via {@link NetworkStatsManager#registerDataUsageCallback}. - * @removed - */ -public class DataUsagePolicy { - - /** - * Network type to be monitored, as defined in {@link ConnectivityManager}, e.g. - * {@link ConnectivityManager#TYPE_MOBILE}, {@link ConnectivityManager#TYPE_WIFI} etc. - */ - public final int networkType; - - /** - * Set of subscriber ids to be monitored for the given network type. May be empty if not - * applicable. - * <p>Should not be modified once created. - */ - public final String[] subscriberIds; - - /** - * Set of UIDs of which to monitor data usage. - * - * <p>If not {@code null}, the caller will be notified when any of the uids exceed - * the given threshold. If empty all uids for which the calling process has access - * to stats will be monitored. - * <p>Should not be modified once created. - */ - public final int[] uids; - - /** - * Threshold in bytes to be notified on. - */ - public final long thresholdInBytes; - - /** - * @hide - */ - DataUsagePolicy(int networkType, String[] subscriberIds, int[] uids, - long thresholdInBytes) { - this.networkType = networkType; - this.subscriberIds = subscriberIds; - this.uids = uids; - this.thresholdInBytes = thresholdInBytes; - } - - /** - * Builder used to create {@link DataUsagePolicy} objects. - */ - public static class Builder { - private static final int INVALID_NETWORK_TYPE = -1; - private int mNetworkType = INVALID_NETWORK_TYPE; - private List<String> mSubscriberList = new ArrayList<>(); - private IntArray mUids = new IntArray(); - private long mThresholdInBytes; - - /** - * Default constructor for Builder. - */ - public Builder() {} - - /** - * Build {@link DataUsagePolicy} given the current policies. - */ - public DataUsagePolicy build() { - if (mNetworkType == INVALID_NETWORK_TYPE) { - throw new IllegalArgumentException( - "DataUsagePolicy requires a valid network type to be set"); - } - return new DataUsagePolicy(mNetworkType, - mSubscriberList.toArray(new String[mSubscriberList.size()]), - mUids.toArray(), mThresholdInBytes); - } - - /** - * Specifies that the given {@code subscriberId} should be monitored. - * - * @param subscriberId the subscriber id of the network interface. - */ - public Builder addSubscriberId(String subscriberId) { - mSubscriberList.add(subscriberId); - return this; - } - - /** - * Specifies that the given {@code uid} should be monitored. - */ - public Builder addUid(int uid) { - mUids.add(uid); - return this; - } - - /** - * Specifies that the callback should monitor the given network. It is mandatory - * to set one. - * - * @param networkType As defined in {@link ConnectivityManager}, e.g. - * {@link ConnectivityManager#TYPE_MOBILE}, - * {@link ConnectivityManager#TYPE_WIFI}, etc. - */ - public Builder setNetworkType(int networkType) { - mNetworkType = networkType; - return this; - } - - /** - * Sets the threshold in bytes on which the listener should be called. The framework may - * impose a minimum threshold to avoid too many notifications to be triggered. - */ - public Builder setThreshold(long thresholdInBytes) { - mThresholdInBytes = thresholdInBytes; - return this; - } - } - - @Override - public String toString() { - return "DataUsagePolicy [ networkType=" + networkType - + ", subscriberIds=" + Arrays.toString(subscriberIds) - + ", uids=" + Arrays.toString(uids) - + ", thresholdInBytes=" + thresholdInBytes + " ]"; - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof DataUsagePolicy == false) return false; - DataUsagePolicy that = (DataUsagePolicy) obj; - return that.networkType == this.networkType - && Arrays.deepEquals(that.subscriberIds, this.subscriberIds) - && Arrays.equals(that.uids, this.uids) - && that.thresholdInBytes == this.thresholdInBytes; - } - - @Override - public int hashCode() { - // Start with a non-zero constant. - int result = 17; - - // Include a hash for each field. - result = 31 * result + networkType; - result = 31 * result + Arrays.deepHashCode(subscriberIds); - result = 31 * result + Arrays.hashCode(uids); - result = 31 * result + (int) (thresholdInBytes ^ (thresholdInBytes >>> 32)); - - return result; - } -} diff --git a/core/java/android/app/usage/NetworkStatsManager.java b/core/java/android/app/usage/NetworkStatsManager.java index 4a2811778aac..720c84a8e2a8 100644 --- a/core/java/android/app/usage/NetworkStatsManager.java +++ b/core/java/android/app/usage/NetworkStatsManager.java @@ -240,18 +240,13 @@ public class NetworkStatsManager { * {@link java.lang.System#currentTimeMillis}. * @param uid UID of app * @param tag TAG of interest. Use {@link NetworkStats.Bucket#TAG_NONE} for no tags. - * @return Statistics object or null if permissions are insufficient or error happened during - * statistics collection. + * @return Statistics object or null if an error happened during statistics collection. + * @throws SecurityException if permissions are insufficient to read network statistics. */ public NetworkStats queryDetailsForUidTag(int networkType, String subscriberId, - long startTime, long endTime, int uid, int tag) { + long startTime, long endTime, int uid, int tag) throws SecurityException { NetworkTemplate template; - try { - template = createTemplate(networkType, subscriberId); - } catch (IllegalArgumentException e) { - if (DBG) Log.e(TAG, "Cannot create template", e); - return null; - } + template = createTemplate(networkType, subscriberId); NetworkStats result; try { @@ -303,17 +298,6 @@ public class NetworkStatsManager { return result; } - /** @removed */ - public void registerDataUsageCallback(DataUsagePolicy policy, DataUsageCallback callback, - @Nullable Handler handler) {} - - /** @removed */ - public void registerDataUsageCallback(DataUsagePolicy policy, UsageCallback callback, - @Nullable Handler handler) {} - - /** @removed */ - public void unregisterDataUsageCallback(DataUsageCallback callback) {} - /** * Registers to receive notifications about data usage on specified networks. * @@ -396,13 +380,6 @@ public class NetworkStatsManager { } } - /** @removed */ - public static abstract class DataUsageCallback { - /** @removed */ - @Deprecated - public void onLimitReached() {} - } - /** * Base class for usage callbacks. Should be extended by applications wanting notifications. */ diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index a43d06ed5ae0..b7588687a8e4 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -1415,6 +1415,8 @@ public abstract class Context { * this context. This is typically used to migrate data between storage * locations after an upgrade, such as migrating to device protected * storage. + * <p> + * The database must be closed before being moved. * * @param sourceContext The source context which contains the existing * database to move. diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl index 49c106e69d9f..a9c09c4bb58a 100644 --- a/core/java/android/hardware/input/IInputManager.aidl +++ b/core/java/android/hardware/input/IInputManager.aidl @@ -81,6 +81,4 @@ interface IInputManager { void setPointerIconType(int typeId); void setCustomPointerIcon(in PointerIcon icon); - - void setPointerIconDetached(boolean detached); } diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java index a5aeae331f84..803337b016f9 100644 --- a/core/java/android/hardware/input/InputManager.java +++ b/core/java/android/hardware/input/InputManager.java @@ -893,24 +893,6 @@ public final class InputManager { } } - /** - * Update the pointer icon status. When detached, the pointer icon disappears, and further - * mouse location will be stuck at the current point. Mouse movement events will still arrive, - * and movement should be handled through {@link MotionEvent.AXIS_RELATIVE_X} and - * {@link MotionEvent.AXIS_RELATIVE_Y}. - * - * @param detached true if the icon will be detached from the actual mouse movement. - * - * @hide - */ - public void setPointerIconDetached(boolean detached) { - try { - mIm.setPointerIconDetached(detached); - } catch (RemoteException ex) { - throw ex.rethrowFromSystemServer(); - } - } - private void populateInputDevicesLocked() { if (mInputDevicesChangedListener == null) { final InputDevicesChangedListener listener = new InputDevicesChangedListener(); diff --git a/core/java/android/net/NetworkInfo.java b/core/java/android/net/NetworkInfo.java index b6c5c6fa966f..42f5feb58339 100644 --- a/core/java/android/net/NetworkInfo.java +++ b/core/java/android/net/NetworkInfo.java @@ -334,6 +334,7 @@ public class NetworkInfo implements Parcelable { * * @return {@code true} if large transfers should be avoided, otherwise * {@code false}. + * @hide */ public boolean isMetered() { synchronized (this) { diff --git a/core/java/android/net/PacProxySelector.java b/core/java/android/net/PacProxySelector.java index 9bdf4f6db8e6..85bf79ab3d69 100644 --- a/core/java/android/net/PacProxySelector.java +++ b/core/java/android/net/PacProxySelector.java @@ -30,6 +30,7 @@ import java.net.Proxy.Type; import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; +import java.net.URISyntaxException; import java.util.List; /** @@ -67,7 +68,15 @@ public class PacProxySelector extends ProxySelector { String response = null; String urlString; try { + // Strip path and username/password from URI so it's not visible to PAC script. The + // path often contains credentials the app does not want exposed to a potentially + // malicious PAC script. + if (!"http".equalsIgnoreCase(uri.getScheme())) { + uri = new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), "/", null, null); + } urlString = uri.toURL().toString(); + } catch (URISyntaxException e) { + urlString = uri.getHost(); } catch (MalformedURLException e) { urlString = uri.getHost(); } diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 7e1fc1539d72..dc7be6b5ad61 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -671,7 +671,7 @@ public class Build { /** * N is for ¯\_(ツ)_/¯. */ - public static final int N = CUR_DEVELOPMENT; + public static final int N = 24; } /** The type of build, like "user" or "eng". */ diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index dcec98246ab6..f3dc43237a4d 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -924,6 +924,7 @@ public class UserManager { /** {@hide} */ public boolean isUserRunning(int userId) { + // TODO Switch to using UMS internal isUserRunning try { return ActivityManagerNative.getDefault().isUserRunning(userId, 0); } catch (RemoteException re) { diff --git a/core/java/android/os/UserManagerInternal.java b/core/java/android/os/UserManagerInternal.java index 551ea6b6c469..93afb4376cf2 100644 --- a/core/java/android/os/UserManagerInternal.java +++ b/core/java/android/os/UserManagerInternal.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 The Android Open Source Project + * Copyright (C) 2016 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. @@ -11,7 +11,7 @@ * 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. + * limitations under the License */ package android.os; @@ -129,15 +129,23 @@ public abstract class UserManagerInternal { /** * Return whether the given user is running in an - * {@link com.android.server.am.UserState#STATE_RUNNING_UNLOCKING "unlocking"} or - * {@link com.android.server.am.UserState#STATE_RUNNING_UNLOCKED "unlocked"} state. + * {@code UserState.STATE_RUNNING_UNLOCKING} or + * {@code UserState.STATE_RUNNING_UNLOCKED} state. */ public abstract boolean isUserUnlockingOrUnlocked(int userId); /** - * Sets whether the given user is running in an - * {@link com.android.server.am.UserState#STATE_RUNNING_UNLOCKING "unlocking"} or - * {@link com.android.server.am.UserState#STATE_RUNNING_UNLOCKED "unlocked"} state. + * Return whether the given user is running */ - public abstract void setUserUnlockingOrUnlocked(int userId, boolean unlockingOrUnlocked); + public abstract boolean isUserRunning(int userId); + + /** + * Set user's running state + */ + public abstract void setUserState(int userId, int userState); + + /** + * Remove user's running state + */ + public abstract void removeUserState(int userId); } diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index fbf7b266330b..485bbd105603 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -114,6 +114,8 @@ public class StorageManager { /** {@hide} */ public static final int FLAG_INCLUDE_INVISIBLE = 1 << 10; + private static volatile IMountService sMountService = null; + private final Context mContext; private final ContentResolver mResolver; @@ -1064,15 +1066,17 @@ public class StorageManager { /** {@hide} */ public static boolean isUserKeyUnlocked(int userId) { - final IMountService mount = IMountService.Stub - .asInterface(ServiceManager.getService("mount")); - if (mount == null) { + if (sMountService == null) { + sMountService = IMountService.Stub + .asInterface(ServiceManager.getService("mount")); + } + if (sMountService == null) { Slog.w(TAG, "Early during boot, assuming locked"); return false; } final long token = Binder.clearCallingIdentity(); try { - return mount.isUserKeyUnlocked(userId); + return sMountService.isUserKeyUnlocked(userId); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } finally { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index cbe98f7cd6e5..0bc514ed0545 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2219,19 +2219,37 @@ public final class Settings { * @param outConfig Where to place the configuration settings. */ public static void getConfiguration(ContentResolver cr, Configuration outConfig) { - getConfigurationForUser(cr, outConfig, UserHandle.myUserId()); + adjustConfigurationForUser(cr, outConfig, UserHandle.myUserId(), + false /* updateSettingsIfEmpty */); } /** @hide */ - public static void getConfigurationForUser(ContentResolver cr, Configuration outConfig, - int userHandle) { + public static void adjustConfigurationForUser(ContentResolver cr, Configuration outConfig, + int userHandle, boolean updateSettingsIfEmpty) { outConfig.fontScale = Settings.System.getFloatForUser( cr, FONT_SCALE, DEFAULT_FONT_SCALE, userHandle); if (outConfig.fontScale < 0) { outConfig.fontScale = DEFAULT_FONT_SCALE; } - outConfig.setLocales(LocaleList.forLanguageTags( - Settings.System.getStringForUser(cr, SYSTEM_LOCALES, userHandle))); + + final String localeValue = + Settings.System.getStringForUser(cr, SYSTEM_LOCALES, userHandle); + if (localeValue != null) { + outConfig.setLocales(LocaleList.forLanguageTags(localeValue)); + } else { + // Do not update configuration with emtpy settings since we need to take over the + // locale list of previous user if the settings value is empty. This happens when a + // new user is created. + + if (updateSettingsIfEmpty) { + // Make current configuration persistent. This is necessary the first time a + // user log in. At the first login, the configuration settings are empty, so we + // need to store the adjusted configuration as the initial settings. + Settings.System.putStringForUser( + cr, SYSTEM_LOCALES, outConfig.getLocales().toLanguageTags(), + userHandle); + } + } } /** diff --git a/core/java/android/service/carrier/CarrierMessagingService.java b/core/java/android/service/carrier/CarrierMessagingService.java index 140341cfaece..88a78c36d112 100644 --- a/core/java/android/service/carrier/CarrierMessagingService.java +++ b/core/java/android/service/carrier/CarrierMessagingService.java @@ -56,7 +56,7 @@ public abstract class CarrierMessagingService extends Service { * new message notification should be shown. * * @see #RECEIVE_OPTIONS_DROP - * @see #RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_ENCRYPTED_STORAGE_UNAVAILABLE + * @see #RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE */ public static final int RECEIVE_OPTIONS_DEFAULT = 0; @@ -72,7 +72,7 @@ public abstract class CarrierMessagingService extends Service { * credential-encrypted storage of the device is not available before the user unlocks the * phone. It is only applicable to devices that support file-based encryption. */ - public static final int RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_ENCRYPTED_STORAGE_UNAVAILABLE = 0x2; + public static final int RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE = 0x2; /** * Indicates that an SMS or MMS message was successfully sent. @@ -148,7 +148,7 @@ public abstract class CarrierMessagingService extends Service { * @param subId SMS subscription ID of the SIM * @param callback result callback. Call with a bitmask integer to indicate how the incoming * text SMS should be handled by the platform. Use {@link #RECEIVE_OPTIONS_DROP} and - * {@link #RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_ENCRYPTED_STORAGE_UNAVAILABLE} + * {@link #RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE} * to set the flags in the bitmask. */ public void onReceiveTextSms(@NonNull MessagePdu pdu, @NonNull String format, @@ -157,7 +157,7 @@ public abstract class CarrierMessagingService extends Service { @Override public void onReceiveResult(Boolean result) throws RemoteException { callback.onReceiveResult(result ? RECEIVE_OPTIONS_DEFAULT : RECEIVE_OPTIONS_DROP - | RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_ENCRYPTED_STORAGE_UNAVAILABLE); + | RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE); } }); } diff --git a/core/java/android/service/notification/Condition.java b/core/java/android/service/notification/Condition.java index 0163b47f2ba7..447afe62fd1a 100644 --- a/core/java/android/service/notification/Condition.java +++ b/core/java/android/service/notification/Condition.java @@ -33,7 +33,7 @@ import java.util.Objects; * {@link ConditionProviderService} that owns the rule. Used to tell the system to enter Do Not * Disturb mode and request that the system exit Do Not Disturb mode. */ -public class Condition implements Parcelable { +public final class Condition implements Parcelable { @SystemApi public static final String SCHEME = "condition"; diff --git a/core/java/android/service/notification/ConditionProviderService.java b/core/java/android/service/notification/ConditionProviderService.java index 44c3887ec35d..9d4b0a4057b3 100644 --- a/core/java/android/service/notification/ConditionProviderService.java +++ b/core/java/android/service/notification/ConditionProviderService.java @@ -95,7 +95,7 @@ public abstract class ConditionProviderService extends Service { /** * A String rule id extra passed to {@link #META_DATA_CONFIGURATION_ACTIVITY}. */ - public static final String EXTRA_RULE_ID = "android.content.automatic.ruleId"; + public static final String EXTRA_RULE_ID = "android.service.notification.extra.RULE_ID"; /** * Called when this service is connected. diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 7b01267b6388..b4131b44263a 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -46,7 +46,7 @@ public class SurfaceControl { boolean allLayers, boolean useIdentityTransform); private static native void nativeOpenTransaction(); - private static native void nativeCloseTransaction(); + private static native void nativeCloseTransaction(boolean sync); private static native void nativeSetAnimationTransaction(); private static native void nativeSetLayer(long nativeObject, int zorder); @@ -372,7 +372,11 @@ public class SurfaceControl { /** end a transaction */ public static void closeTransaction() { - nativeCloseTransaction(); + nativeCloseTransaction(false); + } + + public static void closeTransactionSync() { + nativeCloseTransaction(true); } public void deferTransactionUntil(IBinder handle, long frame) { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 2269282a5771..88605db0408a 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -5698,6 +5698,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * Call this view's OnContextClickListener, if it is defined. * + * @param x the x coordinate of the context click + * @param y the y coordinate of the context click + * @return True if there was an assigned OnContextClickListener that consumed the event, false + * otherwise. + */ + public boolean performContextClick(float x, float y) { + return performContextClick(); + } + + /** + * Call this view's OnContextClickListener, if it is defined. + * * @return True if there was an assigned OnContextClickListener that consumed the event, false * otherwise. */ @@ -10044,7 +10056,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (isContextClickable() && !mInContextButtonPress && !mHasPerformedLongPress && (actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY || actionButton == MotionEvent.BUTTON_SECONDARY)) { - if (performContextClick()) { + if (performContextClick(event.getX(), event.getY())) { mInContextButtonPress = true; setPressed(true, event.getX(), event.getY()); removeTapCallback(); @@ -15250,7 +15262,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, destroyDrawingCache(); cleanupDraw(); - releasePointerCapture(); mCurrentAnimation = null; } @@ -21824,57 +21835,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return mPointerIcon; } - - /** - * Request capturing further mouse events. - * - * When the view captures, the pointer icon will disappear and will not change its - * position. Further pointer events will come to the capturing view, and the pointer movements - * will can be detected through {@link MotionEvent#AXIS_RELATIVE_X} and - * {@link MotionEvent#AXIS_RELATIVE_Y}. Non-mouse events (touchscreens, or stylus) will not - * be affected. - * - * The capture will be released through {@link #releasePointerCapture()}, or will be lost - * automatically when the view or containing window disappear. - * - * @return true when succeeds. - * @see #releasePointerCapture() - * @see #hasPointerCapture() - */ - public void requestPointerCapture() { - final ViewRootImpl viewRootImpl = getViewRootImpl(); - if (viewRootImpl != null) { - viewRootImpl.requestPointerCapture(this); - } - } - - - /** - * Release the current capture of mouse events. - * - * If the view does not have the capture, it will do nothing. - * @see #requestPointerCapture() - * @see #hasPointerCapture() - */ - public void releasePointerCapture() { - final ViewRootImpl viewRootImpl = getViewRootImpl(); - if (viewRootImpl != null) { - viewRootImpl.releasePointerCapture(this); - } - } - - /** - * Checks the capture status of mouse events. - * - * @return true if the view has the capture. - * @see #requestPointerCapture() - * @see #hasPointerCapture() - */ - public boolean hasPointerCapture() { - final ViewRootImpl viewRootImpl = getViewRootImpl(); - return (viewRootImpl != null) && viewRootImpl.hasPointerCapture(this); - } - // // Properties // @@ -22852,6 +22812,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, boolean mKeepScreenOn; /** + * Set during a traveral if the light center needs to be updated. + */ + boolean mNeedsUpdateLightCenter; + + /** * Bitwise-or of all of the values that views have passed to setSystemUiVisibility(). */ int mSystemUiVisibility; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 1c6600d0b3ac..0d648c12d23c 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -80,7 +80,6 @@ import android.view.accessibility.IAccessibilityInteractionConnection; import android.view.accessibility.IAccessibilityInteractionConnectionCallback; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Interpolator; -import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputMethodManager; import android.widget.Scroller; @@ -920,6 +919,11 @@ public final class ViewRootImpl implements ViewParent, // Recompute system ui visibility. mAttachInfo.mRecomputeGlobalAttributes = true; } + if ((mWindowAttributesChangesFlag + & WindowManager.LayoutParams.LAYOUT_CHANGED) != 0) { + // Request to update light center. + mAttachInfo.mNeedsUpdateLightCenter = true; + } if (mWindowAttributes.packageName == null) { mWindowAttributes.packageName = mBasePackageName; } @@ -2226,13 +2230,16 @@ public final class ViewRootImpl implements ViewParent, } mAttachInfo.mWindowLeft = frame.left; mAttachInfo.mWindowTop = frame.top; - - // Update the light position for the new window offsets. + } + if (windowMoved || mAttachInfo.mNeedsUpdateLightCenter) { + // Update the light position for the new offsets. if (mAttachInfo.mHardwareRenderer != null) { mAttachInfo.mHardwareRenderer.setLightCenter(mAttachInfo); } + mAttachInfo.mNeedsUpdateLightCenter = false; } } + private void handleOutOfResourcesException(Surface.OutOfResourcesException e) { Log.e(mTag, "OutOfResourcesException initializing HW surface", e); try { @@ -3168,32 +3175,6 @@ public final class ViewRootImpl implements ViewParent, } } - void requestPointerCapture(View view) { - if (!mAttachInfo.mHasWindowFocus) { - Log.w(mTag, "Can't set capture if it's not focused."); - return; - } - if (mCapturingView == view) { - return; - } - mCapturingView = view; - InputManager.getInstance().setPointerIconDetached(true); - return; - } - - void releasePointerCapture(View view) { - if (mCapturingView != view || mCapturingView == null) { - return; - } - - mCapturingView = null; - InputManager.getInstance().setPointerIconDetached(false); - } - - boolean hasPointerCapture(View view) { - return view != null && mCapturingView == view; - } - @Override public void requestChildFocus(View child, View focused) { if (DEBUG_INPUT_RESIZE) { @@ -3271,10 +3252,6 @@ public final class ViewRootImpl implements ViewParent, mView = null; mAttachInfo.mRootView = null; - if (mCapturingView != null) { - releasePointerCapture(mCapturingView); - } - mSurface.release(); if (mInputQueueCallback != null && mInputQueue != null) { @@ -3615,8 +3592,6 @@ public final class ViewRootImpl implements ViewParent, .softInputMode &= ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION; mHasHadWindowFocus = true; - } else if (mCapturingView != null) { - releasePointerCapture(mCapturingView); } } } break; diff --git a/core/java/android/view/accessibility/AccessibilityWindowInfo.java b/core/java/android/view/accessibility/AccessibilityWindowInfo.java index d0d4507e7b62..52f35de7e189 100644 --- a/core/java/android/view/accessibility/AccessibilityWindowInfo.java +++ b/core/java/android/view/accessibility/AccessibilityWindowInfo.java @@ -16,6 +16,7 @@ package android.view.accessibility; +import android.annotation.Nullable; import android.graphics.Rect; import android.os.Parcel; import android.os.Parcelable; @@ -101,8 +102,9 @@ public final class AccessibilityWindowInfo implements Parcelable { /** * Gets the title of the window. * - * @return The title. + * @return The title of the window, or {@code null} if none is available. */ + @Nullable public CharSequence getTitle() { return mTitle; } diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java index 66896ab70e45..ac44033c21c6 100644 --- a/core/java/android/widget/CalendarView.java +++ b/core/java/android/widget/CalendarView.java @@ -16,6 +16,8 @@ package android.widget; +import com.android.internal.R; + import android.annotation.AttrRes; import android.annotation.ColorInt; import android.annotation.DrawableRes; @@ -27,17 +29,16 @@ import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; +import android.icu.util.Calendar; +import android.icu.util.TimeZone; import android.util.AttributeSet; import android.util.Log; -import com.android.internal.R; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Calendar; import java.util.Date; import java.util.Locale; -import java.util.TimeZone; /** * This class is a calendar widget for displaying and selecting dates. The diff --git a/core/java/android/widget/CalendarViewLegacyDelegate.java b/core/java/android/widget/CalendarViewLegacyDelegate.java index f540479ad641..2b91713e3fed 100644 --- a/core/java/android/widget/CalendarViewLegacyDelegate.java +++ b/core/java/android/widget/CalendarViewLegacyDelegate.java @@ -27,6 +27,7 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.icu.util.Calendar; import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.DisplayMetrics; @@ -37,7 +38,6 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import java.util.Calendar; import java.util.Locale; import libcore.icu.LocaleData; diff --git a/core/java/android/widget/CalendarViewMaterialDelegate.java b/core/java/android/widget/CalendarViewMaterialDelegate.java index 0ed75d5f7a42..07b20007f8fa 100644 --- a/core/java/android/widget/CalendarViewMaterialDelegate.java +++ b/core/java/android/widget/CalendarViewMaterialDelegate.java @@ -18,11 +18,10 @@ package android.widget; import android.annotation.StyleRes; import android.content.Context; +import android.icu.util.Calendar; import android.util.AttributeSet; import android.widget.DayPickerView.OnDaySelectedListener; -import java.util.Calendar; - class CalendarViewMaterialDelegate extends CalendarView.AbstractCalendarViewDelegate { private final DayPickerView mDayPickerView; diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index 0c5edc5f2f81..8613f9989abc 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -16,11 +16,15 @@ package android.widget; +import com.android.internal.R; + import android.annotation.Nullable; import android.annotation.Widget; import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; +import android.icu.util.Calendar; +import android.icu.util.TimeZone; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; @@ -28,11 +32,7 @@ import android.util.SparseArray; import android.view.View; import android.view.accessibility.AccessibilityEvent; -import com.android.internal.R; - -import java.util.Calendar; import java.util.Locale; -import java.util.TimeZone; /** * Provides a widget for selecting a date. diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java index 0a23b34b9195..2fd52b5f1230 100755 --- a/core/java/android/widget/DatePickerCalendarDelegate.java +++ b/core/java/android/widget/DatePickerCalendarDelegate.java @@ -26,6 +26,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.icu.text.DisplayContext; import android.icu.text.SimpleDateFormat; +import android.icu.util.Calendar; import android.os.Parcelable; import android.text.format.DateFormat; import android.text.format.DateUtils; @@ -40,7 +41,6 @@ import android.view.accessibility.AccessibilityEvent; import android.widget.DayPickerView.OnDaySelectedListener; import android.widget.YearPickerView.OnYearSelectedListener; -import java.util.Calendar; import java.util.Locale; /** @@ -432,7 +432,8 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { public void setMinDate(long minDate) { mTempDate.setTimeInMillis(minDate); if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR) - && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) { + && mTempDate.get(Calendar.DAY_OF_YEAR) == mMinDate.get(Calendar.DAY_OF_YEAR)) { + // Same day, no-op. return; } if (mCurrentDate.before(mTempDate)) { @@ -453,7 +454,8 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { public void setMaxDate(long maxDate) { mTempDate.setTimeInMillis(maxDate); if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR) - && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) { + && mTempDate.get(Calendar.DAY_OF_YEAR) == mMaxDate.get(Calendar.DAY_OF_YEAR)) { + // Same day, no-op. return; } if (mCurrentDate.after(mTempDate)) { diff --git a/core/java/android/widget/DatePickerSpinnerDelegate.java b/core/java/android/widget/DatePickerSpinnerDelegate.java index d8a3c5638b72..1a6d351575f9 100644 --- a/core/java/android/widget/DatePickerSpinnerDelegate.java +++ b/core/java/android/widget/DatePickerSpinnerDelegate.java @@ -19,6 +19,7 @@ package android.widget; import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; +import android.icu.util.Calendar; import android.os.Parcelable; import android.text.InputType; import android.text.TextUtils; @@ -37,7 +38,6 @@ import java.text.DateFormatSymbols; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; -import java.util.Calendar; import java.util.Locale; import libcore.icu.ICU; @@ -288,7 +288,8 @@ class DatePickerSpinnerDelegate extends AbstractDatePickerDelegate { public void setMinDate(long minDate) { mTempDate.setTimeInMillis(minDate); if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR) - && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) { + && mTempDate.get(Calendar.DAY_OF_YEAR) == mMinDate.get(Calendar.DAY_OF_YEAR)) { + // Same day, no-op. return; } mMinDate.setTimeInMillis(minDate); @@ -311,7 +312,8 @@ class DatePickerSpinnerDelegate extends AbstractDatePickerDelegate { public void setMaxDate(long maxDate) { mTempDate.setTimeInMillis(maxDate); if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR) - && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) { + && mTempDate.get(Calendar.DAY_OF_YEAR) == mMaxDate.get(Calendar.DAY_OF_YEAR)) { + // Same day, no-op. return; } mMaxDate.setTimeInMillis(maxDate); diff --git a/core/java/android/widget/DayPickerPagerAdapter.java b/core/java/android/widget/DayPickerPagerAdapter.java index 97936e7c7c5b..9f02b4485dc0 100644 --- a/core/java/android/widget/DayPickerPagerAdapter.java +++ b/core/java/android/widget/DayPickerPagerAdapter.java @@ -25,14 +25,13 @@ import android.annotation.Nullable; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.icu.util.Calendar; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.SimpleMonthView.OnDayClickListener; -import java.util.Calendar; - /** * An adapter for a list of {@link android.widget.SimpleMonthView} items. */ diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java index dc772fbf63dc..ab89c1f0b534 100644 --- a/core/java/android/widget/DayPickerView.java +++ b/core/java/android/widget/DayPickerView.java @@ -24,6 +24,7 @@ import android.annotation.Nullable; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.icu.util.Calendar; import android.util.AttributeSet; import android.util.MathUtils; import android.view.LayoutInflater; @@ -31,7 +32,6 @@ import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityManager; -import java.util.Calendar; import java.util.Locale; import libcore.icu.LocaleData; diff --git a/core/java/android/widget/SimpleMonthView.java b/core/java/android/widget/SimpleMonthView.java index 97d834a85681..588425fdee66 100644 --- a/core/java/android/widget/SimpleMonthView.java +++ b/core/java/android/widget/SimpleMonthView.java @@ -32,6 +32,7 @@ import android.graphics.Rect; import android.graphics.Typeface; import android.icu.text.DisplayContext; import android.icu.text.SimpleDateFormat; +import android.icu.util.Calendar; import android.os.Bundle; import android.text.TextPaint; import android.text.format.DateFormat; @@ -48,7 +49,6 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import java.text.NumberFormat; -import java.util.Calendar; import java.util.Locale; import libcore.icu.LocaleData; diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index fc120eb0e65f..3711b9402f3a 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -6983,14 +6983,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return false; } - private static int desired(Layout layout) { + private static int desired(Layout layout, int maxLines) { int n = layout.getLineCount(); CharSequence text = layout.getText(); float max = 0; + // if maxLines is set, and the text length is greater that the length of the text in the + // layout, it means that there is a cut-off and we cannot use it. + if (maxLines != -1 && text.length() > layout.getLineEnd(n - 1)) { + return -1; + } + // if any line was wrapped, we can't use it. // but it's ok for the last line not to have a newline - for (int i = 0; i < n - 1; i++) { if (text.charAt(layout.getLineEnd(i) - 1) != '\n') return -1; @@ -7063,7 +7068,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener width = widthSize; } else { if (mLayout != null && mEllipsize == null) { - des = desired(mLayout); + des = desired(mLayout, getMaxLines()); } if (des < 0) { @@ -7095,7 +7100,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int hintWidth; if (mHintLayout != null && mEllipsize == null) { - hintDes = desired(mHintLayout); + hintDes = desired(mHintLayout, getMaxLines()); } if (hintDes < 0) { diff --git a/core/java/android/widget/YearPickerView.java b/core/java/android/widget/YearPickerView.java index 96624d2f0617..a3f5a67baca1 100644 --- a/core/java/android/widget/YearPickerView.java +++ b/core/java/android/widget/YearPickerView.java @@ -16,18 +16,17 @@ package android.widget; +import com.android.internal.R; + import android.content.Context; import android.content.res.Resources; +import android.icu.util.Calendar; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; -import java.util.Calendar; - -import com.android.internal.R; - /** * Displays a selectable list of years. */ diff --git a/core/java/com/android/internal/app/PlatLogoActivity.java b/core/java/com/android/internal/app/PlatLogoActivity.java index 59445688aa7e..ef2fd0d7401d 100644 --- a/core/java/com/android/internal/app/PlatLogoActivity.java +++ b/core/java/com/android/internal/app/PlatLogoActivity.java @@ -53,6 +53,8 @@ import android.widget.FrameLayout; import android.widget.ImageView; public class PlatLogoActivity extends Activity { + public static final boolean REVEAL_THE_NAME = true; + FrameLayout mLayout; int mTapCount; int mKeyCount; @@ -100,6 +102,19 @@ public class PlatLogoActivity extends Activity { public boolean onLongClick(View v) { if (mTapCount < 5) return false; + if (REVEAL_THE_NAME) { + final Drawable overlay = getDrawable( + com.android.internal.R.drawable.platlogo_m); + overlay.setBounds(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); + im.getOverlay().clear(); + im.getOverlay().add(overlay); + overlay.setAlpha(0); + ObjectAnimator.ofInt(overlay, "alpha", 0, 255) + .setDuration(500) + .start(); + return true; + } + final ContentResolver cr = getContentResolver(); if (Settings.System.getLong(cr, Settings.System.EGG_MODE, 0) == 0) { diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 5bb89693e9f2..4f15ece8e04e 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -521,16 +521,22 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { @Override public void setTitle(CharSequence title) { + setTitle(title, true); + } + + public void setTitle(CharSequence title, boolean updateAccessibilityTitle) { if (mTitleView != null) { mTitleView.setText(title); } else if (mDecorContentParent != null) { mDecorContentParent.setWindowTitle(title); } mTitle = title; - WindowManager.LayoutParams params = getAttributes(); - if (!TextUtils.equals(title, params.accessibilityTitle)) { - params.accessibilityTitle = TextUtils.stringOrSpannedString(title); - dispatchWindowAttributesChanged(getAttributes()); + if (updateAccessibilityTitle) { + WindowManager.LayoutParams params = getAttributes(); + if (!TextUtils.equals(title, params.accessibilityTitle)) { + params.accessibilityTitle = TextUtils.stringOrSpannedString(title); + dispatchWindowAttributesChanged(getAttributes()); + } } } diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl index 6b93d8336b95..05b839df9fa4 100644 --- a/core/java/com/android/internal/widget/ILockSettings.aidl +++ b/core/java/com/android/internal/widget/ILockSettings.aidl @@ -28,6 +28,7 @@ interface ILockSettings { long getLong(in String key, in long defaultValue, in int userId); String getString(in String key, in String defaultValue, in int userId); void setLockPattern(in String pattern, in String savedPattern, int userId); + void resetKeyStore(int userId); VerifyCredentialResponse checkPattern(in String pattern, int userId); VerifyCredentialResponse verifyPattern(in String pattern, long challenge, int userId); void setLockPassword(in String password, in String savedPassword, int userId); diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 70941b6c300b..1beea8c11386 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -535,6 +535,18 @@ public class LockPatternUtils { } /** + * Use it to reset keystore without wiping work profile + */ + public void resetKeyStore(int userId) { + try { + getLockSettings().resetKeyStore(userId); + } catch (RemoteException e) { + // It should not happen + Log.e(TAG, "Couldn't reset keystore " + e); + } + } + + /** * Clear any lock pattern or password. */ public void clearLock(int userHandle) { diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 864a0bfe6f5d..a9ed9dce590e 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -223,8 +223,9 @@ static void nativeOpenTransaction(JNIEnv* env, jclass clazz) { SurfaceComposerClient::openGlobalTransaction(); } -static void nativeCloseTransaction(JNIEnv* env, jclass clazz) { - SurfaceComposerClient::closeGlobalTransaction(); + +static void nativeCloseTransaction(JNIEnv* env, jclass clazz, jboolean sync) { + SurfaceComposerClient::closeGlobalTransaction(sync); } static void nativeSetAnimationTransaction(JNIEnv* env, jclass clazz) { @@ -649,7 +650,7 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeScreenshot }, {"nativeOpenTransaction", "()V", (void*)nativeOpenTransaction }, - {"nativeCloseTransaction", "()V", + {"nativeCloseTransaction", "(Z)V", (void*)nativeCloseTransaction }, {"nativeSetAnimationTransaction", "()V", (void*)nativeSetAnimationTransaction }, diff --git a/core/res/res/drawable-nodpi/default_wallpaper.png b/core/res/res/drawable-nodpi/default_wallpaper.png Binary files differindex 91ad252507e5..ce546f0a11e7 100644 --- a/core/res/res/drawable-nodpi/default_wallpaper.png +++ b/core/res/res/drawable-nodpi/default_wallpaper.png diff --git a/core/res/res/drawable-nodpi/platlogo_m.xml b/core/res/res/drawable-nodpi/platlogo_m.xml index f19e045a65ff..d9a558db859a 100644 --- a/core/res/res/drawable-nodpi/platlogo_m.xml +++ b/core/res/res/drawable-nodpi/platlogo_m.xml @@ -1,5 +1,5 @@ <!-- -Copyright (C) 2015 The Android Open Source Project +Copyright (C) 2016 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. @@ -19,19 +19,54 @@ Copyright (C) 2015 The Android Open Source Project android:viewportWidth="48.0" android:viewportHeight="48.0"> <path - android:fillColor="#08000000" - android:pathData="M13.5,34.5l13.3,13.3c11,-1.3,19.7,-10,21,-21L34.5,13.5L13.5,34.5z" - /> + android:fillColor="#FFFFFFFF" + android:pathData="M33.8,38l-25.5,-25.5l-1.7000003,0.6999998l25.499998,25.5z"/> <path - android:pathData="M24,24c0,0,0,2.4,0,5.2s0,5.2,0,5.2L34.5,24V13.5L24,24z" - android:fillColor="#FFFFFF"/> + android:fillColor="#FFFFFFFF" + android:pathData="M40.8,34.8l-25.4,-25.5l-1.6999998,0.6999998l25.5,25.5z"/> <path - android:pathData="M24,24L13.5,13.5V24L24,34.5c0,0,0,-2.4,0,-5.2S24,24,24,24z" - android:fillColor="#EEEEEE"/> + android:fillColor="#FFFFFFFF" + android:pathData="M11.1,13.1l-0.3,-0.4l1.1,-1.3l0,0l-1.6,0.8l-0.4,-0.4l2.6,-1.2l0.4,0.4l-1.1,1.3l0,0l1.6,-0.8l0.3,0.4L11.1,13.1z"/> <path - android:pathData="M13.5,34.5l10.5,0.0l-10.5,-10.5z" - android:fillColor="#DDDDDD"/> + android:fillColor="#FFFFFFFF" + android:pathData="M13,14.2l-0.5,-0.5l-0.6,0.2l-0.4,-0.4l3.1,-0.7l0.4,0.4l-2.1,1.7l-0.4,-0.4L13,14.2z M13,13.6l0.3,0.3l0.8,-0.6 l0,0L13,13.6z"/> <path - android:pathData="M34.5,34.5l0.0,-10.5l-10.5,10.5z" - android:fillColor="#DDDDDD"/> + android:fillColor="#FFFFFFFF" + android:pathData="M16.3,14.6l-1.6,1.2l0,0l2.2,-0.6l0.5,0.5l-2.6,1.2l-0.3,-0.4l0.7,-0.3l1,-0.4l0,0l-2.1,0.5L13.9,16l1.4,-1.1l0,0 l-0.9,0.5l-0.7,0.3l-0.3,-0.4l2.6,-1.2L16.3,14.6z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M17.4,17.8l-0.6,-0.6l-0.7,0.3l0.7,0.7l-0.4,0.2l-1,-1l2.6,-1.2l1,1l-0.4,0.2l-0.7,-0.7L17.2,17l0.6,0.6L17.4,17.8 z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M18.8,18.7L18.8,18.7l1.3,-0.2l0.4,0.4l-2.1,0.3l-0.9,0.4l-0.3,-0.4l1,-0.4l1.2,-1.2l0.4,0.4L18.8,18.7z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M22.2,20.5l-1.6,1.2l0,0l2.2,-0.6l0.5,0.5l-2.6,1.2l-0.3,-0.4l0.7,-0.3l1,-0.4l0,0L20,22.1l-0.2,-0.2l1.4,-1.1l0,0 l-0.9,0.5l-0.7,0.3l-0.3,-0.4l2.6,-1.2L22.2,20.5z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M22,23.6c0,0,0.1,0.1,0.2,0.1c0.1,0,0.2,0,0.3,-0.1l0.3,0.3c-0.2,0.1,-0.4,0.1,-0.6,0.1c-0.2,0,-0.4,-0.1,-0.5,-0.2 c-0.2,-0.2,-0.2,-0.3,-0.1,-0.5c0.1,-0.2,0.2,-0.3,0.5,-0.4l0.2,-0.1c0.3,-0.1,0.5,-0.2,0.8,-0.2c0.2,0,0.5,0.1,0.6,0.3 c0.1,0.1,0.2,0.3,0.1,0.4c0,0.1,-0.2,0.3,-0.4,0.4L23,23.4c0.1,0,0.2,-0.1,0.2,-0.2c0,-0.1,0,-0.1,0,-0.2C23.1,23,23,22.9,22.9,23 c-0.1,0,-0.2,0.1,-0.4,0.1l-0.2,0.1c-0.2,0.1,-0.3,0.1,-0.3,0.2C21.9,23.5,21.9,23.5,22,23.6z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M23.8,25.9l-0.3,-0.4l1.1,-1.3l0,0L22.9,25l-0.4,-0.4l2.6,-1.2l0.4,0.4l-1.1,1.3l0,0l1.6,-0.8l0.3,0.4L23.8,25.9z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M25.7,27l-0.5,-0.5l-0.6,0.2l-0.4,-0.4l3.1,-0.7l0.4,0.4l-2.1,1.7l-0.4,-0.4L25.7,27z M25.7,26.4l0.3,0.3l0.8,-0.6 l0,0L25.7,26.4z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M29,27.4l-1.6,1.2l0,0l2.2,-0.6l0.5,0.5l-2.6,1.2l-0.3,-0.4l0.8,-0.3l1,-0.4l0,0L26.8,29l-0.2,-0.2l1.4,-1.1l0,0 L27,28.1l-0.8,0.3l-0.3,-0.4l2.6,-1.2L29,27.4z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M30,30.6L29.5,30l-0.7,0.3l0.7,0.7L29,31.2l-1,-1l2.6,-1.2l1,1l-0.4,0.2l-0.7,-0.7l-0.6,0.3l0.6,0.6L30,30.6z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M31.5,32.1l-0.6,-0.6L29.8,32l-0.4,-0.4l2.6,-1.2l1,1l-0.4,0.2L32,31l-0.7,0.3l0.6,0.6L31.5,32.1z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M32,33.5L31.6,33L31,33.2l-0.4,-0.4l3.1,-0.7l0.4,0.4l-2.1,1.7l-0.4,-0.4L32,33.5z M32.1,32.9l0.3,0.3l0.8,-0.6 l0,0L32.1,32.9z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M34.3,35.3c-0.3,0.1,-0.5,0.2,-0.8,0.1c-0.2,0,-0.5,-0.1,-0.6,-0.3c-0.2,-0.2,-0.2,-0.4,-0.2,-0.5 c0.1,-0.2,0.2,-0.3,0.6,-0.5l0.8,-0.4c0.3,-0.1,0.6,-0.2,0.9,-0.2c0.3,0,0.5,0.1,0.7,0.3c0.2,0.2,0.3,0.4,0.2,0.5c0,0.2,-0.2,0.3,-0.5,0.5 l-0.3,-0.4c0.2,-0.1,0.3,-0.1,0.3,-0.2c0,-0.1,0,-0.1,-0.1,-0.2C35,34,34.9,34,34.8,34c-0.1,0,-0.3,0,-0.5,0.1l-0.8,0.4 c-0.2,0.1,-0.3,0.2,-0.4,0.2c0,0.1,0,0.1,0,0.2c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.4,-0.1L34.3,35.3z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M36,36.6L35.4,36l-0.7,0.3l0.7,0.7l-0.4,0.2l-1,-1l2.6,-1.2l1,1l-0.4,0.2l-0.7,-0.7l-0.6,0.3l0.6,0.6L36,36.6z"/> </vector> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 44923c9890dc..9fbba3824db4 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Doen \'n fabriekterugstelling om hierdie toestel sonder beperkinge te gebruik"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Raak om meer te wete te kom."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index a648c006141a..4bab99e90ffe 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"ይህን መሣሪያ ያለምንም ገደብ ለመጠቀም የፋብሪካ ዳግም ያስጀምሩ"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"የበለጠ ለመረዳት ይንኩ።"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 69b5badc25be..b797006bfd88 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1730,4 +1730,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"يمكنك إعادة تعيين بيانات المصنع لاستخدام هذا الجهاز بدون قيود"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"المس للتعرف على مزيد من المعلومات."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index 3619b9ad56a2..61f4bf4606ec 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Bu cihazı məhdudiyyətsiz istifadə etmək üçün zavod sıfırlaması edin"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Daha çox məlumat üçün toxunun."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 091d02a8e78e..9500deb99358 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1646,4 +1646,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Resetujte uređaj na fabrička podešavanja da biste ga koristili bez ograničenja"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Dodirnite da biste saznali više."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-be-rBY/strings.xml b/core/res/res/values-be-rBY/strings.xml index 4e419dc14312..36e6a57e9d71 100644 --- a/core/res/res/values-be-rBY/strings.xml +++ b/core/res/res/values-be-rBY/strings.xml @@ -1674,4 +1674,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Выканайце скід да заводскіх налад, каб выкарыстоўваць гэту прыладу без абмежаванняў"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Краніце, каб даведацца больш."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 2f41788c5ede..06329bcd2f64 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Възстановете фабричните настройки на това устройство, за да го използвате без ограничения"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Докоснете, за да научите повече."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index eb6ee1a7a379..2916d95438a3 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"কোনো বিধিনিষেধ ছাড়াই এই ডিভাইসটিকে ব্যবহার করতে ফ্যাক্টরি রিসেট করুন"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"আরো জানতে স্পর্শ করুন৷"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml index 1ea1c668ccb9..3c3e4885bda7 100644 --- a/core/res/res/values-bs-rBA/strings.xml +++ b/core/res/res/values-bs-rBA/strings.xml @@ -1651,4 +1651,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Vratite uređaj na fabričke postavke kako biste ga koristili bez ograničenja"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Dodirnite da saznate više."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 948895c2055c..59bf3e90fa80 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Restableix les dades de fàbrica del dispositiu per utilitzar-lo sense restriccions"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toca per obtenir més informació."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 4db961bce4f4..7d66b17d2df9 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1674,4 +1674,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Chcete-li toto zařízení používat bez omezení, obnovte jej do továrního nastavení"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Klepnutím zobrazíte další informace."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 4121d237ed1e..eafad45cc816 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Gendan fabriksdataene på enheden for at bruge den uden begrænsninger"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Tryk for at få flere oplysninger."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 595f83dbedd0..5510238f531d 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Gerät auf Werkseinstellungen zurücksetzen, um es ohne Einschränkungen zu nutzen"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Für weitere Informationen tippen."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 55c6fa81448b..bfb52e33081c 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Επαναφέρετε τις εργοστασιακές ρυθμίσεις για να χρησιμοποιήσετε αυτήν τη συσκευή χωρίς περιορισμούς"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Αγγίξτε για να μάθετε περισσότερα."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index d2e413956c59..3c399c4940df 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Factory reset to use this device without restrictions"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Touch to find out more."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index d2e413956c59..3c399c4940df 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Factory reset to use this device without restrictions"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Touch to find out more."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index d2e413956c59..3c399c4940df 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Factory reset to use this device without restrictions"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Touch to find out more."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index f23c3cc66d96..773dd11410c8 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Restablece la configuración de fábrica para usar este dispositivo sin restricciones"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toca para obtener más información."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index fa50f61156c1..93f128c2ca55 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Restablece los datos de fábrica para usar este dispositivo sin restricciones"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toca para obtener más información."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index c34ad91d374c..329150e0f5dc 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Seadme piiranguteta kasutamiseks lähtestage see tehaseandmetele"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Lisateabe saamiseks puudutage."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index 2b88997178dd..2e813b48f5ec 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Berrezarri jatorrizko ezarpenak gailua murriztapenik gabe erabili ahal izateko"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Sakatu informazio gehiago lortzeko."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 2434c34dd53e..972640653b94 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"برای استفاده بدون محدودیت از این دستگاه، بازنشانی کارخانهای انجام دهید"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"برای یادگیری بیشتر لمس کنید."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 24f40987fef5..81fd54222161 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Palauta tehdasasetukset, jotta voit käyttää tätä laitetta rajoituksitta"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Lue lisätietoja koskettamalla."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 6ecd0fc27aec..bb3ae67c323b 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Rétablissez la configuration d\'usine de cet appareil pour l\'utiliser sans restrictions"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Touchez ici pour en savoir plus."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index cdd622fbd2f9..64d58996a6dc 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"− <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Rétablir la configuration d\'usine pour utiliser cet appareil sans restrictions"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Appuyez ici pour en savoir plus."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index 5317a84d12ba..f57e7bbff379 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Restablecemento dos valores de fábrica para usar este dispositivo sen restricións"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toca para acceder a máis información"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index c069c15d81aa..289582b02586 100644 --- a/core/res/res/values-gu-rIN/strings.xml +++ b/core/res/res/values-gu-rIN/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"આ ઉપકરણનો પ્રતિબંધો વિના ઉપયોગ કરવા માટે ફેક્ટરી રીસેટ કરો"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"વધુ જાણવા માટે ટચ કરો."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 6ba19ef10f66..6bf92686ca09 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"इस डिवाइस को प्रतिबंधों के बिना उपयोग करने के लिए फ़ैक्टरी रीसेट करें"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"अधिक जानने के लिए स्पर्श करें."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 60de8527d41a..d1e06a6179db 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1646,4 +1646,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Uređaj je vraćen na tvorničke postavke da biste ga mogli upotrebljavati bez ograničenja"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Dodirnite da biste saznali više."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 1a01aca2e489..77c920feeb0f 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Állítsa vissza a gyári beállításokat az eszköz korlátozások nélküli használata érdekében"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Érintse meg a további információkért."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 2b935cd9a138..31d9cc14b724 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -940,7 +940,7 @@ <string name="whichEditApplication" msgid="144727838241402655">"Խմբագրել հետևյալ ծրագրով՝"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Խմբագրել հետևյալով՝ %1$s"</string> <string name="whichEditApplicationLabel" msgid="7183524181625290300">"Փոփոխել"</string> - <string name="whichSendApplication" msgid="6902512414057341668">"Տարածել"</string> + <string name="whichSendApplication" msgid="6902512414057341668">"Կիսվել"</string> <string name="whichSendApplicationNamed" msgid="2799370240005424391">"Տարածել ըստ %1$s"</string> <string name="whichSendApplicationLabel" msgid="4579076294675975354">"Տրամադրել"</string> <string name="whichSendToApplication" msgid="8272422260066642057">"Ուղարկել այս հավելվածով"</string> @@ -1219,7 +1219,7 @@ <string name="action_mode_done" msgid="7217581640461922289">"Կատարված է"</string> <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"Ջնջում է USB կրիչը..."</string> <string name="progress_erasing" product="default" msgid="6596988875507043042">"Ջնջում է SD քարտը..."</string> - <string name="share" msgid="1778686618230011964">"Տարածել"</string> + <string name="share" msgid="1778686618230011964">"Կիսվել"</string> <string name="find" msgid="4808270900322985960">"Գտնել"</string> <string name="websearch" msgid="4337157977400211589">"Վեբի որոնում"</string> <string name="find_next" msgid="5742124618942193978">"Գտնել հաջորդը"</string> @@ -1264,7 +1264,7 @@ <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Մուտք"</string> <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Ընտրել ծրագիր"</string> <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Չհաջողվեց գործարկել <xliff:g id="APPLICATION_NAME">%s</xliff:g> ծրագիրը"</string> - <string name="shareactionprovider_share_with" msgid="806688056141131819">"Տարածել"</string> + <string name="shareactionprovider_share_with" msgid="806688056141131819">"Կիսվել"</string> <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Կիսվել <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ի հետ"</string> <string name="content_description_sliding_handle" msgid="415975056159262248">"Սահող բռնակ: Հպել & պահել:"</string> <string name="description_target_unlock_tablet" msgid="3833195335629795055">"Սահեցրեք` ապակողպելու համար:"</string> @@ -1312,7 +1312,7 @@ <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1մատնահետք`"</string> <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Տեսնել բոլորը"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Ընտրել գործունեությունը"</string> - <string name="share_action_provider_share_with" msgid="5247684435979149216">"Տարածել"</string> + <string name="share_action_provider_share_with" msgid="5247684435979149216">"Կիսվել"</string> <string name="sending" msgid="3245653681008218030">"Ուղարկվում է..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Գործարկե՞լ զննարկիչը:"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Ընդունե՞լ զանգը:"</string> @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Սարքն առանց սահմանափակումների օգտագործելու համար կատարեք գործարանային վերակայում"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Հպեք՝ ավելին իմանալու համար:"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 8e7b87ec89f7..1128338c098a 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -546,7 +546,7 @@ <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Mencegah penggunaan beberapa fitur kunci layar."</string> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Rumah"</item> - <item msgid="869923650527136615">"Seluler"</item> + <item msgid="869923650527136615">"Ponsel"</item> <item msgid="7897544654242874543">"Kantor"</item> <item msgid="1103601433382158155">"Faks Kantor"</item> <item msgid="1735177144948329370">"Faks Rumah"</item> @@ -589,7 +589,7 @@ </string-array> <string name="phoneTypeCustom" msgid="1644738059053355820">"Khusus"</string> <string name="phoneTypeHome" msgid="2570923463033985887">"Rumah"</string> - <string name="phoneTypeMobile" msgid="6501463557754751037">"Seluler"</string> + <string name="phoneTypeMobile" msgid="6501463557754751037">"Ponsel"</string> <string name="phoneTypeWork" msgid="8863939667059911633">"Kantor"</string> <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Faks Kantor"</string> <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Faks Rumah"</string> @@ -616,7 +616,7 @@ <string name="emailTypeHome" msgid="449227236140433919">"Rumah"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Kantor"</string> <string name="emailTypeOther" msgid="2923008695272639549">"Lainnya"</string> - <string name="emailTypeMobile" msgid="119919005321166205">"Seluler"</string> + <string name="emailTypeMobile" msgid="119919005321166205">"Ponsel"</string> <string name="postalTypeCustom" msgid="8903206903060479902">"Khusus"</string> <string name="postalTypeHome" msgid="8165756977184483097">"Rumah"</string> <string name="postalTypeWork" msgid="5268172772387694495">"Kantor"</string> @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Dikembalikan ke setelan pabrik agar perangkat ini dapat digunakan tanpa batasan"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Sentuh untuk mempelajari lebih lanjut."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index 3ca3039e2bc4..a65e8d9a6ab3 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Núllstilltu til að nota þetta tæki án takmarkana"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Snertu til að fá frekari upplýsingar."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index e96927dfecf6..7eed84085f02 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Esegui il ripristino dei dati di fabbrica per utilizzare il dispositivo senza limitazioni"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Tocca per ulteriori informazioni."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 29e6dec523b7..dd75ff3145b0 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1674,4 +1674,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"איפוס להגדרות היצרן כדי לאפשר שימוש במכשיר ללא מגבלות"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"גע לקבלת מידע נוסף."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 9618f44d1e56..2bd2504da8cd 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"制限なしでこの端末を使用するには初期状態にリセットしてください"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"タップして詳細をご確認ください。"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index c3965e866627..33544657b751 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"ამ მოწყობილობის შეზღუდვების გარეშე გამოსაყენებლად, დააბრუნეთ ქარხნული პარამეტრები"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"შეეხეთ მეტის გასაგებად."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index 08cde3e96864..29a62f33d342 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Осы құрылғыны шектеусіз пайдалану үшін зауыттық параметрлерді қалпына келтіріңіз"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Қосымша мәліметтер алу үшін түртіңіз."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 2ac5017f829f..31d87de09593 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -1620,4 +1620,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"កំណត់ដូចចេញពីរោងចក្រឡើងវិញដើម្បីប្រើឧបករណ៍នេះដោយគ្មានការរឹតបន្តឹង"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"ប៉ះ ដើម្បីស្វែងយល់បន្ថែម។"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index be9ded7a013f..c1bac96aea09 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"ನಿರ್ಬಂಧಗಳು ಇಲ್ಲದೆಯೇ ಈ ಸಾಧನವನ್ನು ಬಳಸಲು ಫ್ಯಾಕ್ಟರಿ ಮರುಹೊಂದಿಸಿ"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಸ್ಪರ್ಶಿಸಿ."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index a286605fcec9..6cb295cbbc6c 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"제한 없이 기기를 사용하기 위한 초기화"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"자세한 내용을 보려면 터치하세요."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 371b02346752..9a1acfafc54f 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Бул түзмөктү чектөөсүз колдонуу үчүн аны баштапкы абалга келтириңиз"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Көбүрөөк билүү үчүн тийип коюңуз."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index cf295a35fc60..ee30debffc99 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"ຣີເຊັດໃຫ້ເປັນຄ່າໂຮງງານເພື່ອໃຊ້ອຸປະກອນນີ້ໂດຍບໍ່ມີຂໍ້ຈຳກັດ"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 66d6bf86b446..7204328d9c21 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1674,4 +1674,6 @@ <string name="negative_duration" msgid="5688706061127375131">"–<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Atkurkite gamyklinius nustatymus, kad galėtumėte naudoti šį įrenginį be apribojimų"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Palieskite, kad sužinotumėte daugiau."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 71f2a0785816..9c6c5f79ade3 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1646,4 +1646,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Rūpnīcas datu atiestatīšana ierīces neierobežotai izmantošanai"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Pieskarieties, lai uzzinātu vairāk."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index 2b36f1f9f5ad..638f2370d88c 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -1623,4 +1623,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Ресетирајте до фабричките поставки за уредов да го користите без ограничувања"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Допрете за да дознаете повеќе."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index ec212382c1f2..74b7570b3a5b 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"നിയന്ത്രണങ്ങൾ ഇല്ലാതെ ഈ ഉപകരണം ഉപയോഗിക്കാൻ ഫാക്ടറി റീസെറ്റ് നടത്തുക"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"കൂടുതലറിയുന്നതിന് സ്പർശിക്കുക."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 06634767d2dd..f9ed6c1d4c80 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -714,7 +714,7 @@ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Та утсыг тайлах гэж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Утас одоо үйлдвэрийн үндсэн утгаараа тохируулагдах болно."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> секундын дараа дахин оролдоно уу."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Хээг мартсан уу?"</string> - <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Акаунт тайлах"</string> + <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Бүртгэл тайлах"</string> <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Хээ оруулах оролдлого хэт олон"</string> <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"Түгжээг тайлах бол Google акаунтаараа нэвтэрнэ үү."</string> <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Хэрэглэгч (имэйл)"</string> @@ -1068,8 +1068,8 @@ <string name="sms_control_yes" msgid="3663725993855816807">"Зөвшөөрөх"</string> <string name="sms_control_no" msgid="625438561395534982">"Татгалзах"</string> <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> нь <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b> уруу мессеж илгээх гэж байна."</string> - <string name="sms_short_code_details" msgid="5873295990846059400">"Энэ таны мобайл акаунтад "<b>"төлбөр нэмэгдүүлж магадгүй"</b>"."</string> - <string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"Энэ таны мобайл акаунтад төлбөр нэмэгдүүлж магадгүй."</b></string> + <string name="sms_short_code_details" msgid="5873295990846059400">"Энэ таны мобайл бүртгэлд "<b>"төлбөр нэмэгдүүлж магадгүй"</b>"."</string> + <string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"Энэ таны мобайл бүртгэлд төлбөр нэмэгдүүлж магадгүй."</b></string> <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"Илгээх"</string> <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Цуцлах"</string> <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Миний сонголтыг санах"</string> @@ -1173,13 +1173,13 @@ <string name="ime_action_default" msgid="2840921885558045721">"Ажиллуулах"</string> <string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g> ашиглан \n залгах"</string> <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g> дугаар ашиглан \n харилцагч үүсгэх"</string> - <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Дараах нэг буюу түүнээс дээш апп таны акаунтад одоо болон дараа хандах зөвшөөрлийг хүсэж байна."</string> + <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Дараах нэг буюу түүнээс дээш апп таны бүртгэлд одоо болон дараа хандах зөвшөөрлийг хүсэж байна."</string> <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Та энэ хүсэлтийг зөвшөөрөх үү?"</string> <string name="grant_permissions_header_text" msgid="6874497408201826708">"Хандах хүсэлт"</string> <string name="allow" msgid="7225948811296386551">"Зөвшөөрөх"</string> <string name="deny" msgid="2081879885755434506">"Татгалзах"</string> <string name="permission_request_notification_title" msgid="6486759795926237907">"Зөвшөөрөл хүсэв"</string> - <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"<xliff:g id="ACCOUNT">%s</xliff:g> акаунт зөвшөөрөл \n хүссэн"</string> + <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"<xliff:g id="ACCOUNT">%s</xliff:g> бүртгэл зөвшөөрөл \n хүссэн"</string> <string name="forward_intent_to_owner" msgid="1207197447013960896">"Та энэ апп-г өөрийн ажлын профайлаас гадуур ашиглаж байна"</string> <string name="forward_intent_to_work" msgid="621480743856004612">"Та энэ апп-г өөрийн ажлын профайл дотор ашиглаж байна"</string> <string name="input_method_binding_label" msgid="1283557179944992649">"Оруулах арга"</string> @@ -1234,8 +1234,8 @@ <string name="sync_really_delete" msgid="2572600103122596243">"Устгах"</string> <string name="sync_undo_deletes" msgid="2941317360600338602">"Устгасныг буцаах"</string> <string name="sync_do_nothing" msgid="3743764740430821845">"Одоо юу ч хийхгүй"</string> - <string name="choose_account_label" msgid="5655203089746423927">"Акаунт сонгох"</string> - <string name="add_account_label" msgid="2935267344849993553">"Акаунт нэмэх"</string> + <string name="choose_account_label" msgid="5655203089746423927">"Бүртгэл сонгох"</string> + <string name="add_account_label" msgid="2935267344849993553">"Бүртгэл нэмэх"</string> <string name="add_account_button_label" msgid="3611982894853435874">"Аккаунт нэмэх"</string> <string name="number_picker_increment_button" msgid="2412072272832284313">"Өсөх"</string> <string name="number_picker_decrement_button" msgid="476050778386779067">"Бууруулах"</string> @@ -1369,7 +1369,7 @@ <string name="kg_login_submit_button" msgid="5355904582674054702">"Нэвтрэх"</string> <string name="kg_login_invalid_input" msgid="5754664119319872197">"Хэрэглэгчийн нэр эсвэл нууц үг буруу."</string> <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Хэрэглэгчийн нэр нууц үгээ мартсан уу?\n"<b>"google.com/accounts/recovery"</b>"-д зочилно уу."</string> - <string name="kg_login_checking_password" msgid="1052685197710252395">"Акаунт шалгаж байна…"</string> + <string name="kg_login_checking_password" msgid="1052685197710252395">"Бүртгэл шалгаж байна…"</string> <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Та PIN кодоо <xliff:g id="NUMBER_0">%1$d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> секундын дараа дахин оролдоно уу."</string> <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Та PIN кодоо <xliff:g id="NUMBER_0">%1$d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> секундын дараа дахин оролдоно уу."</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Та тайлах хээг <xliff:g id="NUMBER_0">%1$d</xliff:g> удаа буруу зурлаа. \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> секундын дараа дахин оролдоно уу."</string> @@ -1379,7 +1379,7 @@ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Та таблетыг тайлах гэж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Таблет одоо үйлдвэрийн үндсэн утгаараа тохируулагдах болно."</string> <string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"Та телевизийнхээ түгжээг <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оруулсан байна. Телевиз үйлдвэрээс гарсан анхны тохиргоонд шилжих болно."</string> <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Та утсыг тайлах гэж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Утас одоо үйлдвэрийн үндсэн утгаараа тохируулагдах болно."</string> - <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Та тайлах хээг <xliff:g id="NUMBER_0">%1$d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%2$d</xliff:g> удаа дахин буруу оруулбал, та таблетаа тайлахын тулд имэйл акаунт шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундын дараа дахин оролдоно уу."</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Та тайлах хээг <xliff:g id="NUMBER_0">%1$d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%2$d</xliff:g> удаа дахин буруу оруулбал, та таблетаа тайлахын тулд имэйл бүртгэл шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундын дараа дахин оролдоно уу."</string> <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"Та зурган түгжээг <xliff:g id="NUMBER_0">%1$d</xliff:g> удаа буруу оруулсан байна. <xliff:g id="NUMBER_1">%2$d</xliff:g> удаа буруу оруулсны дараагаар та телевизийнхээ түгжээг и-мэйл дансаа ашиглан тайлах хэрэгтэй болно.\n\n Та <xliff:g id="NUMBER_2">%3$d</xliff:g> секундийн дараа дахин оролдоно уу."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Та тайлах хээг <xliff:g id="NUMBER_0">%1$d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%2$d</xliff:g> удаа дахин буруу оруулбал, та утсаа тайлахын тулд имэйл акаунтаа ашиглах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундын дараа дахин оролдоно уу."</string> <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string> @@ -1616,4 +1616,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Энэ төхөөрөмжийг хязгаарлалтгүй ашиглахын тулд үйлдвэрийн тохиргоонд дахин тохируулна уу"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Дэлгэрэнгүй үзэх бол дарна уу."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index d3d5478b8da2..bd964f2dbb92 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"हे डिव्हाइस निर्बंधांशिवाय वापरण्यासाठी फॅक्टरी रीसेट करा"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"अधिक जाणून घेण्यासाठी स्पर्श करा."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index b49fca9ef333..528b86b54e7b 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Lakukan tetapan semula kilang untuk menggunakan peranti ini tanpa sekatan"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Ketik untuk mengetahui lebih lanjut."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index dea7dbe1d6e8..a508ef20c42c 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"ဤစက်ပစ္စည်းကို ကန့်သတ်ချက်များမပါဘဲ အသုံးပြုရန် စက်ရုံထုတ်ဆက်တင်အတိုင်း ပြန်လည်သတ်မှတ်ပါ"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"ပိုမိုလေ့လာရန် တို့ပါ။"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 7452f3a9386c..c87f33bdf033 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Tilbakestill til fabrikkstandard for å bruke denne enheten uten begrensninger"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Trykk for å finne ut mer."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index e2b6c6414471..1c9d96b06d59 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -1624,4 +1624,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"यस यन्त्रलाई सीमितताहरू बिना प्रयोग गर्नका लागि फ्याक्ट्री रिसेट गर्नुहोस्"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"थप जान्नका लागि छुनुहोस्।"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 322b00710576..fdd69698099c 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Zet dit apparaat terug op de fabrieksinstellingen om het zonder beperkingen te gebruiken"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Tik voor meer informatie."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index 744fdb9a7a87..937f04508d63 100644 --- a/core/res/res/values-pa-rIN/strings.xml +++ b/core/res/res/values-pa-rIN/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਬਿਨਾਂ ਪਾਬੰਦੀਆਂ ਦੇ ਵਰਤਣ ਲਈ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਕਰੋ"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"ਹੋਰ ਜਾਣਨ ਲਈ ਸਪਰਸ਼ ਕਰੋ।"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index a44f943093ab..84734b945eac 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1674,4 +1674,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Aby używać tego urządzenia bez ograniczeń, przywróć ustawienia fabryczne"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Kliknij, by dowiedzieć się więcej."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index a99a86fb5c7d..f4edeb669b38 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Redefinir para a configuração original para usar este dispositivo sem restrições"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toque para saber mais."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index c7088ae1a53c..2bea25f38721 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Repor os dados de fábrica para utilizar o dispositivo sem restrições"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toque para saber mais."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index a99a86fb5c7d..f4edeb669b38 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Redefinir para a configuração original para usar este dispositivo sem restrições"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Toque para saber mais."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index f28166c8e7a0..023932e09775 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1646,4 +1646,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Reveniți la setările din fabrică pentru a folosi acest dispozitiv fără restricții"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Atingeți pentru a afla mai multe."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index fce83ced4e07..47676380ad03 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1674,4 +1674,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Сброс до заводских настроек для работы без ограничений"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Нажмите, чтобы узнать больше."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index 17a709c366ef..fc99747e0b8e 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -1620,4 +1620,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"සීමා කිරීම්වලින් තොරව මෙම උපාංගය භාවිත කිරීමට කර්මාන්ත ශාලා යළි සැකසීම"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"තව දැන ගැනීමට ස්පර්ශ කරන්න."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index cac680e9893f..bafb794d9c93 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1674,4 +1674,6 @@ <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Ak chcete toto zariadenie používať bez obmedzení, obnovte na ňom továrenské nastavenia"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Klepnutím získate ďalšie informácie."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 84f5ca8e7ffb..278080839230 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1674,4 +1674,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Ponastavitev naprave na tovarniške nastavitve za uporabo brez omejitev"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Dotaknite se, če želite izvedeti več."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 52ddeb04b74b..fc3fac45b4e8 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Rivendos cilësimet e fabrikës për ta përdorur këtë pajisje pa kufizime"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Prek për të mësuar më shumë."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index becd3c8cf28c..1a63a3bdf592 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1646,4 +1646,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Ресетујте уређај на фабричка подешавања да бисте га користили без ограничења"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Додирните да бисте сазнали више."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 8add186dc08d..f69d620d7395 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Återställ enheten till standardinställningarna om du vill använda den utan begränsningar"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Tryck här om du vill läsa mer."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index e8b863148707..be3acf067ea0 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1616,4 +1616,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Rejesha mipangilio iliyotoka nayo kiwandani ili utumie kifaa hiki bila vikwazo"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Gusa ili kupata maelezo zaidi."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index d5155a108929..8216c5011f25 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"இந்தச் சாதனத்தைக் கட்டுப்பாடுகளின்றிப் பயன்படுத்த, ஆரம்ப நிலைக்கு மீட்டமைக்கவும்"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"மேலும் அறிய தொடவும்."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index 56195b7aaaac..37ed0e5cb9c3 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"ఈ పరికరాన్ని ఎటువంటి పరిమితులు లేకుండా ఉపయోగించడానికి ఫ్యాక్టరీ రీసెట్ చేయండి"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"మరింత తెలుసుకోవడానికి తాకండి."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 6415de19ba19..9d20655f81de 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"รีเซ็ตเป็นค่าเริ่มต้นเพื่อใช้อุปกรณ์นี้โดยไร้ข้อจำกัด"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"แตะเพื่อเรียนรู้เพิ่มเติม"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 83885de8438a..34cc2ce6862b 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"I-factory reset upang magamit ang device na ito nang walang mga paghihigpit"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Pindutin upang matuto nang higit pa."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 9dedf1e9daac..112cdc9c2012 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Bu cihazı kısıtlama olmadan kullanmak için fabrika ayarlarına sıfırlayın"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Daha fazla bilgi edinmek için dokunun."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 1c1547cb01f6..4a3c3ffb249e 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1674,4 +1674,6 @@ <string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Відновіть заводські параметри, щоб використовувати пристрій без обмежень"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Торкніться, щоб дізнатися більше."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index bfff0ba8ab9e..03e961a46df4 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"بغیر کسی حدود کے استعمال کرنے کیلئے اس آلے کو فیکٹری ری سیٹ کریں"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"مزید جاننے کیلئے ٹچ کریں۔"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index 4177d02c0ef0..3da5c9d4211c 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -1526,7 +1526,7 @@ <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> - <string name="data_saver_description" msgid="6015391409098303235">"Trafik sarfini kamaytirish maqsadida Trafik tejash funksiyasi ba’zi ilovalarning orqa fonda internetdan foydalanishining oldini oladi. Siz hozirda foydalanayotgan ilova internetdan faqat talab etilgandagina foydalanishi mumkin. Bu degani, masalan, rasmlar ustiga bosilmaguncha, ular yuklanmaydi."</string> + <string name="data_saver_description" msgid="6015391409098303235">"Trafik tejash rejimida ayrim ilovalar uchun orqa fondan internetdan foydalanish imkoniyati cheklanadi. Siz ishlatayotgan ilova zaruratga qarab internet-trafik sarflashi mumkin, biroq cheklangan miqdorda. Masalan, rasmlar ustiga bosmaguningizcha ular yuklanmaydi."</string> <string name="data_saver_enable_title" msgid="4674073932722787417">"Trafik tejash yoqilsinmi?"</string> <string name="data_saver_enable_button" msgid="7147735965247211818">"Yoqish"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1621,4 +1621,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Bu qurilmadan cheklovlarsiz foydalanish uchun zavod sozlamalarini tiklang"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Ko‘proq o‘rganish uchun bosing."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 73d49267fc27..cb315d930cb6 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Khôi phục cài đặt gốc để sử dụng thiết bị này mà không bị hạn chế"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Chạm để tìm hiểu thêm."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index defd0a66b2eb..505d5a07580a 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"恢复出厂设置即可正常使用此设备,不受任何限制"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"触摸即可了解详情。"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 4b1cfbbb9b34..33ab32e0fbdb 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"將此裝置回復至原廠設定後,使用將不受限制"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"輕觸以瞭解詳情。"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 91183314c7d8..c6211cd5ec55 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"恢復原廠設定即可正常使用這個裝置"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"輕觸即可瞭解詳情。"</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 55d4b7306c7c..f0e7f2ba7636 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1618,4 +1618,6 @@ <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="audit_safemode_notification" msgid="6416076898350685856">"Setha kabusha ukuze usebenzise idivayisi ngaphandle kwemikhawulo"</string> <string name="audit_safemode_notification_details" msgid="1860601176690176413">"Thinta ukuze ufunde kabanzi."</string> + <!-- no translation found for suspended_widget_accessibility (6712143096475264190) --> + <skip /> </resources> diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml index 30e23f5124c5..e190bd13f5d2 100644 --- a/core/res/res/values/arrays.xml +++ b/core/res/res/values/arrays.xml @@ -22,296 +22,120 @@ <!-- Do not translate. These are all of the drawable resources that should be preloaded by the zygote process before it starts forking application processes. --> <array name="preloaded_drawables"> - <item>@drawable/toast_frame</item> - <item>@drawable/btn_check_on_pressed_holo_light</item> - <item>@drawable/btn_check_on_pressed_holo_dark</item> - <item>@drawable/btn_check_on_holo_light</item> - <item>@drawable/btn_check_on_holo_dark</item> - <item>@drawable/btn_check_on_focused_holo_light</item> - <item>@drawable/btn_check_on_focused_holo_dark</item> - <item>@drawable/btn_check_on_disabled_holo_light</item> - <item>@drawable/btn_check_on_disabled_holo_dark</item> - <item>@drawable/btn_check_on_disabled_focused_holo_light</item> - <item>@drawable/btn_check_on_disabled_focused_holo_dark</item> - <item>@drawable/btn_check_off_pressed_holo_light</item> - <item>@drawable/btn_check_off_pressed_holo_dark</item> - <item>@drawable/btn_check_off_holo_light</item> - <item>@drawable/btn_check_off_holo_dark</item> - <item>@drawable/btn_check_off_focused_holo_light</item> - <item>@drawable/btn_check_off_focused_holo_dark</item> - <item>@drawable/btn_check_off_disabled_holo_light</item> - <item>@drawable/btn_check_off_disabled_holo_dark</item> - <item>@drawable/btn_check_off_disabled_focused_holo_light</item> - <item>@drawable/btn_check_off_disabled_focused_holo_dark</item> - <item>@drawable/btn_check_holo_light</item> - <item>@drawable/btn_check_holo_dark</item> - <item>@drawable/btn_radio_on_pressed_holo_light</item> - <item>@drawable/btn_radio_on_pressed_holo_dark</item> - <item>@drawable/btn_radio_on_holo_light</item> - <item>@drawable/btn_radio_on_holo_dark</item> - <item>@drawable/btn_radio_on_focused_holo_light</item> - <item>@drawable/btn_radio_on_focused_holo_dark</item> - <item>@drawable/btn_radio_on_disabled_holo_light</item> - <item>@drawable/btn_radio_on_disabled_holo_dark</item> - <item>@drawable/btn_radio_on_disabled_focused_holo_light</item> - <item>@drawable/btn_radio_on_disabled_focused_holo_dark</item> - <item>@drawable/btn_radio_off_pressed_holo_light</item> - <item>@drawable/btn_radio_off_pressed_holo_dark</item> - <item>@drawable/btn_radio_off_holo_light</item> - <item>@drawable/btn_radio_off_holo_dark</item> - <item>@drawable/btn_radio_off_focused_holo_light</item> - <item>@drawable/btn_radio_off_focused_holo_dark</item> - <item>@drawable/btn_radio_off_disabled_holo_light</item> - <item>@drawable/btn_radio_off_disabled_holo_dark</item> - <item>@drawable/btn_radio_off_disabled_focused_holo_light</item> - <item>@drawable/btn_radio_off_disabled_focused_holo_dark</item> - <item>@drawable/btn_default_pressed_holo_light</item> - <item>@drawable/btn_default_pressed_holo_dark</item> - <item>@drawable/btn_default_normal_holo_light</item> - <item>@drawable/btn_default_normal_holo_dark</item> - <item>@drawable/btn_default_focused_holo_light</item> - <item>@drawable/btn_default_focused_holo_dark</item> - <item>@drawable/btn_default_disabled_holo_light</item> - <item>@drawable/btn_default_disabled_holo_dark</item> - <item>@drawable/btn_default_disabled_focused_holo_light</item> - <item>@drawable/btn_default_disabled_focused_holo_dark</item> - <item>@drawable/btn_default_holo_dark</item> - <item>@drawable/btn_default_holo_light</item> - <item>@drawable/edit_text_holo_light</item> - <item>@drawable/edit_text_holo_dark</item> - <item>@drawable/text_cursor_holo_light</item> - <item>@drawable/text_cursor_holo_dark</item> - <item>@drawable/text_edit_paste_window</item> - <item>@drawable/expander_close_holo_dark</item> - <item>@drawable/expander_close_holo_light</item> - <item>@drawable/expander_group_holo_dark</item> - <item>@drawable/expander_group_holo_light</item> - <item>@drawable/list_selector_holo_dark</item> - <item>@drawable/list_selector_holo_light</item> - <item>@drawable/list_section_divider_holo_light</item> - <item>@drawable/list_section_divider_holo_dark</item> - <item>@drawable/menu_dropdown_panel_holo_light</item> - <item>@drawable/menu_dropdown_panel_holo_dark</item> - <item>@drawable/menu_panel_holo_light</item> - <item>@drawable/menu_panel_holo_dark</item> - <item>@drawable/spinner_16_outer_holo</item> - <item>@drawable/spinner_16_inner_holo</item> - <item>@drawable/spinner_48_outer_holo</item> - <item>@drawable/spinner_48_inner_holo</item> - <item>@drawable/progress_bg_holo_dark</item> - <item>@drawable/progress_bg_holo_light</item> - <item>@drawable/progress_horizontal_holo_dark</item> - <item>@drawable/progress_horizontal_holo_light</item> - <item>@drawable/progress_large_holo</item> - <item>@drawable/progress_medium_holo</item> - <item>@drawable/progress_primary_holo_dark</item> - <item>@drawable/progress_primary_holo_light</item> - <item>@drawable/progress_secondary_holo_dark</item> - <item>@drawable/progress_secondary_holo_light</item> - <item>@drawable/progress_small_holo</item> - <item>@drawable/scrubber_progress_horizontal_holo_dark</item> - <item>@drawable/scrubber_progress_horizontal_holo_light</item> - <item>@drawable/background_holo_light</item> - <item>@drawable/background_holo_dark</item> - <item>@drawable/screen_background_dark</item> - <item>@drawable/screen_background_dark_transparent</item> - <item>@drawable/screen_background_light</item> - <item>@drawable/screen_background_light_transparent</item> - <item>@drawable/screen_background_selector_dark</item> - <item>@drawable/screen_background_selector_light</item> - <item>@drawable/scrollbar_handle_holo_dark</item> - <item>@drawable/scrollbar_handle_holo_light</item> - <item>@drawable/spinner_background_holo_dark</item> - <item>@drawable/spinner_background_holo_light</item> - <item>@drawable/spinner_ab_default_holo_dark</item> - <item>@drawable/spinner_ab_default_holo_light</item> - <item>@drawable/spinner_ab_disabled_holo_dark</item> - <item>@drawable/spinner_ab_disabled_holo_light</item> - <item>@drawable/spinner_ab_focused_holo_dark</item> - <item>@drawable/spinner_ab_focused_holo_light</item> - <item>@drawable/spinner_ab_pressed_holo_dark</item> - <item>@drawable/spinner_ab_pressed_holo_light</item> - <item>@drawable/spinner_ab_holo_dark</item> - <item>@drawable/spinner_ab_holo_light</item> - <item>@drawable/spinner_default_holo_dark</item> - <item>@drawable/spinner_default_holo_light</item> - <item>@drawable/spinner_disabled_holo_dark</item> - <item>@drawable/spinner_disabled_holo_light</item> - <item>@drawable/spinner_focused_holo_dark</item> - <item>@drawable/spinner_focused_holo_light</item> - <item>@drawable/spinner_pressed_holo_dark</item> - <item>@drawable/spinner_pressed_holo_light</item> - <item>@drawable/cab_background_bottom_holo_dark</item> - <item>@drawable/cab_background_top_holo_light</item> - <item>@drawable/cab_background_bottom_holo_light</item> - <item>@drawable/ic_cab_done_holo_dark</item> - <item>@drawable/cab_background_top_holo_dark</item> - <item>@drawable/ic_cab_done_holo_light</item> - <item>@drawable/btn_cab_done_default_holo_dark</item> - <item>@drawable/btn_cab_done_focused_holo_light</item> - <item>@drawable/btn_cab_done_default_holo_light</item> - <item>@drawable/btn_cab_done_pressed_holo_dark</item> - <item>@drawable/btn_cab_done_focused_holo_dark</item> - <item>@drawable/btn_cab_done_pressed_holo_light</item> - <item>@drawable/btn_cab_done_holo_light</item> - <item>@drawable/btn_cab_done_holo_dark</item> - <item>@drawable/ic_menu_close_clear_cancel</item> - <item>@drawable/ic_menu_copy_holo_dark</item> - <item>@drawable/ic_menu_copy_holo_light</item> - <item>@drawable/ic_menu_cut_holo_dark</item> - <item>@drawable/ic_menu_cut_holo_light</item> - <item>@drawable/ic_menu_more</item> - <item>@drawable/ic_menu_moreoverflow_holo_dark</item> - <item>@drawable/ic_menu_moreoverflow_holo_light</item> - <item>@drawable/ic_menu_paste_holo_dark</item> - <item>@drawable/ic_menu_paste_holo_light</item> - <item>@drawable/ic_menu_selectall_holo_light</item> - <item>@drawable/ic_menu_selectall_holo_dark</item> - <item>@drawable/ic_clear</item> - <item>@drawable/ic_clear_disabled</item> - <item>@drawable/ic_clear_normal</item> - <item>@drawable/ic_search_api_holo_dark</item> - <item>@drawable/ic_search_api_holo_light</item> - <item>@drawable/ic_go</item> - <item>@drawable/ic_voice_search_api_holo_dark</item> - <item>@drawable/ic_voice_search_api_holo_light</item> - <item>@drawable/dialog_bottom_holo_dark</item> - <item>@drawable/dialog_bottom_holo_light</item> - <item>@drawable/dialog_middle_holo_dark</item> - <item>@drawable/dialog_middle_holo_light</item> - <item>@drawable/dialog_top_holo_dark</item> - <item>@drawable/dialog_top_holo_light</item> - <item>@drawable/ic_dialog_alert_holo_dark</item> - <item>@drawable/ic_dialog_alert_holo_light</item> - <item>@drawable/list_divider_holo_dark</item> - <item>@drawable/list_divider_holo_light</item> - <item>@drawable/list_divider_holo_light</item> - <item>@drawable/ab_transparent_dark_holo</item> - <item>@drawable/ab_stacked_transparent_dark_holo</item> - <item>@drawable/ab_bottom_transparent_dark_holo</item> - <item>@drawable/ab_solid_dark_holo</item> - <item>@drawable/ab_stacked_solid_dark_holo</item> - <item>@drawable/ab_bottom_solid_dark_holo</item> - <item>@drawable/ab_transparent_light_holo</item> - <item>@drawable/ab_stacked_transparent_light_holo</item> - <item>@drawable/ab_bottom_transparent_light_holo</item> - <item>@drawable/ab_solid_light_holo</item> - <item>@drawable/ab_stacked_solid_light_holo</item> - <item>@drawable/ab_bottom_solid_light_holo</item> - <item>@drawable/ab_solid_shadow_holo</item> - <item>@drawable/item_background_holo_dark</item> - <item>@drawable/item_background_holo_light</item> - <item>@drawable/fastscroll_thumb_holo</item> - <item>@drawable/fastscroll_thumb_pressed_holo</item> - <item>@drawable/fastscroll_thumb_default_holo</item> - <item>@drawable/fastscroll_track_holo_dark</item> - <item>@drawable/fastscroll_track_pressed_holo_dark</item> - <item>@drawable/fastscroll_track_default_holo_dark</item> - <item>@drawable/fastscroll_track_holo_light</item> - <item>@drawable/fastscroll_track_pressed_holo_light</item> - <item>@drawable/fastscroll_track_default_holo_light</item> - <item>@drawable/editbox_dropdown_background_dark</item> - <item>@drawable/textfield_searchview_holo_dark</item> - <item>@drawable/textfield_searchview_right_holo_dark</item> - <item>@drawable/textfield_searchview_holo_light</item> - <item>@drawable/textfield_searchview_right_holo_light</item> - <item>@drawable/textfield_search_selected_holo_dark</item> - <item>@drawable/textfield_search_default_holo_dark</item> - <item>@drawable/textfield_search_right_selected_holo_dark</item> - <item>@drawable/textfield_search_right_default_holo_dark</item> - <item>@drawable/textfield_search_selected_holo_light</item> - <item>@drawable/textfield_search_default_holo_light</item> - <item>@drawable/textfield_search_right_selected_holo_light</item> - <item>@drawable/textfield_search_right_default_holo_light</item> - <item>@drawable/tab_indicator_holo</item> - <item>@drawable/tab_unselected_holo</item> - <item>@drawable/tab_selected_holo</item> - <item>@drawable/tab_unselected_focused_holo</item> - <item>@drawable/tab_selected_focused_holo</item> - <item>@drawable/tab_unselected_pressed_holo</item> - <item>@drawable/tab_selected_pressed_holo</item> - <item>@drawable/quickcontact_badge_overlay_dark</item> - <item>@drawable/quickcontact_badge_overlay_normal_dark</item> - <item>@drawable/quickcontact_badge_overlay_pressed_dark</item> - <item>@drawable/quickcontact_badge_overlay_light</item> - <item>@drawable/quickcontact_badge_overlay_normal_light</item> - <item>@drawable/quickcontact_badge_overlay_pressed_light</item> - - <!-- Material assets --> - <item>@drawable/ab_share_pack_material</item> - <item>@drawable/ab_solid_shadow_material</item> - <item>@drawable/activated_background_material</item> - <item>@drawable/btn_borderless_material</item> - <item>@drawable/btn_check_material_anim</item> - <item>@drawable/btn_default_material</item> - <item>@drawable/btn_radio_material_anim</item> - <item>@drawable/btn_star_material</item> - <item>@drawable/btn_toggle_material</item> - <item>@drawable/cab_background_bottom_material</item> - <item>@drawable/cab_background_top_material</item> - <item>@drawable/dialog_background_material</item> - <item>@drawable/edit_text_material</item> - <item>@drawable/expander_group_material</item> - <item>@drawable/fastscroll_label_left_material</item> - <item>@drawable/fastscroll_label_right_material</item> - <item>@drawable/fastscroll_thumb_material</item> - <item>@drawable/fastscroll_track_material</item> - <item>@drawable/floating_popup_background_dark</item> - <item>@drawable/floating_popup_background_light</item> - <item>@drawable/ic_ab_back_material</item> - <item>@drawable/ic_ab_back_material_dark</item> - <item>@drawable/ic_ab_back_material_light</item> - <item>@drawable/ic_clear_material</item> - <item>@drawable/ic_commit_search_api_material</item> - <item>@drawable/ic_dialog_alert_material</item> - <item>@drawable/ic_find_next_material</item> - <item>@drawable/ic_find_previous_material</item> - <item>@drawable/ic_go_search_api_material</item> - <item>@drawable/ic_media_route_connecting_material</item> - <item>@drawable/ic_media_route_material</item> - <item>@drawable/ic_menu_copy_material</item> - <item>@drawable/ic_menu_cut_material</item> - <item>@drawable/ic_menu_find_material</item> - <item>@drawable/ic_menu_moreoverflow_material</item> - <item>@drawable/ic_menu_paste_material</item> - <item>@drawable/ic_menu_search_material</item> - <item>@drawable/ic_menu_selectall_material</item> - <item>@drawable/ic_menu_share_material</item> - <item>@drawable/ic_search_api_material</item> - <item>@drawable/ic_voice_search_api_material</item> - <item>@drawable/item_background_borderless_material</item> - <item>@drawable/item_background_borderless_material_dark</item> - <item>@drawable/item_background_borderless_material_light</item> - <item>@drawable/item_background_material</item> - <item>@drawable/item_background_material_dark</item> - <item>@drawable/item_background_material_light</item> - <item>@drawable/list_divider_material</item> - <item>@drawable/list_section_divider_material</item> - <item>@drawable/notification_material_action_background</item> - <item>@drawable/notification_material_media_action_background</item> - <item>@drawable/popup_background_material</item> - <item>@drawable/progress_horizontal_material</item> - <item>@drawable/progress_indeterminate_horizontal_material</item> - <item>@drawable/progress_large_material</item> - <item>@drawable/progress_medium_material</item> - <item>@drawable/progress_small_material</item> - <item>@drawable/ratingbar_material</item> - <item>@drawable/ratingbar_small_material</item> - <item>@drawable/ratingbar_indicator_material</item> - <item>@drawable/scrollbar_handle_material</item> - <item>@drawable/seekbar_thumb_material_anim</item> - <item>@drawable/seekbar_track_material</item> - <item>@drawable/spinner_background_material</item> - <item>@drawable/spinner_textfield_background_material</item> - <item>@drawable/switch_thumb_material_anim</item> - <item>@drawable/switch_track_material</item> - <item>@drawable/tab_indicator_material</item> - <item>@drawable/text_cursor_material</item> - <item>@drawable/textfield_search_material</item> - <item>@drawable/text_select_handle_left_material</item> - <item>@drawable/text_select_handle_middle_material</item> - <item>@drawable/text_select_handle_right_material</item> - <item>@drawable/ic_account_circle</item> + <item>@drawable/ab_share_pack_material</item> + <item>@drawable/ab_solid_shadow_material</item> + <item>@drawable/action_bar_item_background_material</item> + <item>@drawable/activated_background_material</item> + <item>@drawable/btn_borderless_material</item> + <item>@drawable/btn_check_material_anim</item> + <item>@drawable/btn_colored_material</item> + <item>@drawable/btn_default_material</item> + <item>@drawable/btn_group_holo_dark</item> + <item>@drawable/btn_group_holo_light</item> + <item>@drawable/btn_radio_material_anim</item> + <item>@drawable/btn_star_material</item> + <item>@drawable/btn_toggle_material</item> + <item>@drawable/button_inset</item> + <item>@drawable/cab_background_bottom_material</item> + <item>@drawable/cab_background_top_material</item> + <item>@drawable/control_background_32dp_material</item> + <item>@drawable/control_background_40dp_material</item> + <item>@drawable/dialog_background_material</item> + <item>@drawable/editbox_dropdown_background_dark</item> + <item>@drawable/edit_text_material</item> + <item>@drawable/expander_group_material</item> + <item>@drawable/fastscroll_label_left_material</item> + <item>@drawable/fastscroll_label_right_material</item> + <item>@drawable/fastscroll_thumb_material</item> + <item>@drawable/fastscroll_track_material</item> + <item>@drawable/floating_popup_background_dark</item> + <item>@drawable/floating_popup_background_light</item> + <item>@drawable/gallery_item_background</item> + <item>@drawable/ic_ab_back_material</item> + <item>@drawable/ic_ab_back_material_dark</item> + <item>@drawable/ic_ab_back_material_light</item> + <item>@drawable/ic_account_circle</item> + <item>@drawable/ic_arrow_drop_right_black_24dp</item> + <item>@drawable/ic_clear</item> + <item>@drawable/ic_clear_disabled</item> + <item>@drawable/ic_clear_material</item> + <item>@drawable/ic_clear_normal</item> + <item>@drawable/ic_commit_search_api_material</item> + <item>@drawable/ic_dialog_alert_material</item> + <item>@drawable/ic_find_next_material</item> + <item>@drawable/ic_find_previous_material</item> + <item>@drawable/ic_go</item> + <item>@drawable/ic_go_search_api_material</item> + <item>@drawable/ic_media_route_connecting_material</item> + <item>@drawable/ic_media_route_material</item> + <item>@drawable/ic_menu_close_clear_cancel</item> + <item>@drawable/ic_menu_copy_material</item> + <item>@drawable/ic_menu_cut_material</item> + <item>@drawable/ic_menu_find_material</item> + <item>@drawable/ic_menu_more</item> + <item>@drawable/ic_menu_moreoverflow_material</item> + <item>@drawable/ic_menu_paste_material</item> + <item>@drawable/ic_menu_search_material</item> + <item>@drawable/ic_menu_selectall_material</item> + <item>@drawable/ic_menu_share_material</item> + <item>@drawable/ic_search_api_material</item> + <item>@drawable/ic_voice_search_api_material</item> + <item>@drawable/indicator_check_mark_dark</item> + <item>@drawable/indicator_check_mark_light</item> + <item>@drawable/item_background_borderless_material</item> + <item>@drawable/item_background_borderless_material_dark</item> + <item>@drawable/item_background_borderless_material_light</item> + <item>@drawable/item_background_material</item> + <item>@drawable/item_background_material_dark</item> + <item>@drawable/item_background_material_light</item> + <item>@drawable/list_choice_background_material</item> + <item>@drawable/list_divider_material</item> + <item>@drawable/list_section_divider_material</item> + <item>@drawable/menu_background_fill_parent_width</item> + <item>@drawable/notification_material_action_background</item> + <item>@drawable/notification_material_media_action_background</item> + <item>@drawable/number_picker_divider_material</item> + <item>@drawable/popup_background_material</item> + <item>@drawable/popup_inline_error_above_holo_dark</item> + <item>@drawable/popup_inline_error_above_holo_light</item> + <item>@drawable/popup_inline_error_holo_dark</item> + <item>@drawable/popup_inline_error_holo_light</item> + <item>@drawable/progress_horizontal_material</item> + <item>@drawable/progress_indeterminate_horizontal_material</item> + <item>@drawable/progress_large_material</item> + <item>@drawable/progress_medium_material</item> + <item>@drawable/progress_small_material</item> + <item>@drawable/quickcontact_badge_overlay_dark</item> + <item>@drawable/quickcontact_badge_overlay_light</item> + <item>@drawable/quickcontact_badge_overlay_normal_dark</item> + <item>@drawable/quickcontact_badge_overlay_normal_light</item> + <item>@drawable/quickcontact_badge_overlay_pressed_dark</item> + <item>@drawable/quickcontact_badge_overlay_pressed_light</item> + <item>@drawable/ratingbar_indicator_material</item> + <item>@drawable/ratingbar_material</item> + <item>@drawable/ratingbar_small_material</item> + <item>@drawable/screen_background_dark</item> + <item>@drawable/screen_background_dark_transparent</item> + <item>@drawable/screen_background_light</item> + <item>@drawable/screen_background_light_transparent</item> + <item>@drawable/screen_background_selector_dark</item> + <item>@drawable/screen_background_selector_light</item> + <item>@drawable/scrollbar_handle_material</item> + <item>@drawable/seekbar_thumb_material_anim</item> + <item>@drawable/seekbar_tick_mark_material</item> + <item>@drawable/seekbar_track_material</item> + <item>@drawable/spinner_background_material</item> + <item>@drawable/spinner_textfield_background_material</item> + <item>@drawable/switch_thumb_material_anim</item> + <item>@drawable/switch_track_material</item> + <item>@drawable/tab_indicator_material</item> + <item>@drawable/text_cursor_material</item> + <item>@drawable/text_edit_paste_window</item> + <item>@drawable/textfield_search_material</item> + <item>@drawable/text_select_handle_left_material</item> + <item>@drawable/text_select_handle_middle_material</item> + <item>@drawable/text_select_handle_right_material</item> + <item>@drawable/toast_frame</item> </array> <!-- Do not translate. These are all of the color state list resources that should be diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index ad02d29dcbf3..d0fd36ad269e 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2477,7 +2477,9 @@ remote provider --> <string name="config_tvRemoteServicePackage" translatable="false"></string> - <!-- True if the device supports persisting security logs across reboots. --> + <!-- True if the device supports persisting security logs across reboots. + This requires the device's kernel to have pstore and pmsg enabled, + and DRAM to be powered and refreshed through all stages of reboot. --> <bool name="config_supportPreRebootSecurityLogs">false</bool> <!-- Default files to pin via Pinner Service --> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 8e9e97869d77..fee2469083e1 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2726,6 +2726,8 @@ <public type="style" name="Widget.Material.Light.CompoundButton.Switch" /> <public type="style" name="Widget.Material.NumberPicker" /> <public type="style" name="Widget.Material.Light.NumberPicker" /> + <public type="style" name="TextAppearance.Material.Widget.Button.Colored" /> + <public type="style" name="TextAppearance.Material.Widget.Button.Borderless.Colored" /> <public type="id" name="accessibilityActionSetProgress" /> <public type="id" name="icon_frame" /> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 45ee778f3a9e..22329422251b 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -4318,6 +4318,6 @@ <string name="audit_safemode_notification_details">Touch to learn more.</string> <!-- Accessibilty string added to a widget that has been suspended [CHAR LIMIT=20] --> - <string name="suspended_widget_accessibility">Suspended <xliff:g id="label" example="Calendar">%1$s</xliff:g></string> + <string name="suspended_widget_accessibility">Disabled <xliff:g id="label" example="Calendar">%1$s</xliff:g></string> </resources> diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml index 3ed8daae9dae..bb0783482e7e 100644 --- a/core/res/res/values/styles_material.xml +++ b/core/res/res/values/styles_material.xml @@ -298,6 +298,14 @@ please see styles_device_defaults.xml. <item name="textColor">?attr/textColorPrimaryInverse</item> </style> + <style name="TextAppearance.Material.Widget.Button.Colored"> + <item name="textColor">@color/btn_colored_text_material</item> + </style> + + <style name="TextAppearance.Material.Widget.Button.Borderless.Colored" parent="TextAppearance.Material.Widget.Button"> + <item name="textColor">@color/btn_colored_borderless_text_material</item> + </style> + <style name="TextAppearance.Material.Widget.EditText"> <item name="textColor">?attr/textColorPrimaryInverse</item> <item name="textColorHint">?attr/textColorHintInverse</item> @@ -485,8 +493,7 @@ please see styles_device_defaults.xml. <!-- Colored bordered ink button --> <style name="Widget.Material.Button.Colored"> <item name="background">@drawable/btn_colored_material</item> - <item name="textAppearance">@style/TextAppearance.Material.Widget.Button.Inverse</item> - <item name="textColor">@color/btn_colored_text_material</item> + <item name="textAppearance">@style/TextAppearance.Material.Widget.Button.Colored</item> </style> <!-- Small bordered ink button --> @@ -503,7 +510,7 @@ please see styles_device_defaults.xml. <!-- Colored borderless ink button --> <style name="Widget.Material.Button.Borderless.Colored"> - <item name="textColor">@color/btn_colored_borderless_text_material</item> + <item name="textAppearance">@style/TextAppearance.Material.Widget.Button.Borderless.Colored</item> </style> <!-- Alert dialog button bar button --> diff --git a/docs/html-intl/intl/es/preview/setup-sdk.jd b/docs/html-intl/intl/es/preview/setup-sdk.jd index 769121d1801e..39e84a8bb44d 100644 --- a/docs/html-intl/intl/es/preview/setup-sdk.jd +++ b/docs/html-intl/intl/es/preview/setup-sdk.jd @@ -130,7 +130,7 @@ Android N Preview SDK en Android Studio de la siguiente manera:</p> SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 </td> </tr> -<table> +</table> @@ -221,4 +221,3 @@ android { y <a href="{@docRoot}preview/api-overview.html">API y funciones de Android N </a>.</li> </ul> -<div class="end-content-title"></div> diff --git a/docs/html-intl/intl/in/preview/setup-sdk.jd b/docs/html-intl/intl/in/preview/setup-sdk.jd index c6e43f165e66..2502d7d17504 100644 --- a/docs/html-intl/intl/in/preview/setup-sdk.jd +++ b/docs/html-intl/intl/in/preview/setup-sdk.jd @@ -130,7 +130,7 @@ Android N Preview SDK di Android Studio sebagai berikut:</p> SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 </td> </tr> -<table> +</table> @@ -221,4 +221,3 @@ android { dan <a href="{@docRoot}preview/api-overview.html">Android N API dan Fiturnya</a>.</li> </ul> -<div class="end-content-title"></div> diff --git a/docs/html-intl/intl/ja/preview/setup-sdk.jd b/docs/html-intl/intl/ja/preview/setup-sdk.jd index 4331641cabba..36c2144beac6 100644 --- a/docs/html-intl/intl/ja/preview/setup-sdk.jd +++ b/docs/html-intl/intl/ja/preview/setup-sdk.jd @@ -130,7 +130,7 @@ page.image=images/cards/card-n-sdk_2x.png SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 </td> </tr> -<table> +</table> @@ -221,4 +221,3 @@ android { </li> </ul> -<div class="end-content-title"></div> diff --git a/docs/html-intl/intl/ko/preview/setup-sdk.jd b/docs/html-intl/intl/ko/preview/setup-sdk.jd index 91f17c1bfaf7..d04acefbbbbb 100644 --- a/docs/html-intl/intl/ko/preview/setup-sdk.jd +++ b/docs/html-intl/intl/ko/preview/setup-sdk.jd @@ -130,7 +130,7 @@ API 참조와 API 차이점 보고서가 포함되어 있습니다. SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 </td> </tr> -<table> +</table> @@ -221,4 +221,3 @@ SDK</strong> 옵션 목록에서 및 기능</a>에서 Android N 플랫폼에 대해 자세히 알아봅니다.</li> </ul> -<div class="end-content-title"></div> diff --git a/docs/html-intl/intl/pt-br/preview/setup-sdk.jd b/docs/html-intl/intl/pt-br/preview/setup-sdk.jd index 9035e508b39b..a917da332988 100644 --- a/docs/html-intl/intl/pt-br/preview/setup-sdk.jd +++ b/docs/html-intl/intl/pt-br/preview/setup-sdk.jd @@ -130,7 +130,7 @@ Android N Preview SDK no Android Studio da seguinte maneira:</p> SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 </td> </tr> -<table> +</table> @@ -221,4 +221,3 @@ android { e <a href="{@docRoot}preview/api-overview.html">Recursos de APIs do Android N</a>.</li> </ul> -<div class="end-content-title"></div> diff --git a/docs/html-intl/intl/ru/preview/setup-sdk.jd b/docs/html-intl/intl/ru/preview/setup-sdk.jd index 582fe9f01a40..6ae86e9a2b06 100644 --- a/docs/html-intl/intl/ru/preview/setup-sdk.jd +++ b/docs/html-intl/intl/ru/preview/setup-sdk.jd @@ -130,7 +130,7 @@ API. SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 </td> </tr> -<table> +</table> @@ -221,4 +221,3 @@ SDK</strong> и выберите и в описании <a href="{@docRoot}preview/api-overview.html">API-интерфейсов и возможностей Android N</a>. </li> </ul> -<div class="end-content-title"></div> diff --git a/docs/html-intl/intl/vi/preview/index.jd b/docs/html-intl/intl/vi/preview/index.jd index 25289e0d57f4..bd64b250fb37 100644 --- a/docs/html-intl/intl/vi/preview/index.jd +++ b/docs/html-intl/intl/vi/preview/index.jd @@ -31,7 +31,7 @@ footer.hide=1 <strong>thông báo trả lời trực tiếp</strong> và nhiều tính năng khác. </p> - <a href="http://factoryberlin.com" target="_new"> + <a class="dac-hero-cta" href="{@docRoot}preview/overview.html"> <span class="dac-sprite dac-auto-chevron"></span> Bắt đầu </a><!--<br> @@ -61,19 +61,19 @@ footer.hide=1 </a> <ul class="dac-actions"> <li class="dac-action"> - <a href="http://factoryberlin.com" target="_new"> + <a class="dac-action-link" href="https://developer.android.com/preview/bug"> <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i> Báo cáo vấn đề </a> </li> <li class="dac-action"> - <a href="http://factoryberlin.com" target="_new"> + <a class="dac-action-link" href="{@docRoot}preview/support.html"> <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i> Xem ghi chú phát hành </a> </li> <li class="dac-action"> - <a href="http://factoryberlin.com" target="_new"> + <a class="dac-action-link" href="{@docRoot}preview/dev-community"> <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i> Tham gia cộng đồng nhà phát triển </a> @@ -86,15 +86,15 @@ footer.hide=1 <div class="wrap dac-offset-parent"> <div class="actions"> - <div><a href="http://factoryberlin.com" target="_new"> + <div><a href="https://developer.android.com/preview/bug"> <span class="dac-sprite dac-auto-chevron-large"></span> Báo cáo vấn đề </a></div> - <div><a href="http://factoryberlin.com" target="_new"> + <div><a href="{@docRoot}preview/support.html"> <span class="dac-sprite dac-auto-chevron-large"></span> Xem ghi chú phát hành </a></div> - <div><a href="http://factoryberlin.com" target="_new"> + <div><a href="{@docRoot}preview/dev-community"> <span class="dac-sprite dac-auto-chevron-large"></span> Tham gia cộng đồng nhà phát triển </a></div> diff --git a/docs/html-intl/intl/vi/preview/setup-sdk.jd b/docs/html-intl/intl/vi/preview/setup-sdk.jd index 6f6cd20bd096..bdba71349087 100644 --- a/docs/html-intl/intl/vi/preview/setup-sdk.jd +++ b/docs/html-intl/intl/vi/preview/setup-sdk.jd @@ -130,7 +130,7 @@ bản cài đặt có sẵn thì hãy chuyển đến bước 4):</p> SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 </td> </tr> -<table> +</table> @@ -221,4 +221,3 @@ android { và<a href="{@docRoot}preview/api-overview.html">API Android N và Các tính năng</a>.</li> </ul> -<div class="end-content-title"></div> diff --git a/docs/html-intl/intl/zh-cn/preview/setup-sdk.jd b/docs/html-intl/intl/zh-cn/preview/setup-sdk.jd index eaef7a11d0d1..69971d8cbd67 100644 --- a/docs/html-intl/intl/zh-cn/preview/setup-sdk.jd +++ b/docs/html-intl/intl/zh-cn/preview/setup-sdk.jd @@ -130,7 +130,7 @@ page.tags="preview", "developer preview" SHA-1:6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 </td> </tr> -<table> +</table> @@ -221,4 +221,3 @@ android { </li> </ul> -<div class="end-content-title"></div> diff --git a/docs/html-intl/intl/zh-tw/preview/setup-sdk.jd b/docs/html-intl/intl/zh-tw/preview/setup-sdk.jd index 7a46acafa305..b486ed41f341 100644 --- a/docs/html-intl/intl/zh-tw/preview/setup-sdk.jd +++ b/docs/html-intl/intl/zh-tw/preview/setup-sdk.jd @@ -130,7 +130,7 @@ page.image=images/cards/card-n-sdk_2x.png SHA-1:6a3880b3ccd19614daae5a4d0698ea6ae11c20a5 </td> </tr> -<table> +</table> @@ -221,4 +221,3 @@ android { </li> </ul> -<div class="end-content-title"></div> diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml index 4211c6fbd5ea..9e9343e2e3ee 100644 --- a/docs/html/_redirects.yaml +++ b/docs/html/_redirects.yaml @@ -127,6 +127,8 @@ redirects: to: https://developers.google.com/mobile-ads-sdk/ - from: /google/play-services/wallet.html to: https://developers.google.com/wallet/instant-buy/ +- from: /google/play-services/id.html + to: https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient - from: /google/play/safetynet/... to: /training/safetynet/index.html - from: /google/gcm/... @@ -843,6 +845,8 @@ redirects: to: /studio/run/emulator.html - from: /r/studio-ui/instant-run.html to: /studio/run/index.html#instant-run +- from: /r/studio-ui/test-recorder.html + to: http://tools.android.com/tech-docs/test-recorder - from: /reference/org/apache/http/... to: /about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client - from: /shareables/... diff --git a/docs/html/google/_book.yaml b/docs/html/google/_book.yaml index 92357e9730c6..885ad7a3a935 100644 --- a/docs/html/google/_book.yaml +++ b/docs/html/google/_book.yaml @@ -63,9 +63,6 @@ toc: - title: Google Play Developer API path: /google/play/developer-api.html -- title: Advertising ID - path: /google/play-services/id.html - - title: Multiple APK Support path: /google/play/publishing/multiple-apks.html diff --git a/docs/html/google/play-services/id.jd b/docs/html/google/play-services/id.jd deleted file mode 100644 index 2f0664c4fed4..000000000000 --- a/docs/html/google/play-services/id.jd +++ /dev/null @@ -1,193 +0,0 @@ -page.title=Advertising ID -page.tags=Ads,Advertising ID,ID - -@jd:body -<div class="landing-banner"> - -<div class="col-8"> -<p itemprop="description"> - The advertising ID is a user-specific, unique, resettable ID for advertising, - provided by Google Play services. It gives users better controls and provides - developers with a simple, standard system to continue to monetize your apps. - It is an anonymous identifier for advertising purposes and enables users to - reset their identifier or opt out of interest-based ads within Google Play - apps. -</p> -<p> - The advertising ID is accessible through a straightforward API that you can - implement in your apps. For details, take a look at the <a href= - "#get_started">overview</a> and the <a href= - "https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/package-summary"> - advertising ID API reference</a>. -</p> -</div> -</div> -<div class="landing-docs"> - <div class="col-6 normal-links"> - <h3 style="clear:left">Key Developer Features</h3> - <h4>Standard, simple ID</h4> - <p>The advertising ID is a part of a standard, simple system for serving ads and performing analytics.</p> - <h4>Giving users control</h4> - <p>Users can reset their advertising ID or opt out of interest-based ads at any time, right from the Google Settings app. - Their preferences apply across all ad companies that use the advertising ID.</p> - - </div> - <div class="col-6 normal-links"> - <h3 style="clear:left">Getting Started</h3> - <h4>1. Get the Google Play services SDK</h4> - <p>The advertising ID APIs are part of the Google Play services platform.</p> - <p>To get started, <a href="https://developers.google.com/android/guides/setup">set up - the Google Play services SDK</a>. </p> - <h4>2. Read the docs and example code</h4> - <p>Once you've installed the Google Play services package, review the <a href="#get_started">overview</a> - below, as well as the <a href="#example">example</a>.</p> - <p> - For detailed documentation, take a look at the <a href= - "https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/package-summary"> - advertising ID API reference documentation</a>. - </p> - </div> -</div> -<p class="caution" style= -"background-color:#fffdeb;width:100%;margin-bottom:1em;padding:.5em;"> - As a reminder, please note that starting <strong>1 August 2014</strong>, new - apps and app updates distributed through Google Play must use the advertising - ID in lieu of any other persistent identifiers for any advertising purposes, - on devices that support the advertising ID.<br> - <br> - To learn how to check your app's compliance through the Developer Console, or - for details on the associated developer policy changes, please see the - <a href= - "https://support.google.com/googleplay/android-developer/answer/6048248">Advertising - ID topic</a> in the Google Play developer help center. -</p> -<h2 id="get_started">Using the Advertising ID</h2> -<p> - The <strong>advertising ID</strong> is a unique but - user-resettable string identifier that lets ad networks and other apps anonymously - identify a user. The user's advertising ID is made available to apps through APIs - provided in Google Play services. -</p> -<p> - Users can reset their advertising ID at any time, right from the Ads section of the - Google Settings app on their devices. From the same app, users can also - opt-out of targeted advertising based on the advertising ID by setting the appropriate - <strong style="white-space:nowrap">ad tracking preference</strong>. When the - user opts-out of targeted ads, this ad tracking preference is made available - to apps through a Google Play services API. -</p> -<p> - Apps making use of the advertising ID <strong>must check for and respect</strong> the - user's ad tracking preference. Also please note that any use of the advertising ID - must abide by the terms of the <a class="external-link" - href="http://play.google.com/about/developer-content-policy.html#ADID">Google Play - Developer Content Policies</a>. -</p> -<h3 id="format">Format of the Advertising ID</h3> -<p> - Google Play services APIs expose the user's advertising ID as a string format of UUID, - with values similar to this: -</p> -<p style="margin-left:1.5em;"><code>"38400000-8cf0-11bd-b23e-10b96e40000d"</code></p> -<h3 id="requirements">Requirements</h3> -<ul> - <li>The advertising ID APIs are supported in Google Play services 4.0+</li> - <li>Support for the advertising ID on specific devices is based on their installed versions - of Google Play services</li> -</ul> -<h3 id="obtaining">Obtaining the user's advertising ID and ad tracking preference</h3> -<p> - If you want to use the advertising ID in your app, you must first install the Google - Play services SDK. As noted in the requirements above, you should install the - SDK for Google Play services 4.0 or higher if you will develop using the advertising ID - APIs. For information about how to get started, see <a href= - "https://developers.google.com/android/guides/setup">Setting Up Google Play services</a>. -</p> -<p> - The advertising ID APIs are available in the <a href= - "{@docRoot}reference/com/google/android/gms/ads/identifier/package-summary.html"> - <code>com.google.android.gms.ads.identifier</code></a> package in the Google - Play Services library. To obtain the user's advertising ID and tracking preference, - call the method - <a href= - "{@docRoot}reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.html#getAdvertisingIdInfo(android.content.Context)"> - <code>getAdvertisingIdInfo()</code></a>, which returns an <a href= - "{@docRoot}reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info.html"> - <code>AdvertisingIdClient.Info</code></a> encapsulating the user's current Advertising ID - and tracking preference. -</p> -<p class="note"> - <strong>Note:</strong> The - <a href= - "{@docRoot}reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.html#getAdvertisingIdInfo(android.content.Context)"><code>getAdvertisingIdInfo()</code></a> - method is a blocking call, so you must not call it on the main (UI) thread. - If called on the main thread, the method throws - {@link java.lang.IllegalStateException}. -</p> -<p> - Once you've retrieved the - <a href= - "{@docRoot}reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info.html"> - <code>AdvertisingIdClient.Info</code></a> - object, you can use its <a href= - "{@docRoot}reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info.html#getId()"> - <code>getId()</code></a> and <a href= - "{@docRoot}reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info.html#isLimitAdTrackingEnabled()"> - <code>isLimitAdTrackingEnabled()</code></a> methods to access the advertising ID and - ad tracking preference. -</p> -<table> -<tr> -<th>Method</th> -<th>Description</th> -</tr> -<tr> -<td><code>public String <a href= - "{@docRoot}reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info.html#getId()">getId()</a></code></td> -<td style="white-space:nowrap;">Retrieves the advertising ID.</td> -</tr> -<tr> -<td style="white-space:nowrap;"><code>public boolean <a href= - "{@docRoot}reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info.html#isLimitAdTrackingEnabled()">isLimitAdTrackingEnabled()</a></code></td> -<td>Retrieves whether the user has limit ad tracking enabled or not.</td> -</tr> -</table> -<p> - The advertising ID APIs do not include a "reset" method. Only users can initiate a - reset of their own advertising IDs, through the Google Settings application. -</p> -<p> - For more information about the advertising ID APIs, see the <a href= - "{@docRoot}reference/com/google/android/gms/ads/identifier/package-summary.html"> - reference documentation</a>. -</p> -<h3 id="example">Example implementation</h3> -<p> - Here's a basic illustration of how you can retrieve the user's advertising ID and ad - tracking preference in your app: -</p> -<pre> -import com.google.android.gms.ads.identifier.AdvertisingIdClient; -import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info; -import com.google.android.gms.common.GooglePlayServicesAvailabilityException; -import com.google.android.gms.common.GooglePlayServicesNotAvailableException; -import java.io.IOException; -... -// Do not call this function from the main thread. Otherwise, -// an IllegalStateException will be thrown. -public void getIdThread() { - Info adInfo = null; - try { - adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext.getApplicationContext()); - } catch (IOException e) { - // Unrecoverable error connecting to Google Play services (e.g., - // the old version of the service doesn't support getting AdvertisingId). - - } catch (GooglePlayServicesAvailabilityException e) { - // Encountered a recoverable error connecting to Google Play services. - } catch (GooglePlayServicesNotAvailableException e) { - // Google Play services is not available entirely. - } - final String id = adInfo.getId(); - final boolean isLAT = adInfo.isLimitAdTrackingEnabled(); -}</pre> diff --git a/docs/html/license.jd b/docs/html/license.jd index 0f671e2dfa1d..4f4036b41211 100644 --- a/docs/html/license.jd +++ b/docs/html/license.jd @@ -29,7 +29,9 @@ adhere to the preferred license, there may be exceptions, such as for documentation (code comments) extracted from a source code module that is licensed under GPLv2 or other license. In those cases, the license covering the source code module will apply to the documentation -extracted from it. </p> +extracted from it. Source code modules that are used in the generation +of documentation and have licenses that require attribution can be +found in the <a href="#doclicenses">Documentation Licences section</a> below.</p> <p>Third-party components of this site such as JavaScript libraries are included in the Android Open Source Project under the licenses specified by their authors. For information about these @@ -144,4 +146,102 @@ Creative Commons legal code</a>. written attribution in the spirit of the messages above. </p> +<h2 id="doclicenses">Documentation Licenses</h2> +<h3 id="icu">ICU License</h3> +<p>The Android public API documentation incorporates text from the following source code libraries under the ICU License:</p> +<ul> +<li><a href="{@docRoot}reference/android/icu/lang/package-summary.html">android.icu.lang</a></li> +<li><a href="{@docRoot}reference/android/icu/math/package-summary.html">android.icu.math</a></li> +<li><a href="{@docRoot}reference/android/icu/text/package-summary.html">android.icu.text</a></li> +<li><a href="{@docRoot}reference/android/icu/util/package-summary.html">android.icu.util</a></li> +</ul> + +<div class="aside" style="overflow:scroll; height:250px;"> +<p>COPYRIGHT AND PERMISSION NOTICE</p> + +<p> +Copyright (c) 1995-2015 International Business Machines Corporation and others +</p> +<p> +All rights reserved. +</p> +<p> +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Software, and to permit persons +to whom the Software is furnished to do so, provided that the above +copyright notice(s) and this permission notice appear in all copies +of the Software and that both the above copyright notice(s) and this +permission notice appear in supporting documentation. +</p> +<p> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL +THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, +OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE +USE OR PERFORMANCE OF THIS SOFTWARE. +</p> +<p> +Except as contained in this notice, the name of a copyright holder shall not be +used in advertising or otherwise to promote the sale, use or other dealings in +this Software without prior written authorization of the copyright holder. +</p> +</div> + +<h3 id="w3c_license">W3C Software and Document Notice and License</h3> +<p>The Android public API documentation incorporates text from the following source code libraries under the W3C Software and Document Notice and License:</p> +<ul> +<li><a href="{@docRoot}reference/org/w3c/dom/package-summary.html">org.w3c.dom</a></li> +<li><a href="{@docRoot}reference/org/w3c/dom/ls/package-summary.html">org.w3c.dom.ls</a></li> +</ul> + +<div class="aside" style="overflow:scroll; height:250px;"> +<p>This work is being provided by the copyright holders under the following license.</p> +<h5>License</h5> +<p> + By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, + and will comply with the following terms and conditions. +</p> +<p> + Permission to copy, modify, and distribute this work, with or without modification, for any + purpose and without fee or royalty is hereby granted, provided that you include the following on + ALL copies of the work or portions thereof, including modifications: +</p> +<ul> +<li> + The full text of this NOTICE in a location viewable to users of the redistributed or + derivative work. +</li> +<li> + Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none + exist, the W3C Software and Document Short Notice should be included. +</li> +<li> + Notice of any changes or modifications, through a copyright statement on the new code or document + such as "This software or document includes material copied from or derived from [title and URI of + the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)." +</li> +</ul> +<h5>Disclaimers</h5> +<p> + THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY + PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY + PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. +</p> +<p> + COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES + ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT. +</p> +<p> + The name and trademarks of copyright holders may NOT be used in advertising or publicity + pertaining to the work without specific, written prior permission. Title to copyright in this work + will at all times remain with copyright holders. +</p> +</div> </div> diff --git a/docs/html/preview/features/security-config.jd b/docs/html/preview/features/security-config.jd index 633c0e5cda60..2706ced8579b 100644 --- a/docs/html/preview/features/security-config.jd +++ b/docs/html/preview/features/security-config.jd @@ -18,7 +18,7 @@ page.image=images/cards/card-nyc_2x.jpg </ol> </li> <li><a href="#TrustingDebugCa">Debugging-only CAs</a></li> - <li><a href="#UsesCleartextTraffic">Opting Out of Cleartext Traffic</a></li> + <li><a href="#CleartextTrafficPermitted">Opting Out of Cleartext Traffic</a></li> <li><a href="#CertificatePinning">Pinning Certificates</a></li> <li><a href="#ConfigInheritance">Configuration Inheritance Behavior</a></li> <li><a href="#FileFormat">Configuration File Format</a></li> @@ -72,9 +72,8 @@ page.image=images/cards/card-nyc_2x.jpg <pre> <?xml version="1.0" encoding="utf-8"?> <manifest ... > - <application ... > - <meta-data android:name="android.security.net.config" - android:resource="@xml/network_security_config" /> + <application android:networkSecurityConfig="@xml/network_security_config" + ... > ... </application> </manifest> @@ -240,7 +239,7 @@ android:debuggable</a> </p> -<h2 id="UsesCleartextTraffic">Opting Out of Cleartext Traffic</h2> +<h2 id="CleartextTrafficPermitted">Opting Out of Cleartext Traffic</h2> <p> Applications intending to connect to destinations using only secure @@ -263,7 +262,7 @@ android:debuggable</a> <pre> <?xml version="1.0" encoding="utf-8"?> <network-security-config> - <domain-config usesCleartextTraffic="false"> + <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">secure.example.com</domain> </domain-config> </network-security-config> @@ -436,7 +435,7 @@ android:debuggable</a> <pre class="stx"> <base-config <a href= -"#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]> +"#CleartextTrafficPermitted">cleartextTrafficPermitted</a>=["true" | "false"]> ... </base-config> </pre> @@ -463,7 +462,7 @@ android:debuggable</a> </p> <pre> -<base-config usesCleartextTraffic="true"> +<base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> @@ -471,7 +470,7 @@ android:debuggable</a> </pre> The default configuration for apps targeting API level 23 and below is: <pre> -<base-config usesCleartextTraffic="true"> +<base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> <certificates src="user" /> @@ -486,7 +485,7 @@ The default configuration for apps targeting API level 23 and below is: <dl class="xml"> <dt>syntax:</dt> <dd> -<pre class="stx"><domain-config <a href="#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]> +<pre class="stx"><domain-config <a href="#CleartextTrafficPermitted">cleartextTrafficPermitted</a>=["true" | "false"]> ... </domain-config></pre> </dd> diff --git a/docs/html/preview/setup-sdk.jd b/docs/html/preview/setup-sdk.jd index ebeae7446206..3b479e25b675 100644 --- a/docs/html/preview/setup-sdk.jd +++ b/docs/html/preview/setup-sdk.jd @@ -98,7 +98,7 @@ Android N Preview SDK in Android Studio as follows:</p> SHA-1: 9224bd4445cd7f653c4c294d362ccb195a2101e7 </td> </tr> -<table> +</table> @@ -189,4 +189,3 @@ href="{@docRoot}preview/download.html">Test on an Android N Device</a>.</li> and <a href="{@docRoot}preview/api-overview.html">Android N APIs and Features</a>.</li> </ul> -<div class="end-content-title"></div> diff --git a/docs/html/topic/instant-apps/faqs.jd b/docs/html/topic/instant-apps/faqs.jd index 0a1f571d9030..bf37241c8cd2 100644 --- a/docs/html/topic/instant-apps/faqs.jd +++ b/docs/html/topic/instant-apps/faqs.jd @@ -63,7 +63,9 @@ forcelocalnav=true <strong>How can developers get involved?</strong> <br/> Developers interested in upgrading their Android apps can visit - <a class="external-link" href="g.co/InstantApps">g.co/InstantApps</a> to + <a class="external-link" + href="http://g.co/InstantApps"> + g.co/InstantApps</a> to sign up. We will be reaching out to interested developers in the coming months. </p>
\ No newline at end of file diff --git a/docs/html/topic/instant-apps/index.jd b/docs/html/topic/instant-apps/index.jd index d8de0b518b4a..e2da9c519892 100644 --- a/docs/html/topic/instant-apps/index.jd +++ b/docs/html/topic/instant-apps/index.jd @@ -12,17 +12,8 @@ excludeFromSuggestions=true <!-- Hero section --> <section class="dac-expand dac-hero dac-section-light"> <div class="wrap"> - <div class="cols dac-hero-content"> - - <div class="col-1of2 col-push-1of2 dac-hero-figure"> - <div class="dev-bytes-video"> - <iframe width="560" height="350" src= - "https://www.youtube.com/embed/cosqlfqrpFA" frameborder="0" - allowfullscreen=""></iframe> - </div> - </div> - - <div class="col-1of2 col-pull-1of2" style="margin-bottom:40px"> + <div class="dac-hero-content"> + <div style="margin-bottom:40px"> <h1> Android Instant Apps </h1> @@ -47,6 +38,11 @@ excludeFromSuggestions=true <a class="landing-button green download-bundle-button" href= "https://docs.google.com/a/google.com/forms/d/1S3MzsMVIlchLCqyNLaFbv64llxWaf90QSeYLeswco90/viewform" target="_blank">I'M INTERESTED IN ANDROID INSTANT APPS<br></a> + <a class="dac-hero-cta dev-bytes" + href="https://www.youtube.com/watch?v=cosqlfqrpFA"> + <span class="dac-sprite dac-auto-chevron"></span> + Watch a video about Instant Apps + </a> </p> </div> @@ -56,7 +52,7 @@ excludeFromSuggestions=true <!-- Second section --> -<div class="wrap" style="margin-top:60px"> +<div class="wrap sub-section"> <div class="cols dac-hero-content"> <div class="col-1of2 dac-hero-figure"> <img src="/images/topic/instant-apps/instant-apps-section-2.png"> @@ -64,7 +60,7 @@ excludeFromSuggestions=true <div class="col-1of2"> <div class="dac-hero-tag"></div> - <h2 id="section-2">Run Android Apps Without Installation</h2> + <h2 id="section-2" class="norule">Run Android Apps Without Installation</h2> <p class="dac-hero-description"> Android Instant Apps lets you experience beautiful and immersive apps, with material design and smooth animations, without installing them @@ -77,9 +73,9 @@ excludeFromSuggestions=true <!-- Third section --> -<div class="wrap" style="margin-top:60px"> +<div class="wrap sub-section"> - <h2 id="section-3">Access Apps From Anywhere</h2> + <h2 id="section-3" class="norule">Access Apps From Anywhere</h2> <p> Get people to your flagship Android experience from links that would @@ -126,7 +122,7 @@ excludeFromSuggestions=true <!-- Fourth section --> -<div class="wrap" style="margin-top:60px"> +<div class="wrap sub-section"> <div class="cols dac-hero-content"> <div class="col-1of2 dac-hero-figure"> <img src="/images/topic/instant-apps/instant-apps-section-4.png"> @@ -134,9 +130,10 @@ excludeFromSuggestions=true <div class="col-1of2"> <div class="dac-hero-tag"></div> - <h2 id="section-4">Built On Google Play Services</h2> + <h2 id="section-4" class="norule">Built On Google Play Services</h2> <p class="dac-hero-description"> - Take advantage of Google Play services features — like location, identity, + Take advantage of Google Play services features — like location, + identity, payments, and Firebase — which are built right in for a seamless user experience. </p> @@ -147,17 +144,16 @@ excludeFromSuggestions=true <!-- Fifth section --> -<div class="wrap" style="margin-top:60px"> +<div class="wrap sub-section"> <div class="cols dac-hero-content"> <div class="col-1of2 col-push-1of2 dac-hero-figure"> <img src="/images/topic/instant-apps/instant-apps-section-5.png"> </div> <div class="col-1of2 col-pull-1of2"> <div class="dac-hero-tag"></div> - <h2 id="section-5">Works On Most Android Devices</h2> + <h2 id="section-5" class="norule">Works On Most Android Devices</h2> <p class="dac-hero-description"> - Android Instant Apps can work on Android devices running Android 4.1+ (API Level 16) or higher with Google Play services. </p> @@ -168,7 +164,7 @@ excludeFromSuggestions=true <!-- Sixth section --> -<div class="wrap" style="margin-top:60px"> +<div class="wrap sub-section"> <div class="cols dac-hero-content"> <div class="col-1of2 dac-hero-figure"> <img src="/images/topic/instant-apps/upgrade-your-app-2x.png"> @@ -176,7 +172,7 @@ excludeFromSuggestions=true <div class="col-1of2"> <div class="dac-hero-tag"></div> - <h2 id="section-6">Upgrade Your Existing App</h2> + <h2 id="section-6" class="norule">Upgrade Your Existing App</h2> <p class="dac-hero-description"> Android Instant Apps functionality is an upgrade to your existing Android app, not a new, separate app. It's the same Android APIs, the same @@ -192,18 +188,18 @@ excludeFromSuggestions=true <!-- Seventh section --> -<div class="wrap" style="margin-top:60px" id="section-7"> - <h2 id="sign-up-docs" style="margin-bottom: 0px;"> +<div class="wrap sub-section" id="section-7"> + <h2 id="sign-up-docs" class="dac-section-title norule" style="margin-bottom: 0px;"> Sign up for access to Android Instant Apps documentation </h2> - <p> + <p class="dac-section-subtitle" style="margin-top:0px"> We’ll let you know if you’re selected for early access to Android Instant Apps. </p> - <p> + <p class="dac-section-subtitle"> <a class="landing-button green download-bundle-button" href="https://docs.google.com/forms/d/1S3MzsMVIlchLCqyNLaFbv64llxWaf90QSeYLeswco90/viewform" target="_blank"> @@ -211,7 +207,7 @@ excludeFromSuggestions=true </a> </p> - <p style="margin-top:24px"> + <p class="dac-section-subtitle" style="margin-top:24px"> Check out our <a href="faqs.html">frequently asked questions</a> to find out more about Android Instant Apps. </p> @@ -230,28 +226,14 @@ excludeFromSuggestions=true background: #B0BEC5; } - /* Styling and layout for video. */ - .dev-bytes-video { - margin-top: 30px; - position: relative; - padding-bottom: 56.25%; /* 16:9 */ - padding-top: 30px; - height: 0; - } - - .dev-bytes-video iframe, - .dev-bytes-video object, - .dev-bytes-video embed { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; + /* Increase top margin for sections */ + .sub-section { + margin-top: 2em; } - /* Increase top margin for sections */ - .wrap { - margin-top: 1.5em; + a.dev-bytes { + padding-top: 1em; + padding-left: 1em; } #section-3, #sign-up-docs { @@ -259,11 +241,6 @@ excludeFromSuggestions=true border-top: 0px; } - /* Align the seventh section in the center. */ - #section-7 { - text-align: center; - } - /* GIF section styling */ .figure-caption { text-align: center; diff --git a/docs/html/training/basics/firstapp/building-ui.jd b/docs/html/training/basics/firstapp/building-ui.jd index 402396ea9320..275500c88141 100644 --- a/docs/html/training/basics/firstapp/building-ui.jd +++ b/docs/html/training/basics/firstapp/building-ui.jd @@ -396,20 +396,13 @@ android.widget.LinearLayout}.</p> <h2>Run Your App</h2> <p>This layout is applied by the default {@link android.app.Activity} class -that the SDK tools generated when you created the project. Run the app to see the -results:</p> +that the SDK tools generated when you created the project.</p> -<ul> - <li>In Android Studio, from the toolbar, click <strong>Run</strong> +<p>To run the app and see the results, + click <strong>Run 'app'</strong> <img src="{@docRoot}images/tools/as-run.png" - style="vertical-align:baseline;margin:0; max-height:1em" />.</li> - <li>Or from a command line, change directories to the root of your Android project and -execute: -<pre class="no-pretty-print"> -$ ant debug -adb install -r app/build/outputs/apk/app-debug.apk -</pre></li> -</ul> + style="vertical-align:baseline;margin:0; max-height:1em" /> in the + toolbar.</p> <p>Continue to the <a href="starting-activity.html">next lesson</a> to learn how to respond to button presses, read content diff --git a/docs/html/training/basics/firstapp/running-app.jd b/docs/html/training/basics/firstapp/running-app.jd index 99b38bfc6393..21fb64d83798 100755 --- a/docs/html/training/basics/firstapp/running-app.jd +++ b/docs/html/training/basics/firstapp/running-app.jd @@ -76,46 +76,6 @@ from the toolbar.</li> <p>Android Studio installs the app on your connected device and starts it.</p> -<h3>Run the app from a command line</h3> - -<p>Open a command-line and navigate to the root of your project directory. - Use Gradle to build your project in debug mode, invoke the <code>assembleDebug</code> build task - using the Gradle wrapper script (<code>gradlew assembleRelease</code>). - - <p>This creates your debug <code>.apk</code> file inside the module <code>build/</code> - directory, named <code>app-debug.apk</code>. </p> - - <p>On Windows platforms, type this command:</p> - -<pre> -> gradlew.bat assembleDebug -</pre> - -<p>On Mac OS and Linux platforms, type these commands:</p> - -<pre> -$ chmod +x gradlew -$ ./gradlew assembleDebug -</pre> - - <p>After you build the project, the output APK for the app module is located in - <code>app/build/outputs/apk/</code> - - <p class="note"><strong>Note:</strong> The first command (<code>chmod</code>) adds the execution - permission to the Gradle wrapper script and is only necessary the first time you build this - project from the command line.</p> - - <p>Make sure the Android SDK <code>platform-tools/</code> directory is included in your - <code>PATH</code> environment variable, then execute: - <pre class="no-pretty-print">$ adb install app/build/outputs/apk/app-debug.apk</pre><p> - <p>On your device, locate <em>MyFirstApp</em> and open it.</p> - -<p>That's how you build and run your Android app on a device! - To start developing, continue to the <a href="building-ui.html">next -lesson</a>.</p> - - - <h2 id="Emulator">Run on the Emulator</h2> <p>Whether you're using Android Studio or the command line, to run your app on the emulator you need @@ -168,23 +128,8 @@ device.</p> When you do, <em>My First App</em> appears on the emulator screen.</p> -<h3>Run your app from the command line</h3> - <ol> - <li>Build the project from the command line. The output APK for the app module is located in - <code>app/build/outputs/apk/</code>.</li> - <li>Make sure the Android SDK <code>platform-tools/</code> directory is included in your - <code>PATH</code> environment variable.</li> - <li>Execute this command: - <p> - <pre class="no-pretty-print">$ adb install app/build/outputs/apk/apk-debug.apk</pre> - </p> - </li> - <li>On the emulator, locate <em>MyFirstApp</em> and open it.</li> - </ol> - - - <p>That's how you build and run your Android app on the emulator! - To start developing, continue to the <a href="building-ui.html">next - lesson</a>.</p> +<p>That's how you build and run your Android app on the emulator! +To start developing, continue to the <a href="building-ui.html">next +lesson</a>.</p> diff --git a/docs/html/training/volley/request.jd b/docs/html/training/volley/request.jd index a2b2ecd9b06e..97efc178345c 100644 --- a/docs/html/training/volley/request.jd +++ b/docs/html/training/volley/request.jd @@ -38,7 +38,7 @@ This lesson describes how to use the common request types that Volley supports:< <p>If your expected response is one of these types, you probably won't have to implement a custom request. This lesson describes how to use these standard request types. For -information on how to implement your own custom request, see <a href="requests-custom.html"> +information on how to implement your own custom request, see <a href="request-custom.html"> Implementing a Custom Request</a>.</p> diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java index 8971004f0f72..c6977746f64e 100644 --- a/graphics/java/android/graphics/drawable/DrawableContainer.java +++ b/graphics/java/android/graphics/drawable/DrawableContainer.java @@ -500,34 +500,44 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { * @param d The drawable to initialize. */ private void initializeDrawableForDisplay(Drawable d) { - if (mDrawableContainerState.mEnterFadeDuration <= 0 && mHasAlpha) { - d.setAlpha(mAlpha); - } - - if (mDrawableContainerState.mHasColorFilter) { - // Color filter always overrides tint. - d.setColorFilter(mDrawableContainerState.mColorFilter); - } else { - if (mDrawableContainerState.mHasTintList) { - d.setTintList(mDrawableContainerState.mTintList); + // Temporary fix for suspending callbacks during initialization. We + // don't want any of these setters causing an invalidate() since that + // may call back into DrawableContainer. + final Callback cb = d.getCallback(); + d.setCallback(null); + + try { + if (mDrawableContainerState.mEnterFadeDuration <= 0 && mHasAlpha) { + d.setAlpha(mAlpha); } - if (mDrawableContainerState.mHasTintMode) { - d.setTintMode(mDrawableContainerState.mTintMode); - } - } - d.setVisible(isVisible(), true); - d.setDither(mDrawableContainerState.mDither); - d.setState(getState()); - d.setLevel(getLevel()); - d.setBounds(getBounds()); - d.setLayoutDirection(getLayoutDirection()); - d.setAutoMirrored(mDrawableContainerState.mAutoMirrored); + if (mDrawableContainerState.mHasColorFilter) { + // Color filter always overrides tint. + d.setColorFilter(mDrawableContainerState.mColorFilter); + } else { + if (mDrawableContainerState.mHasTintList) { + d.setTintList(mDrawableContainerState.mTintList); + } + if (mDrawableContainerState.mHasTintMode) { + d.setTintMode(mDrawableContainerState.mTintMode); + } + } - final Rect hotspotBounds = mHotspotBounds; - if (hotspotBounds != null) { - d.setHotspotBounds(hotspotBounds.left, hotspotBounds.top, - hotspotBounds.right, hotspotBounds.bottom); + d.setVisible(isVisible(), true); + d.setDither(mDrawableContainerState.mDither); + d.setState(getState()); + d.setLevel(getLevel()); + d.setBounds(getBounds()); + d.setLayoutDirection(getLayoutDirection()); + d.setAutoMirrored(mDrawableContainerState.mAutoMirrored); + + final Rect hotspotBounds = mHotspotBounds; + if (hotspotBounds != null) { + d.setHotspotBounds(hotspotBounds.left, hotspotBounds.top, + hotspotBounds.right, hotspotBounds.bottom); + } + } finally { + d.setCallback(cb); } } diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp index 746e99a96123..cb8e55fbb21c 100644 --- a/libs/hwui/FrameBuilder.cpp +++ b/libs/hwui/FrameBuilder.cpp @@ -878,11 +878,49 @@ void FrameBuilder::deferEndLayerOp(const EndLayerOp& /* ignored */) { restoreForLayer(); + // saveLayer will clip & translate the draw contents, so we need + // to translate the drawLayer by how much the contents was translated + // TODO: Unify this with beginLayerOp so we don't have to calculate this + // twice + uint32_t layerWidth = (uint32_t) beginLayerOp.unmappedBounds.getWidth(); + uint32_t layerHeight = (uint32_t) beginLayerOp.unmappedBounds.getHeight(); + + auto previous = mCanvasState.currentSnapshot(); + Vector3 lightCenter = previous->getRelativeLightCenter(); + + // Combine all transforms used to present saveLayer content: + // parent content transform * canvas transform * bounds offset + Matrix4 contentTransform(*(previous->transform)); + contentTransform.multiply(beginLayerOp.localMatrix); + contentTransform.translate(beginLayerOp.unmappedBounds.left, + beginLayerOp.unmappedBounds.top); + + Matrix4 inverseContentTransform; + inverseContentTransform.loadInverse(contentTransform); + + // map the light center into layer-relative space + inverseContentTransform.mapPoint3d(lightCenter); + + // Clip bounds of temporary layer to parent's clip rect, so: + Rect saveLayerBounds(layerWidth, layerHeight); + // 1) transform Rect(width, height) into parent's space + // note: left/top offsets put in contentTransform above + contentTransform.mapRect(saveLayerBounds); + // 2) intersect with parent's clip + saveLayerBounds.doIntersect(previous->getRenderTargetClip()); + // 3) and transform back + inverseContentTransform.mapRect(saveLayerBounds); + saveLayerBounds.doIntersect(Rect(layerWidth, layerHeight)); + saveLayerBounds.roundOut(); + + Matrix4 localMatrix(beginLayerOp.localMatrix); + localMatrix.translate(saveLayerBounds.left, saveLayerBounds.top); + // record the draw operation into the previous layer's list of draw commands // uses state from the associated beginLayerOp, since it has all the state needed for drawing LayerOp* drawLayerOp = mAllocator.create_trivial<LayerOp>( beginLayerOp.unmappedBounds, - beginLayerOp.localMatrix, + localMatrix, beginLayerOp.localClip, beginLayerOp.paint, &(mLayerBuilders[finishedLayerIndex]->offscreenBuffer)); diff --git a/libs/hwui/OpDumper.cpp b/libs/hwui/OpDumper.cpp index cab93e8faf6a..ec9ffdeebb4c 100644 --- a/libs/hwui/OpDumper.cpp +++ b/libs/hwui/OpDumper.cpp @@ -45,5 +45,9 @@ void OpDumper::dump(const RecordedOp& op, std::ostream& output, int level) { } } +const char* OpDumper::opName(const RecordedOp& op) { + return sOpNameLut[op.opId]; +} + } // namespace uirenderer } // namespace android diff --git a/libs/hwui/OpDumper.h b/libs/hwui/OpDumper.h index c99b51796b5c..a82289c7cca2 100644 --- a/libs/hwui/OpDumper.h +++ b/libs/hwui/OpDumper.h @@ -26,6 +26,7 @@ struct RecordedOp; class OpDumper { public: static void dump(const RecordedOp& op, std::ostream& output, int level = 0); + static const char* opName(const RecordedOp& op); }; }; // namespace uirenderer diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp index 0f16b1512586..af1fbd8254f9 100644 --- a/libs/hwui/tests/unit/FrameBuilderTests.cpp +++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp @@ -2025,6 +2025,7 @@ struct SaveLayerAlphaData { uint32_t layerHeight = 0; Rect rectClippedBounds; Matrix4 rectMatrix; + Matrix4 drawLayerMatrix; }; /** * Constructs a view to hit the temporary layer alpha property implementation: @@ -2060,6 +2061,7 @@ void testSaveLayerAlphaClip(SaveLayerAlphaData* outObservedData, } void onLayerOp(const LayerOp& op, const BakedOpState& state) override { EXPECT_EQ(3, mIndex++); + mOutData->drawLayerMatrix = state.computedState.transform; } void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override { EXPECT_EQ(4, mIndex++); @@ -2108,6 +2110,9 @@ RENDERTHREAD_TEST(FrameBuilder, renderPropSaveLayerAlphaClipBig) { expected.loadTranslate(0, -2000, 0); EXPECT_MATRIX_APPROX_EQ(expected, observedData.rectMatrix) << "expect content to be translated as part of being clipped"; + expected.loadTranslate(10, 0, 0); + EXPECT_MATRIX_APPROX_EQ(expected, observedData.drawLayerMatrix) + << "expect drawLayer to be translated as part of being clipped"; } RENDERTHREAD_TEST(FrameBuilder, renderPropSaveLayerAlphaRotate) { diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 61f78cc069c5..27193b743379 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -90,7 +90,6 @@ PointerController::PointerController(const sp<PointerControllerPolicyInterface>& mLocked.lastFrameUpdatedTime = 0; mLocked.buttonState = 0; - mLocked.iconDetached = false; mPolicy->loadPointerIcon(&mLocked.pointerIcon); @@ -185,10 +184,6 @@ void PointerController::setPosition(float x, float y) { } void PointerController::setPositionLocked(float x, float y) { - if (mLocked.iconDetached) { - return; - } - float minX, minY, maxX, maxY; if (getBoundsLocked(&minX, &minY, &maxX, &maxY)) { if (x <= minX) { @@ -222,10 +217,6 @@ void PointerController::fade(Transition transition) { // Remove the inactivity timeout, since we are fading now. removeInactivityTimeoutLocked(); - if (mLocked.iconDetached) { - return; - } - // Start fading. if (transition == TRANSITION_IMMEDIATE) { mLocked.pointerFadeDirection = 0; @@ -243,10 +234,6 @@ void PointerController::unfade(Transition transition) { // Always reset the inactivity timer. resetInactivityTimeoutLocked(); - if (mLocked.iconDetached) { - return; - } - // Start unfading. if (transition == TRANSITION_IMMEDIATE) { mLocked.pointerFadeDirection = 0; @@ -362,22 +349,6 @@ void PointerController::reloadPointerResources() { updatePointerLocked(); } -void PointerController::detachPointerIcon(bool detached) { - AutoMutex _l(mLock); - - if (mLocked.iconDetached == detached) { - return; - } - - mLocked.iconDetached = detached; - if (detached) { - mLocked.pointerFadeDirection = -1; - } else { - mLocked.pointerFadeDirection = 1; - } - startAnimationLocked(); -} - void PointerController::setDisplayViewport(int32_t width, int32_t height, int32_t orientation) { AutoMutex _l(mLock); diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index b47139adaf90..99292d7ca8a6 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -111,10 +111,6 @@ public: void setInactivityTimeout(InactivityTimeout inactivityTimeout); void reloadPointerResources(); - /* Detach or attach the pointer icon status. When detached, the pointer icon disappears - * and the icon location does not change at all. */ - void detachPointerIcon(bool detached); - private: static const size_t MAX_RECYCLED_SPRITES = 12; static const size_t MAX_SPOTS = 12; @@ -184,8 +180,6 @@ private: int32_t buttonState; - bool iconDetached; - Vector<Spot*> spots; Vector<sp<Sprite> > recycledSprites; } mLocked; diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java index a3bbdfcb2627..5286f8fa5ad3 100644 --- a/media/java/android/media/AudioAttributes.java +++ b/media/java/android/media/AudioAttributes.java @@ -225,9 +225,20 @@ public final class AudioAttributes implements Parcelable { public final static int FLAG_BYPASS_MUTE = 0x1 << 7; /** - * Flag requesting a low latency path. + * Flag requesting a low latency path when creating an AudioTrack. * When using this flag, the sample rate must match the native sample rate * of the device. Effects processing is also unavailable. + * + * Note that if this flag is used without specifying a bufferSizeInBytes then the + * AudioTrack's actual buffer size may be too small. It is recommended that a fairly + * large buffer should be specified when the AudioTrack is created. + * Then the actual size can be reduced by calling + * {@link AudioTrack#setBufferSizeInFrames(int)}. The buffer size can be optimized + * by lowering it after each write() call until the audio glitches, which is detected by calling + * {@link AudioTrack#getUnderrunCount()}. Then the buffer size can be increased + * until there are no glitches. + * This tuning step should be done while playing silence. + * This technique provides a compromise between latency and glitch rate. */ public final static int FLAG_LOW_LATENCY = 0x1 << 8; diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index 87c6d88a0c11..349d67ec9145 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -567,6 +567,34 @@ public final class MediaCodecInfo { return false; } } + + Integer profile = (Integer)map.get(MediaFormat.KEY_PROFILE); + Integer level = (Integer)map.get(MediaFormat.KEY_LEVEL); + + if (profile != null) { + if (!supportsProfileLevel(profile, level)) { + return false; + } + + // If we recognize this profile, check that this format is supported by the + // highest level supported by the codec for that profile. (Ignore specified + // level beyond the above profile/level check as level is only used as a + // guidance. E.g. AVC Level 1 CIF format is supported if codec supports level 1.1 + // even though max size for Level 1 is QCIF. However, MPEG2 Simple Profile + // 1080p format is not supported even if codec supports Main Profile Level High, + // as Simple Profile does not support 1080p. + CodecCapabilities levelCaps = null; + int maxLevel = 0; + for (CodecProfileLevel pl : profileLevels) { + if (pl.profile == profile && pl.level > maxLevel) { + maxLevel = pl.level; + } + } + levelCaps = createFromProfileLevel(mMime, profile, maxLevel); + if (levelCaps != null && !levelCaps.isFormatSupported(format)) { + return false; + } + } if (mAudioCaps != null && !mAudioCaps.supportsFormat(format)) { return false; } @@ -579,6 +607,57 @@ public final class MediaCodecInfo { return true; } + private static boolean supportsBitrate( + Range<Integer> bitrateRange, MediaFormat format) { + Map<String, Object> map = format.getMap(); + + // consider max bitrate over average bitrate for support + Integer maxBitrate = (Integer)map.get(MediaFormat.KEY_MAX_BIT_RATE); + Integer bitrate = (Integer)map.get(MediaFormat.KEY_BIT_RATE); + if (bitrate == null) { + bitrate = maxBitrate; + } else if (maxBitrate != null) { + bitrate = Math.max(bitrate, maxBitrate); + } + + if (bitrate != null && bitrate > 0) { + return bitrateRange.contains(bitrate); + } + + return true; + } + + private boolean supportsProfileLevel(int profile, Integer level) { + for (CodecProfileLevel pl: profileLevels) { + if (pl.profile != profile) { + continue; + } + + // AAC does not use levels + if (level == null || mMime.equalsIgnoreCase(MediaFormat.MIMETYPE_AUDIO_AAC)) { + return true; + } + + // H.263 levels are not completely ordered: + // Level45 support only implies Level10 support + if (mMime.equalsIgnoreCase(MediaFormat.MIMETYPE_VIDEO_H263)) { + if (pl.level != level && pl.level == CodecProfileLevel.H263Level45 + && level > CodecProfileLevel.H263Level10) { + continue; + } + } + if (pl.level >= level) { + // if we recognize the listed profile/level, we must also recognize the + // profile/level arguments. + if (createFromProfileLevel(mMime, profile, pl.level) != null) { + return createFromProfileLevel(mMime, profile, level) != null; + } + return true; + } + } + return false; + } + // errors while reading profile levels - accessed from sister capabilities int mError; @@ -1004,10 +1083,15 @@ public final class MediaCodecInfo { Map<String, Object> map = format.getMap(); Integer sampleRate = (Integer)map.get(MediaFormat.KEY_SAMPLE_RATE); Integer channels = (Integer)map.get(MediaFormat.KEY_CHANNEL_COUNT); + if (!supports(sampleRate, channels)) { return false; } + if (!CodecCapabilities.supportsBitrate(mBitrateRange, format)) { + return false; + } + // nothing to do for: // KEY_CHANNEL_MASK: codecs don't get this // KEY_IS_ADTS: required feature for all AAC decoders @@ -1310,8 +1394,7 @@ public final class MediaCodecInfo { return supports(width, height, null); } - private boolean supports( - Integer width, Integer height, Number rate) { + private boolean supports(Integer width, Integer height, Number rate) { boolean ok = true; if (ok && width != null) { @@ -1353,9 +1436,16 @@ public final class MediaCodecInfo { Integer height = (Integer)map.get(MediaFormat.KEY_HEIGHT); Number rate = (Number)map.get(MediaFormat.KEY_FRAME_RATE); - // we ignore color-format for now as it is not reliably reported by codec + if (!supports(width, height, rate)) { + return false; + } - return supports(width, height, rate); + if (!CodecCapabilities.supportsBitrate(mBitrateRange, format)) { + return false; + } + + // we ignore color-format for now as it is not reliably reported by codec + return true; } /* no public constructor */ diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java index 93c595f1ca2b..33e39575fdac 100644 --- a/media/java/android/media/MediaFormat.java +++ b/media/java/android/media/MediaFormat.java @@ -185,12 +185,20 @@ public final class MediaFormat { public static final String KEY_MAX_INPUT_SIZE = "max-input-size"; /** - * A key describing the bitrate in bits/sec. + * A key describing the average bitrate in bits/sec. * The associated value is an integer */ public static final String KEY_BIT_RATE = "bitrate"; /** + * A key describing the max bitrate in bits/sec. + * This is usually over a one-second sliding window (e.g. over any window of one second). + * The associated value is an integer + * @hide + */ + public static final String KEY_MAX_BIT_RATE = "max-bitrate"; + + /** * A key describing the color format of the content in a video format. * Constants are declared in {@link android.media.MediaCodecInfo.CodecCapabilities}. */ diff --git a/packages/PrintRecommendationService/res/values/donottranslate.xml b/packages/PrintRecommendationService/res/values/donottranslate.xml index 68effbfbdf35..86027cda405a 100644 --- a/packages/PrintRecommendationService/res/values/donottranslate.xml +++ b/packages/PrintRecommendationService/res/values/donottranslate.xml @@ -32,8 +32,15 @@ <item>Hewlett Packard</item> </string-array> + <string-array name="known_print_vendor_info_for_samsung" translatable="false"> + <item>com.sec.app.samsungprintservice</item> + <item>Samsung Electronics</item> + <item>Samsung</item> + </string-array> + <array name="known_print_plugin_vendors" translatable="false"> <item>@array/known_print_vendor_info_for_mopria</item> <item>@array/known_print_vendor_info_for_hp</item> + <item>@array/known_print_vendor_info_for_samsung</item> </array> </resources> diff --git a/packages/PrintRecommendationService/res/values/strings.xml b/packages/PrintRecommendationService/res/values/strings.xml index 97281de5b4ec..348fcace90c5 100644 --- a/packages/PrintRecommendationService/res/values/strings.xml +++ b/packages/PrintRecommendationService/res/values/strings.xml @@ -23,7 +23,7 @@ <string name="plugin_vendor_brother">Brother</string> <string name="plugin_vendor_canon">Canon</string> <string name="plugin_vendor_xerox">Xerox</string> - <string name="plugin_vendor_samsung">Samsung Electronics</string> + <string name="plugin_vendor_samsung">Samsung</string> <string name="plugin_vendor_epson">Epson</string> <string name="plugin_vendor_konica_minolta">Konica Minolta</string> <string name="plugin_vendor_fuji">Fuji</string> diff --git a/packages/PrintRecommendationService/res/xml/vendorconfigs.xml b/packages/PrintRecommendationService/res/xml/vendorconfigs.xml index b7925df07b7e..108ea66c404e 100644 --- a/packages/PrintRecommendationService/res/xml/vendorconfigs.xml +++ b/packages/PrintRecommendationService/res/xml/vendorconfigs.xml @@ -51,14 +51,6 @@ </vendor> <vendor> - <name>@string/plugin_vendor_samsung</name> - <package>com.sec.app.samsungprintservice</package> - <mdns-names> - <mdns-name>Samsung</mdns-name> - </mdns-names> - </vendor> - - <vendor> <name>@string/plugin_vendor_epson</name> <package>com.epson.mobilephone.android.epsonprintserviceplugin</package> <mdns-names> diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/RecommendationServiceImpl.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/RecommendationServiceImpl.java index 4b4b47084b82..d95654f7a247 100644 --- a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/RecommendationServiceImpl.java +++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/RecommendationServiceImpl.java @@ -25,6 +25,7 @@ import com.android.printservice.recommendation.plugin.hp.HPRecommendationPlugin; import com.android.printservice.recommendation.plugin.mdnsFilter.MDNSFilterPlugin; import com.android.printservice.recommendation.plugin.mdnsFilter.VendorConfig; import com.android.printservice.recommendation.plugin.mopria.MopriaRecommendationPlugin; +import com.android.printservice.recommendation.plugin.samsung.SamsungRecommendationPlugin; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; @@ -74,6 +75,14 @@ public class RecommendationServiceImpl extends RecommendationService " plugin", e); } + try { + mPlugins.add(new RemotePrintServicePlugin(new SamsungRecommendationPlugin(this), this, + false)); + } catch (Exception e) { + Log.e(LOG_TAG, "Could not initiate " + getString(R.string.plugin_vendor_samsung) + + " plugin", e); + } + final int numPlugins = mPlugins.size(); for (int i = 0; i < numPlugins; i++) { try { diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/MDnsUtils.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/MDnsUtils.java new file mode 100644 index 000000000000..963e09b25257 --- /dev/null +++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/MDnsUtils.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2016 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.printservice.recommendation.plugin.samsung; + +import android.net.nsd.NsdServiceInfo; +import android.text.TextUtils; + +import java.nio.charset.StandardCharsets; +import java.util.Locale; +import java.util.Map; + +public class MDnsUtils { + public static final String ATTRIBUTE__TY = "ty"; + public static final String ATTRIBUTE__PRODUCT = "product"; + public static final String ATTRIBUTE__USB_MFG = "usb_MFG"; + public static final String ATTRIBUTE__MFG = "mfg"; + + public static String getString(byte[] value) { + if (value != null) return new String(value,StandardCharsets.UTF_8); + return null; + } + + public static boolean isVendorPrinter(NsdServiceInfo networkDevice, String[] vendorValues) { + + Map<String,byte[]> attributes = networkDevice.getAttributes(); + String product = getString(attributes.get(ATTRIBUTE__PRODUCT)); + String ty = getString(attributes.get(ATTRIBUTE__TY)); + String usbMfg = getString(attributes.get(ATTRIBUTE__USB_MFG)); + String mfg = getString(attributes.get(ATTRIBUTE__MFG)); + return containsVendor(product, vendorValues) || containsVendor(ty, vendorValues) || containsVendor(usbMfg, vendorValues) || containsVendor(mfg, vendorValues); + + } + + public static String getVendor(NsdServiceInfo networkDevice) { + String vendor; + + Map<String,byte[]> attributes = networkDevice.getAttributes(); + vendor = getString(attributes.get(ATTRIBUTE__MFG)); + if (!TextUtils.isEmpty(vendor)) return vendor; + vendor = getString(attributes.get(ATTRIBUTE__USB_MFG)); + if (!TextUtils.isEmpty(vendor)) return vendor; + + return null; + } + + private static boolean containsVendor(String container, String[] vendorValues) { + if ((container == null) || (vendorValues == null)) return false; + for (String value : vendorValues) { + if (containsString(container, value) + || containsString(container.toLowerCase(Locale.US), value.toLowerCase(Locale.US)) + || containsString(container.toUpperCase(Locale.US), value.toUpperCase(Locale.US))) + return true; + } + return false; + } + + private static boolean containsString(String container, String contained) { + return (container != null) && (contained != null) && (container.equalsIgnoreCase(contained) || container.contains(contained + " ")); + } +} diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/PrinterHashMap.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/PrinterHashMap.java new file mode 100644 index 000000000000..032fe22dd744 --- /dev/null +++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/PrinterHashMap.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2016 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.printservice.recommendation.plugin.samsung; + +import android.net.nsd.NsdServiceInfo; + +import java.util.HashMap; + +final class PrinterHashMap extends HashMap<String, NsdServiceInfo> { + public static String getKey(NsdServiceInfo serviceInfo) { + return serviceInfo.getServiceName(); + } + public NsdServiceInfo addPrinter(NsdServiceInfo device) { + return put(getKey(device), device); + } + public NsdServiceInfo removePrinter(NsdServiceInfo device) { + return remove(getKey(device)); + } +} diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/SamsungRecommendationPlugin.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/SamsungRecommendationPlugin.java new file mode 100644 index 000000000000..e5b8a0f15f2e --- /dev/null +++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/SamsungRecommendationPlugin.java @@ -0,0 +1,102 @@ +/*
+(c) Copyright 2016 Samsung Electronics..
+
+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.printservice.recommendation.plugin.samsung;
+
+import android.content.Context;
+import android.net.nsd.NsdServiceInfo;
+import android.text.TextUtils;
+
+import java.util.Locale;
+import java.util.Map;
+
+import com.android.printservice.recommendation.R;
+
+public class SamsungRecommendationPlugin extends ServiceRecommendationPlugin {
+
+ private static final String TAG = "SamsungRecommendation";
+
+ private static final String ATTR_USB_MFG = "usb_MFG";
+ private static final String ATTR_MFG = "mfg";
+ private static final String ATTR_USB_MDL = "usb_MDL";
+ private static final String ATTR_MDL = "mdl";
+ private static final String ATTR_PRODUCT = "product";
+ private static final String ATTR_TY = "ty";
+
+ private static String[] mNotSupportedDevices = new String[]{
+ "SCX-5x15",
+ "SF-555P",
+ "CF-555P",
+ "SCX-4x16",
+ "SCX-4214F",
+ "CLP-500",
+ "CJX-",
+ "MJC-"
+ };
+
+ private static boolean isSupportedModel(String model) {
+ if (!TextUtils.isEmpty(model)) {
+ String modelToUpper = model.toUpperCase(Locale.US);
+ for (String unSupportedPrinter : mNotSupportedDevices) {
+ if (modelToUpper.contains(unSupportedPrinter)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ public SamsungRecommendationPlugin(Context context) {
+ super(context, R.string.plugin_vendor_samsung, new VendorInfo(context.getResources(), R.array.known_print_vendor_info_for_samsung), new String[]{"_pdl-datastream._tcp"});
+ }
+
+ @Override
+ public boolean matchesCriteria(String vendor, NsdServiceInfo nsdServiceInfo) {
+ if (!TextUtils.equals(vendor, mVendorInfo.mVendorID)) return false;
+
+ String modelName = getModelName(nsdServiceInfo);
+ if (modelName != null) {
+ return (isSupportedModel(modelName));
+ }
+ return false;
+ }
+
+ private String getModelName(NsdServiceInfo resolvedDevice) {
+ Map<String,byte[]> attributes = resolvedDevice.getAttributes();
+ String usb_mfg = MDnsUtils.getString(attributes.get(ATTR_USB_MFG));
+ if (TextUtils.isEmpty(usb_mfg)) {
+ usb_mfg = MDnsUtils.getString(attributes.get(ATTR_MFG));
+ }
+
+ String usb_mdl = MDnsUtils.getString(attributes.get(ATTR_USB_MDL));
+ if (TextUtils.isEmpty(usb_mdl)) {
+ usb_mdl = MDnsUtils.getString(attributes.get(ATTR_MDL));
+ }
+
+ String modelName = null;
+ if (!TextUtils.isEmpty(usb_mfg) && !TextUtils.isEmpty(usb_mdl)) {
+ modelName = usb_mfg.trim() + " " + usb_mdl.trim();
+ } else {
+ modelName = MDnsUtils.getString(attributes.get(ATTR_PRODUCT));
+ if (TextUtils.isEmpty(modelName)) {
+ modelName = MDnsUtils.getString(attributes.get(ATTR_TY));
+ }
+ }
+
+ return modelName;
+ }
+}
diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/ServiceListener.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/ServiceListener.java new file mode 100644 index 000000000000..7bb83c9384f7 --- /dev/null +++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/ServiceListener.java @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2016 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.printservice.recommendation.plugin.samsung; + +import android.content.Context; +import android.content.res.TypedArray; +import android.net.nsd.NsdManager; +import android.net.nsd.NsdServiceInfo; +import android.text.TextUtils; +import android.util.Pair; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.android.printservice.recommendation.R; +import com.android.printservice.recommendation.util.DiscoveryListenerMultiplexer; + +public class ServiceListener implements ServiceResolveQueue.ResolveCallback { + + private final NsdManager mNSDManager; + private final Map<String, VendorInfo> mVendorInfoHashMap; + private final String[] mServiceType; + private final Observer mObserver; + private final ServiceResolveQueue mResolveQueue; + private List<NsdManager.DiscoveryListener> mListeners = new ArrayList<>(); + public HashMap<String, PrinterHashMap> mVendorHashMap = new HashMap<>(); + + public interface Observer { + boolean matchesCriteria(String vendor, NsdServiceInfo serviceInfo); + void dataSetChanged(); + } + + public ServiceListener(Context context, Observer observer, String[] serviceTypes) { + mObserver = observer; + mServiceType = serviceTypes; + mNSDManager = (NsdManager)context.getSystemService(Context.NSD_SERVICE); + mResolveQueue = ServiceResolveQueue.getInstance(mNSDManager); + + Map<String, VendorInfo> vendorInfoMap = new HashMap<>(); + TypedArray testArray = context.getResources().obtainTypedArray(R.array.known_print_plugin_vendors); + for(int i = 0; i < testArray.length(); i++) { + int arrayID = testArray.getResourceId(i, 0); + if (arrayID != 0) { + VendorInfo info = new VendorInfo(context.getResources(), arrayID); + vendorInfoMap.put(info.mVendorID, info); + vendorInfoMap.put(info.mPackageName, info); + } + } + testArray.recycle(); + mVendorInfoHashMap = vendorInfoMap; + } + + @Override + public void serviceResolved(NsdServiceInfo nsdServiceInfo) { + printerFound(nsdServiceInfo); + } + + private synchronized void printerFound(NsdServiceInfo nsdServiceInfo) { + if (nsdServiceInfo == null) return; + if (TextUtils.isEmpty(PrinterHashMap.getKey(nsdServiceInfo))) return; + String vendor = MDnsUtils.getVendor(nsdServiceInfo); + if (vendor == null) vendor = ""; + for(Map.Entry<String,VendorInfo> entry : mVendorInfoHashMap.entrySet()) { + for(String vendorValues : entry.getValue().mDNSValues) { + if (vendor.equalsIgnoreCase(vendorValues)) { + vendor = entry.getValue().mVendorID; + break; + } + } + // intentional pointer check + //noinspection StringEquality + if ((vendor != entry.getValue().mVendorID) && + MDnsUtils.isVendorPrinter(nsdServiceInfo, entry.getValue().mDNSValues)) { + vendor = entry.getValue().mVendorID; + } + // intentional pointer check + //noinspection StringEquality + if (vendor == entry.getValue().mVendorID) break; + } + + if (TextUtils.isEmpty(vendor)) { + return; + } + + if (!mObserver.matchesCriteria(vendor, nsdServiceInfo)) + return; + boolean mapsChanged; + + PrinterHashMap vendorHash = mVendorHashMap.get(vendor); + if (vendorHash == null) { + vendorHash = new PrinterHashMap(); + } + mapsChanged = (vendorHash.addPrinter(nsdServiceInfo) == null); + mVendorHashMap.put(vendor, vendorHash); + + if (mapsChanged) { + mObserver.dataSetChanged(); + } + } + + private synchronized void printerRemoved(NsdServiceInfo nsdServiceInfo) { + boolean wasRemoved = false; + Set<String> vendors = mVendorHashMap.keySet(); + for(String vendor : vendors) { + PrinterHashMap map = mVendorHashMap.get(vendor); + wasRemoved |= (map.removePrinter(nsdServiceInfo) != null); + if (map.isEmpty()) wasRemoved |= (mVendorHashMap.remove(vendor) != null); + } + if (wasRemoved) { + mObserver.dataSetChanged(); + } + } + + public void start() { + stop(); + for(final String service :mServiceType) { + NsdManager.DiscoveryListener listener = new NsdManager.DiscoveryListener() { + @Override + public void onStartDiscoveryFailed(String s, int i) { + + } + + @Override + public void onStopDiscoveryFailed(String s, int i) { + + } + + @Override + public void onDiscoveryStarted(String s) { + + } + + @Override + public void onDiscoveryStopped(String s) { + + } + + @Override + public void onServiceFound(NsdServiceInfo nsdServiceInfo) { + mResolveQueue.queueRequest(nsdServiceInfo, ServiceListener.this); + } + + @Override + public void onServiceLost(NsdServiceInfo nsdServiceInfo) { + mResolveQueue.removeRequest(nsdServiceInfo, ServiceListener.this); + printerRemoved(nsdServiceInfo); + } + }; + DiscoveryListenerMultiplexer.addListener(mNSDManager, service, listener); + mListeners.add(listener); + } + } + + public void stop() { + for(NsdManager.DiscoveryListener listener : mListeners) { + DiscoveryListenerMultiplexer.removeListener(mNSDManager, listener); + } + mVendorHashMap.clear(); + mListeners.clear(); + } + + public Pair<Integer, Integer> getCount() { + int count = 0; + for (PrinterHashMap map : mVendorHashMap.values()) { + count += map.size(); + } + return Pair.create(mVendorHashMap.size(), count); + } +} diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/ServiceRecommendationPlugin.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/ServiceRecommendationPlugin.java new file mode 100644 index 000000000000..9d15f3054ee2 --- /dev/null +++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/ServiceRecommendationPlugin.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2016 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.printservice.recommendation.plugin.samsung; + +import android.content.Context; +import android.net.nsd.NsdManager; +import android.net.nsd.NsdServiceInfo; +import android.annotation.NonNull; +import android.text.TextUtils; +import com.android.printservice.recommendation.PrintServicePlugin; + +public abstract class ServiceRecommendationPlugin implements PrintServicePlugin, ServiceListener.Observer { + + protected static final String PDL_ATTRIBUTE = "pdl"; + + protected final Object mLock = new Object(); + protected PrinterDiscoveryCallback mCallback = null; + protected final ServiceListener mListener; + protected final NsdManager mNSDManager; + protected final VendorInfo mVendorInfo; + private final int mVendorStringID; + + protected ServiceRecommendationPlugin(Context context, int vendorStringID, VendorInfo vendorInfo, String[] services) { + mNSDManager = (NsdManager)context.getSystemService(Context.NSD_SERVICE); + mVendorStringID = vendorStringID; + mVendorInfo = vendorInfo; + mListener = new ServiceListener(context, this, services); + } + + @Override + public int getName() { + return mVendorStringID; + } + + @NonNull + @Override + public CharSequence getPackageName() { + return mVendorInfo.mPackageName; + } + + @Override + public void start(@NonNull PrinterDiscoveryCallback callback) throws Exception { + synchronized (mLock) { + mCallback = callback; + } + mListener.start(); + } + + @Override + public void stop() throws Exception { + synchronized (mLock) { + mCallback = null; + } + mListener.stop(); + } + + @Override + public void dataSetChanged() { + synchronized (mLock) { + if (mCallback != null) mCallback.onChanged(getCount()); + } + } + + @Override + public boolean matchesCriteria(String vendor, NsdServiceInfo nsdServiceInfo) { + return TextUtils.equals(vendor, mVendorInfo.mVendorID); + } + + public int getCount() { + return mListener.getCount().second; + } +} diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/ServiceResolveQueue.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/ServiceResolveQueue.java new file mode 100644 index 000000000000..e5691b734416 --- /dev/null +++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/ServiceResolveQueue.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2016 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.printservice.recommendation.plugin.samsung; + +import android.net.nsd.NsdManager; +import android.net.nsd.NsdServiceInfo; +import android.util.Pair; +import com.android.printservice.recommendation.util.NsdResolveQueue; + +import java.util.LinkedList; + +final class ServiceResolveQueue { + + private final NsdManager mNsdManager; + private final LinkedList<Pair<NsdServiceInfo, ResolveCallback>> mQueue = new LinkedList<>(); + private final Object mLock = new Object(); + + private static Object sLock = new Object(); + private static ServiceResolveQueue sInstance = null; + private final NsdResolveQueue mNsdResolveQueue; + private Pair<NsdServiceInfo, ResolveCallback> mCurrentRequest = null; + + public static void createInstance(NsdManager nsdManager) { + if (sInstance == null) sInstance = new ServiceResolveQueue(nsdManager); + } + + public static ServiceResolveQueue getInstance(NsdManager nsdManager) { + synchronized (sLock) { + createInstance(nsdManager); + return sInstance; + } + } + + public static void destroyInstance() { + sInstance = null; + } + + public interface ResolveCallback { + void serviceResolved(NsdServiceInfo nsdServiceInfo); + } + + public ServiceResolveQueue(NsdManager nsdManager) { + mNsdManager = nsdManager; + mNsdResolveQueue = NsdResolveQueue.getInstance(); + } + + public void queueRequest(NsdServiceInfo serviceInfo, ResolveCallback callback) { + synchronized (mLock) { + Pair<NsdServiceInfo, ResolveCallback> newRequest = Pair.create(serviceInfo, callback); + if (mQueue.contains(newRequest)) return; + mQueue.add(newRequest); + makeNextRequest(); + } + } + + public void removeRequest(NsdServiceInfo serviceInfo, ResolveCallback callback) { + synchronized (mLock) { + Pair<NsdServiceInfo, ResolveCallback> newRequest = Pair.create(serviceInfo, callback); + mQueue.remove(newRequest); + if ((mCurrentRequest != null) && newRequest.equals(mCurrentRequest)) mCurrentRequest = null; + } + } + + private void makeNextRequest() { + synchronized (mLock) { + if (mCurrentRequest != null) return; + if (mQueue.isEmpty()) return; + mCurrentRequest = mQueue.removeFirst(); + mNsdResolveQueue.resolve(mNsdManager, mCurrentRequest.first, + new NsdManager.ResolveListener() { + @Override + public void onResolveFailed(NsdServiceInfo nsdServiceInfo, int i) { + synchronized (mLock) { + if (mCurrentRequest != null) mQueue.add(mCurrentRequest); + makeNextRequest(); + } + } + + @Override + public void onServiceResolved(NsdServiceInfo nsdServiceInfo) { + synchronized (mLock) { + if (mCurrentRequest != null) { + mCurrentRequest.second.serviceResolved(nsdServiceInfo); + mCurrentRequest = null; + } + makeNextRequest(); + } + } + }); + + } + } + + +} diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/VendorInfo.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/VendorInfo.java new file mode 100644 index 000000000000..0ebb4e441f11 --- /dev/null +++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/samsung/VendorInfo.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2016 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.printservice.recommendation.plugin.samsung; + +import android.content.res.Resources; + +import java.util.Arrays; + +public final class VendorInfo { + + public final String mPackageName; + public final String mVendorID; + public final String[] mDNSValues; + public final int mID; + + public VendorInfo(Resources resources, int vendor_info_id) { + mID = vendor_info_id; + String[] data = resources.getStringArray(vendor_info_id); + if ((data == null) || (data.length < 2)) { + data = new String[] { null, null }; + } + mPackageName = data[0]; + mVendorID = data[1]; + mDNSValues = (data.length > 2) ? Arrays.copyOfRange(data, 2, data.length) : new String[]{}; + } +} diff --git a/packages/PrintSpooler/res/layout/add_printer_list_header.xml b/packages/PrintSpooler/res/layout/add_printer_list_header.xml index 9eee0c46c124..488b3abb8093 100644 --- a/packages/PrintSpooler/res/layout/add_printer_list_header.xml +++ b/packages/PrintSpooler/res/layout/add_printer_list_header.xml @@ -24,6 +24,7 @@ android:gravity="start|center_vertical"> <TextView android:id="@+id/text" - style="?android:attr/listSeparatorTextViewStyle" /> + style="?android:attr/listSeparatorTextViewStyle" + android:textAlignment="viewStart" /> </LinearLayout> diff --git a/packages/SettingsLib/res/drawable/notification_auto_importance.xml b/packages/SettingsLib/res/drawable/notification_auto_importance.xml index a63e911b9ffc..c94615312306 100644 --- a/packages/SettingsLib/res/drawable/notification_auto_importance.xml +++ b/packages/SettingsLib/res/drawable/notification_auto_importance.xml @@ -20,8 +20,8 @@ android:viewportHeight="24.0"> <path android:fillColor="#FFFFFFFF" - android:pathData="M11.2,13.6l1.6,0l-0.8,-2.6z"/> + android:pathData="M10.8,12.7l2.4,0l-1.2,-3.7z"/> <path android:fillColor="#FF000000" - android:pathData="M22.5,9.6L15,9l-3,-7L9,9L1.5,9.6l5.7,5L5.5,22l6.5,-3.9l6.5,3.9l-1.7,-7.4L22.5,9.6zM13.6,16l-0.5,-1.4h-2.3L10.4,16H9l2.3,-6.4h1.4L15,16H13.6z"/> + android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10s10,-4.5 10,-10S17.5,2 12,2zM14.3,16l-0.7,-2h-3.2l-0.7,2H7.8L11,7h2l3.2,9H14.3z"/> </vector>
\ No newline at end of file diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index fe726264de9d..eae49c4bfa18 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Geaktiveer deur administrateur"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Gedeaktiveer deur administrateur"</string> <string name="home" msgid="3256884684164448244">"Instellingstuisblad"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> gelede"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> oor"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Klein"</string> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 843db182cd7d..4fd425915a87 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"በአስተዳዳሪ የነቃ"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"በአስተዳዳሪ የተሰናከለ"</string> <string name="home" msgid="3256884684164448244">"የቅንብሮች መነሻ"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"ከ<xliff:g id="ID_1">%1$s</xliff:g> በፊት"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> ቀርቷል"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"ትንሽ"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 27050d1e2942..246880cc2a82 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"تم التمكين بواسطة المشرف"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"تم التعطيل بواسطة المشرف"</string> <string name="home" msgid="3256884684164448244">"الشاشة الرئيسية للإعدادات"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"٠٪"</item> + <item msgid="8934126114226089439">"٪۵۰"</item> + <item msgid="1286113608943010849">"٪۱۰۰"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"قبل <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"يتبقى <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"صغير"</string> diff --git a/packages/SettingsLib/res/values-az-rAZ/strings.xml b/packages/SettingsLib/res/values-az-rAZ/strings.xml index 414bcd437180..0caeea0eb1d8 100644 --- a/packages/SettingsLib/res/values-az-rAZ/strings.xml +++ b/packages/SettingsLib/res/values-az-rAZ/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Administrator tərəfindən aktiv edildi"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Administrator tərəfindən deaktiv edildi"</string> <string name="home" msgid="3256884684164448244">"Ayarların əsas səhifəsi"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> əvvəl"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> qalıb"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Kiçik"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 2239dee54e7e..a61462da0e60 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Omogućio je administrator"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Onemogućio je administrator"</string> <string name="home" msgid="3256884684164448244">"Početna za Podešavanja"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Pre <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Još <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Mali"</string> diff --git a/packages/SettingsLib/res/values-be-rBY/strings.xml b/packages/SettingsLib/res/values-be-rBY/strings.xml index 7e13220467f7..0637741a1644 100644 --- a/packages/SettingsLib/res/values-be-rBY/strings.xml +++ b/packages/SettingsLib/res/values-be-rBY/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Уключана адміністратарам"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Адключана адміністратарам"</string> <string name="home" msgid="3256884684164448244">"Галоўная старонка налад"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> таму назад"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Засталося <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Маленькі"</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index b410590344e7..efc88ca3fdd3 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Активирано от администратора"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Деактивирано от администратора"</string> <string name="home" msgid="3256884684164448244">"Начален екран на Настройки"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Преди <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Оставащо време: <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Малко"</string> diff --git a/packages/SettingsLib/res/values-bn-rBD/strings.xml b/packages/SettingsLib/res/values-bn-rBD/strings.xml index 2019097a2ee6..791c527618e3 100644 --- a/packages/SettingsLib/res/values-bn-rBD/strings.xml +++ b/packages/SettingsLib/res/values-bn-rBD/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"প্রশাসক সক্ষম করেছেন"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"প্রশাসক অক্ষম করেছেন"</string> <string name="home" msgid="3256884684164448244">"সেটিংস হোম"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"০%"</item> + <item msgid="8934126114226089439">"৫০%"</item> + <item msgid="1286113608943010849">"১০০%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> আগে"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> বাকী আছে"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"ক্ষুদ্র"</string> diff --git a/packages/SettingsLib/res/values-bs-rBA/strings.xml b/packages/SettingsLib/res/values-bs-rBA/strings.xml index 995d85629ffa..28e3507a2ad6 100644 --- a/packages/SettingsLib/res/values-bs-rBA/strings.xml +++ b/packages/SettingsLib/res/values-bs-rBA/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Omogućio administrator"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Onemogućio je administrator"</string> <string name="home" msgid="3256884684164448244">"Postavke početne stranice"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"prije <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Još otprilike <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Malo"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index ef52df5da28e..24873135a6bf 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Opció activada per l\'administrador"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Opció desactivada per l\'administrador"</string> <string name="home" msgid="3256884684164448244">"Pàgina d\'inici de configuració"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Fa <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Temps restant: <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Petit"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index bb0b608dcfd3..42c7bdf8fd9e 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Povoleno administrátorem"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Zakázáno administrátorem"</string> <string name="home" msgid="3256884684164448244">"Domovská stránka Nastavení"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"před <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Zbývající čas: <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Malé"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index df024c3eaac9..4df39d2e4f9a 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Aktiveret af administratoren"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Deaktiveret af administratoren"</string> <string name="home" msgid="3256884684164448244">"Startside for Indstillinger"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> siden"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> tilbage"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Lille"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 16b6acee5107..169d6b01a36c 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Vom Administrator aktiviert"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Vom Administrator deaktiviert"</string> <string name="home" msgid="3256884684164448244">"Startseite \"Einstellungen\""</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Vor <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Noch <xliff:g id="ID_1">%1$s</xliff:g> verbleibend"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Klein"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 7827ab991588..c52514550f2a 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Ενεργοποιήθηκε από το διαχειριστή"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Απενεργοποιήθηκε από το διαχειριστή"</string> <string name="home" msgid="3256884684164448244">"Αρχική σελίδα ρυθμίσεων"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Πριν από <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Απομένουν <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Μικρά"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index ec3d04b301c0..05fc9db8e93f 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Enabled by administrator"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Disabled by administrator"</string> <string name="home" msgid="3256884684164448244">"Settings Home"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> ago"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> left"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Small"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index ec3d04b301c0..05fc9db8e93f 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Enabled by administrator"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Disabled by administrator"</string> <string name="home" msgid="3256884684164448244">"Settings Home"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> ago"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> left"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Small"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index ec3d04b301c0..05fc9db8e93f 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Enabled by administrator"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Disabled by administrator"</string> <string name="home" msgid="3256884684164448244">"Settings Home"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> ago"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> left"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Small"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 2facecbe23f8..2fd5e9b0bf9f 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Habilitada por el administrador"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Inhabilitada por el administrador"</string> <string name="home" msgid="3256884684164448244">"Pantalla de configuración"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Hace <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Falta <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Pequeño"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 163e846f9fce..b4e01250d7ce 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Habilitado por el administrador"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Inhabilitado por el administrador"</string> <string name="home" msgid="3256884684164448244">"Página principal de ajustes"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Hace <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Tiempo restante: <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Pequeño"</string> diff --git a/packages/SettingsLib/res/values-et-rEE/strings.xml b/packages/SettingsLib/res/values-et-rEE/strings.xml index 756e4ad49717..cda3d9f1cf09 100644 --- a/packages/SettingsLib/res/values-et-rEE/strings.xml +++ b/packages/SettingsLib/res/values-et-rEE/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Administraator on lubanud"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Administraator on keelanud"</string> <string name="home" msgid="3256884684164448244">"Seadete avaleht"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> tagasi"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> on jäänud"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Väike"</string> diff --git a/packages/SettingsLib/res/values-eu-rES/strings.xml b/packages/SettingsLib/res/values-eu-rES/strings.xml index b6db37aff389..00a92e862efc 100644 --- a/packages/SettingsLib/res/values-eu-rES/strings.xml +++ b/packages/SettingsLib/res/values-eu-rES/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Administratzaileak gaitu du"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Administratzaileak desgaitu du"</string> <string name="home" msgid="3256884684164448244">"Ezarpenen orri nagusia"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"% 0"</item> + <item msgid="8934126114226089439">"% 50"</item> + <item msgid="1286113608943010849">"% 100"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Duela <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> guztiz kargatu arte"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Txikia"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 2f0f8c873a74..8729ffd8159d 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"سرپرست آن را فعال کرده است"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"سرپرست آن را غیرفعال کرده است"</string> <string name="home" msgid="3256884684164448244">"صفحه اصلی تنظیمات"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"٪۰"</item> + <item msgid="8934126114226089439">"۵۰٪"</item> + <item msgid="1286113608943010849">"۱۰۰٪"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> قبل"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> باقی مانده است"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"کوچک"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 1f2579b48b21..5c4287a75bfe 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Järjestelmänvalvojan käyttöön ottama"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Järjestelmänvalvojan käytöstä poistama"</string> <string name="home" msgid="3256884684164448244">"Asetusten etusivu"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> sitten"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> jäljellä"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Pieni"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 2ada1362526c..6f7982d4834d 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Activé par l\'administrateur"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Désactivé par l\'administrateur"</string> <string name="home" msgid="3256884684164448244">"Accueil des paramètres"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Il y a <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Durée restante :<xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Petite"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index ac8f629d0774..a72ecd62eb73 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Activé par l\'administrateur"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Désactivé par l\'administrateur"</string> <string name="home" msgid="3256884684164448244">"Paramètres"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Il y a <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Il reste <xliff:g id="ID_1">%1$s</xliff:g>."</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Petit"</string> diff --git a/packages/SettingsLib/res/values-gl-rES/strings.xml b/packages/SettingsLib/res/values-gl-rES/strings.xml index ce52a7022eb2..8fb4431c0ab4 100644 --- a/packages/SettingsLib/res/values-gl-rES/strings.xml +++ b/packages/SettingsLib/res/values-gl-rES/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Activado polo administrador"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Desactivado polo administrador"</string> <string name="home" msgid="3256884684164448244">"Inicio da configuración"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Hai <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Tempo restante: <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Pequeno"</string> diff --git a/packages/SettingsLib/res/values-gu-rIN/strings.xml b/packages/SettingsLib/res/values-gu-rIN/strings.xml index 13eb654acd4c..fcb396867d03 100644 --- a/packages/SettingsLib/res/values-gu-rIN/strings.xml +++ b/packages/SettingsLib/res/values-gu-rIN/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"વ્યવસ્થાપક દ્વારા સક્ષમ કરેલ"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ"</string> <string name="home" msgid="3256884684164448244">"સેટિંગ્સ હોમ"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> પહેલાં"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> બાકી"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"નાનું"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 0ed67eeddfe0..65338cc7d555 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"व्यवस्थापक द्वारा सक्षम किया गया"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"व्यवस्थापक द्वारा अक्षम किया गया"</string> <string name="home" msgid="3256884684164448244">"सेटिंग होम"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> पहले"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> शेष"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"छोटा"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 6c87e802b740..148065efc288 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Omogućio administrator"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Onemogućio administrator"</string> <string name="home" msgid="3256884684164448244">"Početni zaslon postavki"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Prije <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Još <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Malo"</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 5b8525cffb5c..d8af0d4d28c6 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Engedélyezve a rendszergazda által"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Letiltva a rendszergazda által"</string> <string name="home" msgid="3256884684164448244">"Kezdőlap beállítása"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Ennyi ideje: <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> van hátra"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Kicsi"</string> diff --git a/packages/SettingsLib/res/values-hy-rAM/strings.xml b/packages/SettingsLib/res/values-hy-rAM/strings.xml index 8db93c6d5b9a..36eafa5bf21f 100644 --- a/packages/SettingsLib/res/values-hy-rAM/strings.xml +++ b/packages/SettingsLib/res/values-hy-rAM/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Միացված է ադմինիստրատորի կողմից"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Կասեցված է ադմինիստրատորի կողմից"</string> <string name="home" msgid="3256884684164448244">"Կարգավորումների գլխավոր էջ"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> առաջ"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Մնացել է <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Փոքր"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index e328a9308166..acbbb4c7086e 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Diaktifkan oleh administrator"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Dinonaktifkan oleh administrator"</string> <string name="home" msgid="3256884684164448244">"Layar Utama Setelan"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> lalu"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Tersisa <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Kecil"</string> diff --git a/packages/SettingsLib/res/values-is-rIS/strings.xml b/packages/SettingsLib/res/values-is-rIS/strings.xml index 3558270a96f5..4bfc0a679f09 100644 --- a/packages/SettingsLib/res/values-is-rIS/strings.xml +++ b/packages/SettingsLib/res/values-is-rIS/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Virkjað af stjórnanda"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Stjórnandi gerði óvirkt"</string> <string name="home" msgid="3256884684164448244">"Stillingar"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Fyrir <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> eftir"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Lítið"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 4c998874d389..959b6614088c 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Attivata dall\'amministratore"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Disattivata dall\'amministratore"</string> <string name="home" msgid="3256884684164448244">"Home page Impostazioni"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%%"</item> + <item msgid="8934126114226089439">"50%%"</item> + <item msgid="1286113608943010849">"100%%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> fa"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> rimanenti"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Piccolo"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 7574322a9abc..44016efb8b80 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"הופעל על ידי מנהל המערכת"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"הושבת על ידי מנהל המערכת"</string> <string name="home" msgid="3256884684164448244">"דף הבית של ההגדרות"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"לפני <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"נשארו <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"קטן"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index b25ad19dba74..12c5e25b490b 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -326,6 +326,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"管理者によって有効にされています"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"管理者によって無効にされています"</string> <string name="home" msgid="3256884684164448244">"設定のホーム"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g>前"</string> <string name="remaining_length_format" msgid="7886337596669190587">"あと <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"小"</string> diff --git a/packages/SettingsLib/res/values-ka-rGE/strings.xml b/packages/SettingsLib/res/values-ka-rGE/strings.xml index 1edca1b868b3..eacc4f5ac5a2 100644 --- a/packages/SettingsLib/res/values-ka-rGE/strings.xml +++ b/packages/SettingsLib/res/values-ka-rGE/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"ჩართულია ადმინისტრატორის მიერ"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"გათიშულია ადმინისტრატორის მიერ"</string> <string name="home" msgid="3256884684164448244">"პარამეტრების მთავარი გვერდი"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"გავიდა <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"დარჩენილია <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"პატარა"</string> diff --git a/packages/SettingsLib/res/values-kk-rKZ/strings.xml b/packages/SettingsLib/res/values-kk-rKZ/strings.xml index 51002828e4b5..a8631ee3adee 100644 --- a/packages/SettingsLib/res/values-kk-rKZ/strings.xml +++ b/packages/SettingsLib/res/values-kk-rKZ/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Әкімші қосқан"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Әкімші өшірген"</string> <string name="home" msgid="3256884684164448244">"Параметрлер негізгі беті"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> бұрын"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> қалды"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Кішкентай"</string> diff --git a/packages/SettingsLib/res/values-km-rKH/strings.xml b/packages/SettingsLib/res/values-km-rKH/strings.xml index 941c01d11e59..a240a37941b5 100644 --- a/packages/SettingsLib/res/values-km-rKH/strings.xml +++ b/packages/SettingsLib/res/values-km-rKH/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"បានបើកដំណើរការដោយអ្នកគ្រប់គ្រង"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"បានបិទដំណើរការដោយអ្នកគ្រប់គ្រង"</string> <string name="home" msgid="3256884684164448244">"ទំព័រដើមនៃការកំណត់"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> មុន"</string> <string name="remaining_length_format" msgid="7886337596669190587">"នៅសល់ <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"តូច"</string> diff --git a/packages/SettingsLib/res/values-kn-rIN/strings.xml b/packages/SettingsLib/res/values-kn-rIN/strings.xml index 99fb1b2efea3..170a928d745d 100644 --- a/packages/SettingsLib/res/values-kn-rIN/strings.xml +++ b/packages/SettingsLib/res/values-kn-rIN/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"ನಿರ್ವಾಹಕರಿಂದ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"ನಿರ್ವಾಹಕರಿಂದ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="home" msgid="3256884684164448244">"ಸೆಟ್ಟಿಂಗ್ಗಳ ಮುಖಪುಟ"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> ಹಿಂದೆ"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> ಉಳಿದಿದೆ"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"ಸಣ್ಣದು"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 0f48a45d6dec..dace41be6b3f 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"관리자가 사용 설정함"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"관리자가 사용 중지함"</string> <string name="home" msgid="3256884684164448244">"설정 홈"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> 전"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> 남음"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"작게"</string> diff --git a/packages/SettingsLib/res/values-ky-rKG/strings.xml b/packages/SettingsLib/res/values-ky-rKG/strings.xml index 935d0b371c66..e1cfc60e6284 100644 --- a/packages/SettingsLib/res/values-ky-rKG/strings.xml +++ b/packages/SettingsLib/res/values-ky-rKG/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Администратор иштетип койгон"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Администратор өчүрүп койгон"</string> <string name="home" msgid="3256884684164448244">"Жөндөөлөрдүн башкы бети"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> мурун"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> калды"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Кичине"</string> diff --git a/packages/SettingsLib/res/values-lo-rLA/strings.xml b/packages/SettingsLib/res/values-lo-rLA/strings.xml index d76821412065..b7befd6da789 100644 --- a/packages/SettingsLib/res/values-lo-rLA/strings.xml +++ b/packages/SettingsLib/res/values-lo-rLA/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"ຖືກເປີດໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບ"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"ຖືກປິດໄວ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບ"</string> <string name="home" msgid="3256884684164448244">"ໜ້າທຳອິດຂອງການຕັ້ງຄ່າ"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> ກ່ອນນີ້"</string> <string name="remaining_length_format" msgid="7886337596669190587">"ຍັງເຫຼືອ <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"ນ້ອຍ"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 7318b41fef10..d409366f5cc3 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Įgalino administratorius"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Išjungė administratorius"</string> <string name="home" msgid="3256884684164448244">"Pagrindinis Nustatymų ekranas"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Prieš <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Liko <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Mažas"</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index e11a4b2e920f..7dfd9ac59f91 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Iespējojis administrators"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Atspējojis administrators"</string> <string name="home" msgid="3256884684164448244">"Iestatījumu sākumekrāns"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Pirms šāda laika: <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Atlikušais laiks: <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Mazs"</string> diff --git a/packages/SettingsLib/res/values-mk-rMK/strings.xml b/packages/SettingsLib/res/values-mk-rMK/strings.xml index f0d7e123ae47..7f3f17a10bf9 100644 --- a/packages/SettingsLib/res/values-mk-rMK/strings.xml +++ b/packages/SettingsLib/res/values-mk-rMK/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Овозможено од администраторот"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Оневозможено од администраторот"</string> <string name="home" msgid="3256884684164448244">"Почетна страница за поставки"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Пред <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Преостанаа <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Мал"</string> diff --git a/packages/SettingsLib/res/values-ml-rIN/strings.xml b/packages/SettingsLib/res/values-ml-rIN/strings.xml index 82ef83d6f5b9..80ff8c3529e4 100644 --- a/packages/SettingsLib/res/values-ml-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ml-rIN/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"അഡ്മിനിസ്ട്രേറ്റർ പ്രവർത്തനക്ഷമമാക്കി"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"അഡ്മിനിസ്ട്രേറ്റർ പ്രവർത്തനരഹിതമാക്കി"</string> <string name="home" msgid="3256884684164448244">"ക്രമീകരണ ഹോം"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> മുമ്പ്"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> ശേഷിക്കുന്നു"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"ചെറുത്"</string> diff --git a/packages/SettingsLib/res/values-mn-rMN/strings.xml b/packages/SettingsLib/res/values-mn-rMN/strings.xml index 07575084919d..359c041f3cca 100644 --- a/packages/SettingsLib/res/values-mn-rMN/strings.xml +++ b/packages/SettingsLib/res/values-mn-rMN/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Админ идэвхтэй болгосон"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Админ идэвхгүй болгосон"</string> <string name="home" msgid="3256884684164448244">"Тохиргооны нүүр хуудас"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> өмнө"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> үлдсэн"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Жижиг"</string> diff --git a/packages/SettingsLib/res/values-mr-rIN/strings.xml b/packages/SettingsLib/res/values-mr-rIN/strings.xml index ba020da79a57..1d5dc197c731 100644 --- a/packages/SettingsLib/res/values-mr-rIN/strings.xml +++ b/packages/SettingsLib/res/values-mr-rIN/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"प्रशासकाने सक्षम केलेले"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"प्रशासकाने अक्षम केलेले"</string> <string name="home" msgid="3256884684164448244">"सेटिंग्ज मुख्यपृष्ठ"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> पूर्वी"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> शिल्लक"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"लहान"</string> diff --git a/packages/SettingsLib/res/values-ms-rMY/strings.xml b/packages/SettingsLib/res/values-ms-rMY/strings.xml index 554b3afa942b..8809f712e951 100644 --- a/packages/SettingsLib/res/values-ms-rMY/strings.xml +++ b/packages/SettingsLib/res/values-ms-rMY/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Didayakan oleh pentadbir"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Dilumpuhkan oleh pentadbir"</string> <string name="home" msgid="3256884684164448244">"Laman Utama Tetapan"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> yang lalu"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> lagi"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Kecil"</string> diff --git a/packages/SettingsLib/res/values-my-rMM/strings.xml b/packages/SettingsLib/res/values-my-rMM/strings.xml index 1a4b6872db18..9bb5694a50c7 100644 --- a/packages/SettingsLib/res/values-my-rMM/strings.xml +++ b/packages/SettingsLib/res/values-my-rMM/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"စီမံခန့်ခွဲသူမှ ဖွင့်ထားသည်"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"စီမံခန့်ခွဲသူမှ ပိတ်ထားသည်"</string> <string name="home" msgid="3256884684164448244">"ဆက်တင် ပင်မစာမျက်နှာ"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"၀%"</item> + <item msgid="8934126114226089439">"၅၀%"</item> + <item msgid="1286113608943010849">"၁၀၀%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"ပြီးခဲ့သည့် <xliff:g id="ID_1">%1$s</xliff:g> က"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> ကျန်ပါသည်"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"သေး"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index fa15cd3f7c70..1c13fc3bd48d 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -70,7 +70,7 @@ <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Bruk til filoverføring"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Bruk for inndata"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Sammenkoble"</string> - <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"KOBLE"</string> + <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"KOBLE TIL"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Avbryt"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Med sammenkobling får den andre enheten tilgang til kontaktene og anropsloggen din når den er tilkoblet."</string> <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"Kan ikke koble til <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Slått på av administratoren"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Avslått av administratoren"</string> <string name="home" msgid="3256884684164448244">"Innstillinger for startsiden"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> siden"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> gjenstår"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Liten"</string> diff --git a/packages/SettingsLib/res/values-ne-rNP/strings.xml b/packages/SettingsLib/res/values-ne-rNP/strings.xml index e091138336b8..8faccf52193d 100644 --- a/packages/SettingsLib/res/values-ne-rNP/strings.xml +++ b/packages/SettingsLib/res/values-ne-rNP/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"प्रशासकद्वारा सक्षम गरिएको छ"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"प्रशासकद्वारा असक्षम गरिएको छ"</string> <string name="home" msgid="3256884684164448244">"सेटिङहरूको गृहपृष्ठ"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"०%"</item> + <item msgid="8934126114226089439">"५०%"</item> + <item msgid="1286113608943010849">"१००%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> पहिले"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> बाँकी"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"सानो"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 2c2c5d065009..b080131f7cda 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Ingeschakeld door beheerder"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Uitgeschakeld door beheerder"</string> <string name="home" msgid="3256884684164448244">"Startpagina voor instellingen"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> geleden"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> resterend"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Klein"</string> diff --git a/packages/SettingsLib/res/values-pa-rIN/strings.xml b/packages/SettingsLib/res/values-pa-rIN/strings.xml index fb17b6c8a9e8..dba71c337d14 100644 --- a/packages/SettingsLib/res/values-pa-rIN/strings.xml +++ b/packages/SettingsLib/res/values-pa-rIN/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਯੋਗ ਬਣਾਈ ਗਈ"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅਯੋਗ ਬਣਾਈ ਗਈ"</string> <string name="home" msgid="3256884684164448244">"ਸੈਟਿੰਗਾਂ ਮੁੱਖ ਪੰਨਾ"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> ਪਹਿਲਾਂ"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> ਬਾਕੀ"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"ਛੋਟਾ"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index e0c51f1b3e50..c72f0c6f76da 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Włączone przez administratora"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Wyłączone przez administratora"</string> <string name="home" msgid="3256884684164448244">"Ekran główny ustawień"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> temu"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Pozostało <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Mały"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index b2ca4370516d..d01ddb7a7d29 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Ativada pelo administrador"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Desativada pelo administrador"</string> <string name="home" msgid="3256884684164448244">"Página inicial das configurações"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> atrás"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> restante(s)"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Pequena"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 55e4def58038..8e05d8c75db2 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Ativado pelo administrador"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Desativado pelo administrador"</string> <string name="home" msgid="3256884684164448244">"Página inicial de definições"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Há <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Resta(m) <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Pequeno"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index b2ca4370516d..d01ddb7a7d29 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Ativada pelo administrador"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Desativada pelo administrador"</string> <string name="home" msgid="3256884684164448244">"Página inicial das configurações"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> atrás"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> restante(s)"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Pequena"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 58db725a54fb..c8587efbc8dc 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Activată de administrator"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Dezactivată de administrator"</string> <string name="home" msgid="3256884684164448244">"Ecran principal Setări"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Acum <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Timp rămas: <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Mic"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 339d2b065f04..5721a8de7194 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Включено администратором"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Отключено администратором"</string> <string name="home" msgid="3256884684164448244">"Настройки"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> назад"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Осталось <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Мелкий"</string> diff --git a/packages/SettingsLib/res/values-si-rLK/strings.xml b/packages/SettingsLib/res/values-si-rLK/strings.xml index 30e7b81999aa..0087352a2931 100644 --- a/packages/SettingsLib/res/values-si-rLK/strings.xml +++ b/packages/SettingsLib/res/values-si-rLK/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"පරිපාලක විසින් සබල කරන ලදී"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"පරිපාලක විසින් අබල කරන ලදී"</string> <string name="home" msgid="3256884684164448244">"සැකසීම් මුල් පිටුව"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g>කට පෙර"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g>ක් ඉතිරිය"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"කුඩා"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 5ad82d62dbeb..a791a1e99890 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Povolené správcom"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Zakázané správcom"</string> <string name="home" msgid="3256884684164448244">"Domovská stránka nastavení"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"pred <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Zostáva <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Malé"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 4f003602508e..25972d0df2ce 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Omogočil skrbnik"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Onemogočil skrbnik"</string> <string name="home" msgid="3256884684164448244">"Začetna stran nastavitev"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Pred toliko časa: <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Še <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Majhno"</string> diff --git a/packages/SettingsLib/res/values-sq-rAL/strings.xml b/packages/SettingsLib/res/values-sq-rAL/strings.xml index 753d7e39b8f5..4ab5025a83f7 100644 --- a/packages/SettingsLib/res/values-sq-rAL/strings.xml +++ b/packages/SettingsLib/res/values-sq-rAL/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Aktivizuar nga administratori"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Çaktivizuar nga administratori"</string> <string name="home" msgid="3256884684164448244">"Kreu i cilësimeve"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> më parë"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> të mbetura"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"I vogël"</string> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 2fee5672ce40..9858580f439e 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Омогућио је администратор"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Онемогућио је администратор"</string> <string name="home" msgid="3256884684164448244">"Почетна за Подешавања"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Пре <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Још <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Мали"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 60704e0dbcf4..45b1b6cc7bf2 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Har aktiverats av administratören"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Har inaktiverats av administratören"</string> <string name="home" msgid="3256884684164448244">"Startskärmen för inställningar"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0 %"</item> + <item msgid="8934126114226089439">"50 %"</item> + <item msgid="1286113608943010849">"100 %"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"för <xliff:g id="ID_1">%1$s</xliff:g> sedan"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> kvar"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Små"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 245cabae1b88..2eca4a19a85e 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Msimamizi amewasha mapendeleo ya mipangilio"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Msimamizi amezima mapendeleo ya mipangilio"</string> <string name="home" msgid="3256884684164448244">"Ukurasa wa Kwanza wa Mipangilio"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"Zimepita <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Zimesalia <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Ndogo"</string> diff --git a/packages/SettingsLib/res/values-ta-rIN/strings.xml b/packages/SettingsLib/res/values-ta-rIN/strings.xml index cdd95cf76d7e..bfa36c3a9730 100644 --- a/packages/SettingsLib/res/values-ta-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ta-rIN/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"நிர்வாகி இயக்கியுள்ளார்"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"நிர்வாகி முடக்கியுள்ளார்"</string> <string name="home" msgid="3256884684164448244">"அமைப்புகள் முகப்பு"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> முன்"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> உள்ளது"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"சிறியது"</string> diff --git a/packages/SettingsLib/res/values-te-rIN/strings.xml b/packages/SettingsLib/res/values-te-rIN/strings.xml index 0c43480decab..4af36a670320 100644 --- a/packages/SettingsLib/res/values-te-rIN/strings.xml +++ b/packages/SettingsLib/res/values-te-rIN/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"నిర్వాహకులు ప్రారంభించారు"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"నిర్వాహకులు నిలిపివేసారు"</string> <string name="home" msgid="3256884684164448244">"సెట్టింగ్ల హోమ్"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> క్రితం"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> మిగిలి ఉంది"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"చిన్నగా"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 7d2c9fba55e4..d7fe2b643c94 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"เปิดใช้โดยผู้ดูแลระบบ"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"ปิดใช้โดยผู้ดูแลระบบ"</string> <string name="home" msgid="3256884684164448244">"หน้าแรกของการตั้งค่า"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g>ที่ผ่านมา"</string> <string name="remaining_length_format" msgid="7886337596669190587">"เหลือ <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"เล็ก"</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 4c12a7df3744..0f8d0f09f94b 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Na-enable ng administrator"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Na-disable ng administrator"</string> <string name="home" msgid="3256884684164448244">"Home ng Mga Setting"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> na ang nakalipas"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> na lang"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Maliit"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index de8222be343f..ceb1292ba625 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Yönetici tarafından etkinleştirildi"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Yönetici tarafından devre dışı bırakıldı"</string> <string name="home" msgid="3256884684164448244">"Ayarlar Ana Sayfası"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"%0"</item> + <item msgid="8934126114226089439">"%50"</item> + <item msgid="1286113608943010849">"%100"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> önce"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> kaldı"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Küçük"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index e09ef5985959..44c9be785352 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Увімкнено адміністратором"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Вимкнено адміністратором"</string> <string name="home" msgid="3256884684164448244">"Головний екран налаштувань"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> тому"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Залишилося <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Малі елементи"</string> diff --git a/packages/SettingsLib/res/values-ur-rPK/strings.xml b/packages/SettingsLib/res/values-ur-rPK/strings.xml index c6b6d8081381..6490204c45e9 100644 --- a/packages/SettingsLib/res/values-ur-rPK/strings.xml +++ b/packages/SettingsLib/res/values-ur-rPK/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"منتظم نے فعال کر دیا"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"منتظم نے غیر فعال کر دیا"</string> <string name="home" msgid="3256884684164448244">"ترتیبات ہوم"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> قبل"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> باقی ہیں"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"چھوٹا"</string> diff --git a/packages/SettingsLib/res/values-uz-rUZ/strings.xml b/packages/SettingsLib/res/values-uz-rUZ/strings.xml index dc103397cd3c..015478f9f00a 100644 --- a/packages/SettingsLib/res/values-uz-rUZ/strings.xml +++ b/packages/SettingsLib/res/values-uz-rUZ/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Administrator tomonidan yoqilgan"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Administrator tomonidan o‘chirilgan"</string> <string name="home" msgid="3256884684164448244">"Sozlamalar"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> oldin"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> qoldi"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Kichkina"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 975aa58147b3..e527d08eb548 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Được bật bởi quản trị viên"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Bị tắt bởi quản trị viên"</string> <string name="home" msgid="3256884684164448244">"Trang chủ cài đặt"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> trước"</string> <string name="remaining_length_format" msgid="7886337596669190587">"Còn <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Nhỏ"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index b81c995c60e4..4eca743f693f 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -324,6 +324,9 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"已被管理员启用"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"已被管理员禁用"</string> <string name="home" msgid="3256884684164448244">"设置主屏幕"</string> + <!-- no translation found for battery_labels:0 (8494684293649631252) --> + <!-- no translation found for battery_labels:1 (8934126114226089439) --> + <!-- no translation found for battery_labels:2 (1286113608943010849) --> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g>前"</string> <string name="remaining_length_format" msgid="7886337596669190587">"还剩 <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"小"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 3388c27fbf63..c8cb2d981b03 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"已由管理員啟用"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"已由管理員停用"</string> <string name="home" msgid="3256884684164448244">"主設定畫面"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g>前"</string> <string name="remaining_length_format" msgid="7886337596669190587">"尚餘 <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"小"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 437e8995726b..75f975899336 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"已由管理員啟用"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"已由管理員停用"</string> <string name="home" msgid="3256884684164448244">"設定主畫面"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g>前"</string> <string name="remaining_length_format" msgid="7886337596669190587">"還剩 <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"小"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index aa8ae4260427..1217183f7523 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -324,6 +324,11 @@ <string name="enabled_by_admin" msgid="2386503803463071894">"Kunikwe amandla umqondisi"</string> <string name="disabled_by_admin" msgid="3669999613095206948">"Ikhutshazwe umlawuli"</string> <string name="home" msgid="3256884684164448244">"Ikhaya lezilungiselelo"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> edlule"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> osele"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Okuncane"</string> diff --git a/packages/SystemUI/res/drawable/ic_hotspot_unavailable.xml b/packages/SystemUI/res/drawable/ic_hotspot_unavailable.xml new file mode 100644 index 000000000000..736cfd8256b4 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_hotspot_unavailable.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2016 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:name="root" + android:height="48dp" + android:width="48dp" + android:viewportHeight="48" + android:viewportWidth="48" + android:tint="@color/qs_tile_tint_unavailable" > + <group + android:name="ic_hotspot" + android:translateX="23.97354" + android:translateY="24.26306" > + <group + android:name="ic_hotspot_pivot" + android:translateX="-23.21545" + android:translateY="-18.86649" > + <clip-path + android:name="mask" + android:pathData="M 38.8337860107,-40.3974914551 c 0.0,0.0 -38.4077911377,30.8523712158 -38.4077911377,30.8523712158 c 0.0,0.0 43.1884765625,43.515335083 43.1884765625,43.515335083 c 0.0,0.0 -2.4169921875,2.57838439941 -2.4169921875,2.57838439941 c 0.0,0.0 -42.9885101318,-43.0112609863 -42.9885101318,-43.0112609863 c 0.0,0.0 -32.6199798584,25.1699066162 -32.6199798584,25.1699066162 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 27.6589050293,-22.6579437256 27.6589050293,-22.6579437256 c 0.0,0.0 -30.8645172119,-34.00390625 -30.8645172119,-34.00390625 c 0.0,0.0 2.70756530762,-1.99278259277 2.70756530762,-1.99278259277 c 0.0,0.0 1.53030395508,-0.876571655273 1.53030395508,-0.876571655274 c 0.0,0.0 2.85780334473,-3.12069702148 2.85780334473,-3.12069702148 c 0.0,0.0 13.0984039307,13.025604248 13.0984039307,13.025604248 c 0.0,0.0 -3.13299560547,2.82977294922 -3.13299560547,2.82977294922 c 0.0,0.0 16.571762085,22.0471801758 16.571762085,22.0471801758 c 0.0,0.0 42.8175811768,-34.3554534912 42.8175811768,-34.3554534912 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z" /> + <group + android:name="cross" > + <path + android:name="cross_1" + android:pathData="M 4.44044494629,2.24310302734 c 0.0,0.0 35.4000396729,35.3999633789 35.4000396729,35.3999633789 " + android:strokeColor="#FFFFFFFF" + android:strokeAlpha="1" + android:strokeWidth="3.5" + android:fillColor="#00000000" /> + </group> + <group + android:name="hotspot" + android:translateX="23.481" + android:translateY="18.71151" > + <group + android:name="circles" + android:translateX="-0.23909" + android:translateY="-0.10807" > + <path + android:name="circle_3" + android:pathData="M 0.0843505859375,-2.93901062012 c -2.30102539062,0.0 -4.16702270508,1.86602783203 -4.16702270508,4.16702270508 c 0.0,2.29898071289 1.86599731445,4.16598510742 4.16702270508,4.16598510742 c 2.29998779297,0.0 4.16598510742,-1.86700439453 4.16598510742,-4.16598510742 c 0.0,-2.30099487305 -1.86599731445,-4.16702270508 -4.16598510742,-4.16702270508 Z M 11.1185302734,5.83390808105 c 0.0,0.0 0.0009765625,0.00100708007812 0.0009765625,0.00100708007812 c 0.14501953125,-0.356994628906 0.27099609375,-0.725006103516 0.382995605469,-1.09799194336 c 0.0570068359375,-0.195007324219 0.101013183594,-0.394989013672 0.149017333984,-0.595001220703 c 0.0690002441406,-0.281005859375 0.126983642578,-0.563995361328 0.175994873047,-0.851989746094 c 0.0270080566406,-0.169006347656 0.0559997558594,-0.337005615234 0.0759887695313,-0.509002685547 c 0.0580139160156,-0.468017578125 0.0970153808594,-0.942993164062 0.0970153808593,-1.4280090332 c 0.0,0.0 0.0,-0.00100708007812 0.0,-0.00100708007812 c 0.0,-5.03900146484 -3.11099243164,-9.3450012207 -7.5119934082,-11.1229858398 c -0.00601196289062,-0.00299072265625 -0.0130004882812,-0.0050048828125 -0.0190124511719,-0.00701904296875 c -0.686004638672,-0.275970458984 -1.39999389648,-0.492980957031 -2.14099121094,-0.638977050781 c -0.072998046875,-0.0150146484375 -0.149017333984,-0.02099609375 -0.222991943359,-0.0339965820313 c -0.302001953125,-0.0540161132812 -0.605010986328,-0.106018066406 -0.916015625,-0.136016845703 c -0.389984130859,-0.0390014648438 -0.786987304688,-0.0599975585938 -1.18899536133,-0.0599975585937 c -0.402008056641,0.0 -0.799011230469,0.02099609375 -1.19000244141,0.0599975585937 c -0.304992675781,0.0299987792969 -0.602996826172,0.0809936523438 -0.901000976563,0.132995605469 c -0.0790100097656,0.0150146484375 -0.160003662109,0.02099609375 -0.238006591797,0.0370178222656 c -0.368988037109,0.0719909667969 -0.730987548828,0.164001464844 -1.08700561523,0.269989013672 c -0.00299072265625,0.00100708007812 -0.0059814453125,0.00201416015625 -0.00900268554687,0.0020141601562 c -0.351989746094,0.10498046875 -0.694000244141,0.226989746094 -1.0309753418,0.361999511719 c -0.0110168457031,0.00399780273438 -0.0220031738281,0.00698852539062 -0.0320129394531,0.0119934082031 c -4.40200805664,1.77798461914 -7.51098632812,6.083984375 -7.5119934082,11.1229858398 c 0.0,0.00799560546875 0.00198364257812,0.0160217285156 0.0019836425781,0.0240173339844 c 0.00100708007812,0.475006103516 0.0380249023438,0.940002441406 0.0950012207032,1.39898681641 c 0.02001953125,0.175994873047 0.0490112304688,0.348999023438 0.0780029296875,0.523010253906 c 0.0469970703125,0.281982421875 0.105010986328,0.557983398438 0.171997070312,0.833984375 c 0.0480041503906,0.204010009766 0.093017578125,0.410003662109 0.152008056641,0.610015869141 c 0.110992431641,0.372009277344 0.238006591797,0.736999511719 0.382019042969,1.09298706055 c 0.0,0.0 0.0009765625,0.0 0.0009765625,0.0 c 1.00701904297,2.48400878906 2.81301879883,4.56100463867 5.11001586914,5.89501953125 c 0.0,0.0 2.01599121094,-3.48300170898 2.01599121094,-3.48300170898 c -2.03900146484,-1.18402099609 -3.5119934082,-3.22500610352 -3.89898681641,-5.63900756836 c 0.0,0.0 0.0009765625,-0.00100708007812 0.0009765625,-0.00100708007812 c -0.0220031738281,-0.130981445312 -0.0369873046875,-0.265991210938 -0.052978515625,-0.399993896484 c -0.0290222167969,-0.274993896484 -0.0570068359375,-0.552001953125 -0.0570068359375,-0.834991455078 c 0.0,0.0 0.0,-0.0190124511719 0.0,-0.0190124511719 c 0.0,-3.98999023438 2.92498779297,-7.28900146484 6.74398803711,-7.89199829102 c 0.0,0.0 0.0180053710938,0.0169982910156 0.0180053710938,0.0169982910156 c 0.404998779297,-0.0639953613281 0.81298828125,-0.125 1.23599243164,-0.125 c 0.0,0.0 0.00201416015625,0.0 0.00201416015624,0.0 c 0.0,0.0 0.00299072265625,0.0 0.00299072265626,0.0 c 0.423004150391,0.0 0.830017089844,0.0610046386719 1.23501586914,0.125 c 0.0,0.0 0.0169982910156,-0.0180053710938 0.0169982910156,-0.0180053710938 c 3.81997680664,0.60400390625 6.74499511719,3.90301513672 6.74499511719,7.89199829102 c 0.0,0.292999267578 -0.0280151367188,0.578002929688 -0.0589904785156,0.861999511719 c -0.0150146484375,0.132019042969 -0.0290222167969,0.264007568359 -0.051025390625,0.393005371094 c -0.385986328125,2.41500854492 -1.85897827148,4.45599365234 -3.89797973633,5.64001464844 c 0.0,0.0 2.01599121094,3.48300170898 2.01599121094,3.48300170898 c 2.29699707031,-1.33401489258 4.10299682617,-3.41101074219 5.11001586914,-5.89602661133 Z M 19.9300231934,2.95698547363 c 0.0059814453125,-0.0659790039062 0.0159912109375,-0.130981445312 0.02099609375,-0.196990966797 c 0.031982421875,-0.462005615234 0.0479736328125,-0.928009033203 0.0489807128906,-1.39700317383 c 0,0.0 0,-0.00997924804688 0,-0.00997924804687 c 0,0.0 0,-0.00100708007812 0,-0.00100708007813 c 0,-7.22500610352 -3.84399414062,-13.5360107422 -9.58599853516,-17.0500183105 c -1.06500244141,-0.652984619141 -2.19299316406,-1.20599365234 -3.37799072266,-1.65197753906 c -0.157989501953,-0.0599975585938 -0.317016601562,-0.118011474609 -0.476989746094,-0.174011230469 c -0.317016601562,-0.110992431641 -0.634002685547,-0.218994140625 -0.9580078125,-0.31298828125 c -0.470001220703,-0.139007568359 -0.944000244141,-0.264007568359 -1.4280090332,-0.368011474609 c -0.186004638672,-0.0390014648438 -0.376983642578,-0.0669860839844 -0.565002441406,-0.101013183594 c -0.414001464844,-0.0759887695312 -0.832000732422,-0.140991210938 -1.25500488281,-0.190979003906 c -0.184997558594,-0.0220031738281 -0.369995117188,-0.0429992675781 -0.556976318359,-0.0599975585937 c -0.592010498047,-0.0530090332031 -1.18801879883,-0.0899963378906 -1.79602050781,-0.0899963378907 c -0.605987548828,0.0 -1.20300292969,0.0369873046875 -1.79598999023,0.0899963378907 c -0.186004638672,0.0169982910156 -0.371002197266,0.0379943847656 -0.555999755859,0.0599975585937 c -0.423004150391,0.0499877929688 -0.842010498047,0.114990234375 -1.25601196289,0.190979003906 c -0.18798828125,0.0350036621094 -0.377990722656,0.06201171875 -0.563995361328,0.101013183594 c -0.483001708984,0.10400390625 -0.959991455078,0.22900390625 -1.42999267578,0.368011474609 c -0.321990966797,0.093994140625 -0.638000488281,0.201995849609 -0.953002929688,0.311981201172 c -0.162994384766,0.0570068359375 -0.324005126953,0.115997314453 -0.484985351562,0.177001953125 c -1.18099975586,0.445007324219 -2.30599975586,0.997009277344 -3.36801147461,1.64700317383 c -0.00201416015625,0.00100708007812 -0.00399780273438,0.00201416015625 -0.0060119628907,0.0029907226562 c -5.74099731445,3.51400756836 -9.58499145508,9.82501220703 -9.58599853516,17.0500183105 c 0,0.0 0,0.00100708007812 0,0.00100708007813 c 0,0.0059814453125 0.00100708007812,0.0130004882812 0.0010070800781,0.0199890136719 c 0.0,0.466003417969 0.0169982910156,0.928009033203 0.0490112304688,1.38598632812 c 0.0050048828125,0.0690002441406 0.0159912109375,0.136016845703 0.02099609375,0.206024169922 c 0.031982421875,0.401000976562 0.0719909667969,0.799987792969 0.127990722656,1.19400024414 c 0.00201416015625,0.0189819335938 0.00701904296875,0.0369873046875 0.010009765625,0.0569763183594 c 0.888000488281,6.17202758789 4.59799194336,11.4250183105 9.7799987793,14.4309997559 c 0.0,0.0 2.00198364258,-3.458984375 2.00198364258,-3.458984375 c -2.58599853516,-1.5 -4.708984375,-3.70401000977 -6.11697387695,-6.34399414063 c 0.0,0.0 0.0169982910156,-0.0180053710938 0.0169982910156,-0.0180053710938 c -0.890014648438,-1.67098999023 -1.50601196289,-3.5110168457 -1.76000976562,-5.46499633789 c -0.00698852539062,-0.0500183105469 -0.010009765625,-0.102020263672 -0.0159912109375,-0.152008056641 c -0.0330200195312,-0.273010253906 -0.0610046386719,-0.545989990234 -0.0800170898437,-0.821990966797 c -0.0220031738281,-0.343017578125 -0.0350036621094,-0.68701171875 -0.0350036621094,-1.03500366211 c 0,-6.53701782227 3.92599487305,-12.1480102539 9.54299926758,-14.6310119629 c 0.157012939453,-0.0700073242188 0.313995361328,-0.135986328125 0.472015380859,-0.199981689453 c 0.373992919922,-0.151000976562 0.751983642578,-0.294006347656 1.13900756836,-0.417022705078 c 0.108978271484,-0.0350036621094 0.221984863281,-0.0619812011719 0.332000732422,-0.0950012207031 c 0.349975585938,-0.102996826172 0.705993652344,-0.194976806641 1.06597900391,-0.273986816406 c 0.114013671875,-0.0249938964844 0.227996826172,-0.052001953125 0.342010498047,-0.0750122070313 c 0.440002441406,-0.0869750976562 0.885986328125,-0.154998779297 1.33700561523,-0.203979492188 c 0.10400390625,-0.0120239257812 0.209991455078,-0.02001953125 0.315002441406,-0.0299987792969 c 0.47998046875,-0.0429992675781 0.963989257812,-0.072998046875 1.45397949219,-0.072998046875 c 0.492004394531,0.0 0.975006103516,0.0299987792969 1.45401000977,0.072998046875 c 0.105987548828,0.00997924804688 0.212005615234,0.0179748535156 0.316986083984,0.0299987792969 c 0.450012207031,0.0489807128906 0.89501953125,0.117004394531 1.33502197266,0.203002929688 c 0.115997314453,0.0239868164062 0.22998046875,0.0509948730469 0.345001220703,0.0769958496094 c 0.358001708984,0.0780029296875 0.710998535156,0.169982910156 1.06097412109,0.272003173828 c 0.111022949219,0.0329895019531 0.226013183594,0.0609741210938 0.336029052734,0.0969848632813 c 0.385986328125,0.123016357422 0.761993408203,0.265014648438 1.13497924805,0.415008544922 c 0.160003662109,0.0650024414062 0.319000244141,0.131988525391 0.477020263672,0.201995849609 c 5.61599731445,2.48400878906 9.53997802734,8.09399414062 9.53997802734,14.6310119629 c 0,0.346984863281 -0.0130004882812,0.690979003906 -0.0350036621094,1.03399658203 c -0.0179748535156,0.274993896484 -0.0469970703125,0.548004150391 -0.0789794921875,0.819000244141 c -0.00601196289062,0.052001953125 -0.010009765625,0.10498046875 -0.0160217285156,0.154998779297 c -0.252990722656,1.95498657227 -0.871002197266,3.79400634766 -1.75997924805,5.46499633789 c 0.0,0.0 0.0169982910156,0.0180053710938 0.0169982910156,0.0180053710938 c -1.40802001953,2.63998413086 -3.53100585938,4.84399414062 -6.11700439453,6.34399414063 c 0.0,0.0 2.00198364258,3.458984375 2.00198364258,3.458984375 c 5.18402099609,-3.00698852539 8.89501953125,-8.26300048828 9.78100585938,-14.4379882813 c 0.00201416015625,-0.0169982910156 0.00601196289062,-0.0320129394531 0.0079956054688,-0.0490112304688 c 0.0570068359375,-0.39697265625 0.0970153808594,-0.798980712891 0.129028320312,-1.20300292969 Z" + android:fillColor="#FFFFFFFF" + android:fillAlpha="1" /> + </group> + </group> + </group> + </group> +</vector> diff --git a/packages/SystemUI/res/layout-television/recents_on_tv.xml b/packages/SystemUI/res/layout-television/recents_on_tv.xml index 1dbd1b39626c..82b9f8c3c48c 100644 --- a/packages/SystemUI/res/layout-television/recents_on_tv.xml +++ b/packages/SystemUI/res/layout-television/recents_on_tv.xml @@ -40,4 +40,16 @@ android:focusable="true" android:visibility="visible" /> + <!-- Placeholder to dismiss during talkback. --> + <ImageView + android:id="@+id/dismiss_placeholder" + android:layout_width="@dimen/recents_tv_dismiss_icon_size" + android:layout_height="@dimen/recents_tv_dismiss_icon_size" + android:layout_gravity="bottom|center_horizontal" + android:layout_marginBottom="50dp" + android:src="@drawable/ic_cancel_white_24dp" + android:contentDescription="@string/status_bar_accessibility_dismiss_recents" + android:focusable="true" + android:visibility="gone" /> + </com.android.systemui.recents.tv.views.RecentsTvView> diff --git a/packages/SystemUI/res/layout-television/recents_tv_task_card_view.xml b/packages/SystemUI/res/layout-television/recents_tv_task_card_view.xml index 36df92454e7c..201f47d4348c 100644 --- a/packages/SystemUI/res/layout-television/recents_tv_task_card_view.xml +++ b/packages/SystemUI/res/layout-television/recents_tv_task_card_view.xml @@ -19,7 +19,6 @@ android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" - android:contentDescription="@string/status_bar_recent_inspect_item_title" android:layout_gravity="center" android:layout_centerInParent="true" android:clipToPadding="false" @@ -50,7 +49,6 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="@dimen/recents_tv_dismiss_icon_top_margin" android:layout_marginBottom="@dimen/recents_tv_dismiss_icon_bottom_margin" - android:contentDescription="@string/status_bar_accessibility_dismiss_recents" android:alpha="@integer/dismiss_unselected_alpha" android:src="@drawable/recents_tv_dismiss_icon" /> <TextView diff --git a/packages/SystemUI/res/layout/qs_customize_panel_content.xml b/packages/SystemUI/res/layout/qs_customize_panel_content.xml index 64385649fe14..ca0248e066eb 100644 --- a/packages/SystemUI/res/layout/qs_customize_panel_content.xml +++ b/packages/SystemUI/res/layout/qs_customize_panel_content.xml @@ -35,6 +35,7 @@ android:importantForAccessibility="no" /> <View + android:id="@+id/nav_bar_background" android:layout_width="match_parent" android:layout_height="@dimen/navigation_bar_size" android:layout_gravity="bottom" 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 61933b44aeeb..4bf85c7a336f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -19,6 +19,7 @@ import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.AnimatorListenerAdapter; import android.content.Context; +import android.content.res.Configuration; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; @@ -103,6 +104,17 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene mRecyclerView.setItemAnimator(animator); } + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + View navBackdrop = findViewById(R.id.nav_bar_background); + if (navBackdrop != null) { + boolean shouldShow = newConfig.smallestScreenWidthDp >= 600 + || newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE; + navBackdrop.setVisibility(shouldShow ? View.VISIBLE : View.GONE); + } + } + public void setHost(QSTileHost host) { mHost = host; mPhoneStatusBar = host.getPhoneStatusBar(); 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 61a92b468b48..60c24d095aa7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -286,10 +286,11 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta private void selectPosition(int position, View v) { // Remove the placeholder. mAccessibilityMoving = false; - move(mAccessibilityFromIndex, position, v); - mTiles.remove(mEditIndex); + mTiles.remove(mEditIndex--); notifyItemRemoved(mEditIndex - 1); + move(mAccessibilityFromIndex, position, v); updateDividerLocations(); + notifyDataSetChanged(); saveSpecs(mHost); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java index 212f1790fd2d..16b11580a176 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java @@ -81,6 +81,8 @@ public class TileLifecycleManager extends BroadcastReceiver implements private IQSService mService; private boolean mUnbindImmediate; private TileChangeListener mChangeListener; + // Return value from bindServiceAsUser, determines whether safe to call unbind. + private boolean mIsBound; public TileLifecycleManager(Handler handler, Context context, Intent intent, UserHandle user) { mContext = context; @@ -132,7 +134,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements } if (DEBUG) Log.d(TAG, "Binding service " + mIntent + " " + mUser); mBindTryCount++; - mContext.bindServiceAsUser(mIntent, this, + mIsBound = mContext.bindServiceAsUser(mIntent, this, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE, mUser); } else { @@ -140,7 +142,10 @@ public class TileLifecycleManager extends BroadcastReceiver implements // Give it another chance next time it needs to be bound, out of kindness. mBindTryCount = 0; mWrapper = null; - mContext.unbindService(this); + if (mIsBound) { + mContext.unbindService(this); + mIsBound = false; + } } } 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 3587262400d5..1c134c1e1424 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -16,15 +16,22 @@ package com.android.systemui.qs.tiles; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.os.UserManager; import android.provider.Settings; +import android.provider.Settings.Global; +import android.text.SpannableStringBuilder; +import android.text.style.ForegroundColorSpan; import android.widget.Switch; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.systemui.R; +import com.android.systemui.qs.GlobalSetting; import com.android.systemui.qs.QSTile; import com.android.systemui.statusbar.policy.HotspotController; @@ -36,12 +43,22 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { private final AnimationIcon mDisable = new AnimationIcon(R.drawable.ic_hotspot_disable_animation, R.drawable.ic_hotspot_enable); + private final Icon mUnavailable = + ResourceIcon.get(R.drawable.ic_hotspot_unavailable); private final HotspotController mController; private final Callback mCallback = new Callback(); + private final GlobalSetting mAirplaneMode; + private boolean mListening; public HotspotTile(Host host) { super(host); mController = host.getHotspotController(); + mAirplaneMode = new GlobalSetting(mContext, mHandler, Global.AIRPLANE_MODE_ON) { + @Override + protected void handleValueChanged(int value) { + refreshState(); + } + }; } @Override @@ -61,11 +78,18 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { @Override public void setListening(boolean listening) { + if (mListening == listening) return; + mListening = listening; if (listening) { mController.addCallback(mCallback); + final IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); + mContext.registerReceiver(mReceiver, filter); } else { mController.removeCallback(mCallback); + mContext.unregisterReceiver(mReceiver); } + mAirplaneMode.setListening(listening); } @Override @@ -76,6 +100,9 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { @Override protected void handleClick() { final boolean isEnabled = (Boolean) mState.value; + if (!isEnabled && mAirplaneMode.getValue() != 0) { + return; + } MetricsLogger.action(mContext, getMetricsCategory(), !isEnabled); mController.setHotspotEnabled(!isEnabled); } @@ -96,6 +123,13 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { state.value = mController.isHotspotEnabled(); } state.icon = state.value ? mEnable : mDisable; + if (mAirplaneMode.getValue() != 0) { + final int disabledColor = mHost.getContext().getColor(R.color.qs_tile_tint_unavailable); + state.label = new SpannableStringBuilder().append(state.label, + new ForegroundColorSpan(disabledColor), + SpannableStringBuilder.SPAN_INCLUSIVE_INCLUSIVE); + state.icon = mUnavailable; + } state.minimalAccessibilityClassName = state.expandedAccessibilityClassName = Switch.class.getName(); state.contentDescription = state.label; @@ -121,4 +155,13 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { refreshState(enabled); } }; + + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) { + refreshState(); + } + } + }; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java index 171535691bbc..bb8bfee11cc9 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java @@ -35,7 +35,7 @@ public class RecentsDebugFlags implements TunerService.Tunable { public static final boolean DisableBackgroundCache = false; // Enables the task affiliations public static final boolean EnableAffiliatedTaskGroups = false; - // TODO: To be repurposed + // Enables the button above the stack public static final boolean EnableStackActionButton = true; // Overrides the Tuner flags and enables the timeout private static final boolean EnableFastToggleTimeout = false; diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java index 50e28ca2205d..26200d0fac47 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java @@ -228,8 +228,8 @@ public class TaskStack { /** * Notifies when a task has been removed from the stack. */ - void onStackTaskRemoved(TaskStack stack, Task removedTask, boolean wasFrontMostTask, - Task newFrontMostTask, AnimationProps animation, boolean fromDockGesture); + void onStackTaskRemoved(TaskStack stack, Task removedTask, Task newFrontMostTask, + AnimationProps animation, boolean fromDockGesture); /** * Notifies when all tasks have been removed from the stack. @@ -609,12 +609,11 @@ public class TaskStack { */ public void removeTask(Task t, AnimationProps animation, boolean fromDockGesture) { if (mStackTaskList.contains(t)) { - boolean wasFrontMostTask = (getStackFrontMostTask(false /* includeFreeform */) == t); removeTaskImpl(mStackTaskList, t); Task newFrontMostTask = getStackFrontMostTask(false /* includeFreeform */); if (mCb != null) { // Notify that a task has been removed - mCb.onStackTaskRemoved(this, t, wasFrontMostTask, newFrontMostTask, animation, + mCb.onStackTaskRemoved(this, t, newFrontMostTask, animation, fromDockGesture); } } @@ -648,6 +647,7 @@ public class TaskStack { ArrayMap<Task.TaskKey, Task> currentTasksMap = createTaskKeyMapFromList(mRawTaskList); ArrayMap<Task.TaskKey, Task> newTasksMap = createTaskKeyMapFromList(tasks); ArrayList<Task> addedTasks = new ArrayList<>(); + ArrayList<Task> removedTasks = new ArrayList<>(); ArrayList<Task> allTasks = new ArrayList<>(); // Disable notifications if there are no callbacks @@ -661,11 +661,7 @@ public class TaskStack { Task task = mRawTaskList.get(i); if (!newTasksMap.containsKey(task.key)) { if (notifyStackChanges) { - // If we are notifying, then remove the task now, otherwise the raw task list - // will be reset at the end of this method - removeTask(task, AnimationProps.IMMEDIATE, false /* fromDockGesture */); - mCb.onStackTaskRemoved(this, task, i == (taskCount - 1), null, - AnimationProps.IMMEDIATE, false /* fromDockGesture */); + removedTasks.add(task); } } task.setGroup(null); @@ -699,6 +695,14 @@ public class TaskStack { // Update the affiliated groupings createAffiliatedGroupings(context); + // Only callback for the removed tasks after the stack has updated + int removedTaskCount = removedTasks.size(); + Task newFrontMostTask = getStackFrontMostTask(false); + for (int i = 0; i < removedTaskCount; i++) { + mCb.onStackTaskRemoved(this, removedTasks.get(i), newFrontMostTask, + AnimationProps.IMMEDIATE, false /* fromDockGesture */); + } + // Only callback for the newly added tasks after this stack has been updated int addedTaskCount = addedTasks.size(); for (int i = 0; i < addedTaskCount; i++) { diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java index ecb64f626650..1a559585e5c0 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java @@ -388,6 +388,26 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { mTaskStackHorizontalGridView.setSelectedPosition(0); } + View dismissPlaceholder = findViewById(R.id.dismiss_placeholder); + if (ssp.isTouchExplorationEnabled()) { + dismissPlaceholder.setAccessibilityTraversalBefore(R.id.task_list); + dismissPlaceholder.setAccessibilityTraversalAfter(R.id.dismiss_placeholder); + mTaskStackHorizontalGridView.setAccessibilityTraversalAfter(R.id.dismiss_placeholder); + mTaskStackHorizontalGridView.setAccessibilityTraversalBefore(R.id.pip); + dismissPlaceholder.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mTaskStackHorizontalGridView.requestFocus(); + mTaskStackHorizontalGridView. + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); + Task focusedTask = mTaskStackHorizontalGridView.getFocusedTask(); + if (focusedTask != null) { + mTaskStackViewAdapter.removeTask(focusedTask); + EventBus.getDefault().send(new DeleteTaskDataEvent(focusedTask)); + } + } + }); + } updatePipUI(); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java index b082658ecca1..06b24418a572 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java @@ -54,6 +54,7 @@ public class RecentsTvView extends FrameLayout { private TaskStack mStack; private TaskStackHorizontalGridView mTaskStackHorizontalView; private View mEmptyView; + private View mDismissPlaceholder; private RecentsRowFocusAnimationHolder mEmptyViewFocusAnimationHolder; private boolean mAwaitingFirstLayout = true; private Rect mSystemInsets = new Rect(); @@ -86,6 +87,12 @@ public class RecentsTvView extends FrameLayout { mTransitionHelper = new RecentsTvTransitionHelper(mContext, mHandler); } + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mDismissPlaceholder = findViewById(R.id.dismiss_placeholder); + } + public void setTaskStack(TaskStack stack) { RecentsConfiguration config = Recents.getConfiguration(); RecentsActivityLaunchState launchState = config.getLaunchState(); @@ -198,6 +205,9 @@ public class RecentsTvView extends FrameLayout { public void showEmptyView() { mEmptyView.setVisibility(View.VISIBLE); mTaskStackHorizontalView.setVisibility(View.GONE); + if (Recents.getSystemServices().isTouchExplorationEnabled()) { + mDismissPlaceholder.setVisibility(View.GONE); + } } /** @@ -206,6 +216,9 @@ public class RecentsTvView extends FrameLayout { public void hideEmptyView() { mEmptyView.setVisibility(View.GONE); mTaskStackHorizontalView.setVisibility(View.VISIBLE); + if (Recents.getSystemServices().isTouchExplorationEnabled()) { + mDismissPlaceholder.setVisibility(View.VISIBLE); + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java index bd857481e8ff..758f93a5f5d5 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java @@ -88,22 +88,10 @@ public class TaskCardView extends LinearLayout { R.dimen.recents_task_view_rounded_corners_radius); mRecentsRowFocusAnimationHolder = new RecentsRowFocusAnimationHolder(this, title); SystemServicesProxy ssp = Recents.getSystemServices(); - if (ssp.isTouchExplorationEnabled()) { - mDismissIconView.setFocusable(true); - mDismissIconView.setFocusableInTouchMode(true); - mDismissIconView.setOnFocusChangeListener(new OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - if (hasFocus) { - setDismissState(true); - } else { - setDismissState(false); - } - } - }); + if (!ssp.isTouchExplorationEnabled()) { + mDismissIconView.setVisibility(VISIBLE); } else { - mDismissIconView.setFocusable(false); - mDismissIconView.setFocusableInTouchMode(false); + mDismissIconView.setVisibility(GONE); } mViewFocusAnimator = new ViewFocusAnimator(this); } @@ -113,6 +101,7 @@ public class TaskCardView extends LinearLayout { mTitleTextView.setText(task.title); mBadgeView.setImageDrawable(task.icon); setThumbnailView(); + setContentDescription(task.titleDescription); } public Task getTask() { diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalGridView.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalGridView.java index 9f52abdad287..3fb339e8f98a 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalGridView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalGridView.java @@ -181,8 +181,8 @@ public class TaskStackHorizontalGridView extends HorizontalGridView implements T } @Override - public void onStackTaskRemoved(TaskStack stack, Task removedTask, boolean wasFrontMostTask, - Task newFrontMostTask, AnimationProps animation, boolean fromDockGesture) { + public void onStackTaskRemoved(TaskStack stack, Task removedTask, Task newFrontMostTask, + AnimationProps animation, boolean fromDockGesture) { ((TaskStackHorizontalViewAdapter) getAdapter()).removeTask(removedTask); if (mFocusedTask == removedTask) { resetFocusedTask(removedTask); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java index f4c13d7b8cdc..493e6187c83e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java @@ -148,10 +148,12 @@ public class TaskStackAnimationHelper { for (int i = taskViews.size() - 1; i >= 0; i--) { TaskView tv = taskViews.get(i); Task task = tv.getTask(); - boolean currentTaskOccludesLaunchTarget = (launchTargetTask != null && - launchTargetTask.group.isTaskAboveTask(task, launchTargetTask)); - boolean hideTask = (launchTargetTask != null && - launchTargetTask.isFreeformTask() && task.isFreeformTask()); + boolean currentTaskOccludesLaunchTarget = launchTargetTask != null && + launchTargetTask.group != null && + launchTargetTask.group.isTaskAboveTask(task, launchTargetTask); + boolean hideTask = launchTargetTask != null && + launchTargetTask.isFreeformTask() && + task.isFreeformTask(); // Get the current transform for the task, which will be used to position it offscreen stackLayout.getStackTransform(task, stackScroller.getStackScroll(), mTmpTransform, @@ -221,11 +223,9 @@ public class TaskStackAnimationHelper { int taskIndexFromBack = i; final TaskView tv = taskViews.get(i); Task task = tv.getTask(); - boolean currentTaskOccludesLaunchTarget = false; - if (launchTargetTask != null) { - currentTaskOccludesLaunchTarget = launchTargetTask.group.isTaskAboveTask(task, - launchTargetTask); - } + boolean currentTaskOccludesLaunchTarget = launchTargetTask != null && + launchTargetTask.group != null && + launchTargetTask.group.isTaskAboveTask(task, launchTargetTask); // Get the current transform for the task, which will be updated to the final transform // to animate to depending on how recents was invoked @@ -358,8 +358,9 @@ public class TaskStackAnimationHelper { for (int i = 0; i < taskViewCount; i++) { TaskView tv = taskViews.get(i); Task task = tv.getTask(); - boolean currentTaskOccludesLaunchTarget = (launchingTask != null && - launchingTask.group.isTaskAboveTask(task, launchingTask)); + boolean currentTaskOccludesLaunchTarget = launchingTask != null && + launchingTask.group != null && + launchingTask.group.isTaskAboveTask(task, launchingTask); if (tv == launchingTaskView) { tv.setClipViewInStack(false); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index 1a197b69c1bb..0d9f77c5d2fa 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -1400,8 +1400,8 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal * We expect that the {@link TaskView} associated with the removed task is already hidden. */ @Override - public void onStackTaskRemoved(TaskStack stack, Task removedTask, boolean wasFrontMostTask, - Task newFrontMostTask, AnimationProps animation, boolean fromDockGesture) { + public void onStackTaskRemoved(TaskStack stack, Task removedTask, Task newFrontMostTask, + AnimationProps animation, boolean fromDockGesture) { if (mFocusedTask == removedTask) { resetFocusedTask(removedTask); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index c53ab5902dec..6f6b02def040 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -41,6 +41,9 @@ import android.view.accessibility.AccessibilityEvent; import android.widget.Chronometer; import android.widget.ImageView; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto; +import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.internal.util.NotificationColorUtil; import com.android.systemui.R; import com.android.systemui.classifier.FalsingManager; @@ -138,11 +141,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { @Override public void onClick(View v) { if (!mShowingPublic && mGroupManager.isSummaryOfGroup(mStatusBarNotification)) { - mGroupManager.toggleGroupExpansion(mStatusBarNotification); - mOnExpandClickListener.onExpandClicked(mEntry, - mGroupManager.isGroupExpanded(mStatusBarNotification)); + final boolean wasExpanded = mGroupManager.isGroupExpanded(mStatusBarNotification); + boolean nowExpanded = mGroupManager.toggleGroupExpansion(mStatusBarNotification); + mOnExpandClickListener.onExpandClicked(mEntry, nowExpanded); mGroupExpansionChanging = true; updateBackgroundForGroupState(); + MetricsLogger.action(mContext, MetricsEvent.ACTION_NOTIFICATION_GROUP_EXPANDER, + nowExpanded); + logExpansionEvent(true /* userAction */, wasExpanded); } else { boolean nowExpanded; if (isPinned()) { @@ -154,6 +160,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } notifyHeightChanged(true); mOnExpandClickListener.onExpandClicked(mEntry, nowExpanded); + MetricsLogger.action(mContext, MetricsEvent.ACTION_NOTIFICATION_EXPANDER, + nowExpanded); } } }; @@ -1019,7 +1027,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { public void setUserExpanded(boolean userExpanded, boolean allowChildExpansion) { mFalsingManager.setNotificationExpanded(); if (mIsSummaryWithChildren && !mShowingPublic && allowChildExpansion) { + final boolean wasExpanded = mGroupManager.isGroupExpanded(mStatusBarNotification); mGroupManager.setGroupExpanded(mStatusBarNotification, userExpanded); + logExpansionEvent(true /* userAction */, wasExpanded); return; } if (userExpanded && !mExpandable) return; @@ -1505,7 +1515,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } private void logExpansionEvent(boolean userAction, boolean wasExpanded) { - final boolean nowExpanded = isExpanded(); + boolean nowExpanded = isExpanded(); + if (mIsSummaryWithChildren) { + nowExpanded = mGroupManager.isGroupExpanded(mStatusBarNotification); + } if (wasExpanded != nowExpanded && mLogger != null) { mLogger.logNotificationExpansion(mLoggingKey, userAction, nowExpanded) ; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java index 32b61cd1fe0b..f3c666f90e40 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java @@ -263,6 +263,7 @@ public class NotificationContentView extends FrameLayout { invalidateOutline(); selectLayout(false /* animate */, mForceSelectNextLayout /* force */); mForceSelectNextLayout = false; + updateExpandButtons(mExpandable); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java index 4650a1f090ed..b523a112c209 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java @@ -23,6 +23,7 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.ColorStateList; +import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.os.Handler; @@ -70,6 +71,8 @@ public class NotificationGuts extends LinearLayout implements TunerService.Tunab private ImageView mAutoButton; private ColorStateList mActiveSliderTint; private ColorStateList mInactiveSliderTint; + private float mActiveSliderAlpha = 1.0f; + private float mInactiveSliderAlpha; private TextView mImportanceSummary; private TextView mImportanceTitle; private boolean mAuto; @@ -100,6 +103,11 @@ public class NotificationGuts extends LinearLayout implements TunerService.Tunab } } }; + final TypedArray ta = + context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Theme, 0, 0); + mInactiveSliderAlpha = + ta.getFloat(com.android.internal.R.styleable.Theme_disabledAlpha, 0.5f); + ta.recycle(); } public void resetFalsingCheck() { @@ -299,13 +307,12 @@ public class NotificationGuts extends LinearLayout implements TunerService.Tunab private void applyAuto() { mSeekBar.setEnabled(!mAuto); - final ColorStateList sliderTint = mAuto ? mInactiveSliderTint : mActiveSliderTint; final ColorStateList starTint = mAuto ? mActiveSliderTint : mInactiveSliderTint; + final float alpha = mAuto ? mInactiveSliderAlpha : mActiveSliderAlpha; Drawable icon = mAutoButton.getDrawable().mutate(); icon.setTintList(starTint); mAutoButton.setImageDrawable(icon); - mSeekBar.setProgressTintList(sliderTint); - mSeekBar.setThumbTintList(sliderTint); + mSeekBar.setAlpha(alpha); if (mAuto) { mSeekBar.setProgress(mNotificationImportance); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java index 4e643f0fcae1..7d3da1b67422 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java @@ -463,9 +463,7 @@ public class TransformState { mTransformedView.animate().cancel(); mTransformedView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); mTransformedView.setAlpha(visible ? 1.0f : 0.0f); - if (visible) { - resetTransformedView(); - } + resetTransformedView(); } public void prepareFadeIn() { 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 0df12044c46e..9ecff18d2d11 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java @@ -323,12 +323,14 @@ public class NotificationGroupManager implements HeadsUpManager.OnHeadsUpChanged : group.summary.row; } - public void toggleGroupExpansion(StatusBarNotification sbn) { + /** @return group expansion state after toggling. */ + public boolean toggleGroupExpansion(StatusBarNotification sbn) { NotificationGroup group = mGroupMap.get(getGroupKey(sbn)); if (group == null) { - return; + return false; } setGroupExpanded(group, !group.expanded); + return group.expanded; } private boolean isIsolated(StatusBarNotification sbn) { 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 6a37099d0b7d..522f2502e256 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -220,18 +220,8 @@ public class NotificationPanelView extends PanelView implements super.onFinishInflate(); mKeyguardStatusBar = (KeyguardStatusBarView) findViewById(R.id.keyguard_header); mKeyguardStatusView = (KeyguardStatusView) findViewById(R.id.keyguard_status_view); - mQsAutoReinflateContainer = - (AutoReinflateContainer) findViewById(R.id.qs_auto_reinflate_container); - mQsAutoReinflateContainer.addInflateListener(new InflateListener() { - @Override - public void onInflated(View v) { - mQsContainer = (QSContainer) v.findViewById(R.id.quick_settings_container); - mQsContainer.setPanelView(NotificationPanelView.this); - mQsContainer.getHeader().findViewById(R.id.expand_indicator) - .setOnClickListener(NotificationPanelView.this); - } - }); mClockView = (TextView) findViewById(R.id.clock_view); + mNotificationContainerParent = (NotificationsQuickSettingsContainer) findViewById(R.id.notification_container_parent); mNotificationStackScroller = (NotificationStackScrollLayout) @@ -239,22 +229,34 @@ public class NotificationPanelView extends PanelView implements mNotificationStackScroller.setOnHeightChangedListener(this); mNotificationStackScroller.setOverscrollTopChangedListener(this); mNotificationStackScroller.setOnEmptySpaceClickListener(this); - mNotificationStackScroller.setQsContainer(mQsContainer); mKeyguardBottomArea = (KeyguardBottomAreaView) findViewById(R.id.keyguard_bottom_area); mQsNavbarScrim = findViewById(R.id.qs_navbar_scrim); mAfforanceHelper = new KeyguardAffordanceHelper(this, getContext()); mLastOrientation = getResources().getConfiguration().orientation; - // recompute internal state when qspanel height changes - mQsContainer.addOnLayoutChangeListener(new OnLayoutChangeListener() { + mQsAutoReinflateContainer = + (AutoReinflateContainer) findViewById(R.id.qs_auto_reinflate_container); + mQsAutoReinflateContainer.addInflateListener(new InflateListener() { @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, - int oldLeft, int oldTop, int oldRight, int oldBottom) { - final int height = bottom - top; - final int oldHeight = oldBottom - oldTop; - if (height != oldHeight) { - onQsHeightChanged(); - } + public void onInflated(View v) { + mQsContainer = (QSContainer) v.findViewById(R.id.quick_settings_container); + mQsContainer.setPanelView(NotificationPanelView.this); + mQsContainer.getHeader().findViewById(R.id.expand_indicator) + .setOnClickListener(NotificationPanelView.this); + + // recompute internal state when qspanel height changes + mQsContainer.addOnLayoutChangeListener(new OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + final int height = bottom - top; + final int oldHeight = oldBottom - oldTop; + if (height != oldHeight) { + onQsHeightChanged(); + } + } + }); + mNotificationStackScroller.setQsContainer(mQsContainer); } }); } diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java index 65b93c743a94..f2cd885d68ce 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java @@ -396,6 +396,7 @@ public class VolumeDialog implements TunerService.Tunable { mSpTexts.add(row.header); row.slider = (SeekBar) row.view.findViewById(R.id.volume_row_slider); row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row)); + row.anim = null; // forward events above the slider into the slider row.view.setOnTouchListener(new OnTouchListener() { diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 46da957ef90f..f8cdf9b3a736 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -2206,6 +2206,12 @@ message MetricsEvent { // Settings launched from expanded quick settings. ACTION_QS_EXPANDED_SETTINGS_LAUNCH = 406; + // Notification expansion state toggled by the expand affordance. + ACTION_NOTIFICATION_EXPANDER = 407; + + // Notification group expansion state toggled by the expand affordance. + ACTION_NOTIFICATION_GROUP_EXPANDER = 408; + // Add new aosp constants above this line. // END OF AOSP CONSTANTS } diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java index 3cc991cab65d..ecba24501a3e 100644 --- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java +++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java @@ -648,7 +648,16 @@ class TouchExplorer implements EventStreamTransformation, AccessibilityGestureDe * @param policyFlags The policy flags associated with the event. */ private void handleMotionEventStateDragging(MotionEvent event, int policyFlags) { - final int pointerIdBits = (1 << mDraggingPointerId); + int pointerIdBits = 0; + // Clear the dragging pointer id if it's no longer valid. + if (event.findPointerIndex(mDraggingPointerId) == -1) { + Slog.e(LOG_TAG, "mDraggingPointerId doesn't match any pointers on current event. " + + "mDraggingPointerId: " + Integer.toString(mDraggingPointerId) + + ", Event: " + event); + mDraggingPointerId = INVALID_POINTER_ID; + } else { + pointerIdBits = (1 << mDraggingPointerId); + } switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: { throw new IllegalStateException("Dragging state can be reached only if two " @@ -664,6 +673,9 @@ class TouchExplorer implements EventStreamTransformation, AccessibilityGestureDe sendDownForAllNotInjectedPointers(event, policyFlags); } break; case MotionEvent.ACTION_MOVE: { + if (mDraggingPointerId == INVALID_POINTER_ID) { + break; + } switch (event.getPointerCount()) { case 1: { // do nothing diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 2f2d8a4435cc..5118b3f2ab7a 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3228,9 +3228,6 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public LegacyVpnInfo getLegacyVpnInfo(int userId) { enforceCrossUserPermission(userId); - if (mLockdownEnabled) { - return null; - } synchronized(mVpns) { return mVpns.get(userId).getLegacyVpnInfo(); diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java index 1d8bb6b4d48c..fb1021ee50d7 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -47,8 +47,10 @@ import android.os.Handler; import android.os.IBinder; import android.os.IProgressListener; import android.os.Parcel; +import android.os.Process; import android.os.RemoteException; import android.os.storage.IMountService; +import android.os.storage.StorageManager; import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; @@ -128,6 +130,14 @@ public class LockSettingsService extends ILockSettings.Stub { private NotificationManager mNotificationManager; private UserManager mUserManager; + private final KeyStore mKeyStore = KeyStore.getInstance(); + + /** + * The UIDs that are used for system credential storage in keystore. + */ + private static final int[] SYSTEM_CREDENTIAL_UIDS = {Process.WIFI_UID, Process.VPN_UID, + Process.ROOT_UID, Process.SYSTEM_UID}; + static { // Just launch the home screen, which happens anyway ACTION_NULL = new Intent(Intent.ACTION_MAIN); @@ -235,6 +245,11 @@ public class LockSettingsService extends ILockSettings.Stub { randomLockSeed = SecureRandom.getInstance("SHA1PRNG").generateSeed(40); String newPassword = String.valueOf(HexEncoding.encode(randomLockSeed)); setLockPasswordInternal(newPassword, managedUserPassword, managedUserId); + // We store a private credential for the managed user that's unlocked by the primary + // account holder's credential. As such, the user will never be prompted to enter this + // password directly, so we always store a password. + setLong(LockPatternUtils.PASSWORD_TYPE_KEY, + DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC, managedUserId); tieProfileLockToParent(managedUserId, newPassword); } catch (NoSuchAlgorithmException | RemoteException e) { Slog.e(TAG, "Fail to tie managed profile", e); @@ -341,6 +356,10 @@ public class LockSettingsService extends ILockSettings.Stub { private void showEncryptionNotification(UserHandle user, CharSequence title, CharSequence message, CharSequence detail, PendingIntent intent) { if (DEBUG) Slog.v(TAG, "showing encryption notification, user: " + user.getIdentifier()); + + // Suppress all notifications on non-FBE devices for now + if (!StorageManager.isFileEncryptedNativeOrEmulated()) return; + Notification notification = new Notification.Builder(mContext) .setSmallIcon(com.android.internal.R.drawable.ic_user_secure) .setWhen(0) @@ -535,6 +554,30 @@ public class LockSettingsService extends ILockSettings.Stub { setString("migrated_lockscreen_disabled", "true", 0); Slog.i(TAG, "Migrated lockscreen disabled flag"); } + + final List<UserInfo> users = mUserManager.getUsers(); + for (int i = 0; i < users.size(); i++) { + final UserInfo userInfo = users.get(i); + if (userInfo.isManagedProfile() && mStorage.hasChildProfileLock(userInfo.id)) { + // When managed profile has a unified lock, the password quality stored has 2 + // possibilities only. + // 1). PASSWORD_QUALITY_UNSPECIFIED, which is upgraded from dp2, and we are + // going to set it back to PASSWORD_QUALITY_ALPHANUMERIC. + // 2). PASSWORD_QUALITY_ALPHANUMERIC, which is the actual password quality for + // unified lock. + final long quality = getLong(LockPatternUtils.PASSWORD_TYPE_KEY, + DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, userInfo.id); + if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { + // Only possible when it's upgraded from nyc dp3 + Slog.i(TAG, "Migrated tied profile lock type"); + setLong(LockPatternUtils.PASSWORD_TYPE_KEY, + DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC, userInfo.id); + } else if (quality != DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC) { + // It should not happen + Slog.e(TAG, "Invalid tied profile lock type: " + quality); + } + } + } } catch (RemoteException re) { Slog.e(TAG, "Unable to migrate old data", re); } @@ -686,7 +729,7 @@ public class LockSettingsService extends ILockSettings.Stub { NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, CertificateException, IOException { - if (DEBUG) Slog.v(TAG, "Unlock keystore for child profile"); + if (DEBUG) Slog.v(TAG, "Get child profile decrytped key"); byte[] storedData = mStorage.readChildProfileLock(userId); if (storedData == null) { throw new FileNotFoundException("Child profile lock file not found"); @@ -1106,6 +1149,49 @@ public class LockSettingsService extends ILockSettings.Stub { } @Override + public void resetKeyStore(int userId) throws RemoteException { + if (DEBUG) Slog.v(TAG, "Reset keystore for user: " + userId); + int managedUserId = -1; + String managedUserDecryptedPassword = null; + final List<UserInfo> profiles = mUserManager.getProfiles(userId); + for (UserInfo pi : profiles) { + // Unlock managed profile with unified lock + if (pi.isManagedProfile() + && !mLockPatternUtils.isSeparateProfileChallengeEnabled(pi.id) + && mStorage.hasChildProfileLock(pi.id)) { + try { + if (managedUserId == -1) { + managedUserDecryptedPassword = getDecryptedPasswordForTiedProfile(pi.id); + managedUserId = pi.id; + } else { + // Should not happen + Slog.e(TAG, "More than one managed profile, uid1:" + managedUserId + + ", uid2:" + pi.id); + } + } catch (UnrecoverableKeyException | InvalidKeyException | KeyStoreException + | NoSuchAlgorithmException | NoSuchPaddingException + | InvalidAlgorithmParameterException | IllegalBlockSizeException + | BadPaddingException | CertificateException | IOException e) { + Slog.e(TAG, "Failed to decrypt child profile key", e); + } + } + } + try { + // Clear all the users credentials could have been installed in for this user. + for (int profileId : mUserManager.getProfileIdsWithDisabled(userId)) { + for (int uid : SYSTEM_CREDENTIAL_UIDS) { + mKeyStore.clearUid(UserHandle.getUid(profileId, uid)); + } + } + } finally { + if (managedUserId != -1 && managedUserDecryptedPassword != null) { + if (DEBUG) Slog.v(TAG, "Restore tied profile lock"); + tieProfileLockToParent(managedUserId, managedUserDecryptedPassword); + } + } + } + + @Override public VerifyCredentialResponse checkPattern(String pattern, int userId) throws RemoteException { return doVerifyPattern(pattern, false, 0, userId); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a8a8553c9d3f..eb4391e03d4d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5419,9 +5419,32 @@ public final class ActivityManagerService extends ActivityManagerNative } } + final int pkgUidF = pkgUid; + final int userIdF = userId; + final IPackageDataObserver localObserver = new IPackageDataObserver.Stub() { + @Override + public void onRemoveCompleted(String packageName, boolean succeeded) + throws RemoteException { + synchronized (ActivityManagerService.this) { + finishForceStopPackageLocked(packageName, pkgUidF); + } + + final Intent intent = new Intent(Intent.ACTION_PACKAGE_DATA_CLEARED, + Uri.fromParts("package", packageName, null)); + intent.putExtra(Intent.EXTRA_UID, pkgUidF); + intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(pkgUidF)); + broadcastIntentInPackage("android", Process.SYSTEM_UID, intent, + null, null, 0, null, null, null, null, false, false, userIdF); + + if (observer != null) { + observer.onRemoveCompleted(packageName, succeeded); + } + } + }; + try { // Clear application user data - pm.clearApplicationUserData(packageName, observer, userId); + pm.clearApplicationUserData(packageName, localObserver, userId); synchronized(this) { // Remove all permissions granted from/to this package @@ -5433,12 +5456,6 @@ public final class ActivityManagerService extends ActivityManagerNative inm.removeAutomaticZenRules(packageName); inm.setNotificationPolicyAccessGranted(packageName, false); - Intent intent = new Intent(Intent.ACTION_PACKAGE_DATA_CLEARED, - Uri.fromParts("package", packageName, null)); - intent.putExtra(Intent.EXTRA_UID, pkgUid); - intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(pkgUid)); - broadcastIntentInPackage("android", Process.SYSTEM_UID, intent, - null, null, 0, null, null, null, null, false, false, userId); } catch (RemoteException e) { } } finally { @@ -5623,6 +5640,7 @@ public final class ActivityManagerService extends ActivityManagerNative } if (mUserController.isUserRunningLocked(user, 0)) { forceStopPackageLocked(packageName, pkgUid, "from pid " + callingPid); + finishForceStopPackageLocked(packageName, pkgUid); } } } @@ -5814,6 +5832,9 @@ public final class ActivityManagerService extends ActivityManagerNative private void forceStopPackageLocked(final String packageName, int uid, String reason) { forceStopPackageLocked(packageName, UserHandle.getAppId(uid), false, false, true, false, false, UserHandle.getUserId(uid), reason); + } + + private void finishForceStopPackageLocked(final String packageName, int uid) { Intent intent = new Intent(Intent.ACTION_PACKAGE_RESTARTED, Uri.fromParts("package", packageName, null)); if (!mProcessesReady) { @@ -10170,6 +10191,7 @@ public final class ActivityManagerService extends ActivityManagerNative int N = providers.size(); app.pubProviders.ensureCapacity(N + app.pubProviders.size()); for (int i=0; i<N; i++) { + // TODO: keep logic in sync with installEncryptionUnawareProviders ProviderInfo cpi = (ProviderInfo)providers.get(i); boolean singleton = isSingleton(cpi.processName, cpi.applicationInfo, @@ -11150,12 +11172,18 @@ public final class ActivityManagerService extends ActivityManagerNative final PackageInfo pkgInfo = AppGlobals.getPackageManager() .getPackageInfo(pkgName, matchFlags, userId); if (pkgInfo != null && !ArrayUtils.isEmpty(pkgInfo.providers)) { - for (ProviderInfo provInfo : pkgInfo.providers) { - if (Objects.equals(provInfo.processName, app.processName)) { - Log.v(TAG, "Installing " + provInfo); - app.thread.scheduleInstallProvider(provInfo); + for (ProviderInfo pi : pkgInfo.providers) { + // TODO: keep in sync with generateApplicationProvidersLocked + final boolean processMatch = Objects.equals(pi.processName, + app.processName) || pi.multiprocess; + final boolean userMatch = isSingleton(pi.processName, + pi.applicationInfo, pi.name, pi.flags) + ? (app.userId == UserHandle.USER_SYSTEM) : true; + if (processMatch && userMatch) { + Log.v(TAG, "Installing " + pi); + app.thread.scheduleInstallProvider(pi); } else { - Log.v(TAG, "Skipping " + provInfo); + Log.v(TAG, "Skipping " + pi); } } } @@ -17520,13 +17548,13 @@ public final class ActivityManagerService extends ActivityManagerNative final boolean killProcess = !intent.getBooleanExtra(Intent.EXTRA_DONT_KILL_APP, false); final boolean fullUninstall = removed && !replacing; - if (killProcess) { - forceStopPackageLocked(ssp, UserHandle.getAppId( - intent.getIntExtra(Intent.EXTRA_UID, -1)), - false, true, true, false, fullUninstall, userId, - removed ? "pkg removed" : "pkg changed"); - } if (removed) { + if (killProcess) { + forceStopPackageLocked(ssp, UserHandle.getAppId( + intent.getIntExtra(Intent.EXTRA_UID, -1)), + false, true, true, false, fullUninstall, userId, + removed ? "pkg removed" : "pkg changed"); + } final int cmd = killProcess ? IApplicationThread.PACKAGE_REMOVED : IApplicationThread.PACKAGE_REMOVED_DONT_KILL; @@ -17543,6 +17571,12 @@ public final class ActivityManagerService extends ActivityManagerNative mBatteryStatsService.notePackageUninstalled(ssp); } } else { + if (killProcess) { + killPackageProcessesLocked(ssp, UserHandle.getAppId( + intent.getIntExtra(Intent.EXTRA_UID, -1)), + userId, ProcessList.INVALID_ADJ, + false, true, true, false, "change " + ssp); + } cleanupDisabledPackageComponentsLocked(ssp, userId, killProcess, intent.getStringArrayExtra( Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST)); @@ -18300,8 +18334,8 @@ public final class ActivityManagerService extends ActivityManagerNative void updateUserConfigurationLocked() { Configuration configuration = new Configuration(mConfiguration); - Settings.System.getConfigurationForUser(mContext.getContentResolver(), configuration, - mUserController.getCurrentUserIdLocked()); + Settings.System.adjustConfigurationForUser(mContext.getContentResolver(), configuration, + mUserController.getCurrentUserIdLocked(), Settings.System.canWrite(mContext)); updateConfigurationLocked(configuration, null, false); } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index b4df10f51691..def6828beabb 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -88,6 +88,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub */ private static final long EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS = 2000; + // There is some accuracy error in wifi reports so allow some slop in the results. + private static final long MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS = 750; + private static IBatteryStats sService; final BatteryStatsImpl mStats; @@ -1338,32 +1341,33 @@ public final class BatteryStatsService extends IBatteryStats.Stub } else { final long totalActiveTimeMs = txTimeMs + rxTimeMs; long maxExpectedIdleTimeMs; - // Active time can never be greater than the total time, the stats received seem - // to be corrupt. if (totalActiveTimeMs > timePeriodMs) { - maxExpectedIdleTimeMs = timePeriodMs; - StringBuilder sb = new StringBuilder(); - sb.append("Total Active time "); - TimeUtils.formatDuration(totalActiveTimeMs, sb); - sb.append(" is longer than sample period "); - TimeUtils.formatDuration(timePeriodMs, sb); - sb.append(".\n"); - sb.append("Previous WiFi snapshot: ").append("idle="); - TimeUtils.formatDuration(lastIdleMs, sb); - sb.append(" rx="); - TimeUtils.formatDuration(lastRxMs, sb); - sb.append(" tx="); - TimeUtils.formatDuration(lastTxMs, sb); - sb.append(" e=").append(lastEnergy); - sb.append("\n"); - sb.append("Current WiFi snapshot: ").append("idle="); - TimeUtils.formatDuration(latest.mControllerIdleTimeMs, sb); - sb.append(" rx="); - TimeUtils.formatDuration(latest.mControllerRxTimeMs, sb); - sb.append(" tx="); - TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb); - sb.append(" e=").append(latest.mControllerEnergyUsed); - Slog.wtf(TAG, sb.toString()); + // Cap the max idle time at zero since the active time consumed the whole time + maxExpectedIdleTimeMs = 0; + if (totalActiveTimeMs > timePeriodMs + MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS) { + StringBuilder sb = new StringBuilder(); + sb.append("Total Active time "); + TimeUtils.formatDuration(totalActiveTimeMs, sb); + sb.append(" is longer than sample period "); + TimeUtils.formatDuration(timePeriodMs, sb); + sb.append(".\n"); + sb.append("Previous WiFi snapshot: ").append("idle="); + TimeUtils.formatDuration(lastIdleMs, sb); + sb.append(" rx="); + TimeUtils.formatDuration(lastRxMs, sb); + sb.append(" tx="); + TimeUtils.formatDuration(lastTxMs, sb); + sb.append(" e=").append(lastEnergy); + sb.append("\n"); + sb.append("Current WiFi snapshot: ").append("idle="); + TimeUtils.formatDuration(latest.mControllerIdleTimeMs, sb); + sb.append(" rx="); + TimeUtils.formatDuration(latest.mControllerRxTimeMs, sb); + sb.append(" tx="); + TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb); + sb.append(" e=").append(latest.mControllerEnergyUsed); + Slog.wtf(TAG, sb.toString()); + } } else { maxExpectedIdleTimeMs = timePeriodMs - totalActiveTimeMs; } diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 67f96d888e3b..f6232fe5222b 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -18,7 +18,6 @@ package com.android.server.am; import static android.Manifest.permission.INTERACT_ACROSS_USERS; import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; -import static android.app.ActivityManager.FLAG_AND_UNLOCKING_OR_UNLOCKED; import static android.app.ActivityManager.USER_OP_ERROR_IS_SYSTEM; import static android.app.ActivityManager.USER_OP_ERROR_RELATED_USERS_CANNOT_STOP; import static android.app.ActivityManager.USER_OP_IS_CURRENT; @@ -233,6 +232,7 @@ final class UserController { // but we might immediately step into RUNNING below if the user // storage is already unlocked. if (uss.setState(STATE_BOOTING, STATE_RUNNING_LOCKED)) { + getUserManagerInternal().setUserState(userId, uss.state); Intent intent = new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED, null); intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT @@ -276,7 +276,7 @@ final class UserController { if (!StorageManager.isUserKeyUnlocked(userId)) return; if (uss.setState(STATE_RUNNING_LOCKED, STATE_RUNNING_UNLOCKING)) { - getUserManagerInternal().setUserUnlockingOrUnlocked(userId, true); + getUserManagerInternal().setUserState(userId, uss.state); uss.mUnlockProgress.start(); // Prepare app storage before we go any further @@ -307,7 +307,7 @@ final class UserController { if (!StorageManager.isUserKeyUnlocked(userId)) return; if (uss.setState(STATE_RUNNING_UNLOCKING, STATE_RUNNING_UNLOCKED)) { - getUserManagerInternal().setUserUnlockingOrUnlocked(userId, true); + getUserManagerInternal().setUserState(userId, uss.state); uss.mUnlockProgress.finish(); // Dispatch unlocked to external apps @@ -481,7 +481,7 @@ final class UserController { if (uss.state != UserState.STATE_STOPPING && uss.state != UserState.STATE_SHUTDOWN) { uss.setState(UserState.STATE_STOPPING); - getUserManagerInternal().setUserUnlockingOrUnlocked(userId, false); + getUserManagerInternal().setUserState(userId, uss.state); updateStartedUserArrayLocked(); long ident = Binder.clearCallingIdentity(); @@ -543,7 +543,7 @@ final class UserController { } uss.setState(UserState.STATE_SHUTDOWN); } - getUserManagerInternal().setUserUnlockingOrUnlocked(userId, false); + getUserManagerInternal().setUserState(userId, uss.state); mService.mBatteryStatsService.noteEvent( BatteryStats.HistoryItem.EVENT_USER_RUNNING_FINISH, @@ -572,6 +572,7 @@ final class UserController { stopped = true; // User can no longer run. mStartedUsers.remove(userId); + getUserManagerInternal().removeUserState(userId); mUserLru.remove(Integer.valueOf(userId)); updateStartedUserArrayLocked(); @@ -779,7 +780,9 @@ final class UserController { // If the user we are switching to is not currently started, then // we need to start it now. if (mStartedUsers.get(userId) == null) { - mStartedUsers.put(userId, new UserState(UserHandle.of(userId))); + UserState userState = new UserState(UserHandle.of(userId)); + mStartedUsers.put(userId, userState); + getUserManagerInternal().setUserState(userId, userState.state); updateStartedUserArrayLocked(); needStart = true; } @@ -813,15 +816,14 @@ final class UserController { // so we can just fairly silently bring the user back from // the almost-dead. uss.setState(uss.lastState); - if (isUserRunningLocked(userId, FLAG_AND_UNLOCKING_OR_UNLOCKED)) { - getUserManagerInternal().setUserUnlockingOrUnlocked(userId, true); - } + getUserManagerInternal().setUserState(userId, uss.state); updateStartedUserArrayLocked(); needStart = true; } else if (uss.state == UserState.STATE_SHUTDOWN) { // This means ACTION_SHUTDOWN has been sent, so we will // need to treat this as a new boot of the user. uss.setState(UserState.STATE_BOOTING); + getUserManagerInternal().setUserState(userId, uss.state); updateStartedUserArrayLocked(); needStart = true; } diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 32b9429ae656..dd9baf4909c7 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1055,18 +1055,27 @@ public class Vpn { } /** - * @return {@code true} if the set of users blocked whilst waiting for VPN to connect includes - * the UID {@param uid}, {@code false} otherwise. + * @return {@code true} if {@param uid} is blocked by an always-on VPN. + * A UID is blocked if it's included in one of the mBlockedUsers ranges and the VPN is + * not connected, or if the VPN is connected but does not apply to the UID. * * @see #mBlockedUsers */ public synchronized boolean isBlockingUid(int uid) { - for (UidRange uidRange : mBlockedUsers) { - if (uidRange.contains(uid)) { - return true; + if (!mLockdown) { + return false; + } + + if (mNetworkInfo.isConnected()) { + return !appliesToUid(uid); + } else { + for (UidRange uidRange : mBlockedUsers) { + if (uidRange.contains(uid)) { + return true; + } } + return false; } - return false; } private native int jniCreate(int mtu); diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java index 2103cce63233..1b2ccd7e43ad 100644 --- a/services/core/java/com/android/server/content/ContentService.java +++ b/services/core/java/com/android/server/content/ContentService.java @@ -20,9 +20,11 @@ import android.Manifest; import android.accounts.Account; import android.annotation.Nullable; import android.app.ActivityManager; +import android.app.ActivityManagerNative; import android.app.AppOpsManager; import android.content.BroadcastReceiver; import android.content.ComponentName; +import android.content.ContentProvider; import android.content.ContentResolver; import android.content.Context; import android.content.IContentService; @@ -296,11 +298,12 @@ public final class ContentService extends IContentService.Stub { final int callingUserHandle = UserHandle.getCallingUserId(); // Registering an observer for any user other than the calling user requires uri grant or // cross user permission - if (callingUserHandle != userHandle && - mContext.checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_READ_URI_PERMISSION) - != PackageManager.PERMISSION_GRANTED) { - enforceCrossUserPermission(userHandle, - "no permission to observe other users' provider view"); + if (callingUserHandle != userHandle) { + if (checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_READ_URI_PERMISSION, userHandle) + != PackageManager.PERMISSION_GRANTED) { + enforceCrossUserPermission(userHandle, + "no permission to observe other users' provider view"); + } } if (userHandle < 0) { @@ -360,10 +363,11 @@ public final class ContentService extends IContentService.Stub { final int pid = Binder.getCallingPid(); final int callingUserHandle = UserHandle.getCallingUserId(); // Notify for any user other than the caller requires uri grant or cross user permission - if (callingUserHandle != userHandle && - mContext.checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_WRITE_URI_PERMISSION) - != PackageManager.PERMISSION_GRANTED) { - enforceCrossUserPermission(userHandle, "no permission to notify other users"); + if (callingUserHandle != userHandle) { + if (checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, + userHandle) != PackageManager.PERMISSION_GRANTED) { + enforceCrossUserPermission(userHandle, "no permission to notify other users"); + } } // We passed the permission check; resolve pseudouser targets as appropriate @@ -389,9 +393,18 @@ public final class ContentService extends IContentService.Stub { for (int i=0; i<numCalls; i++) { ObserverCall oc = calls.get(i); try { - oc.mObserver.onChange(oc.mSelfChange, uri, userHandle); + // If the uri does not belong to the same user as the observer: we must add + // the userId to the uri. Otherewise the observer would think the uri belongs + // to his user. + final Uri tempUri; + if (oc.mObserverUserId != userHandle) { + tempUri = ContentProvider.maybeAddUserId(uri, userHandle); + } else { + tempUri = uri; + } + oc.mObserver.onChange(oc.mSelfChange, tempUri, userHandle); if (DEBUG) Slog.d(TAG, "Notified " + oc.mObserver + " of " + "update at " - + uri); + + tempUri); } catch (RemoteException ex) { synchronized (mRootNode) { Log.w(TAG, "Found dead observer, removing"); @@ -427,6 +440,15 @@ public final class ContentService extends IContentService.Stub { } } + private int checkUriPermission(Uri uri, int pid, int uid, int modeFlags, int userHandle) { + try { + return ActivityManagerNative.getDefault().checkUriPermission( + uri, pid, uid, modeFlags, userHandle, null); + } catch (RemoteException e) { + return PackageManager.PERMISSION_DENIED; + } + } + public void notifyChange(Uri uri, IContentObserver observer, boolean observerWantsSelfNotifications, boolean syncToNetwork) { notifyChange(uri, observer, observerWantsSelfNotifications, @@ -444,11 +466,13 @@ public final class ContentService extends IContentService.Stub { final ObserverNode mNode; final IContentObserver mObserver; final boolean mSelfChange; + final int mObserverUserId; - ObserverCall(ObserverNode node, IContentObserver observer, boolean selfChange) { + ObserverCall(ObserverNode node, IContentObserver observer, boolean selfChange, int observerUserId) { mNode = node; mObserver = observer; mSelfChange = selfChange; + mObserverUserId = observerUserId; } } @@ -1361,7 +1385,8 @@ public final class ContentService extends IContentService.Stub { if (DEBUG) Slog.d(TAG, "Reporting to " + entry.observer + ": leaf=" + leaf + " flags=" + Integer.toHexString(flags) + " desc=" + entry.notifyForDescendants); - calls.add(new ObserverCall(this, entry.observer, selfChange)); + calls.add(new ObserverCall(this, entry.observer, selfChange, + UserHandle.getUserId(entry.uid))); } } } diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 0daa8ba57d69..aa1d73fe832e 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -222,7 +222,6 @@ public class InputManagerService extends IInputManager.Stub private static native void nativeSetPointerIconType(long ptr, int iconId); private static native void nativeReloadPointerIcons(long ptr); private static native void nativeSetCustomPointerIcon(long ptr, PointerIcon icon); - private static native void nativeSetPointerIconDetached(long ptr, boolean detached); // Input event injection constants defined in InputDispatcher.h. private static final int INPUT_EVENT_INJECTION_SUCCEEDED = 0; @@ -1503,11 +1502,6 @@ public class InputManagerService extends IInputManager.Stub nativeSetFocusedApplication(mPtr, application); } - @Override - public void setPointerIconDetached(boolean detached) { - nativeSetPointerIconDetached(mPtr, detached); - } - public void setInputDispatchMode(boolean enabled, boolean frozen) { nativeSetInputDispatchMode(mPtr, enabled, frozen); } diff --git a/services/core/java/com/android/server/net/NetworkStatsObservers.java b/services/core/java/com/android/server/net/NetworkStatsObservers.java index 230c2e95109e..ea361700faf4 100644 --- a/services/core/java/com/android/server/net/NetworkStatsObservers.java +++ b/services/core/java/com/android/server/net/NetworkStatsObservers.java @@ -190,11 +190,9 @@ class NetworkStatsObservers { private void handleUpdateStats(StatsContext statsContext) { if (mDataUsageRequests.size() == 0) { - if (LOGV) Slog.v(TAG, "No registered listeners of data usage"); return; } - if (LOGV) Slog.v(TAG, "Checking if any registered observer needs to be notified"); for (int i = 0; i < mDataUsageRequests.size(); i++) { RequestInfo requestInfo = mDataUsageRequests.valueAt(i); requestInfo.updateStats(statsContext); @@ -371,9 +369,6 @@ class NetworkStatsObservers { NetworkStats stats = mCollection.getSummary(template, Long.MIN_VALUE /* start */, Long.MAX_VALUE /* end */, mAccessLevel, mCallingUid); - if (LOGV) { - Slog.v(TAG, "Netstats for " + template + ": " + stats); - } return stats.getTotalBytes(); } } @@ -391,11 +386,6 @@ class NetworkStatsObservers { for (int i = 0; i < uidsToMonitor.length; i++) { long bytesSoFar = getTotalBytesForNetworkUid(mRequest.template, uidsToMonitor[i]); - - if (LOGV) { - Slog.v(TAG, bytesSoFar + " bytes so far since notification for " - + mRequest.template + " for uid=" + uidsToMonitor[i]); - } if (bytesSoFar > mRequest.thresholdInBytes) { return true; } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 946e4f7e7067..cf4669d77789 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -3813,8 +3813,10 @@ public class NotificationManagerService extends SystemService { @Override public void onUserSwitched(int user) { - for (ManagedServiceInfo info : mServices) { - unregisterService(info.service, info.userid); + synchronized (mNotificationList) { + for (ManagedServiceInfo info : mServices) { + unregisterService(info.service, info.userid); + } } registerRanker(); } diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java index 7c89e9f0ba93..367f8cbb3458 100644 --- a/services/core/java/com/android/server/notification/NotificationRecord.java +++ b/services/core/java/com/android/server/notification/NotificationRecord.java @@ -318,8 +318,12 @@ public final class NotificationRecord { public void setContactAffinity(float contactAffinity) { mContactAffinity = contactAffinity; + if (mImportance < IMPORTANCE_HIGH && + mContactAffinity >= ValidateNotificationPeople.STARRED_CONTACT) { + setImportance(IMPORTANCE_HIGH, getPeopleExplanation()); + } if (mImportance < IMPORTANCE_DEFAULT && - mContactAffinity > ValidateNotificationPeople.VALID_CONTACT) { + mContactAffinity >= ValidateNotificationPeople.VALID_CONTACT) { setImportance(IMPORTANCE_DEFAULT, getPeopleExplanation()); } } diff --git a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java index 15a63ec6875b..e3dcf1401f3a 100644 --- a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java +++ b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java @@ -36,6 +36,7 @@ import android.util.Slog; import com.android.server.notification.NotificationManagerService.DumpFilter; import java.io.PrintWriter; +import java.util.Calendar; import java.util.TimeZone; /** @@ -237,6 +238,14 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { @Override public void onReceive(Context context, Intent intent) { if (DEBUG) Slog.d(TAG, "onReceive " + intent.getAction()); + if (Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) { + for (Uri conditionId : mSubscriptions.keySet()) { + final ScheduleCalendar cal = mSubscriptions.get(conditionId); + if (cal != null) { + cal.setTimeZone(Calendar.getInstance().getTimeZone()); + } + } + } evaluateSubscriptions(); } }; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 35bcaa98bd64..08b9c789ee4d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -16300,11 +16300,11 @@ public class PackageManagerService extends IPackageManager.Stub { final int appId = UserHandle.getAppId(pkg.applicationInfo.uid); removeKeystoreDataIfNeeded(userId, appId); - final UserManager um = mContext.getSystemService(UserManager.class); + UserManagerInternal umInternal = getUserManagerInternal(); final int flags; - if (um.isUserUnlockingOrUnlocked(userId)) { + if (umInternal.isUserUnlockingOrUnlocked(userId)) { flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE; - } else if (um.isUserRunning(userId)) { + } else if (umInternal.isUserRunning(userId)) { flags = StorageManager.FLAG_STORAGE_DE; } else { flags = 0; @@ -19063,11 +19063,12 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); // Reconcile app data for all started/unlocked users final StorageManager sm = mContext.getSystemService(StorageManager.class); final UserManager um = mContext.getSystemService(UserManager.class); + UserManagerInternal umInternal = getUserManagerInternal(); for (UserInfo user : um.getUsers()) { final int flags; - if (um.isUserUnlockingOrUnlocked(user.id)) { + if (umInternal.isUserUnlockingOrUnlocked(user.id)) { flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE; - } else if (um.isUserRunning(user.id)) { + } else if (umInternal.isUserRunning(user.id)) { flags = StorageManager.FLAG_STORAGE_DE; } else { continue; @@ -19491,11 +19492,12 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } final UserManager um = mContext.getSystemService(UserManager.class); + UserManagerInternal umInternal = getUserManagerInternal(); for (UserInfo user : um.getUsers()) { final int flags; - if (um.isUserUnlockingOrUnlocked(user.id)) { + if (umInternal.isUserUnlockingOrUnlocked(user.id)) { flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE; - } else if (um.isUserRunning(user.id)) { + } else if (umInternal.isUserRunning(user.id)) { flags = StorageManager.FLAG_STORAGE_DE; } else { continue; diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 33ccf160f8d0..9d8ba127c834 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -22,7 +22,6 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SystemApi; import android.annotation.UserIdInt; import android.app.Activity; import android.app.ActivityManager; @@ -31,9 +30,7 @@ import android.app.ActivityManagerNative; import android.app.IActivityManager; import android.app.IStopUserCallback; import android.app.KeyguardManager; -import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -76,6 +73,7 @@ import android.util.Log; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; +import android.util.SparseIntArray; import android.util.TimeUtils; import android.util.Xml; @@ -88,6 +86,7 @@ import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import com.android.internal.widget.LockPatternUtils; import com.android.server.LocalServices; +import com.android.server.am.UserState; import libcore.io.IoUtils; import libcore.util.Objects; @@ -329,8 +328,8 @@ public class UserManagerService extends IUserManager.Stub { @GuardedBy("mUsersLock") private boolean mForceEphemeralUsers; - @GuardedBy("mUsersLock") - private final SparseBooleanArray mUnlockingOrUnlockedUsers = new SparseBooleanArray(); + @GuardedBy("mUserStates") + private final SparseIntArray mUserStates = new SparseIntArray(); private static UserManagerService sInstance; @@ -377,6 +376,7 @@ public class UserManagerService extends IUserManager.Stub { mLocalService = new LocalService(); LocalServices.addService(UserManagerInternal.class, mLocalService); mLockPatternUtils = new LockPatternUtils(mContext); + mUserStates.put(UserHandle.USER_SYSTEM, UserState.STATE_BOOTING); } void systemReady() { @@ -2375,7 +2375,9 @@ public class UserManagerService extends IUserManager.Stub { synchronized (mUsersLock) { mUsers.remove(userHandle); mIsUserManaged.delete(userHandle); - mUnlockingOrUnlockedUsers.delete(userHandle); + } + synchronized (mUserStates) { + mUserStates.delete(userHandle); } synchronized (mRestrictionsLock) { mBaseUserRestrictions.remove(userHandle); @@ -3055,6 +3057,9 @@ public class UserManagerService extends IUserManager.Stub { pw.println(); pw.println(" Device managed: " + mIsDeviceManaged); } + synchronized (mUserStates) { + pw.println(" Started users state: " + mUserStates); + } // Dump some capabilities pw.println(); pw.println(" Max users: " + UserManager.getMaxSupportedUsers()); @@ -3241,16 +3246,32 @@ public class UserManagerService extends IUserManager.Stub { } @Override - public void setUserUnlockingOrUnlocked(int userId, boolean unlockingOrUnlocked) { - synchronized (mUsersLock) { - mUnlockingOrUnlockedUsers.put(userId, unlockingOrUnlocked); + public boolean isUserRunning(int userId) { + synchronized (mUserStates) { + return mUserStates.get(userId, -1) >= 0; + } + } + + @Override + public void setUserState(int userId, int userState) { + synchronized (mUserStates) { + mUserStates.put(userId, userState); + } + } + + @Override + public void removeUserState(int userId) { + synchronized (mUserStates) { + mUserStates.delete(userId); } } @Override public boolean isUserUnlockingOrUnlocked(int userId) { - synchronized (mUsersLock) { - return mUnlockingOrUnlockedUsers.get(userId); + synchronized (mUserStates) { + int state = mUserStates.get(userId, -1); + return (state == UserState.STATE_RUNNING_UNLOCKING) + || (state == UserState.STATE_RUNNING_UNLOCKED); } } } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 5fdb1e85b8e1..0cafb93a060b 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2589,8 +2589,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { final PhoneWindow win = new PhoneWindow(context); win.setIsStartingWindow(true); + final WindowManager.LayoutParams params = win.getAttributes(); final Resources r = context.getResources(); - win.setTitle(r.getText(labelRes, nonLocalizedLabel)); + CharSequence label = r.getText(labelRes); + // Only change the accessibility title if the label is localized + if (label != null) { + win.setTitle(label, true); + } else { + win.setTitle(nonLocalizedLabel, false); + } win.setType( WindowManager.LayoutParams.TYPE_APPLICATION_STARTING); @@ -2624,7 +2631,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { win.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); - final WindowManager.LayoutParams params = win.getAttributes(); params.token = appToken; params.packageName = packageName; params.windowAnimations = win.getWindowStyle().getResourceId( diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index 101f56f49241..8be5dfb3c7fd 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -1203,9 +1203,6 @@ final class AccessibilityController { window.layer = windowState.mLayer; window.token = windowState.mClient.asBinder(); window.title = windowState.mAttrs.accessibilityTitle; - if (window.title == null) { - window.title = windowState.mAttrs.getTitle(); - } window.accessibilityIdOfAnchor = windowState.mAttrs.accessibilityIdOfAnchor; WindowState attachedWindow = windowState.mAttachedWindow; diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index b773a4e016bd..f57e83aa1e0d 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -451,6 +451,16 @@ class AppWindowToken extends WindowToken { destroySurfaces(); } + void markSavedSurfaceExiting() { + for (int i = allAppWindows.size() - 1; i >= 0; i--) { + final WindowState w = allAppWindows.get(i); + if (w.isAnimatingInvisibleWithSavedSurface()) { + w.mAnimatingExit = true; + w.mWinAnimator.mAnimating = true; + } + } + } + void restoreSavedSurfaces() { if (!canRestoreSurfaces()) { clearVisibleBeforeClientHidden(); diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index f51fd8aaf7eb..114d9bed827c 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT; +import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT; 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; @@ -380,6 +381,11 @@ public class TaskStack implements DimLayer.DimLayerUser, } private boolean updateBoundsAfterConfigChange() { + if (mDisplayContent == null) { + // If the stack is already detached we're not updating anything, + // as it's going away soon anyway. + return false; + } final int newRotation = getDisplayInfo().rotation; final int newDensity = getDisplayInfo().logicalDensityDpi; @@ -403,6 +409,13 @@ public class TaskStack implements DimLayer.DimLayerUser, snapDockedStackAfterRotation(mTmpRect2); final int newDockSide = getDockSide(mTmpRect2); if (oldDockSide != newDockSide) { + // Update the dock create mode and clear the dock create bounds, these + // might change after a rotation and the original values will be invalid. + mService.setDockedStackCreateStateLocked( + (newDockSide == DOCKED_LEFT || newDockSide == DOCKED_TOP) + ? DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT + : DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT, + null); mDisplayContent.getDockedDividerController().notifyDockSideChanged(newDockSide); } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index aaed8ca9181d..c7148c1ef340 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2277,6 +2277,19 @@ public class WindowManagerService extends IWindowManager.Stub } } + private void setupWindowForRemoveOnExit(WindowState win) { + win.mRemoveOnExit = true; + win.setDisplayLayoutNeeded(); + // Request a focus update as this window's input channel is already gone. Otherwise + // we could have no focused window in input manager. + final boolean focusChanged = updateFocusedWindowLocked( + UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); + mWindowPlacerLocked.performSurfacePlacement(); + if (focusChanged) { + mInputMonitor.updateInputWindowsLw(false /*force*/); + } + } + public void removeWindow(Session session, IWindow client) { synchronized(mWindowMap) { WindowState win = windowForClientLocked(session, client, false); @@ -2358,14 +2371,7 @@ public class WindowManagerService extends IWindowManager.Stub // Do not set mAnimatingExit to true here, it will cause the surface to be hidden // immediately after the enter animation is done. If the app is not yet drawn then // it will show up as a flicker. - win.mRemoveOnExit = true; - // Request a focus update as this window's input channel is already gone. Otherwise - // we could have no focused window in input manager. - final boolean focusChanged = updateFocusedWindowLocked( - UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); - if (focusChanged) { - mInputMonitor.updateInputWindowsLw(false /*force*/); - } + setupWindowForRemoveOnExit(win); Binder.restoreCallingIdentity(origId); return; } @@ -2417,17 +2423,10 @@ public class WindowManagerService extends IWindowManager.Stub // The exit animation is running or should run... wait for it! if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Not removing " + win + " due to exit animation "); - win.mRemoveOnExit = true; - win.setDisplayLayoutNeeded(); - final boolean focusChanged = updateFocusedWindowLocked( - UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); - mWindowPlacerLocked.performSurfacePlacement(); + setupWindowForRemoveOnExit(win); if (appToken != null) { appToken.updateReportedVisibilityLocked(); } - if (focusChanged) { - mInputMonitor.updateInputWindowsLw(false /*force*/); - } Binder.restoreCallingIdentity(origId); return; } @@ -4960,11 +4959,15 @@ public class WindowManagerService extends IWindowManager.Stub public void setDockedStackCreateState(int mode, Rect bounds) { synchronized (mWindowMap) { - mDockedStackCreateMode = mode; - mDockedStackCreateBounds = bounds; + setDockedStackCreateStateLocked(mode, bounds); } } + void setDockedStackCreateStateLocked(int mode, Rect bounds) { + mDockedStackCreateMode = mode; + mDockedStackCreateBounds = bounds; + } + /** * Create a new TaskStack and place it on a DisplayContent. * @param stackId The unique identifier of the new stack. @@ -6387,6 +6390,11 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_SCREENSHOT && inRotation) Slog.v(TAG_WM, "Taking screenshot while rotating"); + // We force pending transactions to flush before taking + // the screenshot by pushing an empty synchronous transaction. + SurfaceControl.openTransaction(); + SurfaceControl.closeTransactionSync(); + bm = SurfaceControl.screenshot(crop, width, height, minLayer, maxLayer, inRotation, rot); if (bm == null) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index c15afb339646..be27c82d61fc 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2111,7 +2111,9 @@ final class WindowState implements WindowManagerPolicy.WindowState { void clearHasSavedSurface() { mSurfaceSaved = false; mAnimatingWithSavedSurface = false; - mWasVisibleBeforeClientHidden = false; + if (mWasVisibleBeforeClientHidden) { + mAppToken.destroySavedSurfaces(); + } } boolean clearAnimatingWithSavedSurface() { diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 308b24dd8dd6..4148cd07681f 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -1301,6 +1301,14 @@ class WindowSurfacePlacer { appsCount = mService.mClosingApps.size(); for (int i = 0; i < appsCount; i++) { AppWindowToken wtoken = mService.mClosingApps.valueAt(i); + + // If we still have some windows animating with saved surfaces that's + // either invisible or already removed, mark them exiting so that they + // are disposed of after the exit animation. These are not supposed to + // be shown, or are delayed removal until app is actually drawn (in which + // case the window will be removed after the animation). + wtoken.markSavedSurfaceExiting(); + final AppWindowAnimator appAnimator = wtoken.mAppAnimator; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken); appAnimator.clearThumbnail(); diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 2e82cec7e9d9..2f72a5cd1ab5 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -207,7 +207,6 @@ public: void setPointerIconType(int32_t iconId); void reloadPointerIcons(); void setCustomPointerIcon(const SpriteIcon& icon); - void setPointerIconDetached(bool detached); /* --- InputReaderPolicyInterface implementation --- */ @@ -712,14 +711,6 @@ void NativeInputManager::setFocusedApplication(JNIEnv* env, jobject applicationH mInputManager->getDispatcher()->setFocusedApplication(applicationHandle); } -void NativeInputManager::setPointerIconDetached(bool detached) { - AutoMutex _l(mLock); - sp<PointerController> controller = mLocked.pointerController.promote(); - if (controller != NULL) { - controller->detachPointerIcon(detached); - } -} - void NativeInputManager::setInputDispatchMode(bool enabled, bool frozen) { mInputManager->getDispatcher()->setInputDispatchMode(enabled, frozen); } @@ -1332,12 +1323,6 @@ static void nativeSetFocusedApplication(JNIEnv* env, jclass /* clazz */, im->setFocusedApplication(env, applicationHandleObj); } -static void nativeSetPointerIconDetached(JNIEnv* env, jclass /* clazz */, jlong ptr, - jboolean detached) { - NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); - im->setPointerIconDetached(detached); -} - static void nativeSetInputDispatchMode(JNIEnv* /* env */, jclass /* clazz */, jlong ptr, jboolean enabled, jboolean frozen) { NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); @@ -1520,8 +1505,6 @@ static const JNINativeMethod gInputManagerMethods[] = { (void*) nativeSetInputWindows }, { "nativeSetFocusedApplication", "(JLcom/android/server/input/InputApplicationHandle;)V", (void*) nativeSetFocusedApplication }, - { "nativeSetPointerIconDetached", "(JZ)V", - (void*) nativeSetPointerIconDetached }, { "nativeSetInputDispatchMode", "(JZZ)V", (void*) nativeSetInputDispatchMode }, { "nativeSetSystemUiVisibility", "(JI)V", diff --git a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp index 8ea9bfc04662..06d2031e4a4a 100644 --- a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp +++ b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp @@ -78,7 +78,7 @@ static inline void ThrowOnError( env->ThrowNew(exceptionClass, methodName); } -static bool IsValidCallbackThread() { +static bool IsValidCallbackThreadEnvOnly() { JNIEnv* env = AndroidRuntime::getJNIEnv(); if(sCallbackEnv == NULL || sCallbackEnv != env) { @@ -89,6 +89,20 @@ static bool IsValidCallbackThread() { return true; } +static bool IsValidCallbackThread() { + // sCallbacksObject is created when FlpHardwareProvider on Java side is + // initialized. Sometimes the hardware may call a function before the Java + // side is ready. In order to prevent a system crash, check whether + // sCallbacksObj has been created. If not, simply ignore this event from + // hardware. + if (sCallbacksObj == NULL) { + ALOGE("Attempt to use FlpHardwareProvider blocked, because it hasn't been initialized."); + return false; + } + + return IsValidCallbackThreadEnvOnly(); +} + static void BatchingCapabilitiesCallback(int32_t capabilities) { if(!IsValidCallbackThread()) { return; @@ -154,7 +168,7 @@ static int SetThreadEvent(ThreadEvent event) { } case DISASSOCIATE_JVM: { - if (!IsValidCallbackThread()) { + if (!IsValidCallbackThreadEnvOnly()) { ALOGE( "Attempted to dissasociate an unnownk callback thread : '%s'.", __FUNCTION__ @@ -661,16 +675,6 @@ static void GeofenceMonitorStatusCallback( TranslateToObject(lastLocation, locationObject); } - // sCallbacksObject is created when FlpHardwareProvider on Java side is - // initialized. Sometimes the hardware may call this function before the Java - // side is ready. In order to prevent the system crash, check whether - // sCallbacksObj has been created. If not, simply ignore this event from - // hardware. - if (sCallbacksObj == NULL) { - ALOGE("FlpHardwareProvider hasn't been initialized."); - return; - } - sCallbackEnv->CallVoidMethod( sCallbacksObj, sOnGeofenceMonitorStatus, diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 78efd055aa6d..613fae4916b6 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -837,28 +837,9 @@ public class CarrierConfigManager { * @param subId the subscription ID, normally obtained from {@link SubscriptionManager}. * @return A {@link PersistableBundle} containing the config for the given subId, or default * values for an invalid subId. - * - * @deprecated use getConfig. */ @Nullable public PersistableBundle getConfigForSubId(int subId) { - return getConfig(subId); - } - - /** - * Gets the configuration values for a particular subscription, which is associated with a - * specific SIM card. If an invalid subId is used, the returned config will contain default - * values. - * - * <p>Requires Permission: - * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} - * - * @param subId the subscription ID, normally obtained from {@link SubscriptionManager}. - * @return A {@link PersistableBundle} containing the config for the given subId, or default - * values for an invalid subId. - */ - @Nullable - public PersistableBundle getConfig(int subId) { try { ICarrierConfigLoader loader = getICarrierConfigLoader(); if (loader == null) { @@ -880,11 +861,11 @@ public class CarrierConfigManager { * <p>Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * - * @return A {@link PersistableBundle} containing the config for the default subscription. + * @see #getConfigForSubId */ @Nullable public PersistableBundle getConfig() { - return getConfig(SubscriptionManager.getDefaultSubscriptionId()); + return getConfigForSubId(SubscriptionManager.getDefaultSubscriptionId()); } /** @@ -901,29 +882,8 @@ public class CarrierConfigManager { * {@link android.service.carrier.CarrierService#onLoadConfig} will be called from an * arbitrary thread. * </p> - * - * @deprecated use notifyConfigChanged. */ public void notifyConfigChangedForSubId(int subId) { - notifyConfigChanged(subId); - } - - /** - * Calling this method triggers telephony services to fetch the current carrier configuration. - * <p> - * Normally this does not need to be called because the platform reloads config on its own. - * This should be called by a carrier service app if it wants to update config at an arbitrary - * moment. - * </p> - * <p>Requires that the calling app has carrier privileges. - * @see #hasCarrierPrivileges - * <p> - * This method returns before the reload has completed, and - * {@link android.service.carrier.CarrierService#onLoadConfig} will be called from an - * arbitrary thread. - * </p> - */ - public void notifyConfigChanged(int subId) { try { ICarrierConfigLoader loader = getICarrierConfigLoader(); if (loader == null) { diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 5fed594d7207..2304346abdb4 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -66,6 +66,12 @@ import java.util.regex.Pattern; * a reference to an instance through * {@link android.content.Context#getSystemService * Context.getSystemService(Context.TELEPHONY_SERVICE)}. + * + * The returned TelephonyManager will use the default subscription for all calls. + * To call an API for a specific subscription, use {@link #createForSubscriptionId(int)}. e.g. + * <code> + * telephonyManager = defaultSubTelephonyManager.createForSubscriptionId(subId); + * </code> * <p> * Note that access to some telephony information is * permission-protected. Your application cannot access the protected @@ -101,6 +107,7 @@ public class TelephonyManager { } private final Context mContext; + private final int mSubId; private SubscriptionManager mSubscriptionManager; private static String multiSimConfig = @@ -121,6 +128,12 @@ public class TelephonyManager { /** @hide */ public TelephonyManager(Context context) { + this(context, SubscriptionManager.DEFAULT_SUBSCRIPTION_ID); + } + + /** @hide */ + public TelephonyManager(Context context, int subId) { + mSubId = subId; Context appContext = context.getApplicationContext(); if (appContext != null) { mContext = appContext; @@ -138,6 +151,7 @@ public class TelephonyManager { /** @hide */ private TelephonyManager() { mContext = null; + mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; } private static TelephonyManager sInstance = new TelephonyManager(); @@ -231,6 +245,16 @@ public class TelephonyManager { return (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); } + /** + * Create a new TelephonyManager object pinned to the given subscription ID. + * + * @return a TelephonyManager that uses the given subId for all calls. + */ + public TelephonyManager createForSubscriptionId(int subId) { + // Don't reuse any TelephonyManager objects. + return new TelephonyManager(mContext, subId); + } + /** {@hide} */ public boolean isMultiSimEnabled() { return (multiSimConfig.equals("dsds") || multiSimConfig.equals("dsda") || @@ -923,7 +947,7 @@ public class TelephonyManager { * @hide */ public void enableLocationUpdates() { - enableLocationUpdates(getDefaultSubscription()); + enableLocationUpdates(getSubId()); } /** @@ -935,8 +959,8 @@ public class TelephonyManager { * CONTROL_LOCATION_UPDATES} * * @param subId for which the location updates are enabled + * @hide */ - /** @hide */ public void enableLocationUpdates(int subId) { try { ITelephony telephony = getITelephony(); @@ -957,7 +981,7 @@ public class TelephonyManager { * @hide */ public void disableLocationUpdates() { - disableLocationUpdates(getDefaultSubscription()); + disableLocationUpdates(getSubId()); } /** @hide */ @@ -1018,7 +1042,7 @@ public class TelephonyManager { */ @SystemApi public int getCurrentPhoneType() { - return getCurrentPhoneType(getDefaultSubscription()); + return getCurrentPhoneType(getSubId()); } /** @@ -1029,8 +1053,8 @@ public class TelephonyManager { * @see #PHONE_TYPE_CDMA * * @param subId for which phone type is returned + * @hide */ - /** {@hide} */ @SystemApi public int getCurrentPhoneType(int subId) { int phoneId; @@ -1258,7 +1282,7 @@ public class TelephonyManager { * on a CDMA network). */ public String getNetworkOperatorName() { - return getNetworkOperatorName(getDefaultSubscription()); + return getNetworkOperatorName(getSubId()); } /** @@ -1269,6 +1293,7 @@ public class TelephonyManager { * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if * on a CDMA network). * @param subId + * @hide */ public String getNetworkOperatorName(int subId) { int phoneId = SubscriptionManager.getPhoneId(subId); @@ -1295,6 +1320,7 @@ public class TelephonyManager { * on a CDMA network). * * @param subId + * @hide */ public String getNetworkOperator(int subId) { int phoneId = SubscriptionManager.getPhoneId(subId); @@ -1323,7 +1349,7 @@ public class TelephonyManager { * Availability: Only when user registered to a network. */ public boolean isNetworkRoaming() { - return isNetworkRoaming(getDefaultSubscription()); + return isNetworkRoaming(getSubId()); } /** @@ -1333,6 +1359,7 @@ public class TelephonyManager { * Availability: Only when user registered to a network. * * @param subId + * @hide */ public boolean isNetworkRoaming(int subId) { int phoneId = SubscriptionManager.getPhoneId(subId); @@ -1361,6 +1388,7 @@ public class TelephonyManager { * on a CDMA network). * * @param subId for which Network CountryIso is returned + * @hide */ public String getNetworkCountryIso(int subId) { int phoneId = SubscriptionManager.getPhoneId(subId); @@ -1469,6 +1497,7 @@ public class TelephonyManager { * <p> * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * @hide */ public int getNetworkType(int subId) { try { @@ -1513,10 +1542,9 @@ public class TelephonyManager { * <p> * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} - * @hide */ public int getDataNetworkType() { - return getDataNetworkType(getDefaultSubscription()); + return getDataNetworkType(getSubId()); } /** @@ -1529,6 +1557,7 @@ public class TelephonyManager { * <p> * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * @hide */ public int getDataNetworkType(int subId) { try{ @@ -1554,10 +1583,9 @@ public class TelephonyManager { * <p> * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} - * @hide */ public int getVoiceNetworkType() { - return getVoiceNetworkType(getDefaultSubscription()); + return getVoiceNetworkType(getSubId()); } /** @@ -1566,6 +1594,7 @@ public class TelephonyManager { * <p> * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * @hide */ public int getVoiceNetworkType(int subId) { try{ @@ -1835,6 +1864,7 @@ public class TelephonyManager { * @see #getSimState * * @param subId for which SimOperator is returned + * @hide */ public String getSimOperator(int subId) { return getSimOperatorNumeric(subId); @@ -1911,6 +1941,7 @@ public class TelephonyManager { * @see #getSimState * * @param subId for which SimOperatorName is returned + * @hide */ public String getSimOperatorName(int subId) { int phoneId = SubscriptionManager.getPhoneId(subId); @@ -1938,6 +1969,7 @@ public class TelephonyManager { * Returns the ISO country code equivalent for the SIM provider's country code. * * @param subId for which SimCountryIso is returned + * @hide */ public String getSimCountryIso(int subId) { int phoneId = SubscriptionManager.getPhoneId(subId); @@ -1962,7 +1994,7 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} */ public String getSimSerialNumber() { - return getSimSerialNumber(getDefaultSubscription()); + return getSimSerialNumber(getSubId()); } /** @@ -1972,6 +2004,7 @@ public class TelephonyManager { * @param subId for which Sim Serial number is returned * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * @hide */ public String getSimSerialNumber(int subId) { try { @@ -2002,7 +2035,7 @@ public class TelephonyManager { * @hide */ public int getLteOnCdmaMode() { - return getLteOnCdmaMode(getDefaultSubscription()); + return getLteOnCdmaMode(getSubId()); } /** @@ -2017,8 +2050,8 @@ public class TelephonyManager { * <p> * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * @hide */ - /** {@hide} */ public int getLteOnCdmaMode(int subId) { try { ITelephony telephony = getITelephony(); @@ -2048,7 +2081,7 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} */ public String getSubscriberId() { - return getSubscriberId(getDefaultSubscription()); + return getSubscriberId(getSubId()); } /** @@ -2060,6 +2093,7 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * * @param subId whose subscriber id is returned + * @hide */ public String getSubscriberId(int subId) { try { @@ -2104,6 +2138,7 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * * @param subId whose subscriber id is returned + * @hide */ public String getGroupIdLevel1(int subId) { try { @@ -2131,7 +2166,7 @@ public class TelephonyManager { * The default SMS app can also use this. */ public String getLine1Number() { - return getLine1Number(getDefaultSubscription()); + return getLine1Number(getSubId()); } /** @@ -2146,6 +2181,7 @@ public class TelephonyManager { * The default SMS app can also use this. * * @param subId whose phone number for line 1 is returned + * @hide */ public String getLine1Number(int subId) { String number = null; @@ -2186,7 +2222,7 @@ public class TelephonyManager { * @return true if the operation was executed correctly. */ public boolean setLine1NumberForDisplay(String alphaTag, String number) { - return setLine1NumberForDisplay(getDefaultSubscription(), alphaTag, number); + return setLine1NumberForDisplay(getSubId(), alphaTag, number); } /** @@ -2202,6 +2238,7 @@ public class TelephonyManager { * @param alphaTag alpha-tagging of the dailing nubmer * @param number The dialing number * @return true if the operation was executed correctly. + * @hide */ public boolean setLine1NumberForDisplay(int subId, String alphaTag, String number) { try { @@ -2224,7 +2261,7 @@ public class TelephonyManager { * nobody seems to call this. */ public String getLine1AlphaTag() { - return getLine1AlphaTag(getDefaultSubscription()); + return getLine1AlphaTag(getSubId()); } /** @@ -2236,6 +2273,7 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * @param subId whose alphabetic identifier associated with line 1 is returned * nobody seems to call this. + * @hide */ public String getLine1AlphaTag(int subId) { String alphaTag = null; @@ -2292,7 +2330,7 @@ public class TelephonyManager { * @hide */ public String getMsisdn() { - return getMsisdn(getDefaultSubscription()); + return getMsisdn(getSubId()); } /** @@ -2303,8 +2341,8 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * * @param subId for which msisdn is returned + * @hide */ - /** {@hide} */ public String getMsisdn(int subId) { try { IPhoneSubInfo info = getSubscriberInfo(); @@ -2326,7 +2364,7 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} */ public String getVoiceMailNumber() { - return getVoiceMailNumber(getDefaultSubscription()); + return getVoiceMailNumber(getSubId()); } /** @@ -2336,6 +2374,7 @@ public class TelephonyManager { * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * @param subId whose voice mail number is returned + * @hide */ public String getVoiceMailNumber(int subId) { try { @@ -2360,7 +2399,7 @@ public class TelephonyManager { * @hide */ public String getCompleteVoiceMailNumber() { - return getCompleteVoiceMailNumber(getDefaultSubscription()); + return getCompleteVoiceMailNumber(getSubId()); } /** @@ -2370,8 +2409,8 @@ public class TelephonyManager { * {@link android.Manifest.permission#CALL_PRIVILEGED CALL_PRIVILEGED} * * @param subId + * @hide */ - /** {@hide} */ public String getCompleteVoiceMailNumber(int subId) { try { IPhoneSubInfo info = getSubscriberInfo(); @@ -2396,7 +2435,7 @@ public class TelephonyManager { * @param number The voicemail number. */ public boolean setVoiceMailNumber(String alphaTag, String number) { - return setVoiceMailNumber(getDefaultSubscription(), alphaTag, number); + return setVoiceMailNumber(getSubId(), alphaTag, number); } /** @@ -2408,6 +2447,7 @@ public class TelephonyManager { * @param subId The subscription id. * @param alphaTag The alpha tag to display. * @param number The voicemail number. + * @hide */ public boolean setVoiceMailNumber(int subId, String alphaTag, String number) { try { @@ -2429,7 +2469,7 @@ public class TelephonyManager { * @hide */ public int getVoiceMessageCount() { - return getVoiceMessageCount(getDefaultSubscription()); + return getVoiceMessageCount(getSubId()); } /** @@ -2438,8 +2478,8 @@ public class TelephonyManager { * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * @param subId whose voice message count is returned + * @hide */ - /** {@hide} */ public int getVoiceMessageCount(int subId) { try { ITelephony telephony = getITelephony(); @@ -2462,7 +2502,7 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} */ public String getVoiceMailAlphaTag() { - return getVoiceMailAlphaTag(getDefaultSubscription()); + return getVoiceMailAlphaTag(getSubId()); } /** @@ -2473,6 +2513,7 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * @param subId whose alphabetic identifier associated with the * voice mail number is returned + * @hide */ public String getVoiceMailAlphaTag(int subId) { try { @@ -2590,6 +2631,7 @@ public class TelephonyManager { * for a subscription. * * @param subId whose call state is returned + * @hide */ public int getCallState(int subId) { int phoneId = SubscriptionManager.getPhoneId(subId); @@ -2759,7 +2801,7 @@ public class TelephonyManager { * @hide */ public int getCdmaEriIconIndex() { - return getCdmaEriIconIndex(getDefaultSubscription()); + return getCdmaEriIconIndex(getSubId()); } /** @@ -2767,8 +2809,8 @@ public class TelephonyManager { * <p> * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * @hide */ - /** {@hide} */ public int getCdmaEriIconIndex(int subId) { try { ITelephony telephony = getITelephony(); @@ -2794,7 +2836,7 @@ public class TelephonyManager { * @hide */ public int getCdmaEriIconMode() { - return getCdmaEriIconMode(getDefaultSubscription()); + return getCdmaEriIconMode(getSubId()); } /** @@ -2805,8 +2847,8 @@ public class TelephonyManager { * <p> * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * @hide */ - /** {@hide} */ public int getCdmaEriIconMode(int subId) { try { ITelephony telephony = getITelephony(); @@ -2830,7 +2872,7 @@ public class TelephonyManager { * @hide */ public String getCdmaEriText() { - return getCdmaEriText(getDefaultSubscription()); + return getCdmaEriText(getSubId()); } /** @@ -2839,8 +2881,8 @@ public class TelephonyManager { * <p> * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * @hide */ - /** {@hide} */ public String getCdmaEriText(int subId) { try { ITelephony telephony = getITelephony(); @@ -2993,7 +3035,7 @@ public class TelephonyManager { * @return an IccOpenLogicalChannelResponse object. */ public IccOpenLogicalChannelResponse iccOpenLogicalChannel(String AID) { - return iccOpenLogicalChannel(getDefaultSubscription(), AID); + return iccOpenLogicalChannel(getSubId(), AID); } /** @@ -3008,6 +3050,7 @@ public class TelephonyManager { * @param subId The subscription to use. * @param AID Application id. See ETSI 102.221 and 101.220. * @return an IccOpenLogicalChannelResponse object. + * @hide */ public IccOpenLogicalChannelResponse iccOpenLogicalChannel(int subId, String AID) { try { @@ -3034,7 +3077,7 @@ public class TelephonyManager { * @return true if the channel was closed successfully. */ public boolean iccCloseLogicalChannel(int channel) { - return iccCloseLogicalChannel(getDefaultSubscription(), channel); + return iccCloseLogicalChannel(getSubId(), channel); } /** @@ -3050,6 +3093,7 @@ public class TelephonyManager { * @param channel is the channel id to be closed as retruned by a successful * iccOpenLogicalChannel. * @return true if the channel was closed successfully. + * @hide */ public boolean iccCloseLogicalChannel(int subId, int channel) { try { @@ -3085,7 +3129,7 @@ public class TelephonyManager { */ public String iccTransmitApduLogicalChannel(int channel, int cla, int instruction, int p1, int p2, int p3, String data) { - return iccTransmitApduLogicalChannel(getDefaultSubscription(), channel, cla, + return iccTransmitApduLogicalChannel(getSubId(), channel, cla, instruction, p1, p2, p3, data); } @@ -3110,6 +3154,7 @@ public class TelephonyManager { * @param data Data to be sent with the APDU. * @return The APDU response from the ICC card with the status appended at * the end. + * @hide */ public String iccTransmitApduLogicalChannel(int subId, int channel, int cla, int instruction, int p1, int p2, int p3, String data) { @@ -3145,7 +3190,7 @@ public class TelephonyManager { */ public String iccTransmitApduBasicChannel(int cla, int instruction, int p1, int p2, int p3, String data) { - return iccTransmitApduBasicChannel(getDefaultSubscription(), cla, + return iccTransmitApduBasicChannel(getSubId(), cla, instruction, p1, p2, p3, data); } @@ -3168,6 +3213,7 @@ public class TelephonyManager { * @param data Data to be sent with the APDU. * @return The APDU response from the ICC card with the status appended at * the end. + * @hide */ public String iccTransmitApduBasicChannel(int subId, int cla, int instruction, int p1, int p2, int p3, String data) { @@ -3199,7 +3245,7 @@ public class TelephonyManager { */ public byte[] iccExchangeSimIO(int fileID, int command, int p1, int p2, int p3, String filePath) { - return iccExchangeSimIO(getDefaultSubscription(), fileID, command, p1, p2, p3, filePath); + return iccExchangeSimIO(getSubId(), fileID, command, p1, p2, p3, filePath); } /** @@ -3217,6 +3263,7 @@ public class TelephonyManager { * @param p3 P3 value of the APDU command. * @param filePath * @return The APDU response. + * @hide */ public byte[] iccExchangeSimIO(int subId, int fileID, int command, int p1, int p2, int p3, String filePath) { @@ -3245,7 +3292,7 @@ public class TelephonyManager { * returns an empty string. */ public String sendEnvelopeWithStatus(String content) { - return sendEnvelopeWithStatus(getDefaultSubscription(), content); + return sendEnvelopeWithStatus(getSubId(), content); } /** @@ -3262,6 +3309,7 @@ public class TelephonyManager { * @return The APDU response from the ICC card in hexadecimal format * with the last 4 bytes being the status word. If the command fails, * returns an empty string. + * @hide */ public String sendEnvelopeWithStatus(int subId, String content) { try { @@ -3381,6 +3429,19 @@ public class TelephonyManager { } /** + * Return an appropriate subscription ID for any situation. + * + * If this object has been created with {@link #createForSubscriptionId}, then the provided + * subId is returned. Otherwise, the default subId will be returned. + */ + private int getSubId() { + if (mSubId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID) { + return getDefaultSubscription(); + } + return mSubId; + } + + /** * Returns Default subscription. */ private static int getDefaultSubscription() { @@ -3662,7 +3723,7 @@ public class TelephonyManager { * @see #hasCarrierPrivileges */ public String getIccAuthentication(int appType, int authType, String data) { - return getIccAuthentication(getDefaultSubscription(), appType, authType, data); + return getIccAuthentication(getSubId(), appType, authType, data); } /** @@ -3680,8 +3741,8 @@ public class TelephonyManager { * @return the response of authentication, or null if not available * * @see #hasCarrierPrivileges + * @hide */ - public String getIccAuthentication(int subId, int appType, int authType, String data) { try { IPhoneSubInfo info = getSubscriberInfo(); @@ -3760,6 +3821,7 @@ public class TelephonyManager { * Or the calling app has carrier privileges. @see #hasCarrierPrivileges * * @hide + * TODO: Add an overload that takes no args. */ public void setNetworkSelectionModeAutomatic(int subId) { try { @@ -3785,6 +3847,7 @@ public class TelephonyManager { * Or the calling app has carrier privileges. @see #hasCarrierPrivileges * * @hide + * TODO: Add an overload that takes no args. */ public CellNetworkScanResult getCellNetworkScanResults(int subId) { try { @@ -3808,6 +3871,7 @@ public class TelephonyManager { * Or the calling app has carrier privileges. @see #hasCarrierPrivileges * * @hide + * TODO: Add an overload that takes no args. */ public boolean setNetworkSelectionModeManual(int subId, OperatorInfo operator, boolean persistSelection) { @@ -3859,7 +3923,7 @@ public class TelephonyManager { * @return true on success; false on any failure. */ public boolean setPreferredNetworkTypeToGlobal() { - return setPreferredNetworkTypeToGlobal(getDefaultSubscription()); + return setPreferredNetworkTypeToGlobal(getSubId()); } /** @@ -3870,6 +3934,7 @@ public class TelephonyManager { * @see #hasCarrierPrivileges * * @return true on success; false on any failure. + * @hide */ public boolean setPreferredNetworkTypeToGlobal(int subId) { return setPreferredNetworkType(subId, RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA); @@ -3919,7 +3984,7 @@ public class TelephonyManager { * @return true if the app has carrier privileges. */ public boolean hasCarrierPrivileges() { - return hasCarrierPrivileges(getDefaultSubscription()); + return hasCarrierPrivileges(getSubId()); } /** @@ -3931,12 +3996,13 @@ public class TelephonyManager { * * @param subId The subscription to use. * @return true if the app has carrier privileges. + * @hide */ public boolean hasCarrierPrivileges(int subId) { try { ITelephony telephony = getITelephony(); if (telephony != null) { - return telephony.getCarrierPrivilegeStatus(subId) == + return telephony.getCarrierPrivilegeStatus(mSubId) == CARRIER_PRIVILEGE_STATUS_HAS_ACCESS; } } catch (RemoteException ex) { @@ -3962,7 +4028,7 @@ public class TelephonyManager { * @return true if the operation was executed correctly. */ public boolean setOperatorBrandOverride(String brand) { - return setOperatorBrandOverride(getDefaultSubscription(), brand); + return setOperatorBrandOverride(getSubId(), brand); } /** @@ -3979,6 +4045,7 @@ public class TelephonyManager { * @param subId The subscription to use. * @param brand The brand name to display/set. * @return true if the operation was executed correctly. + * @hide */ public boolean setOperatorBrandOverride(int subId, String brand) { try { @@ -4015,7 +4082,7 @@ public class TelephonyManager { public boolean setRoamingOverride(List<String> gsmRoamingList, List<String> gsmNonRoamingList, List<String> cdmaRoamingList, List<String> cdmaNonRoamingList) { - return setRoamingOverride(getDefaultSubscription(), gsmRoamingList, gsmNonRoamingList, + return setRoamingOverride(getSubId(), gsmRoamingList, gsmNonRoamingList, cdmaRoamingList, cdmaNonRoamingList); } @@ -4062,7 +4129,7 @@ public class TelephonyManager { /** @hide */ @SystemApi public String getCdmaMdn() { - return getCdmaMdn(getDefaultSubscription()); + return getCdmaMdn(getSubId()); } /** @hide */ @@ -4083,7 +4150,7 @@ public class TelephonyManager { /** @hide */ @SystemApi public String getCdmaMin() { - return getCdmaMin(getDefaultSubscription()); + return getCdmaMin(getSubId()); } /** @hide */ @@ -4626,7 +4693,8 @@ public class TelephonyManager { * retrieves value for setting "name", and if that is not found throws * SettingNotFoundException * - * @hide */ + * @hide + */ public static int getIntWithSubId(ContentResolver cr, String name, int subId) throws SettingNotFoundException { try { diff --git a/test-runner/src/android/test/mock/MockContentProvider.java b/test-runner/src/android/test/mock/MockContentProvider.java index 3743fb0811f8..5ef71df341bf 100644 --- a/test-runner/src/android/test/mock/MockContentProvider.java +++ b/test-runner/src/android/test/mock/MockContentProvider.java @@ -41,12 +41,7 @@ import java.util.ArrayList; * Mock implementation of ContentProvider. All methods are non-functional and throw * {@link java.lang.UnsupportedOperationException}. Tests can extend this class to * implement behavior needed for tests. - * - * @deprecated Use a mocking framework like <a href="https://github.com/mockito/mockito">Mockito</a>. - * New tests should be written using the - * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>. */ -@Deprecated public class MockContentProvider extends ContentProvider { /* * Note: if you add methods to ContentProvider, you must add similar methods to diff --git a/test-runner/src/android/test/mock/MockContentResolver.java b/test-runner/src/android/test/mock/MockContentResolver.java index 75c8335b6653..d8e097756c66 100644 --- a/test-runner/src/android/test/mock/MockContentResolver.java +++ b/test-runner/src/android/test/mock/MockContentResolver.java @@ -49,12 +49,7 @@ import java.util.Map; * <p>For more information about application testing, read the * <a href="{@docRoot}guide/topics/testing/index.html">Testing</a> developer guide.</p> * </div> - * - * @deprecated Use a mocking framework like <a href="https://github.com/mockito/mockito">Mockito</a>. - * New tests should be written using the - * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>. */ -@Deprecated public class MockContentResolver extends ContentResolver { Map<String, ContentProvider> mProviders; diff --git a/test-runner/src/android/test/mock/MockContext.java b/test-runner/src/android/test/mock/MockContext.java index c7cbf977d7d7..b14fc41632b3 100644 --- a/test-runner/src/android/test/mock/MockContext.java +++ b/test-runner/src/android/test/mock/MockContext.java @@ -55,12 +55,7 @@ import java.io.InputStream; * A mock {@link android.content.Context} class. All methods are non-functional and throw * {@link java.lang.UnsupportedOperationException}. You can use this to inject other dependencies, * mocks, or monitors into the classes you are testing. - * - * @deprecated Use a mocking framework like <a href="https://github.com/mockito/mockito">Mockito</a>. - * New tests should be written using the - * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>. */ -@Deprecated public class MockContext extends Context { @Override diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java index cbd041593d95..1afd90d39f31 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/Layout.java @@ -23,6 +23,7 @@ import com.android.ide.common.rendering.api.SessionParams; import com.android.ide.common.rendering.api.StyleResourceValue; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.android.BridgeContext; +import com.android.layoutlib.bridge.android.RenderParamsFlags; import com.android.layoutlib.bridge.bars.AppCompatActionBar; import com.android.layoutlib.bridge.bars.BridgeActionBar; import com.android.layoutlib.bridge.bars.Config; @@ -232,8 +233,10 @@ class Layout extends RelativeLayout { private BridgeActionBar createActionBar(@NonNull BridgeContext context, @NonNull SessionParams params) { + boolean isMenu = "menu".equals(params.getFlag(RenderParamsFlags.FLAG_KEY_ROOT_TAG)); + BridgeActionBar actionBar; - if (mBuilder.isThemeAppCompat()) { + if (mBuilder.isThemeAppCompat() && !isMenu) { actionBar = new AppCompatActionBar(context, params); } else { actionBar = new FrameworkActionBar(context, params); |