diff options
457 files changed, 6096 insertions, 4135 deletions
diff --git a/Android.bp b/Android.bp index fb6ff0fb6dbc..b4ce5de18532 100644 --- a/Android.bp +++ b/Android.bp @@ -108,6 +108,7 @@ java_defaults { "core/java/android/app/prediction/IPredictionCallback.aidl", "core/java/android/app/prediction/IPredictionManager.aidl", "core/java/android/app/role/IOnRoleHoldersChangedListener.aidl", + "core/java/android/app/role/IRoleController.aidl", "core/java/android/app/role/IRoleManager.aidl", "core/java/android/app/role/IRoleManagerCallback.aidl", "core/java/android/app/slice/ISliceManager.aidl", @@ -225,6 +226,8 @@ java_defaults { "core/java/android/net/INetworkScoreService.aidl", "core/java/android/net/INetworkStatsService.aidl", "core/java/android/net/INetworkStatsSession.aidl", + "core/java/android/net/ITestNetworkManager.aidl", + "core/java/android/net/ITetheringEventCallback.aidl", "core/java/android/net/ITetheringStatsProvider.aidl", "core/java/android/net/nsd/INsdManager.aidl", "core/java/android/nfc/IAppCallback.aidl", @@ -274,7 +277,6 @@ java_defaults { "core/java/android/os/storage/IStorageShutdownObserver.aidl", "core/java/android/os/storage/IObbActionListener.aidl", "core/java/android/permission/IPermissionController.aidl", - "core/java/android/rolecontrollerservice/IRoleControllerService.aidl", ":keystore_aidl", "core/java/android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl", "core/java/android/service/appprediction/IPredictionService.aidl", @@ -604,6 +606,7 @@ java_defaults { "telephony/java/com/android/internal/telephony/IOns.aidl", "telephony/java/com/android/internal/telephony/ITelephony.aidl", "telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl", + "telephony/java/com/android/internal/telephony/IUpdateAvailableNetworksCallback.aidl", "telephony/java/com/android/internal/telephony/IWapPushManager.aidl", "telephony/java/com/android/internal/telephony/euicc/IAuthenticateServerCallback.aidl", "telephony/java/com/android/internal/telephony/euicc/ICancelSessionCallback.aidl", diff --git a/api/current.txt b/api/current.txt index 25c676e6646c..63ca6da38c96 100644 --- a/api/current.txt +++ b/api/current.txt @@ -3947,7 +3947,7 @@ package android.app { method public android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName) throws java.lang.SecurityException; method @Deprecated public java.util.List<android.app.ActivityManager.RunningServiceInfo> getRunningServices(int) throws java.lang.SecurityException; method @Deprecated public java.util.List<android.app.ActivityManager.RunningTaskInfo> getRunningTasks(int) throws java.lang.SecurityException; - method public boolean isActivityStartAllowedOnDisplay(android.content.Context, int, android.content.Intent); + method public boolean isActivityStartAllowedOnDisplay(@NonNull android.content.Context, int, @NonNull android.content.Intent); method public boolean isBackgroundRestricted(); method @Deprecated public boolean isInLockTaskMode(); method public boolean isLowRamDevice(); @@ -4454,7 +4454,7 @@ package android.app { ctor public AutomaticZenRule(android.os.Parcel); method public int describeContents(); method public android.net.Uri getConditionId(); - method public android.content.ComponentName getConfigurationActivity(); + method @Nullable public android.content.ComponentName getConfigurationActivity(); method public long getCreationTime(); method public int getInterruptionFilter(); method public String getName(); @@ -4462,7 +4462,7 @@ package android.app { method public android.service.notification.ZenPolicy getZenPolicy(); method public boolean isEnabled(); method public void setConditionId(android.net.Uri); - method public void setConfigurationActivity(android.content.ComponentName); + method public void setConfigurationActivity(@Nullable android.content.ComponentName); method public void setEnabled(boolean); method public void setInterruptionFilter(int); method public void setName(String); @@ -5819,10 +5819,9 @@ package android.app { method public void notify(String, int, android.app.Notification); method public void notifyAsPackage(@NonNull String, @NonNull String, int, @NonNull android.app.Notification); method public boolean removeAutomaticZenRule(String); - method public void revokeNotificationDelegate(); method public void setAutomaticZenRuleState(@NonNull String, @NonNull android.service.notification.Condition); method public final void setInterruptionFilter(int); - method public void setNotificationDelegate(@NonNull String); + method public void setNotificationDelegate(@Nullable String); method public void setNotificationPolicy(@NonNull android.app.NotificationManager.Policy); method public boolean shouldHideSilentStatusBarIcons(); method public boolean updateAutomaticZenRule(String, android.app.AutomaticZenRule); @@ -8644,9 +8643,9 @@ package android.bluetooth { } public final class BluetoothHearingAid implements android.bluetooth.BluetoothProfile { - method public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices(); - method public int getConnectionState(android.bluetooth.BluetoothDevice); - method public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]); + method @NonNull public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices(); + method public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice); + method @NonNull public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(@NonNull int[]); field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.hearingaid.profile.action.CONNECTION_STATE_CHANGED"; } @@ -12378,7 +12377,7 @@ package android.content.res { method public String getPositionDescription(); method @AnyRes public int getResourceId(@StyleableRes int, int); method public android.content.res.Resources getResources(); - method @StyleRes public int getSourceResourceId(@StyleableRes int, @StyleRes int); + method @AnyRes public int getSourceResourceId(@StyleableRes int, @AnyRes int); method @Nullable public String getString(@StyleableRes int); method public CharSequence getText(@StyleableRes int); method public CharSequence[] getTextArray(@StyleableRes int); @@ -14461,7 +14460,7 @@ package android.graphics { method public android.graphics.Paint.Style getStyle(); method public android.graphics.Paint.Align getTextAlign(); method public void getTextBounds(String, int, int, android.graphics.Rect); - method public void getTextBounds(CharSequence, int, int, android.graphics.Rect); + method public void getTextBounds(@NonNull CharSequence, int, int, @NonNull android.graphics.Rect); method public void getTextBounds(char[], int, int, android.graphics.Rect); method @NonNull public java.util.Locale getTextLocale(); method @NonNull @Size(min=1) public android.os.LocaleList getTextLocales(); @@ -14480,7 +14479,7 @@ package android.graphics { method public android.graphics.Typeface getTypeface(); method @Px public float getUnderlinePosition(); method @Px public float getUnderlineThickness(); - method public float getWordSpacing(); + method @Px public float getWordSpacing(); method @Deprecated public android.graphics.Xfermode getXfermode(); method public boolean hasGlyph(String); method public final boolean isAntiAlias(); @@ -14536,7 +14535,7 @@ package android.graphics { method public void setTextSkewX(float); method public android.graphics.Typeface setTypeface(android.graphics.Typeface); method public void setUnderlineText(boolean); - method public void setWordSpacing(float); + method public void setWordSpacing(@Px float); method @Deprecated public android.graphics.Xfermode setXfermode(android.graphics.Xfermode); field public static final int ANTI_ALIAS_FLAG = 1; // 0x1 field public static final int CURSOR_AFTER = 0; // 0x0 @@ -15116,13 +15115,13 @@ package android.graphics { method public android.graphics.Typeface.Builder setWeight(@IntRange(from=1, to=1000) int); } - public static class Typeface.CustomFallbackBuilder { + public static final class Typeface.CustomFallbackBuilder { ctor public Typeface.CustomFallbackBuilder(@NonNull android.graphics.fonts.FontFamily); - method public android.graphics.Typeface.CustomFallbackBuilder addCustomFallback(@NonNull android.graphics.fonts.FontFamily); - method public android.graphics.Typeface build(); + method @NonNull public android.graphics.Typeface.CustomFallbackBuilder addCustomFallback(@NonNull android.graphics.fonts.FontFamily); + method @NonNull public android.graphics.Typeface build(); method @IntRange(from=64) public static int getMaxCustomFallbackCount(); - method public android.graphics.Typeface.CustomFallbackBuilder setStyle(@NonNull android.graphics.fonts.FontStyle); - method public android.graphics.Typeface.CustomFallbackBuilder setSystemFallback(@NonNull String); + method @NonNull public android.graphics.Typeface.CustomFallbackBuilder setStyle(@NonNull android.graphics.fonts.FontStyle); + method @NonNull public android.graphics.Typeface.CustomFallbackBuilder setSystemFallback(@NonNull String); } public class Xfermode { @@ -15776,15 +15775,15 @@ package android.graphics.fonts { method @NonNull public java.nio.ByteBuffer getBuffer(); method @Nullable public java.io.File getFile(); method @NonNull public android.os.LocaleList getLocaleList(); - method public android.graphics.fonts.FontStyle getStyle(); + method @NonNull public android.graphics.fonts.FontStyle getStyle(); method @IntRange(from=0) public int getTtcIndex(); } - public static class Font.Builder { + public static final class Font.Builder { ctor public Font.Builder(@NonNull java.nio.ByteBuffer); ctor public Font.Builder(@NonNull java.io.File); - ctor public Font.Builder(@NonNull java.io.FileDescriptor); - ctor public Font.Builder(@NonNull java.io.FileDescriptor, @IntRange(from=0) long, @IntRange(from=0xffffffff) long); + ctor public Font.Builder(@NonNull android.os.ParcelFileDescriptor); + ctor public Font.Builder(@NonNull android.os.ParcelFileDescriptor, @IntRange(from=0) long, @IntRange(from=0xffffffff) long); ctor public Font.Builder(@NonNull android.content.res.AssetManager, @NonNull String); ctor public Font.Builder(@NonNull android.content.res.Resources, int); method @Nullable public android.graphics.fonts.Font build() throws java.io.IOException; @@ -15796,11 +15795,11 @@ package android.graphics.fonts { } public final class FontFamily { - method public android.graphics.fonts.Font getFont(@IntRange(from=0) int); - method public int getSize(); + method @NonNull public android.graphics.fonts.Font getFont(@IntRange(from=0) int); + method @IntRange(from=1) public int getSize(); } - public static class FontFamily.Builder { + public static final class FontFamily.Builder { ctor public FontFamily.Builder(@NonNull android.graphics.fonts.Font); method @NonNull public android.graphics.fonts.FontFamily.Builder addFont(@NonNull android.graphics.fonts.Font); method @NonNull public android.graphics.fonts.FontFamily build(); @@ -15892,7 +15891,7 @@ package android.graphics.pdf { package android.graphics.text { public class LineBreaker { - method public android.graphics.text.LineBreaker.Result computeLineBreaks(@NonNull android.graphics.text.MeasuredText, @NonNull android.graphics.text.LineBreaker.ParagraphConstraints, @IntRange(from=0) int); + method @NonNull public android.graphics.text.LineBreaker.Result computeLineBreaks(@NonNull android.graphics.text.MeasuredText, @NonNull android.graphics.text.LineBreaker.ParagraphConstraints, @IntRange(from=0) int); field public static final int BREAK_STRATEGY_BALANCED = 2; // 0x2 field public static final int BREAK_STRATEGY_HIGH_QUALITY = 1; // 0x1 field public static final int BREAK_STRATEGY_SIMPLE = 0; // 0x0 @@ -15903,13 +15902,13 @@ package android.graphics.text { field public static final int JUSTIFICATION_MODE_NONE = 0; // 0x0 } - public static class LineBreaker.Builder { + public static final class LineBreaker.Builder { ctor public LineBreaker.Builder(); - method public android.graphics.text.LineBreaker build(); - method public android.graphics.text.LineBreaker.Builder setBreakStrategy(int); - method public android.graphics.text.LineBreaker.Builder setHyphenationFrequency(int); - method public android.graphics.text.LineBreaker.Builder setIndents(@Nullable int[]); - method public android.graphics.text.LineBreaker.Builder setJustified(int); + method @NonNull public android.graphics.text.LineBreaker build(); + method @NonNull public android.graphics.text.LineBreaker.Builder setBreakStrategy(int); + method @NonNull public android.graphics.text.LineBreaker.Builder setHyphenationFrequency(int); + method @NonNull public android.graphics.text.LineBreaker.Builder setIndents(@Nullable int[]); + method @NonNull public android.graphics.text.LineBreaker.Builder setJustificationMode(int); } public static class LineBreaker.ParagraphConstraints { @@ -15941,14 +15940,14 @@ package android.graphics.text { method @FloatRange(from=0.0) @Px public float getWidth(@IntRange(from=0) int, @IntRange(from=0) int); } - public static class MeasuredText.Builder { + public static final class MeasuredText.Builder { ctor public MeasuredText.Builder(@NonNull char[]); ctor public MeasuredText.Builder(@NonNull android.graphics.text.MeasuredText); - method public android.graphics.text.MeasuredText.Builder appendReplacementRun(@NonNull android.graphics.Paint, @IntRange(from=0) int, @FloatRange(from=0) float); - method public android.graphics.text.MeasuredText.Builder appendStyleRun(@NonNull android.graphics.Paint, @IntRange(from=0) int, boolean); - method public android.graphics.text.MeasuredText build(); - method public android.graphics.text.MeasuredText.Builder setComputeHyphenation(boolean); - method public android.graphics.text.MeasuredText.Builder setComputeLayout(boolean); + method @NonNull public android.graphics.text.MeasuredText.Builder appendReplacementRun(@NonNull android.graphics.Paint, @IntRange(from=0) int, @Px @FloatRange(from=0) float); + method @NonNull public android.graphics.text.MeasuredText.Builder appendStyleRun(@NonNull android.graphics.Paint, @IntRange(from=0) int, boolean); + method @NonNull public android.graphics.text.MeasuredText build(); + method @NonNull public android.graphics.text.MeasuredText.Builder setComputeHyphenation(boolean); + method @NonNull public android.graphics.text.MeasuredText.Builder setComputeLayout(boolean); } } @@ -25725,7 +25724,7 @@ package android.media { public static class MediaPlayer2.TrackInfo { method @Nullable public android.media.MediaFormat getFormat(); - method @Nullable public String getLanguage(); + method @NonNull public String getLanguage(); method public int getTrackType(); field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2 field public static final int MEDIA_TRACK_TYPE_METADATA = 5; // 0x5 @@ -30090,7 +30089,7 @@ package android.net.wifi { public static final class WifiNetworkSpecifier.Builder { ctor public WifiNetworkSpecifier.Builder(); - method @NonNull public android.net.NetworkSpecifier build(); + method @NonNull public android.net.wifi.WifiNetworkSpecifier build(); method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setBssid(@NonNull android.net.MacAddress); method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setBssidPattern(@NonNull android.net.MacAddress, @NonNull android.net.MacAddress); method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setIsEnhancedOpen(); @@ -30565,7 +30564,7 @@ package android.net.wifi.p2p { } public static interface WifiP2pManager.NetworkInfoListener { - method public void onNetworkInfoAvailable(android.net.NetworkInfo); + method public void onNetworkInfoAvailable(@NonNull android.net.NetworkInfo); } public static interface WifiP2pManager.P2pStateListener { @@ -30912,10 +30911,10 @@ package android.nfc.cardemulation { method public boolean isDefaultServiceForCategory(android.content.ComponentName, String); method public boolean registerAidsForService(android.content.ComponentName, String, java.util.List<java.lang.String>); method public boolean removeAidsForService(android.content.ComponentName, String); - method public boolean setOffHostForService(android.content.ComponentName, String); + method public boolean setOffHostForService(@NonNull android.content.ComponentName, @NonNull String); method public boolean setPreferredService(android.app.Activity, android.content.ComponentName); method public boolean supportsAidPrefixRegistration(); - method public boolean unsetOffHostForService(android.content.ComponentName); + method public boolean unsetOffHostForService(@NonNull android.content.ComponentName); method public boolean unsetPreferredService(android.app.Activity); field public static final String ACTION_CHANGE_DEFAULT = "android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT"; field public static final String CATEGORY_OTHER = "other"; @@ -34677,46 +34676,46 @@ package android.os { public class Handler { ctor public Handler(); - ctor public Handler(android.os.Handler.Callback); - ctor public Handler(android.os.Looper); - ctor public Handler(android.os.Looper, android.os.Handler.Callback); + ctor public Handler(@Nullable android.os.Handler.Callback); + ctor public Handler(@NonNull android.os.Looper); + ctor public Handler(@NonNull android.os.Looper, @Nullable android.os.Handler.Callback); method @NonNull public static android.os.Handler createAsync(@NonNull android.os.Looper); method @NonNull public static android.os.Handler createAsync(@NonNull android.os.Looper, @NonNull android.os.Handler.Callback); - method public void dispatchMessage(android.os.Message); - method public final void dump(android.util.Printer, String); - method public final android.os.Looper getLooper(); - method public String getMessageName(android.os.Message); - method public void handleMessage(android.os.Message); - method public final boolean hasCallbacks(Runnable); + method public void dispatchMessage(@NonNull android.os.Message); + method public final void dump(@NonNull android.util.Printer, @NonNull String); + method @NonNull public final android.os.Looper getLooper(); + method @NonNull public String getMessageName(@NonNull android.os.Message); + method public void handleMessage(@NonNull android.os.Message); + method public final boolean hasCallbacks(@NonNull Runnable); method public final boolean hasMessages(int); - method public final boolean hasMessages(int, Object); - method public final android.os.Message obtainMessage(); - method public final android.os.Message obtainMessage(int); - method public final android.os.Message obtainMessage(int, Object); - method public final android.os.Message obtainMessage(int, int, int); - method public final android.os.Message obtainMessage(int, int, int, Object); - method public final boolean post(Runnable); - method public final boolean postAtFrontOfQueue(Runnable); - method public final boolean postAtTime(Runnable, long); - method public final boolean postAtTime(Runnable, Object, long); - method public final boolean postDelayed(Runnable, long); - method public final boolean postDelayed(Runnable, Object, long); - method public final void removeCallbacks(Runnable); - method public final void removeCallbacks(Runnable, Object); - method public final void removeCallbacksAndMessages(Object); + method public final boolean hasMessages(int, @Nullable Object); + method @NonNull public final android.os.Message obtainMessage(); + method @NonNull public final android.os.Message obtainMessage(int); + method @NonNull public final android.os.Message obtainMessage(int, @Nullable Object); + method @NonNull public final android.os.Message obtainMessage(int, int, int); + method @NonNull public final android.os.Message obtainMessage(int, int, int, @Nullable Object); + method public final boolean post(@NonNull Runnable); + method public final boolean postAtFrontOfQueue(@NonNull Runnable); + method public final boolean postAtTime(@NonNull Runnable, long); + method public final boolean postAtTime(@NonNull Runnable, @Nullable Object, long); + method public final boolean postDelayed(@NonNull Runnable, long); + method public final boolean postDelayed(@NonNull Runnable, @Nullable Object, long); + method public final void removeCallbacks(@NonNull Runnable); + method public final void removeCallbacks(@NonNull Runnable, @Nullable Object); + method public final void removeCallbacksAndMessages(@Nullable Object); method public final void removeMessages(int); - method public final void removeMessages(int, Object); + method public final void removeMessages(int, @Nullable Object); method public final boolean sendEmptyMessage(int); method public final boolean sendEmptyMessageAtTime(int, long); method public final boolean sendEmptyMessageDelayed(int, long); - method public final boolean sendMessage(android.os.Message); - method public final boolean sendMessageAtFrontOfQueue(android.os.Message); - method public boolean sendMessageAtTime(android.os.Message, long); - method public final boolean sendMessageDelayed(android.os.Message, long); + method public final boolean sendMessage(@NonNull android.os.Message); + method public final boolean sendMessageAtFrontOfQueue(@NonNull android.os.Message); + method public boolean sendMessageAtTime(@NonNull android.os.Message, long); + method public final boolean sendMessageDelayed(@NonNull android.os.Message, long); } public static interface Handler.Callback { - method public boolean handleMessage(android.os.Message); + method public boolean handleMessage(@NonNull android.os.Message); } public class HandlerThread extends java.lang.Thread { @@ -38955,6 +38954,7 @@ package android.provider { field public static final String ACTION_INTERNET_CONNECTIVITY = "android.settings.panel.action.INTERNET_CONNECTIVITY"; field public static final String ACTION_NFC = "android.settings.panel.action.NFC"; field public static final String ACTION_VOLUME = "android.settings.panel.action.VOLUME"; + field public static final String ACTION_WIFI = "android.settings.panel.action.WIFI"; } public static final class Settings.Secure extends android.provider.Settings.NameValueTable { @@ -39257,13 +39257,13 @@ package android.provider { } public static final class Telephony.CarrierId implements android.provider.BaseColumns { - method @NonNull public static android.net.Uri getPreciseCarrierIdUriForSubscriptionId(int); + method @NonNull public static android.net.Uri getSpecificCarrierIdUriForSubscriptionId(int); method public static android.net.Uri getUriForSubscriptionId(int); field public static final String CARRIER_ID = "carrier_id"; field public static final String CARRIER_NAME = "carrier_name"; field public static final android.net.Uri CONTENT_URI; - field public static final String PRECISE_CARRIER_ID = "precise_carrier_id"; - field public static final String PRECISE_CARRIER_ID_NAME = "precise_carrier_id_name"; + field public static final String SPECIFIC_CARRIER_ID = "specific_carrier_id"; + field public static final String SPECIFIC_CARRIER_ID_NAME = "specific_carrier_id_name"; } public static final class Telephony.Carriers implements android.provider.BaseColumns { @@ -41407,7 +41407,7 @@ package android.service.carrier { method @Nullable public String getImsi(); method public String getMcc(); method public String getMnc(); - method public int getPreciseCarrierId(); + method public int getSpecificCarrierId(); method @Nullable public String getSpn(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.service.carrier.CarrierIdentifier> CREATOR; @@ -41763,7 +41763,7 @@ package android.service.notification { method public int getId(); method public String getKey(); method public android.app.Notification getNotification(); - method public String getOpPkg(); + method @NonNull public String getOpPkg(); method public String getOverrideGroupKey(); method public String getPackageName(); method public long getPostTime(); @@ -44135,9 +44135,10 @@ package android.telephony { } public final class AvailableNetworkInfo implements android.os.Parcelable { - ctor public AvailableNetworkInfo(int, int, java.util.List<java.lang.String>); + ctor public AvailableNetworkInfo(int, int, @NonNull java.util.List<java.lang.String>, @NonNull java.util.List<java.lang.Integer>); method public int describeContents(); - method public java.util.List<java.lang.String> getMccMncs(); + method @NonNull public java.util.List<java.lang.Integer> getBands(); + method @NonNull public java.util.List<java.lang.String> getMccMncs(); method public int getPriority(); method public int getSubId(); method public void writeToParcel(android.os.Parcel, int); @@ -44307,6 +44308,7 @@ package android.telephony { field public static final String KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool"; field public static final String KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL = "support_swap_after_merge_bool"; field public static final String KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL = "treat_downgraded_video_calls_as_video_calls_bool"; + field public static final String KEY_TTY_SUPPORTED_BOOL = "tty_supported_bool"; field public static final String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool"; field public static final String KEY_USE_OTASP_FOR_PROVISIONING_BOOL = "use_otasp_for_provisioning_bool"; field public static final String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool"; @@ -44597,7 +44599,7 @@ package android.telephony { public class MbmsGroupCallSession implements java.lang.AutoCloseable { method public void close(); method @Nullable public static android.telephony.MbmsGroupCallSession create(@NonNull android.content.Context, int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.mbms.MbmsGroupCallSessionCallback); - method public static android.telephony.MbmsGroupCallSession create(@NonNull android.content.Context, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.mbms.MbmsGroupCallSessionCallback); + method @Nullable public static android.telephony.MbmsGroupCallSession create(@NonNull android.content.Context, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.mbms.MbmsGroupCallSessionCallback); method @Nullable public android.telephony.mbms.GroupCall startGroupCall(long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.mbms.GroupCallCallback); } @@ -44965,9 +44967,9 @@ package android.telephony { method public String getIccId(); method public int getIconTint(); method @Deprecated public int getMcc(); - method public String getMccString(); + method @Nullable public String getMccString(); method @Deprecated public int getMnc(); - method public String getMncString(); + method @Nullable public String getMncString(); method public String getNumber(); method public int getSimSlotIndex(); method public int getSubscriptionId(); @@ -45112,9 +45114,9 @@ package android.telephony { method public String getSimCountryIso(); method public String getSimOperator(); method public String getSimOperatorName(); - method public int getSimPreciseCarrierId(); - method @Nullable public CharSequence getSimPreciseCarrierIdName(); method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getSimSerialNumber(); + method public int getSimSpecificCarrierId(); + method @Nullable public CharSequence getSimSpecificCarrierIdName(); method public int getSimState(); method public int getSimState(int); method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getSubscriberId(); @@ -45166,7 +45168,7 @@ package android.telephony { method @Deprecated public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri); method @Deprecated public void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void switchMultiSimConfig(int); - method public boolean updateAvailableNetworks(java.util.List<android.telephony.AvailableNetworkInfo>); + method public void updateAvailableNetworks(@NonNull java.util.List<android.telephony.AvailableNetworkInfo>, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer<java.lang.Integer>); field public static final String ACTION_CARRIER_MESSAGING_CLIENT_SERVICE = "android.telephony.action.CARRIER_MESSAGING_CLIENT_SERVICE"; field public static final String ACTION_CONFIGURE_VOICEMAIL = "android.telephony.action.CONFIGURE_VOICEMAIL"; field public static final String ACTION_NETWORK_COUNTRY_CHANGED = "android.telephony.action.NETWORK_COUNTRY_CHANGED"; @@ -45175,7 +45177,7 @@ package android.telephony { field public static final String ACTION_SECRET_CODE = "android.telephony.action.SECRET_CODE"; field public static final String ACTION_SHOW_VOICEMAIL_NOTIFICATION = "android.telephony.action.SHOW_VOICEMAIL_NOTIFICATION"; field public static final String ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED = "android.telephony.action.SUBSCRIPTION_CARRIER_IDENTITY_CHANGED"; - field public static final String ACTION_SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED = "android.telephony.action.SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED"; + field public static final String ACTION_SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED = "android.telephony.action.SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED"; field public static final int APPTYPE_CSIM = 4; // 0x4 field public static final int APPTYPE_ISIM = 5; // 0x5 field public static final int APPTYPE_RUIM = 3; // 0x3 @@ -45210,8 +45212,8 @@ package android.telephony { field public static final String EXTRA_NETWORK_COUNTRY = "android.telephony.extra.NETWORK_COUNTRY"; field public static final String EXTRA_NOTIFICATION_COUNT = "android.telephony.extra.NOTIFICATION_COUNT"; field public static final String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telephony.extra.PHONE_ACCOUNT_HANDLE"; - field public static final String EXTRA_PRECISE_CARRIER_ID = "android.telephony.extra.PRECISE_CARRIER_ID"; - field public static final String EXTRA_PRECISE_CARRIER_NAME = "android.telephony.extra.PRECISE_CARRIER_NAME"; + field public static final String EXTRA_SPECIFIC_CARRIER_ID = "android.telephony.extra.SPECIFIC_CARRIER_ID"; + field public static final String EXTRA_SPECIFIC_CARRIER_NAME = "android.telephony.extra.SPECIFIC_CARRIER_NAME"; field public static final String EXTRA_STATE = "state"; field public static final String EXTRA_STATE_IDLE; field public static final String EXTRA_STATE_OFFHOOK; @@ -45259,6 +45261,11 @@ package android.telephony { field public static final int UNINITIALIZED_CARD_ID = -2; // 0xfffffffe field public static final int UNKNOWN_CARRIER_ID = -1; // 0xffffffff field public static final int UNSUPPORTED_CARD_ID = -1; // 0xffffffff + field public static final int UPDATE_AVAILABLE_NETWORKS_ABORTED = 2; // 0x2 + field public static final int UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS = 3; // 0x3 + field public static final int UPDATE_AVAILABLE_NETWORKS_NO_CARRIER_PRIVILEGE = 4; // 0x4 + field public static final int UPDATE_AVAILABLE_NETWORKS_SUCCESS = 0; // 0x0 + field public static final int UPDATE_AVAILABLE_NETWORKS_UNKNOWN_FAILURE = 1; // 0x1 field public static final int USSD_ERROR_SERVICE_UNAVAIL = -2; // 0xfffffffe field public static final int USSD_RETURN_FAILURE = -1; // 0xffffffff field public static final String VVM_TYPE_CVVM = "vvm_type_cvvm"; @@ -50334,7 +50341,7 @@ package android.view { method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getAlpha(); method public android.view.animation.Animation getAnimation(); method public android.os.IBinder getApplicationWindowToken(); - method @NonNull public java.util.List<java.lang.Integer> getAttributeResolutionStack(@AttrRes int); + method @NonNull public int[] getAttributeResolutionStack(@AttrRes int); method @NonNull public java.util.Map<java.lang.Integer,java.lang.Integer> getAttributeSourceResourceMap(); method @android.view.ViewDebug.ExportedProperty @Nullable public String[] getAutofillHints(); method public final android.view.autofill.AutofillId getAutofillId(); @@ -58057,7 +58064,7 @@ package dalvik.system { public final class DelegateLastClassLoader extends dalvik.system.PathClassLoader { ctor public DelegateLastClassLoader(String, ClassLoader); ctor public DelegateLastClassLoader(String, String, ClassLoader); - ctor public DelegateLastClassLoader(String, String, ClassLoader, boolean); + ctor public DelegateLastClassLoader(@NonNull String, @Nullable String, @Nullable ClassLoader, boolean); } public class DexClassLoader extends dalvik.system.BaseDexClassLoader { diff --git a/api/system-current.txt b/api/system-current.txt index 6f9b28cb7dd3..0597dba6f365 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -1116,6 +1116,19 @@ package android.app.role { method public void onRoleHoldersChanged(@NonNull String, @NonNull android.os.UserHandle); } + public abstract class RoleControllerService extends android.app.Service { + ctor public RoleControllerService(); + method public abstract void onAddRoleHolder(@NonNull String, @NonNull String, int, @NonNull android.app.role.RoleManagerCallback); + method @Nullable public final android.os.IBinder onBind(@Nullable android.content.Intent); + method public abstract void onClearRoleHolders(@NonNull String, int, @NonNull android.app.role.RoleManagerCallback); + method public abstract void onGrantDefaultRoles(@NonNull android.app.role.RoleManagerCallback); + method public abstract boolean onIsApplicationQualifiedForRole(@NonNull String, @NonNull String); + method public abstract boolean onIsRoleVisible(@NonNull String); + method public abstract void onRemoveRoleHolder(@NonNull String, @NonNull String, int, @NonNull android.app.role.RoleManagerCallback); + method public abstract void onSmsKillSwitchToggled(boolean); + field public static final String SERVICE_INTERFACE = "android.app.role.RoleControllerService"; + } + public final class RoleManager { method @RequiresPermission(android.Manifest.permission.OBSERVE_ROLE_HOLDERS) public void addOnRoleHoldersChangedListenerAsUser(@NonNull java.util.concurrent.Executor, @NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle); method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void addRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback); @@ -1561,23 +1574,26 @@ package android.content.pm { public static class PackageInstaller.SessionInfo implements android.os.Parcelable { method public boolean getAllocateAggressive(); - method public boolean getAllowDowngrade(); + method @Deprecated public boolean getAllowDowngrade(); method public boolean getDontKillApp(); + method public boolean getEnableRollback(); method @Nullable public String[] getGrantedRuntimePermissions(); method public boolean getInstallAsFullApp(boolean); method public boolean getInstallAsInstantApp(boolean); method public boolean getInstallAsVirtualPreload(); + method public boolean getRequestDowngrade(); } public static class PackageInstaller.SessionParams implements android.os.Parcelable { method @RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE) public void setAllocateAggressive(boolean); - method public void setAllowDowngrade(boolean); + method @Deprecated public void setAllowDowngrade(boolean); method public void setDontKillApp(boolean); - method public void setEnableRollback(); + method public void setEnableRollback(boolean); method @RequiresPermission(android.Manifest.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS) public void setGrantedRuntimePermissions(String[]); method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setInstallAsApex(); method public void setInstallAsInstantApp(boolean); method public void setInstallAsVirtualPreload(); + method public void setRequestDowngrade(boolean); method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setStaged(); } @@ -1607,7 +1623,7 @@ package android.content.pm { method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public abstract java.util.List<android.content.pm.InstantAppInfo> getInstantApps(); method public abstract java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(String); method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract int getIntentVerificationStatusAsUser(String, int); - method @android.content.pm.PackageManager.PermissionFlags @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS}) public abstract int getPermissionFlags(String, String, @NonNull android.os.UserHandle); + method @android.content.pm.PackageManager.PermissionFlags @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, android.Manifest.permission.GET_RUNTIME_PERMISSIONS}) public abstract int getPermissionFlags(String, String, @NonNull android.os.UserHandle); method @NonNull @RequiresPermission(android.Manifest.permission.SUSPEND_APPS) public String[] getUnsuspendablePackages(@NonNull String[]); method @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public abstract void grantRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle); method @Deprecated public abstract int installExistingPackage(String) throws android.content.pm.PackageManager.NameNotFoundException; @@ -1642,6 +1658,8 @@ package android.content.pm { field public static final int FLAG_PERMISSION_REVOKE_ON_UPGRADE = 8; // 0x8 field public static final int FLAG_PERMISSION_SYSTEM_FIXED = 16; // 0x10 field public static final int FLAG_PERMISSION_USER_FIXED = 2; // 0x2 + field public static final int FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED = 512; // 0x200 + field public static final int FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED = 256; // 0x100 field public static final int FLAG_PERMISSION_USER_SET = 1; // 0x1 field public static final int INSTALL_FAILED_ALREADY_EXISTS = -1; // 0xffffffff field public static final int INSTALL_FAILED_CONFLICTING_PROVIDER = -13; // 0xfffffff3 @@ -1687,7 +1705,7 @@ package android.content.pm { field public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED = 0; // 0x0 field public static final int INTENT_FILTER_VERIFICATION_FAILURE = -1; // 0xffffffff field public static final int INTENT_FILTER_VERIFICATION_SUCCESS = 1; // 0x1 - field public static final int MASK_PERMISSION_FLAGS = 255; // 0xff + field @Deprecated public static final int MASK_PERMISSION_FLAGS = 255; // 0xff field public static final int MATCH_ANY_USER = 4194304; // 0x400000 field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000 field public static final int MATCH_INSTANT = 8388608; // 0x800000 @@ -1705,7 +1723,7 @@ package android.content.pm { method public void onPermissionsChanged(int); } - @IntDef(prefix={"FLAG_PERMISSION_"}, value={android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET, android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE, android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PackageManager.PermissionFlags { + @IntDef(prefix={"FLAG_PERMISSION_"}, value={android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET, android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE, android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED, android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PackageManager.PermissionFlags { } public class PermissionGroupInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable { @@ -4036,11 +4054,13 @@ package android.net { method @RequiresPermission(android.Manifest.permission.LOCAL_MAC_ADDRESS) public String getCaptivePortalServerUrl(); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void getLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEntitlementResultListener); method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported(); + method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEventCallback); method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void setAirplaneMode(boolean); method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(android.net.Network, android.os.Bundle); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback, android.os.Handler); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void stopTethering(int); + method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void unregisterTetheringEventCallback(@NonNull android.net.ConnectivityManager.OnTetheringEventCallback); field public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC"; field public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT"; field public static final int TETHERING_BLUETOOTH = 2; // 0x2 @@ -4061,6 +4081,11 @@ package android.net { method public void onEntitlementResult(int); } + public abstract static class ConnectivityManager.OnTetheringEventCallback { + ctor public ConnectivityManager.OnTetheringEventCallback(); + method public void onUpstreamChanged(@Nullable android.net.Network); + } + public final class IpPrefix implements android.os.Parcelable { ctor public IpPrefix(java.net.InetAddress, int); ctor public IpPrefix(String); @@ -4723,10 +4748,10 @@ package android.net.wifi { public class WifiManager { method @RequiresPermission("android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE") public void addWifiUsabilityStatsListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.WifiUsabilityStatsListener); - method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void connect(android.net.wifi.WifiConfiguration, android.net.wifi.WifiManager.ActionListener); - method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void connect(int, android.net.wifi.WifiManager.ActionListener); - method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void disable(int, android.net.wifi.WifiManager.ActionListener); - method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void forget(int, android.net.wifi.WifiManager.ActionListener); + method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void connect(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener); + method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void connect(int, @Nullable android.net.wifi.WifiManager.ActionListener); + method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void disable(int, @Nullable android.net.wifi.WifiManager.ActionListener); + method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void forget(int, @Nullable android.net.wifi.WifiManager.ActionListener); method @NonNull @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.util.Pair<android.net.wifi.WifiConfiguration,java.util.Map<java.lang.Integer,java.util.List<android.net.wifi.ScanResult>>>> getAllMatchingWifiConfigs(@NonNull java.util.List<android.net.wifi.ScanResult>); method @NonNull @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,java.util.List<android.net.wifi.ScanResult>> getMatchingOsuProviders(java.util.List<android.net.wifi.ScanResult>); method @NonNull @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,android.net.wifi.hotspot2.PasspointConfiguration> getMatchingPasspointConfigsForOsuProviders(@NonNull java.util.Set<android.net.wifi.hotspot2.OsuProvider>); @@ -4738,7 +4763,7 @@ package android.net.wifi { method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isWifiApEnabled(); method public boolean isWifiScannerSupported(); method @RequiresPermission("android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE") public void removeWifiUsabilityStatsListener(@NonNull android.net.wifi.WifiManager.WifiUsabilityStatsListener); - method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void save(android.net.wifi.WifiConfiguration, android.net.wifi.WifiManager.ActionListener); + method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void save(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener); method @RequiresPermission("android.permission.WIFI_SET_DEVICE_MOBILITY_STATE") public void setDeviceMobilityState(int); method @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public boolean setWifiApConfiguration(android.net.wifi.WifiConfiguration); method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startEasyConnectAsConfiguratorInitiator(@NonNull String, int, int, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.EasyConnectStatusCallback); @@ -5163,7 +5188,7 @@ package android.os { public static interface Binder.ProxyTransactListener { method public void onTransactEnded(@Nullable Object); - method public Object onTransactStarted(android.os.IBinder, int); + method @Nullable public Object onTransactStarted(@NonNull android.os.IBinder, int); } public class BugreportManager { @@ -5677,8 +5702,6 @@ package android.permission { method @NonNull public abstract java.util.List<android.permission.RuntimePermissionPresentationInfo> onGetAppPermissions(@NonNull String); method @NonNull public abstract java.util.List<android.permission.RuntimePermissionUsageInfo> onGetPermissionUsages(boolean, long); method public abstract void onGetRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.OutputStream); - method public abstract boolean onIsApplicationQualifiedForRole(@NonNull String, @NonNull String); - method public abstract boolean onIsRoleVisible(@NonNull String); method @BinderThread public abstract boolean onRestoreDelayedRuntimePermissionsBackup(@NonNull String, @NonNull android.os.UserHandle); method @BinderThread public abstract void onRestoreRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.InputStream); method public abstract void onRevokeRuntimePermission(@NonNull String, @NonNull String); @@ -6166,21 +6189,6 @@ package android.provider { } -package android.rolecontrollerservice { - - public abstract class RoleControllerService extends android.app.Service { - ctor public RoleControllerService(); - method public abstract void onAddRoleHolder(@NonNull String, @NonNull String, int, @NonNull android.app.role.RoleManagerCallback); - method @Nullable public final android.os.IBinder onBind(@Nullable android.content.Intent); - method public abstract void onClearRoleHolders(@NonNull String, int, @NonNull android.app.role.RoleManagerCallback); - method public abstract void onGrantDefaultRoles(@NonNull android.app.role.RoleManagerCallback); - method public abstract void onRemoveRoleHolder(@NonNull String, @NonNull String, int, @NonNull android.app.role.RoleManagerCallback); - method public abstract void onSmsKillSwitchToggled(boolean); - field public static final String SERVICE_INTERFACE = "android.rolecontrollerservice.RoleControllerService"; - } - -} - package android.security.keystore { public abstract class AttestationUtils { @@ -6477,10 +6485,14 @@ package android.service.contentsuggestions { public abstract class ContentSuggestionsService extends android.app.Service { ctor public ContentSuggestionsService(); - method public abstract void classifyContentSelections(@NonNull android.app.contentsuggestions.ClassificationsRequest, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.ClassificationsCallback); - method public abstract void notifyInteraction(@NonNull String, @NonNull android.os.Bundle); - method public abstract void processContextImage(int, @Nullable android.graphics.Bitmap, @NonNull android.os.Bundle); - method public abstract void suggestContentSelections(@NonNull android.app.contentsuggestions.SelectionsRequest, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.SelectionsCallback); + method @Deprecated public void classifyContentSelections(@NonNull android.app.contentsuggestions.ClassificationsRequest, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.ClassificationsCallback); + method @Deprecated public void notifyInteraction(@NonNull String, @NonNull android.os.Bundle); + method public void onClassifyContentSelections(@NonNull android.app.contentsuggestions.ClassificationsRequest, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.ClassificationsCallback); + method public void onNotifyInteraction(@NonNull String, @NonNull android.os.Bundle); + method public void onProcessContextImage(int, @Nullable android.graphics.Bitmap, @NonNull android.os.Bundle); + method public void onSuggestContentSelections(@NonNull android.app.contentsuggestions.SelectionsRequest, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.SelectionsCallback); + method @Deprecated public void processContextImage(int, @Nullable android.graphics.Bitmap, @NonNull android.os.Bundle); + method @Deprecated public void suggestContentSelections(@NonNull android.app.contentsuggestions.SelectionsRequest, @NonNull android.app.contentsuggestions.ContentSuggestionsManager.SelectionsCallback); field public static final String SERVICE_INTERFACE = "android.service.contentsuggestions.ContentSuggestionsService"; } @@ -9072,7 +9084,7 @@ package android.telephony.ims { public static class ProvisioningManager.Callback { ctor public ProvisioningManager.Callback(); method public void onProvisioningIntChanged(int, int); - method public void onProvisioningStringChanged(int, String); + method public void onProvisioningStringChanged(int, @NonNull String); } } diff --git a/api/system-removed.txt b/api/system-removed.txt index 7e044698c72c..18d0ec02f077 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -60,6 +60,14 @@ package android.content { } +package android.content.pm { + + public static class PackageInstaller.SessionParams implements android.os.Parcelable { + method @Deprecated public void setEnableRollback(); + } + +} + package android.location { public class LocationManager { diff --git a/api/test-current.txt b/api/test-current.txt index 4d1d44084ad2..b0e8df83ec6e 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -640,7 +640,7 @@ package android.content.pm { method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS_FULL") public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int); method @Nullable public abstract String[] getNamesForUids(int[]); method public abstract String getPermissionControllerPackageName(); - method @RequiresPermission(anyOf={"android.permission.GRANT_RUNTIME_PERMISSIONS", "android.permission.REVOKE_RUNTIME_PERMISSIONS"}) public abstract int getPermissionFlags(String, String, @NonNull android.os.UserHandle); + method @RequiresPermission(anyOf={"android.permission.GRANT_RUNTIME_PERMISSIONS", "android.permission.REVOKE_RUNTIME_PERMISSIONS", "android.permission.GET_RUNTIME_PERMISSIONS"}) public abstract int getPermissionFlags(String, String, @NonNull android.os.UserHandle); method @NonNull public abstract String getServicesSystemSharedLibraryPackageName(); method @NonNull public abstract String getSharedSystemSharedLibraryPackageName(); method public String getWellbeingPackageName(); @@ -1233,6 +1233,21 @@ package android.net { field @NonNull public static final android.os.Parcelable.Creator<android.net.StaticIpConfiguration> CREATOR; } + public final class TestNetworkInterface implements android.os.Parcelable { + ctor public TestNetworkInterface(android.os.ParcelFileDescriptor, String); + method public int describeContents(); + method public android.os.ParcelFileDescriptor getFileDescriptor(); + method public String getInterfaceName(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.net.TestNetworkInterface> CREATOR; + } + + public class TestNetworkManager { + method public android.net.TestNetworkInterface createTunInterface(@NonNull android.net.LinkAddress[]); + method public void setupTestNetwork(@NonNull String, @NonNull android.os.IBinder); + method public void teardownTestNetwork(@NonNull android.net.Network); + } + public class TrafficStats { method public static long getLoopbackRxBytes(); method public static long getLoopbackRxPackets(); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index c067f9d0ce1c..023371d3b443 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -2018,7 +2018,8 @@ public class ActivityManager { * @return {@code true} if a call to start an activity on the target display is allowed for the * provided context and no {@link SecurityException} will be thrown, {@code false} otherwise. */ - public boolean isActivityStartAllowedOnDisplay(Context context, int displayId, Intent intent) { + public boolean isActivityStartAllowedOnDisplay(@NonNull Context context, int displayId, + @NonNull Intent intent) { try { return getTaskService().isActivityStartAllowedOnDisplay(displayId, intent, intent.resolveTypeIfNeeded(context.getContentResolver()), context.getUserId()); diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java index 010a900b9d96..ec2825edebe6 100644 --- a/core/java/android/app/AutomaticZenRule.java +++ b/core/java/android/app/AutomaticZenRule.java @@ -136,7 +136,7 @@ public final class AutomaticZenRule implements Parcelable { * Returns the {@link ComponentName} of the activity that shows configuration options * for this rule. */ - public ComponentName getConfigurationActivity() { + public @Nullable ComponentName getConfigurationActivity() { return configurationActivity; } @@ -237,9 +237,10 @@ public final class AutomaticZenRule implements Parcelable { /** * Sets the configuration activity - an activity that handles * {@link NotificationManager#ACTION_AUTOMATIC_ZEN_RULE} that shows the user more information - * about this rule and/or allows them to configure it. + * about this rule and/or allows them to configure it. This is required to be non-null for rules + * that are not backed by {@link android.service.notification.ConditionProviderService}. */ - public void setConfigurationActivity(ComponentName componentName) { + public void setConfigurationActivity(@Nullable ComponentName componentName) { this.configurationActivity = componentName; } diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index e1da08bb2e1a..29e6807a3244 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -192,7 +192,6 @@ interface INotificationManager ParceledListSlice getAppActiveNotifications(String callingPkg, int userId); void setNotificationDelegate(String callingPkg, String delegate); - void revokeNotificationDelegate(String callingPkg); String getNotificationDelegate(String callingPkg); boolean canNotifyAsPackage(String callingPkg, String targetPkg); diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index edf86f9501d8..ed7aa4a097eb 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -589,11 +589,11 @@ public class NotificationManager { * received on your behalf from the cloud, without your process having to wake up. * * You can check if you have an allowed delegate with {@link #getNotificationDelegate()} and - * revoke your delegate with {@link #revokeNotificationDelegate()}. + * revoke your delegate by passing null to this method. * * @param delegate Package name of the app which can send notifications on your behalf. */ - public void setNotificationDelegate(@NonNull String delegate) { + public void setNotificationDelegate(@Nullable String delegate) { INotificationManager service = getService(); String pkg = mContext.getPackageName(); if (localLOGV) Log.v(TAG, pkg + ": cancelAll()"); @@ -605,20 +605,6 @@ public class NotificationManager { } /** - * Revokes permission for your {@link #setNotificationDelegate(String) notification delegate} - * to post notifications on your behalf. - */ - public void revokeNotificationDelegate() { - INotificationManager service = getService(); - String pkg = mContext.getPackageName(); - try { - service.revokeNotificationDelegate(pkg); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - - /** * Returns the {@link #setNotificationDelegate(String) delegate} that can post notifications on * your behalf, if there currently is one. */ diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 1faa2ac76d71..90bc0a6dd11e 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -26,6 +26,7 @@ import android.app.contentsuggestions.IContentSuggestionsManager; import android.app.job.IJobScheduler; import android.app.job.JobScheduler; import android.app.prediction.AppPredictionManager; +import android.app.role.RoleControllerManager; import android.app.role.RoleManager; import android.app.slice.SliceManager; import android.app.timedetector.TimeDetector; @@ -1243,6 +1244,14 @@ final class SystemServiceRegistry { return new RoleManager(ctx.getOuterContext()); }}); + registerService(Context.ROLE_CONTROLLER_SERVICE, RoleControllerManager.class, + new CachedServiceFetcher<RoleControllerManager>() { + @Override + public RoleControllerManager createService(ContextImpl ctx) + throws ServiceNotFoundException { + return new RoleControllerManager(ctx.getOuterContext()); + }}); + registerService(Context.ROLLBACK_SERVICE, RollbackManager.class, new CachedServiceFetcher<RollbackManager>() { @Override diff --git a/core/java/android/rolecontrollerservice/IRoleControllerService.aidl b/core/java/android/app/role/IRoleController.aidl index 40852ea9719d..e8f6ce2780b2 100644 --- a/core/java/android/rolecontrollerservice/IRoleControllerService.aidl +++ b/core/java/android/app/role/IRoleController.aidl @@ -14,24 +14,30 @@ * limitations under the License. */ -package android.rolecontrollerservice; +package android.app.role; import android.app.role.IRoleManagerCallback; +import android.os.RemoteCallback; /** * @hide */ -oneway interface IRoleControllerService { +oneway interface IRoleController { + + void onGrantDefaultRoles(in IRoleManagerCallback callback); void onAddRoleHolder(in String roleName, in String packageName, int flags, in IRoleManagerCallback callback); void onRemoveRoleHolder(in String roleName, in String packageName, int flags, - in IRoleManagerCallback callback); + in IRoleManagerCallback callback); void onClearRoleHolders(in String roleName, int flags, in IRoleManagerCallback callback); - void onGrantDefaultRoles(in IRoleManagerCallback callback); + void onSmsKillSwitchToggled(boolean enabled); + + void isApplicationQualifiedForRole(in String roleName, in String packageName, + in RemoteCallback callback); - void onSmsKillSwitchToggled(boolean smsRestrictionEnabled); + void isRoleVisible(in String roleName, in RemoteCallback callback); } diff --git a/core/java/android/app/role/RoleControllerManager.java b/core/java/android/app/role/RoleControllerManager.java new file mode 100644 index 000000000000..2edc526ff261 --- /dev/null +++ b/core/java/android/app/role/RoleControllerManager.java @@ -0,0 +1,613 @@ +/* + * Copyright (C) 2019 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.role; + +import android.Manifest; +import android.annotation.CallbackExecutor; +import android.annotation.NonNull; +import android.annotation.RequiresPermission; +import android.annotation.SystemService; +import android.annotation.UserIdInt; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.Binder; +import android.os.Handler; +import android.os.IBinder; +import android.os.RemoteCallback; +import android.os.RemoteException; +import android.util.Log; +import android.util.SparseArray; + +import com.android.internal.annotations.GuardedBy; +import com.android.internal.infra.AbstractMultiplePendingRequestsRemoteService; +import com.android.internal.infra.AbstractRemoteService; + +import java.util.concurrent.Executor; +import java.util.function.Consumer; + +/** + * Interface for communicating with the role controller. + * + * @hide + */ +@SystemService(Context.ROLE_CONTROLLER_SERVICE) +public class RoleControllerManager { + + private static final String LOG_TAG = RoleControllerManager.class.getSimpleName(); + + /** + * The key for retrieving the result from a bundle. + */ + public static final String KEY_RESULT = "android.app.role.RoleControllerManager.key.RESULT"; + + private static final Object sRemoteServicesLock = new Object(); + /** + * Global remote services (per user) used by all {@link RoleControllerManager managers}. + */ + @GuardedBy("sRemoteServicesLock") + private static final SparseArray<RemoteService> sRemoteServices = new SparseArray<>(); + + @NonNull + private final RemoteService mRemoteService; + + public RoleControllerManager(@NonNull Context context, @NonNull Handler handler) { + synchronized (sRemoteServicesLock) { + int userId = context.getUserId(); + RemoteService remoteService = sRemoteServices.get(userId); + if (remoteService == null) { + Intent intent = new Intent(RoleControllerService.SERVICE_INTERFACE); + PackageManager packageManager = context.getPackageManager(); + intent.setPackage(packageManager.getPermissionControllerPackageName()); + ResolveInfo resolveInfo = packageManager.resolveService(intent, 0); + + remoteService = new RemoteService(context.getApplicationContext(), + resolveInfo.getComponentInfo().getComponentName(), handler, userId); + sRemoteServices.put(userId, remoteService); + } + mRemoteService = remoteService; + } + } + + public RoleControllerManager(@NonNull Context context) { + this(context, context.getMainThreadHandler()); + } + + /** + * @see RoleControllerService#onGrantDefaultRoles(RoleManagerCallback) + */ + public void onGrantDefaultRoles(@NonNull IRoleManagerCallback callback) { + mRemoteService.scheduleRequest(new OnGrantDefaultRolesRequest(mRemoteService, callback)); + } + + /** + * @see RoleControllerService#onAddRoleHolder(String, String, int, RoleManagerCallback) + */ + public void onAddRoleHolder(@NonNull String roleName, @NonNull String packageName, + @RoleManager.ManageHoldersFlags int flags, @NonNull IRoleManagerCallback callback) { + mRemoteService.scheduleRequest(new OnAddRoleHolderRequest(mRemoteService, roleName, + packageName, flags, callback)); + } + + /** + * @see RoleControllerService#onRemoveRoleHolder(String, String, int, RoleManagerCallback) + */ + public void onRemoveRoleHolder(@NonNull String roleName, @NonNull String packageName, + @RoleManager.ManageHoldersFlags int flags, @NonNull IRoleManagerCallback callback) { + mRemoteService.scheduleRequest(new OnRemoveRoleHolderRequest(mRemoteService, roleName, + packageName, flags, callback)); + } + + /** + * @see RoleControllerService#onClearRoleHolders(String, int, RoleManagerCallback) + */ + public void onClearRoleHolders(@NonNull String roleName, + @RoleManager.ManageHoldersFlags int flags, @NonNull IRoleManagerCallback callback) { + mRemoteService.scheduleRequest(new OnClearRoleHoldersRequest(mRemoteService, roleName, + flags, callback)); + } + + /** + * @see RoleControllerService#onSmsKillSwitchToggled(boolean) + */ + public void onSmsKillSwitchToggled(boolean enabled) { + mRemoteService.scheduleAsyncRequest(new OnSmsKillSwitchToggledRequest(enabled)); + } + + /** + * @see RoleControllerService#onIsApplicationQualifiedForRole(String, String) + */ + @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) + public void isApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName, + @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + mRemoteService.scheduleRequest(new IsApplicationQualifiedForRoleRequest(mRemoteService, + roleName, packageName, executor, callback)); + } + + /** + * @see RoleControllerService#onIsRoleVisible(String) + */ + @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) + public void isRoleVisible(@NonNull String roleName, + @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + mRemoteService.scheduleRequest(new IsRoleVisibleRequest(mRemoteService, roleName, executor, + callback)); + } + + /** + * Connection to the remote service. + */ + private static final class RemoteService extends AbstractMultiplePendingRequestsRemoteService< + RemoteService, IRoleController> { + + private static final long UNBIND_DELAY_MILLIS = 15 * 1000; + private static final long REQUEST_TIMEOUT_MILLIS = 15 * 1000; + + /** + * Create a connection to the remote service + * + * @param context the context to use + * @param componentName the component of the service to connect to + * @param handler the handler for binding service and callbacks + * @param userId the user whom remote service should be connected as + */ + RemoteService(@NonNull Context context, @NonNull ComponentName componentName, + @NonNull Handler handler, @UserIdInt int userId) { + super(context, RoleControllerService.SERVICE_INTERFACE, componentName, userId, + service -> Log.e(LOG_TAG, "RemoteService " + service + " died"), handler, false, + false, 1); + } + + /** + * @return The default handler used by this service. + */ + @NonNull + public Handler getHandler() { + return mHandler; + } + + @Override + protected @NonNull IRoleController getServiceInterface(@NonNull IBinder binder) { + return IRoleController.Stub.asInterface(binder); + } + + @Override + protected long getTimeoutIdleBindMillis() { + return UNBIND_DELAY_MILLIS; + } + + @Override + protected long getRemoteRequestMillis() { + return REQUEST_TIMEOUT_MILLIS; + } + + @Override + public void scheduleRequest( + @NonNull BasePendingRequest<RemoteService, IRoleController> pendingRequest) { + super.scheduleRequest(pendingRequest); + } + + @Override + public void scheduleAsyncRequest(@NonNull AsyncRequest<IRoleController> request) { + super.scheduleAsyncRequest(request); + } + } + + /** + * Request for {@link #onGrantDefaultRoles(IRoleManagerCallback)}. + */ + private static final class OnGrantDefaultRolesRequest + extends AbstractRemoteService.PendingRequest<RemoteService, IRoleController> { + + @NonNull + private final IRoleManagerCallback mCallback; + + @NonNull + private final IRoleManagerCallback mRemoteCallback; + + private OnGrantDefaultRolesRequest(@NonNull RemoteService service, + @NonNull IRoleManagerCallback callback) { + super(service); + + mCallback = callback; + + mRemoteCallback = new IRoleManagerCallback.Stub() { + @Override + public void onSuccess() throws RemoteException { + long token = Binder.clearCallingIdentity(); + try { + mCallback.onSuccess(); + } finally { + Binder.restoreCallingIdentity(token); + finish(); + } + } + @Override + public void onFailure() throws RemoteException { + long token = Binder.clearCallingIdentity(); + try { + mCallback.onSuccess(); + } finally { + Binder.restoreCallingIdentity(token); + finish(); + } + } + }; + } + + @Override + protected void onTimeout(@NonNull RemoteService remoteService) { + try { + mCallback.onFailure(); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Error calling onFailure() on callback", e); + } + } + + @Override + public void run() { + try { + getService().getServiceInterface().onGrantDefaultRoles(mRemoteCallback); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Error calling onGrantDefaultRoles()", e); + } + } + } + + /** + * Request for {@link #onAddRoleHolder(String, String, int, IRoleManagerCallback)}. + */ + private static final class OnAddRoleHolderRequest + extends AbstractRemoteService.PendingRequest<RemoteService, IRoleController> { + + @NonNull + private final String mRoleName; + @NonNull + private final String mPackageName; + @RoleManager.ManageHoldersFlags + private final int mFlags; + @NonNull + private final IRoleManagerCallback mCallback; + + @NonNull + private final IRoleManagerCallback mRemoteCallback; + + private OnAddRoleHolderRequest(@NonNull RemoteService service, @NonNull String roleName, + @NonNull String packageName, @RoleManager.ManageHoldersFlags int flags, + @NonNull IRoleManagerCallback callback) { + super(service); + + mRoleName = roleName; + mPackageName = packageName; + mFlags = flags; + mCallback = callback; + + mRemoteCallback = new IRoleManagerCallback.Stub() { + @Override + public void onSuccess() throws RemoteException { + long token = Binder.clearCallingIdentity(); + try { + mCallback.onSuccess(); + } finally { + Binder.restoreCallingIdentity(token); + finish(); + } + } + @Override + public void onFailure() throws RemoteException { + long token = Binder.clearCallingIdentity(); + try { + mCallback.onSuccess(); + } finally { + Binder.restoreCallingIdentity(token); + finish(); + } + } + }; + } + + @Override + protected void onTimeout(@NonNull RemoteService remoteService) { + try { + mCallback.onFailure(); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Error calling onFailure() on callback", e); + } + } + + @Override + public void run() { + try { + getService().getServiceInterface().onAddRoleHolder(mRoleName, mPackageName, mFlags, + mRemoteCallback); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Error calling onAddRoleHolder()", e); + } + } + } + + /** + * Request for {@link #onRemoveRoleHolder(String, String, int, IRoleManagerCallback)}. + */ + private static final class OnRemoveRoleHolderRequest + extends AbstractRemoteService.PendingRequest<RemoteService, IRoleController> { + + @NonNull + private final String mRoleName; + @NonNull + private final String mPackageName; + @RoleManager.ManageHoldersFlags + private final int mFlags; + @NonNull + private final IRoleManagerCallback mCallback; + + @NonNull + private final IRoleManagerCallback mRemoteCallback; + + private OnRemoveRoleHolderRequest(@NonNull RemoteService service, @NonNull String roleName, + @NonNull String packageName, @RoleManager.ManageHoldersFlags int flags, + @NonNull IRoleManagerCallback callback) { + super(service); + + mRoleName = roleName; + mPackageName = packageName; + mFlags = flags; + mCallback = callback; + + mRemoteCallback = new IRoleManagerCallback.Stub() { + @Override + public void onSuccess() throws RemoteException { + long token = Binder.clearCallingIdentity(); + try { + mCallback.onSuccess(); + } finally { + Binder.restoreCallingIdentity(token); + finish(); + } + } + @Override + public void onFailure() throws RemoteException { + long token = Binder.clearCallingIdentity(); + try { + mCallback.onSuccess(); + } finally { + Binder.restoreCallingIdentity(token); + finish(); + } + } + }; + } + + @Override + protected void onTimeout(@NonNull RemoteService remoteService) { + try { + mCallback.onFailure(); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Error calling onFailure() on callback", e); + } + } + + @Override + public void run() { + try { + getService().getServiceInterface().onRemoveRoleHolder(mRoleName, mPackageName, + mFlags, mRemoteCallback); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Error calling onRemoveRoleHolder()", e); + } + } + } + + /** + * Request for {@link #onClearRoleHolders(String, int, IRoleManagerCallback)}. + */ + private static final class OnClearRoleHoldersRequest + extends AbstractRemoteService.PendingRequest<RemoteService, IRoleController> { + + @NonNull + private final String mRoleName; + @RoleManager.ManageHoldersFlags + private final int mFlags; + @NonNull + private final IRoleManagerCallback mCallback; + + @NonNull + private final IRoleManagerCallback mRemoteCallback; + + private OnClearRoleHoldersRequest(@NonNull RemoteService service, @NonNull String roleName, + @RoleManager.ManageHoldersFlags int flags, @NonNull IRoleManagerCallback callback) { + super(service); + + mRoleName = roleName; + mFlags = flags; + mCallback = callback; + + mRemoteCallback = new IRoleManagerCallback.Stub() { + @Override + public void onSuccess() throws RemoteException { + long token = Binder.clearCallingIdentity(); + try { + mCallback.onSuccess(); + } finally { + Binder.restoreCallingIdentity(token); + finish(); + } + } + @Override + public void onFailure() throws RemoteException { + long token = Binder.clearCallingIdentity(); + try { + mCallback.onSuccess(); + } finally { + Binder.restoreCallingIdentity(token); + finish(); + } + } + }; + } + + @Override + protected void onTimeout(@NonNull RemoteService remoteService) { + try { + mCallback.onFailure(); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Error calling onFailure() on callback", e); + } + } + + @Override + public void run() { + try { + getService().getServiceInterface().onClearRoleHolders(mRoleName, mFlags, + mRemoteCallback); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Error calling onClearRoleHolders()", e); + } + } + } + + /** + * Request for {@link #onSmsKillSwitchToggled(boolean)} + */ + private static final class OnSmsKillSwitchToggledRequest + implements AbstractRemoteService.AsyncRequest<IRoleController> { + + private final boolean mEnabled; + + private OnSmsKillSwitchToggledRequest(boolean enabled) { + mEnabled = enabled; + } + + @Override + public void run(@NonNull IRoleController service) { + try { + service.onSmsKillSwitchToggled(mEnabled); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Error calling onSmsKillSwitchToggled()", e); + } + } + } + + /** + * Request for {@link #isApplicationQualifiedForRole(String, String, Executor, Consumer)} + */ + private static final class IsApplicationQualifiedForRoleRequest extends + AbstractRemoteService.PendingRequest<RemoteService, IRoleController> { + + @NonNull + private final String mRoleName; + @NonNull + private final String mPackageName; + @NonNull + private final Executor mExecutor; + @NonNull + private final Consumer<Boolean> mCallback; + + @NonNull + private final RemoteCallback mRemoteCallback; + + private IsApplicationQualifiedForRoleRequest(@NonNull RemoteService service, + @NonNull String roleName, @NonNull String packageName, + @CallbackExecutor @NonNull Executor executor, @NonNull Consumer<Boolean> callback) { + super(service); + + mRoleName = roleName; + mPackageName = packageName; + mExecutor = executor; + mCallback = callback; + + mRemoteCallback = new RemoteCallback(result -> mExecutor.execute(() -> { + long token = Binder.clearCallingIdentity(); + try { + boolean qualified = result != null && result.getBoolean(KEY_RESULT); + mCallback.accept(qualified); + } finally { + Binder.restoreCallingIdentity(token); + finish(); + } + })); + } + + @Override + protected void onTimeout(RemoteService remoteService) { + mExecutor.execute(() -> mCallback.accept(false)); + } + + @Override + public void run() { + try { + getService().getServiceInterface().isApplicationQualifiedForRole(mRoleName, + mPackageName, mRemoteCallback); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Error calling isApplicationQualifiedForRole()", e); + } + } + } + + /** + * Request for {@link #isRoleVisible(String, Executor, Consumer)} + */ + private static final class IsRoleVisibleRequest + extends AbstractRemoteService.PendingRequest<RemoteService, IRoleController> { + + @NonNull + private final String mRoleName; + @NonNull + private final Executor mExecutor; + @NonNull + private final Consumer<Boolean> mCallback; + + @NonNull + private final RemoteCallback mRemoteCallback; + + private IsRoleVisibleRequest(@NonNull RemoteService service, @NonNull String roleName, + @CallbackExecutor @NonNull Executor executor, @NonNull Consumer<Boolean> callback) { + super(service); + + mRoleName = roleName; + mExecutor = executor; + mCallback = callback; + + mRemoteCallback = new RemoteCallback(result -> mExecutor.execute(() -> { + long token = Binder.clearCallingIdentity(); + try { + boolean visible = result != null && result.getBoolean(KEY_RESULT); + mCallback.accept(visible); + } finally { + Binder.restoreCallingIdentity(token); + finish(); + } + })); + } + + @Override + protected void onTimeout(RemoteService remoteService) { + mExecutor.execute(() -> mCallback.accept(false)); + } + + @Override + public void run() { + try { + getService().getServiceInterface().isRoleVisible(mRoleName, mRemoteCallback); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Error calling isRoleVisible()", e); + } + } + } +} diff --git a/core/java/android/rolecontrollerservice/RoleControllerService.java b/core/java/android/app/role/RoleControllerService.java index c846b076c14f..47be38561b45 100644 --- a/core/java/android/rolecontrollerservice/RoleControllerService.java +++ b/core/java/android/app/role/RoleControllerService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 The Android Open Source Project + * Copyright (C) 2019 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. @@ -14,17 +14,17 @@ * limitations under the License. */ -package android.rolecontrollerservice; +package android.app.role; +import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.app.Service; -import android.app.role.IRoleManagerCallback; -import android.app.role.RoleManager; -import android.app.role.RoleManagerCallback; import android.content.Intent; +import android.os.Bundle; import android.os.IBinder; +import android.os.RemoteCallback; import android.os.RemoteException; import android.os.UserHandle; import android.util.Log; @@ -48,17 +48,21 @@ public abstract class RoleControllerService extends Service { private static final String LOG_TAG = RoleControllerService.class.getSimpleName(); /** - * The {@link Intent} that must be declared as handled by the service. The service should also - * require the {@link android.Manifest.permission#BIND_ROLE_CONTROLLER_SERVICE} permission so - * that other applications can not abuse it. + * The {@link Intent} that must be declared as handled by the service. */ - public static final String SERVICE_INTERFACE = - "android.rolecontrollerservice.RoleControllerService"; + public static final String SERVICE_INTERFACE = "android.app.role.RoleControllerService"; @Nullable @Override public final IBinder onBind(@Nullable Intent intent) { - return new IRoleControllerService.Stub() { + return new IRoleController.Stub() { + + @Override + public void onGrantDefaultRoles(IRoleManagerCallback callback) { + Preconditions.checkNotNull(callback, "callback cannot be null"); + RoleControllerService.this.onGrantDefaultRoles(new RoleManagerCallbackDelegate( + callback)); + } @Override public void onAddRoleHolder(String roleName, String packageName, int flags, @@ -92,20 +96,52 @@ public abstract class RoleControllerService extends Service { } @Override - public void onGrantDefaultRoles(IRoleManagerCallback callback) { + public void onSmsKillSwitchToggled(boolean smsRestrictionEnabled) { + RoleControllerService.this.onSmsKillSwitchToggled(smsRestrictionEnabled); + } + + @Override + public void isApplicationQualifiedForRole(String roleName, String packageName, + RemoteCallback callback) { + enforceCallingPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, null); + + Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); + Preconditions.checkStringNotEmpty(packageName, + "packageName cannot be null or empty"); Preconditions.checkNotNull(callback, "callback cannot be null"); - RoleControllerService.this.onGrantDefaultRoles(new RoleManagerCallbackDelegate( - callback)); + + boolean qualified = onIsApplicationQualifiedForRole(roleName, packageName); + Bundle result = new Bundle(); + result.putBoolean(RoleControllerManager.KEY_RESULT, qualified); + callback.sendResult(result); } @Override - public void onSmsKillSwitchToggled(boolean smsRestrictionEnabled) { - RoleControllerService.this.onSmsKillSwitchToggled(smsRestrictionEnabled); + public void isRoleVisible(String roleName, RemoteCallback callback) { + enforceCallingPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, null); + + Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); + Preconditions.checkNotNull(callback, "callback cannot be null"); + + boolean visible = onIsRoleVisible(roleName); + Bundle result = new Bundle(); + result.putBoolean(RoleControllerManager.KEY_RESULT, visible); + callback.sendResult(result); } }; } /** + * Called by system to grant default permissions and roles. + * <p> + * This is typically when creating a new user or upgrading either system or + * permission controller package + * + * @param callback the callback for whether this call is successful + */ + public abstract void onGrantDefaultRoles(@NonNull RoleManagerCallback callback); + + /** * Add a specific application to the holders of a role. If the role is exclusive, the previous * holder will be replaced. * <p> @@ -153,20 +189,30 @@ public abstract class RoleControllerService extends Service { /** * Cleanup appop/permissions state in response to sms kill switch toggle * - * @param smsRestrictionEnabled whether kill switch was turned on + * @param enabled whether kill switch was turned on */ //STOPSHIP: remove this api before shipping a final version - public abstract void onSmsKillSwitchToggled(boolean smsRestrictionEnabled); + public abstract void onSmsKillSwitchToggled(boolean enabled); /** - * Called by system to grant default permissions and roles. - * <p> - * This is typically when creating a new user or upgrading either system or - * permission controller package + * Check whether an application is qualified for a role. * - * @param callback the callback for whether this call is successful + * @param roleName name of the role to check for + * @param packageName package name of the application to check for + * + * @return whether the application is qualified for the role */ - public abstract void onGrantDefaultRoles(@NonNull RoleManagerCallback callback); + public abstract boolean onIsApplicationQualifiedForRole(@NonNull String roleName, + @NonNull String packageName); + + /** + * Check whether a role should be visible to user. + * + * @param roleName name of the role to check for + * + * @return whether the role should be visible to user + */ + public abstract boolean onIsRoleVisible(@NonNull String roleName); private static class RoleManagerCallbackDelegate implements RoleManagerCallback { diff --git a/core/java/android/app/role/RoleManager.java b/core/java/android/app/role/RoleManager.java index f91d8780084f..a663498d9057 100644 --- a/core/java/android/app/role/RoleManager.java +++ b/core/java/android/app/role/RoleManager.java @@ -545,7 +545,7 @@ public final class RoleManager { /** * Set the names of all the available roles. Should only be called from - * {@link android.rolecontrollerservice.RoleControllerService}. + * {@link android.app.role.RoleControllerService}. * <p> * <strong>Note:</strong> Using this API requires holding * {@link #PERMISSION_MANAGE_ROLES_FROM_CONTROLLER}. @@ -569,7 +569,7 @@ public final class RoleManager { /** * Add a specific application to the holders of a role, only modifying records inside * {@link RoleManager}. Should only be called from - * {@link android.rolecontrollerservice.RoleControllerService}. + * {@link android.app.role.RoleControllerService}. * <p> * <strong>Note:</strong> Using this API requires holding * {@link #PERMISSION_MANAGE_ROLES_FROM_CONTROLLER}. @@ -602,7 +602,7 @@ public final class RoleManager { /** * Remove a specific application from the holders of a role, only modifying records inside * {@link RoleManager}. Should only be called from - * {@link android.rolecontrollerservice.RoleControllerService}. + * {@link android.app.role.RoleControllerService}. * <p> * <strong>Note:</strong> Using this API requires holding * {@link #PERMISSION_MANAGE_ROLES_FROM_CONTROLLER}. diff --git a/core/java/android/bluetooth/BluetoothCodecStatus.java b/core/java/android/bluetooth/BluetoothCodecStatus.java index 8eae2b4cf590..58b6aeae6398 100644 --- a/core/java/android/bluetooth/BluetoothCodecStatus.java +++ b/core/java/android/bluetooth/BluetoothCodecStatus.java @@ -75,8 +75,8 @@ public final class BluetoothCodecStatus implements Parcelable { * @param c2 the second array of capabilities to compare * @return true if both arrays contain same capabilities */ - private static boolean sameCapabilities(BluetoothCodecConfig[] c1, - BluetoothCodecConfig[] c2) { + public static boolean sameCapabilities(BluetoothCodecConfig[] c1, + BluetoothCodecConfig[] c2) { if (c1 == null) { return (c2 == null); } diff --git a/core/java/android/bluetooth/BluetoothHearingAid.java b/core/java/android/bluetooth/BluetoothHearingAid.java index 82cc1bcf053c..b4eaab20c5bc 100644 --- a/core/java/android/bluetooth/BluetoothHearingAid.java +++ b/core/java/android/bluetooth/BluetoothHearingAid.java @@ -17,6 +17,7 @@ package android.bluetooth; import android.Manifest; +import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; @@ -303,7 +304,7 @@ public final class BluetoothHearingAid implements BluetoothProfile { * {@inheritDoc} */ @Override - public List<BluetoothDevice> getConnectedDevices() { + public @NonNull List<BluetoothDevice> getConnectedDevices() { if (VDBG) log("getConnectedDevices()"); try { mServiceLock.readLock().lock(); @@ -323,8 +324,8 @@ public final class BluetoothHearingAid implements BluetoothProfile { /** * {@inheritDoc} */ - @Override - public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) { + @Override public @NonNull List<BluetoothDevice> getDevicesMatchingConnectionStates( + @NonNull int[] states) { if (VDBG) log("getDevicesMatchingStates()"); try { mServiceLock.readLock().lock(); @@ -345,7 +346,7 @@ public final class BluetoothHearingAid implements BluetoothProfile { * {@inheritDoc} */ @Override - public int getConnectionState(BluetoothDevice device) { + public int getConnectionState(@NonNull BluetoothDevice device) { if (VDBG) log("getState(" + device + ")"); try { mServiceLock.readLock().lock(); diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index f28718cadad1..f896274ed8b3 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -3176,6 +3176,7 @@ public abstract class Context { RESTRICTIONS_SERVICE, APP_OPS_SERVICE, ROLE_SERVICE, + //@hide ROLE_CONTROLLER_SERVICE, CAMERA_SERVICE, PRINT_SERVICE, CONSUMER_IR_SERVICE, @@ -4285,6 +4286,16 @@ public abstract class Context { public static final String ROLE_SERVICE = "role"; /** + * Official published name of the (internal) role controller service. + * + * @see #getSystemService(String) + * @see android.app.role.RoleControllerService + * + * @hide + */ + public static final String ROLE_CONTROLLER_SERVICE = "role_controller"; + + /** * Use with {@link #getSystemService(String)} to retrieve a * {@link android.hardware.camera2.CameraManager} for interacting with * camera devices. diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 4f09d5a21836..706cbbf560c5 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -43,6 +43,7 @@ import com.android.server.SystemConfig; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.text.Collator; +import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; @@ -2028,6 +2029,27 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { return this; } + /** + * Return all the APK paths that may be required to load this application, including all + * splits, shared libraries, and resource overlays. + * @hide + */ + public String[] getAllApkPaths() { + final String[][] inputLists = { splitSourceDirs, sharedLibraryFiles, resourceDirs }; + final List<String> output = new ArrayList<>(10); + if (sourceDir != null) { + output.add(sourceDir); + } + for (String[] inputList : inputLists) { + if (inputList != null) { + for (String input : inputList) { + output.add(input); + } + } + } + return output.toArray(new String[output.size()]); + } + /** {@hide} */ public void setCodePath(String codePath) { scanSourceDir = codePath; } /** {@hide} */ public void setBaseCodePath(String baseCodePath) { sourceDir = baseCodePath; } /** {@hide} */ public void setSplitCodePaths(String[] splitCodePaths) { splitSourceDirs = splitCodePaths; } diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 7de810526d4b..7b4dd195ded9 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -1342,8 +1342,8 @@ public class PackageInstaller { * @hide */ public boolean areHiddenOptionsSet() { - return (installFlags & (PackageManager.INSTALL_ALLOW_DOWNGRADE - | PackageManager.INSTALL_RESPECT_ALLOW_DOWNGRADE + return (installFlags & (PackageManager.INSTALL_REQUEST_DOWNGRADE + | PackageManager.INSTALL_ALLOW_DOWNGRADE | PackageManager.INSTALL_DONT_KILL_APP | PackageManager.INSTALL_INSTANT_APP | PackageManager.INSTALL_FULL_APP @@ -1448,20 +1448,49 @@ public class PackageInstaller { /** * Request that rollbacks be enabled for the given upgrade. + * + * @removed + * @deprecated use {@link #setEnableRollback(boolean)} instead. * @hide */ + @Deprecated @SystemApi public void setEnableRollback() { installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK; } - /** {@hide} */ + /** + * Request that rollbacks be enabled or disabled for the given upgrade. + * + * @param enable set to {@code true} to enable, {@code false} to disable + * @hide + */ + @SystemApi + public void setEnableRollback(boolean enable) { + if (enable) { + installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK; + } else { + installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK; + } + } + + /** + * @deprecated use {@link #setRequestDowngrade(boolean)}. + * {@hide} + */ @SystemApi + @Deprecated public void setAllowDowngrade(boolean allowDowngrade) { - if (allowDowngrade) { - installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE; + setRequestDowngrade(allowDowngrade); + } + + /** {@hide} */ + @SystemApi + public void setRequestDowngrade(boolean requestDowngrade) { + if (requestDowngrade) { + installFlags |= PackageManager.INSTALL_REQUEST_DOWNGRADE; } else { - installFlags &= ~PackageManager.INSTALL_ALLOW_DOWNGRADE; + installFlags &= ~PackageManager.INSTALL_REQUEST_DOWNGRADE; } } @@ -1982,11 +2011,23 @@ public class PackageInstaller { /** * Get the value set in {@link SessionParams#setAllowDowngrade(boolean)}. * + * @deprecated use {@link #getRequestDowngrade()}. * @hide */ @SystemApi + @Deprecated public boolean getAllowDowngrade() { - return (installFlags & PackageManager.INSTALL_ALLOW_DOWNGRADE) != 0; + return getRequestDowngrade(); + } + + /** + * Get the value set in {@link SessionParams#setRequestDowngrade(boolean)}. + * + * @hide + */ + @SystemApi + public boolean getRequestDowngrade() { + return (installFlags & PackageManager.INSTALL_REQUEST_DOWNGRADE) != 0; } /** @@ -2036,6 +2077,16 @@ public class PackageInstaller { } /** + * Return whether rollback is enabled or disabled for the given upgrade. + * + * @hide + */ + @SystemApi + public boolean getEnableRollback() { + return (installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) != 0; + } + + /** * Get the value set in {@link SessionParams#setAllocateAggressive(boolean)}. * * @hide diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index c133fba031f2..d1ebcfdaca3a 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -710,7 +710,7 @@ public abstract class PackageManager { INSTALL_INTERNAL, INSTALL_FROM_ADB, INSTALL_ALL_USERS, - INSTALL_ALLOW_DOWNGRADE, + INSTALL_REQUEST_DOWNGRADE, INSTALL_GRANT_RUNTIME_PERMISSIONS, INSTALL_FORCE_VOLUME_UUID, INSTALL_FORCE_PERMISSION_PROMPT, @@ -721,7 +721,7 @@ public abstract class PackageManager { INSTALL_VIRTUAL_PRELOAD, INSTALL_APEX, INSTALL_ENABLE_ROLLBACK, - INSTALL_RESPECT_ALLOW_DOWNGRADE, + INSTALL_ALLOW_DOWNGRADE, }) @Retention(RetentionPolicy.SOURCE) public @interface InstallFlags {} @@ -768,14 +768,21 @@ public abstract class PackageManager { public static final int INSTALL_ALL_USERS = 0x00000040; /** - * Flag parameter for {@link #installPackage} to indicate that it is okay - * to install an update to an app where the newly installed app has a lower - * version code than the currently installed app. This is permitted only if - * the currently installed app is marked debuggable. + * Flag parameter for {@link #installPackage} to indicate that an upgrade to a lower version + * of a package than currently installed has been requested. + * + * <p>Note that this flag doesn't guarantee that downgrade will be performed. That decision + * depends + * on whenever: + * <ul> + * <li>An app is debuggable. + * <li>Or a build is debuggable. + * <li>Or {@link #INSTALL_ALLOW_DOWNGRADE} is set. + * </ul> * * @hide */ - public static final int INSTALL_ALLOW_DOWNGRADE = 0x00000080; + public static final int INSTALL_REQUEST_DOWNGRADE = 0x00000080; /** * Flag parameter for {@link #installPackage} to indicate that all runtime @@ -868,12 +875,11 @@ public abstract class PackageManager { /** * Flag parameter for {@link #installPackage} to indicate that - * {@link #INSTALL_ALLOW_DOWNGRADE} should be respected. + * {@link #INSTALL_REQUEST_DOWNGRADE} should be allowed. * * @hide */ - // TODO(b/127322579): rename - public static final int INSTALL_RESPECT_ALLOW_DOWNGRADE = 0x00100000; + public static final int INSTALL_ALLOW_DOWNGRADE = 0x00100000; /** @hide */ @IntDef(flag = true, prefix = { "DONT_KILL_APP" }, value = { @@ -3041,14 +3047,44 @@ public abstract class PackageManager { public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 1 << 7; /** - * Mask for all permission flags. + * Permission flag: The permission's usage should be made highly visible to the user + * when granted. + * + * @hide + */ + @SystemApi + public static final int FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED = 1 << 8; + + /** + * Permission flag: The permission's usage should be made highly visible to the user + * when denied. * * @hide */ @SystemApi + public static final int FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED = 1 << 9; + + /** + * Mask for all permission flags present in Android P + * + * @deprecated This constant does not contain useful information and should never have been + * exposed. When checking permission flags always flag each flag explicitly and ignore all + * flags that do not matter for this particular code. + * + * @hide + */ + @Deprecated + @SystemApi public static final int MASK_PERMISSION_FLAGS = 0xFF; /** + * Mask for all permission flags. + * + * @hide + */ + public static final int MASK_PERMISSION_FLAGS_ALL = 0x3FF; + + /** * Injected activity in app that forwards user to setting activity of that app. * * @hide @@ -3755,6 +3791,8 @@ public abstract class PackageManager { FLAG_PERMISSION_REVOKE_ON_UPGRADE, FLAG_PERMISSION_SYSTEM_FIXED, FLAG_PERMISSION_GRANTED_BY_DEFAULT, + FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED, + FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED, /* FLAG_PERMISSION_REVOKE_WHEN_REQUESED */ @@ -3829,7 +3867,8 @@ public abstract class PackageManager { @TestApi @RequiresPermission(anyOf = { android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, - android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS + android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, + android.Manifest.permission.GET_RUNTIME_PERMISSIONS }) public abstract @PermissionFlags int getPermissionFlags(String permissionName, String packageName, @NonNull UserHandle user); @@ -6542,6 +6581,8 @@ public abstract class PackageManager { case FLAG_PERMISSION_USER_FIXED: return "USER_FIXED"; case FLAG_PERMISSION_REVIEW_REQUIRED: return "REVIEW_REQUIRED"; case FLAG_PERMISSION_REVOKE_WHEN_REQUESTED: return "REVOKE_WHEN_REQUESTED"; + case FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED: return "USER_SENSITIVE_WHEN_GRANTED"; + case FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED: return "USER_SENSITIVE_WHEN_DENIED"; default: return Integer.toString(flag); } } diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java index 565cd3375c32..633966c38786 100644 --- a/core/java/android/content/res/ResourcesImpl.java +++ b/core/java/android/content/res/ResourcesImpl.java @@ -1303,7 +1303,7 @@ public class ResourcesImpl { @AnyRes static int getAttributeSetSourceResId(@Nullable AttributeSet set) { - if (set == null) { + if (set == null || !(set instanceof XmlBlock.Parser)) { return ID_NULL; } return ((XmlBlock.Parser) set).getSourceResId(); diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java index d36e076381eb..b79cf6566987 100644 --- a/core/java/android/content/res/TypedArray.java +++ b/core/java/android/content/res/TypedArray.java @@ -19,7 +19,6 @@ package android.content.res; import android.annotation.AnyRes; import android.annotation.ColorInt; import android.annotation.Nullable; -import android.annotation.StyleRes; import android.annotation.StyleableRes; import android.annotation.UnsupportedAppUsage; import android.content.pm.ActivityInfo; @@ -72,7 +71,7 @@ public class TypedArray { static final int STYLE_RESOURCE_ID = 3; static final int STYLE_CHANGING_CONFIGURATIONS = 4; static final int STYLE_DENSITY = 5; - static final int SYTLE_SOURCE_RESOURCE_ID = 6; + static final int STYLE_SOURCE_RESOURCE_ID = 6; @UnsupportedAppUsage private final Resources mResources; @@ -1134,14 +1133,14 @@ public class TypedArray { * resolved in a style or layout. * @throws RuntimeException if the TypedArray has already been recycled. */ - @StyleRes - public int getSourceResourceId(@StyleableRes int index, @StyleRes int defaultValue) { + @AnyRes + public int getSourceResourceId(@StyleableRes int index, @AnyRes int defaultValue) { if (mRecycled) { throw new RuntimeException("Cannot make calls to a recycled instance!"); } index *= STYLE_NUM_ENTRIES; - final int resid = mData[index + SYTLE_SOURCE_RESOURCE_ID]; + final int resid = mData[index + STYLE_SOURCE_RESOURCE_ID]; if (resid != 0) { return resid; } @@ -1360,7 +1359,7 @@ public class TypedArray { data[index + STYLE_CHANGING_CONFIGURATIONS]); outValue.density = data[index + STYLE_DENSITY]; outValue.string = (type == TypedValue.TYPE_STRING) ? loadStringValueAt(index) : null; - outValue.sourceResourceId = data[index + SYTLE_SOURCE_RESOURCE_ID]; + outValue.sourceResourceId = data[index + STYLE_SOURCE_RESOURCE_ID]; return true; } diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index ac863b2a45af..81abdea0d23f 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -1174,6 +1174,7 @@ public class Camera { { private final Camera mCamera; + @UnsupportedAppUsage public EventHandler(Camera c, Looper looper) { super(looper); mCamera = c; diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 0497f8c94667..fb0821e735e9 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -56,6 +56,7 @@ import android.util.ArrayMap; import android.util.Log; import android.util.SparseIntArray; +import com.android.internal.annotations.GuardedBy; import com.android.internal.telephony.ITelephony; import com.android.internal.telephony.PhoneConstants; import com.android.internal.util.Preconditions; @@ -2542,6 +2543,94 @@ public class ConnectivityManager { } /** + * Callback for use with {@link registerTetheringEventCallback} to find out tethering + * upstream status. + * + *@hide + */ + @SystemApi + public abstract static class OnTetheringEventCallback { + + /** + * Called when tethering upstream changed. This can be called multiple times and can be + * called any time. + * + * @param network the {@link Network} of tethering upstream. Null means tethering doesn't + * have any upstream. + */ + public void onUpstreamChanged(@Nullable Network network) {} + } + + @GuardedBy("mTetheringEventCallbacks") + private final ArrayMap<OnTetheringEventCallback, ITetheringEventCallback> + mTetheringEventCallbacks = new ArrayMap<>(); + + /** + * Start listening to tethering change events. Any new added callback will receive the last + * tethering status right away. If callback is registered when tethering loses its upstream or + * disabled, {@link OnTetheringEventCallback#onUpstreamChanged} will immediately be called + * with a null argument. The same callback object cannot be registered twice. + * + * @param executor the executor on which callback will be invoked. + * @param callback the callback to be called when tethering has change events. + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) + public void registerTetheringEventCallback( + @NonNull @CallbackExecutor Executor executor, + @NonNull final OnTetheringEventCallback callback) { + Preconditions.checkNotNull(callback, "OnTetheringEventCallback cannot be null."); + + synchronized (mTetheringEventCallbacks) { + Preconditions.checkArgument(!mTetheringEventCallbacks.containsKey(callback), + "callback was already registered."); + ITetheringEventCallback remoteCallback = new ITetheringEventCallback.Stub() { + @Override + public void onUpstreamChanged(Network network) throws RemoteException { + Binder.withCleanCallingIdentity(() -> + executor.execute(() -> { + callback.onUpstreamChanged(network); + })); + } + }; + try { + String pkgName = mContext.getOpPackageName(); + Log.i(TAG, "registerTetheringUpstreamCallback:" + pkgName); + mService.registerTetheringEventCallback(remoteCallback, pkgName); + mTetheringEventCallbacks.put(callback, remoteCallback); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** + * Remove tethering event callback previously registered with + * {@link #registerTetheringEventCallback}. + * + * @param callback previously registered callback. + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) + public void unregisterTetheringEventCallback( + @NonNull final OnTetheringEventCallback callback) { + synchronized (mTetheringEventCallbacks) { + ITetheringEventCallback remoteCallback = mTetheringEventCallbacks.remove(callback); + Preconditions.checkNotNull(remoteCallback, "callback was not registered."); + try { + String pkgName = mContext.getOpPackageName(); + Log.i(TAG, "unregisterTetheringEventCallback:" + pkgName); + mService.unregisterTetheringEventCallback(remoteCallback, pkgName); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + + /** * Get the list of regular expressions that define any tetherable * USB network interfaces. If USB tethering is not supported by the * device, this list should be empty. diff --git a/core/java/android/net/DnsPacket.java b/core/java/android/net/DnsPacket.java index 458fb340b196..0ac02b1b7b37 100644 --- a/core/java/android/net/DnsPacket.java +++ b/core/java/android/net/DnsPacket.java @@ -28,7 +28,6 @@ import java.text.DecimalFormat; import java.text.FieldPosition; import java.util.ArrayList; import java.util.List; -import java.util.StringJoiner; /** * Defines basic data for DNS protocol based on RFC 1035. @@ -42,7 +41,7 @@ public abstract class DnsPacket { public final int id; public final int flags; public final int rcode; - private final int[] mSectionCount; + private final int[] mRecordCount; /** * Create a new DnsHeader from a positioned ByteBuffer. @@ -52,27 +51,32 @@ public abstract class DnsPacket { * When this constructor returns, the reading position of the ByteBuffer has been * advanced to the end of the DNS header record. * This is meant to chain with other methods reading a DNS response in sequence. - * */ DnsHeader(@NonNull ByteBuffer buf) throws BufferUnderflowException { id = BitUtils.uint16(buf.getShort()); flags = BitUtils.uint16(buf.getShort()); rcode = flags & 0xF; - mSectionCount = new int[NUM_SECTIONS]; + mRecordCount = new int[NUM_SECTIONS]; for (int i = 0; i < NUM_SECTIONS; ++i) { - mSectionCount[i] = BitUtils.uint16(buf.getShort()); + mRecordCount[i] = BitUtils.uint16(buf.getShort()); } } /** - * Get section count by section type. + * Get record count by type. */ - public int getSectionCount(int sectionType) { - return mSectionCount[sectionType]; + public int getRecordCount(int type) { + return mRecordCount[type]; } } - public class DnsSection { + /** + * It's used both for DNS questions and DNS resource records. + * + * DNS questions (No TTL/RDATA) + * DNS resource records (With TTL/RDATA) + */ + public class DnsRecord { private static final int MAXNAMESIZE = 255; private static final int MAXLABELSIZE = 63; private static final int MAXLABELCOUNT = 128; @@ -81,57 +85,57 @@ public abstract class DnsPacket { private final DecimalFormat byteFormat = new DecimalFormat(); private final FieldPosition pos = new FieldPosition(0); - private static final String TAG = "DnsSection"; + private static final String TAG = "DnsRecord"; public final String dName; public final int nsType; public final int nsClass; public final long ttl; - private final byte[] mRR; + private final byte[] mRdata; /** - * Create a new DnsSection from a positioned ByteBuffer. + * Create a new DnsRecord from a positioned ByteBuffer. * - * The ByteBuffer must be in network byte order (which is the default). - * Reads the passed ByteBuffer from its current position and decodes a DNS section. + * @param ByteBuffer input of record, must be in network byte order + * (which is the default). + * Reads the passed ByteBuffer from its current position and decodes a DNS record. * When this constructor returns, the reading position of the ByteBuffer has been * advanced to the end of the DNS header record. * This is meant to chain with other methods reading a DNS response in sequence. - * */ - DnsSection(int sectionType, @NonNull ByteBuffer buf) + DnsRecord(int recordType, @NonNull ByteBuffer buf) throws BufferUnderflowException, ParseException { dName = parseName(buf, 0 /* Parse depth */); if (dName.length() > MAXNAMESIZE) { - throw new ParseException("Parse name fail, name size is too long"); + throw new ParseException( + "Parse name fail, name size is too long: " + dName.length()); } nsType = BitUtils.uint16(buf.getShort()); nsClass = BitUtils.uint16(buf.getShort()); - if (sectionType != QDSECTION) { + if (recordType != QDSECTION) { ttl = BitUtils.uint32(buf.getInt()); final int length = BitUtils.uint16(buf.getShort()); - mRR = new byte[length]; - buf.get(mRR); + mRdata = new byte[length]; + buf.get(mRdata); } else { ttl = 0; - mRR = null; + mRdata = null; } } /** - * Get a copy of rr. + * Get a copy of rdata. */ - @Nullable public byte[] getRR() { - return (mRR == null) ? null : mRR.clone(); + @Nullable + public byte[] getRR() { + return (mRdata == null) ? null : mRdata.clone(); } /** * Convert label from {@code byte[]} to {@code String} * - * It follows the same converting rule as native layer. - * (See ns_name.c in libc) - * + * Follows the same conversion rules of the native code (ns_name.c in libc) */ private String labelToString(@NonNull byte[] label) { final StringBuffer sb = new StringBuffer(); @@ -139,13 +143,16 @@ public abstract class DnsPacket { int b = BitUtils.uint8(label[i]); // Control characters and non-ASCII characters. if (b <= 0x20 || b >= 0x7f) { + // Append the byte as an escaped decimal number, e.g., "\19" for 0x13. sb.append('\\'); byteFormat.format(b, sb, pos); } else if (b == '"' || b == '.' || b == ';' || b == '\\' || b == '(' || b == ')' || b == '@' || b == '$') { + // Append the byte as an escaped character, e.g., "\:" for 0x3a. sb.append('\\'); sb.append((char) b); } else { + // Append the byte as a character, e.g., "a" for 0x61. sb.append((char) b); } } @@ -154,7 +161,9 @@ public abstract class DnsPacket { private String parseName(@NonNull ByteBuffer buf, int depth) throws BufferUnderflowException, ParseException { - if (depth > MAXLABELCOUNT) throw new ParseException("Parse name fails, too many labels"); + if (depth > MAXLABELCOUNT) { + throw new ParseException("Failed to parse name, too many labels"); + } final int len = BitUtils.uint8(buf.get()); final int mask = len & NAME_COMPRESSION; if (0 == len) { @@ -194,7 +203,7 @@ public abstract class DnsPacket { private static final String TAG = DnsPacket.class.getSimpleName(); protected final DnsHeader mHeader; - protected final List<DnsSection>[] mSections; + protected final List<DnsRecord>[] mRecords; public static class ParseException extends Exception { public ParseException(String msg) { @@ -216,18 +225,18 @@ public abstract class DnsPacket { throw new ParseException("Parse Header fail, bad input data", e); } - mSections = new ArrayList[NUM_SECTIONS]; + mRecords = new ArrayList[NUM_SECTIONS]; for (int i = 0; i < NUM_SECTIONS; ++i) { - final int count = mHeader.getSectionCount(i); + final int count = mHeader.getRecordCount(i); if (count > 0) { - mSections[i] = new ArrayList(count); + mRecords[i] = new ArrayList(count); } for (int j = 0; j < count; ++j) { try { - mSections[i].add(new DnsSection(i, buffer)); + mRecords[i].add(new DnsRecord(i, buffer)); } catch (BufferUnderflowException e) { - throw new ParseException("Parse section fail", e); + throw new ParseException("Parse record fail", e); } } } diff --git a/core/java/android/net/DnsResolver.java b/core/java/android/net/DnsResolver.java index 6d54264cd89f..d3bc3e66fbee 100644 --- a/core/java/android/net/DnsResolver.java +++ b/core/java/android/net/DnsResolver.java @@ -43,6 +43,9 @@ import java.util.function.Consumer; /** * Dns resolver class for asynchronous dns querying * + * Note that if a client sends a query with more than 1 record in the question section but + * the remote dns server does not support this, it may not respond at all, leading to a timeout. + * */ public final class DnsResolver { private static final String TAG = "DnsResolver"; @@ -226,19 +229,19 @@ public final class DnsResolver { if (mHeader.rcode != 0) { throw new ParseException("Response error, rcode:" + mHeader.rcode); } - if (mHeader.getSectionCount(ANSECTION) == 0) { + if (mHeader.getRecordCount(ANSECTION) == 0) { throw new ParseException("No available answer"); } - if (mHeader.getSectionCount(QDSECTION) == 0) { + if (mHeader.getRecordCount(QDSECTION) == 0) { throw new ParseException("No question found"); } - // Assume only one question per answer packet. (RFC1035) - mQueryType = mSections[QDSECTION].get(0).nsType; + // Expect only one question in question section. + mQueryType = mRecords[QDSECTION].get(0).nsType; } public @NonNull List<InetAddress> getAddresses() { final List<InetAddress> results = new ArrayList<InetAddress>(); - for (final DnsSection ansSec : mSections[ANSECTION]) { + for (final DnsRecord ansSec : mRecords[ANSECTION]) { // Only support A and AAAA, also ignore answers if query type != answer type. int nsType = ansSec.nsType; if (nsType != mQueryType || (nsType != TYPE_A && nsType != TYPE_AAAA)) { diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index fd44fc8a2353..a425a91ef39f 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -19,6 +19,7 @@ package android.net; import android.app.PendingIntent; import android.net.ConnectionInfo; import android.net.LinkProperties; +import android.net.ITetheringEventCallback; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo; @@ -214,4 +215,7 @@ interface IConnectivityManager void getLatestTetheringEntitlementResult(int type, in ResultReceiver receiver, boolean showEntitlementUi, String callerPkg); + + void registerTetheringEventCallback(ITetheringEventCallback callback, String callerPkg); + void unregisterTetheringEventCallback(ITetheringEventCallback callback, String callerPkg); } diff --git a/core/java/android/net/ITestNetworkManager.aidl b/core/java/android/net/ITestNetworkManager.aidl new file mode 100644 index 000000000000..119a30cb2ddb --- /dev/null +++ b/core/java/android/net/ITestNetworkManager.aidl @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2018, 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.net; + +import android.net.LinkAddress; +import android.net.TestNetworkInterface; +import android.os.IBinder; +import android.os.ParcelFileDescriptor; + +/** + * Interface that allows for creation and management of test-only networks. + * + * @hide + */ +interface ITestNetworkManager +{ + TestNetworkInterface createTunInterface(in LinkAddress[] linkAddrs); + + void setupTestNetwork(in String iface, in IBinder binder); + + void teardownTestNetwork(int netId); +} diff --git a/core/java/android/net/ITetheringEventCallback.aidl b/core/java/android/net/ITetheringEventCallback.aidl new file mode 100644 index 000000000000..d502088542a6 --- /dev/null +++ b/core/java/android/net/ITetheringEventCallback.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2019 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.net; + +import android.net.Network; + +/** + * Callback class for receiving tethering changed events + * @hide + */ +oneway interface ITetheringEventCallback +{ + void onUpstreamChanged(in Network network); +} diff --git a/core/java/android/net/OWNERS b/core/java/android/net/OWNERS index 15f4913c5419..a1c7fce67d30 100644 --- a/core/java/android/net/OWNERS +++ b/core/java/android/net/OWNERS @@ -1,12 +1,11 @@ set noparent codewiz@google.com -ek@google.com -jsharkey@android.com jchalard@google.com +jsharkey@android.com +junyulai@google.com lorenzo@google.com reminv@google.com satk@google.com -silberst@google.com per-file SSL*, Uri*, Url* = flooey@google.com, narayan@google.com, tobiast@google.com diff --git a/core/java/android/net/ParseException.java b/core/java/android/net/ParseException.java index 68b209b6d81b..2380e863d043 100644 --- a/core/java/android/net/ParseException.java +++ b/core/java/android/net/ParseException.java @@ -24,6 +24,7 @@ public class ParseException extends RuntimeException { public String response; ParseException(String response) { + super(response); this.response = response; } } diff --git a/core/java/android/net/TestNetworkInterface.aidl b/core/java/android/net/TestNetworkInterface.aidl new file mode 100644 index 000000000000..e1f4f9f794eb --- /dev/null +++ b/core/java/android/net/TestNetworkInterface.aidl @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2019 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.net; + +/** @hide */ +parcelable TestNetworkInterface; diff --git a/core/java/android/net/TestNetworkInterface.java b/core/java/android/net/TestNetworkInterface.java new file mode 100644 index 000000000000..30e68f5b9854 --- /dev/null +++ b/core/java/android/net/TestNetworkInterface.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2019 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.net; + +import android.annotation.TestApi; +import android.os.Parcel; +import android.os.ParcelFileDescriptor; +import android.os.Parcelable; + +/** + * This class is used to return the interface name and fd of the test interface + * + * @hide + */ +@TestApi +public final class TestNetworkInterface implements Parcelable { + private static final String TAG = "TestNetworkInterface"; + + private final ParcelFileDescriptor mFileDescriptor; + private final String mInterfaceName; + + @Override + public int describeContents() { + return (mFileDescriptor != null) ? Parcelable.CONTENTS_FILE_DESCRIPTOR : 0; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + out.writeParcelable(mFileDescriptor, PARCELABLE_WRITE_RETURN_VALUE); + out.writeString(mInterfaceName); + } + + public TestNetworkInterface(ParcelFileDescriptor pfd, String intf) { + mFileDescriptor = pfd; + mInterfaceName = intf; + } + + private TestNetworkInterface(Parcel in) { + mFileDescriptor = in.readParcelable(ParcelFileDescriptor.class.getClassLoader()); + mInterfaceName = in.readString(); + } + + public ParcelFileDescriptor getFileDescriptor() { + return mFileDescriptor; + } + + public String getInterfaceName() { + return mInterfaceName; + } + + public static final Parcelable.Creator<TestNetworkInterface> CREATOR = + new Parcelable.Creator<TestNetworkInterface>() { + public TestNetworkInterface createFromParcel(Parcel in) { + return new TestNetworkInterface(in); + } + + public TestNetworkInterface[] newArray(int size) { + return new TestNetworkInterface[size]; + } + }; +} diff --git a/core/java/android/net/TestNetworkManager.java b/core/java/android/net/TestNetworkManager.java new file mode 100644 index 000000000000..cd58e6641e51 --- /dev/null +++ b/core/java/android/net/TestNetworkManager.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2018 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.net; + +import android.annotation.NonNull; +import android.annotation.TestApi; +import android.content.Context; +import android.os.IBinder; +import android.os.RemoteException; + +import com.android.internal.util.Preconditions; + +/** + * Class that allows creation and management of per-app, test-only networks + * + * @hide + */ +@TestApi +public class TestNetworkManager { + @NonNull private static final String TAG = TestNetworkManager.class.getSimpleName(); + + @NonNull private final ITestNetworkManager mService; + @NonNull private final Context mContext; + + /** @hide */ + public TestNetworkManager(@NonNull Context context, @NonNull ITestNetworkManager service) { + mContext = Preconditions.checkNotNull(context, "missing Context"); + mService = Preconditions.checkNotNull(service, "missing ITestNetworkManager"); + } + + /** + * Teardown the capability-limited, testing-only network for a given interface + * + * @param network The test network that should be torn down + * @hide + */ + @TestApi + public void teardownTestNetwork(@NonNull Network network) { + try { + mService.teardownTestNetwork(network.netId); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Sets up a capability-limited, testing-only network for a given interface + * + * @param iface the name of the interface to be used for the Network LinkProperties. + * @param binder A binder object guarding the lifecycle of this test network. + * @hide + */ + @TestApi + public void setupTestNetwork(@NonNull String iface, @NonNull IBinder binder) { + try { + mService.setupTestNetwork(iface, binder); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Create a tun interface for testing purposes + * + * @param linkAddrs an array of LinkAddresses to assign to the TUN interface + * @return A ParcelFileDescriptor of the underlying TUN interface. Close this to tear down the + * TUN interface. + * @hide + */ + @TestApi + public TestNetworkInterface createTunInterface(@NonNull LinkAddress[] linkAddrs) { + try { + return mService.createTunInterface(linkAddrs); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } +} diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java index 01932abfaa9b..f23dc2da291a 100644 --- a/core/java/android/nfc/cardemulation/CardEmulation.java +++ b/core/java/android/nfc/cardemulation/CardEmulation.java @@ -16,6 +16,7 @@ package android.nfc.cardemulation; +import android.annotation.NonNull; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.app.Activity; @@ -359,7 +360,7 @@ public final class CardEmulation { * @param service The component name of the service * @return whether the registration was successful. */ - public boolean unsetOffHostForService(ComponentName service) { + public boolean unsetOffHostForService(@NonNull ComponentName service) { NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext); if (adapter == null) { return false; @@ -405,7 +406,8 @@ public final class CardEmulation { * @param offHostSecureElement Secure Element to register the AID to * @return whether the registration was successful. */ - public boolean setOffHostForService(ComponentName service, String offHostSecureElement) { + public boolean setOffHostForService(@NonNull ComponentName service, + @NonNull String offHostSecureElement) { boolean validSecureElement = false; NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext); diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index b28c2f462db2..d5ef249e85e7 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -653,7 +653,8 @@ public class Binder implements IBinder { * * @return an object that will be passed back to #onTransactEnded (or null). */ - Object onTransactStarted(IBinder binder, int transactionCode); + @Nullable + Object onTransactStarted(@NonNull IBinder binder, int transactionCode); /** * Called after onTranact (even when an exception is thrown). diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index b3e35b6237cc..fea69c063e9c 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -389,7 +389,7 @@ public class Environment { /** {@hide} */ public static File getDataStagingDirectory(String volumeUuid) { - return new File(getDataDirectory(volumeUuid), "pkg_staging"); + return new File(getDataDirectory(volumeUuid), "app-staging"); } /** {@hide} */ diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java index e6c12c7972a2..a03974238039 100644 --- a/core/java/android/os/Handler.java +++ b/core/java/android/os/Handler.java @@ -82,19 +82,19 @@ public class Handler { * @param msg A {@link android.os.Message Message} object * @return True if no further handling is desired */ - public boolean handleMessage(Message msg); + boolean handleMessage(@NonNull Message msg); } /** * Subclasses must implement this to receive messages. */ - public void handleMessage(Message msg) { + public void handleMessage(@NonNull Message msg) { } /** * Handle system messages here. */ - public void dispatchMessage(Message msg) { + public void dispatchMessage(@NonNull Message msg) { if (msg.callback != null) { handleCallback(msg); } else { @@ -128,7 +128,7 @@ public class Handler { * * @param callback The callback interface in which to handle messages, or null. */ - public Handler(Callback callback) { + public Handler(@Nullable Callback callback) { this(callback, false); } @@ -137,7 +137,7 @@ public class Handler { * * @param looper The looper, must not be null. */ - public Handler(Looper looper) { + public Handler(@NonNull Looper looper) { this(looper, null, false); } @@ -148,7 +148,7 @@ public class Handler { * @param looper The looper, must not be null. * @param callback The callback interface in which to handle messages, or null. */ - public Handler(Looper looper, Callback callback) { + public Handler(@NonNull Looper looper, @Nullable Callback callback) { this(looper, callback, false); } @@ -189,7 +189,7 @@ public class Handler { * * @hide */ - public Handler(Callback callback, boolean async) { + public Handler(@Nullable Callback callback, boolean async) { if (FIND_POTENTIAL_LEAKS) { final Class<? extends Handler> klass = getClass(); if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && @@ -229,7 +229,7 @@ public class Handler { * * @hide */ - public Handler(Looper looper, Callback callback, boolean async) { + public Handler(@NonNull Looper looper, @Nullable Callback callback, boolean async) { mLooper = looper; mQueue = looper.mQueue; mCallback = callback; @@ -289,7 +289,8 @@ public class Handler { } /** {@hide} */ - public String getTraceName(Message message) { + @NonNull + public String getTraceName(@NonNull Message message) { final StringBuilder sb = new StringBuilder(); sb.append(getClass().getName()).append(": "); if (message.callback != null) { @@ -308,7 +309,8 @@ public class Handler { * * @param message The message whose name is being queried */ - public String getMessageName(Message message) { + @NonNull + public String getMessageName(@NonNull Message message) { if (message.callback != null) { return message.callback.getClass().getName(); } @@ -320,6 +322,7 @@ public class Handler { * creating and allocating new instances. The retrieved message has its handler set to this instance (Message.target == this). * If you don't want that facility, just call Message.obtain() instead. */ + @NonNull public final Message obtainMessage() { return Message.obtain(this); @@ -331,6 +334,7 @@ public class Handler { * @param what Value to assign to the returned Message.what field. * @return A Message from the global message pool. */ + @NonNull public final Message obtainMessage(int what) { return Message.obtain(this, what); @@ -345,8 +349,8 @@ public class Handler { * @param obj Value to assign to the returned Message.obj field. * @return A Message from the global message pool. */ - public final Message obtainMessage(int what, Object obj) - { + @NonNull + public final Message obtainMessage(int what, @Nullable Object obj) { return Message.obtain(this, what, obj); } @@ -359,6 +363,7 @@ public class Handler { * @param arg2 Value to assign to the returned Message.arg2 field. * @return A Message from the global message pool. */ + @NonNull public final Message obtainMessage(int what, int arg1, int arg2) { return Message.obtain(this, what, arg1, arg2); @@ -374,8 +379,8 @@ public class Handler { * @param obj Value to assign to the returned Message.obj field. * @return A Message from the global message pool. */ - public final Message obtainMessage(int what, int arg1, int arg2, Object obj) - { + @NonNull + public final Message obtainMessage(int what, int arg1, int arg2, @Nullable Object obj) { return Message.obtain(this, what, arg1, arg2, obj); } @@ -390,8 +395,7 @@ public class Handler { * message queue. Returns false on failure, usually because the * looper processing the message queue is exiting. */ - public final boolean post(Runnable r) - { + public final boolean post(@NonNull Runnable r) { return sendMessageDelayed(getPostMessage(r), 0); } @@ -413,8 +417,7 @@ public class Handler { * the looper is quit before the delivery time of the message * occurs then the message will be dropped. */ - public final boolean postAtTime(Runnable r, long uptimeMillis) - { + public final boolean postAtTime(@NonNull Runnable r, long uptimeMillis) { return sendMessageAtTime(getPostMessage(r), uptimeMillis); } @@ -440,8 +443,8 @@ public class Handler { * * @see android.os.SystemClock#uptimeMillis */ - public final boolean postAtTime(Runnable r, Object token, long uptimeMillis) - { + public final boolean postAtTime( + @NonNull Runnable r, @Nullable Object token, long uptimeMillis) { return sendMessageAtTime(getPostMessage(r, token), uptimeMillis); } @@ -464,8 +467,7 @@ public class Handler { * if the looper is quit before the delivery time of the message * occurs then the message will be dropped. */ - public final boolean postDelayed(Runnable r, long delayMillis) - { + public final boolean postDelayed(@NonNull Runnable r, long delayMillis) { return sendMessageDelayed(getPostMessage(r), delayMillis); } @@ -495,8 +497,8 @@ public class Handler { * if the looper is quit before the delivery time of the message * occurs then the message will be dropped. */ - public final boolean postDelayed(Runnable r, Object token, long delayMillis) - { + public final boolean postDelayed( + @NonNull Runnable r, @Nullable Object token, long delayMillis) { return sendMessageDelayed(getPostMessage(r, token), delayMillis); } @@ -515,8 +517,7 @@ public class Handler { * message queue. Returns false on failure, usually because the * looper processing the message queue is exiting. */ - public final boolean postAtFrontOfQueue(Runnable r) - { + public final boolean postAtFrontOfQueue(@NonNull Runnable r) { return sendMessageAtFrontOfQueue(getPostMessage(r)); } @@ -560,7 +561,7 @@ public class Handler { * If we ever do make it part of the API, we might want to rename it to something * less funny like runUnsafe(). */ - public final boolean runWithScissors(final Runnable r, long timeout) { + public final boolean runWithScissors(@NonNull Runnable r, long timeout) { if (r == null) { throw new IllegalArgumentException("runnable must not be null"); } @@ -580,8 +581,7 @@ public class Handler { /** * Remove any pending posts of Runnable r that are in the message queue. */ - public final void removeCallbacks(Runnable r) - { + public final void removeCallbacks(@NonNull Runnable r) { mQueue.removeMessages(this, r, null); } @@ -590,8 +590,7 @@ public class Handler { * <var>token</var> that are in the message queue. If <var>token</var> is null, * all callbacks will be removed. */ - public final void removeCallbacks(Runnable r, Object token) - { + public final void removeCallbacks(@NonNull Runnable r, @Nullable Object token) { mQueue.removeMessages(this, r, token); } @@ -604,8 +603,7 @@ public class Handler { * message queue. Returns false on failure, usually because the * looper processing the message queue is exiting. */ - public final boolean sendMessage(Message msg) - { + public final boolean sendMessage(@NonNull Message msg) { return sendMessageDelayed(msg, 0); } @@ -664,8 +662,7 @@ public class Handler { * the looper is quit before the delivery time of the message * occurs then the message will be dropped. */ - public final boolean sendMessageDelayed(Message msg, long delayMillis) - { + public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) { if (delayMillis < 0) { delayMillis = 0; } @@ -691,7 +688,7 @@ public class Handler { * the looper is quit before the delivery time of the message * occurs then the message will be dropped. */ - public boolean sendMessageAtTime(Message msg, long uptimeMillis) { + public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) { MessageQueue queue = mQueue; if (queue == null) { RuntimeException e = new RuntimeException( @@ -714,7 +711,7 @@ public class Handler { * message queue. Returns false on failure, usually because the * looper processing the message queue is exiting. */ - public final boolean sendMessageAtFrontOfQueue(Message msg) { + public final boolean sendMessageAtFrontOfQueue(@NonNull Message msg) { MessageQueue queue = mQueue; if (queue == null) { RuntimeException e = new RuntimeException( @@ -734,7 +731,7 @@ public class Handler { * looper processing the message queue is exiting. * @hide */ - public final boolean executeOrSendMessage(Message msg) { + public final boolean executeOrSendMessage(@NonNull Message msg) { if (mLooper == Looper.myLooper()) { dispatchMessage(msg); return true; @@ -742,7 +739,8 @@ public class Handler { return sendMessage(msg); } - private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { + private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg, + long uptimeMillis) { msg.target = this; msg.workSourceUid = ThreadLocalWorkSource.getUid(); @@ -765,7 +763,7 @@ public class Handler { * 'object' that are in the message queue. If <var>object</var> is null, * all messages will be removed. */ - public final void removeMessages(int what, Object object) { + public final void removeMessages(int what, @Nullable Object object) { mQueue.removeMessages(this, what, object); } @@ -774,7 +772,7 @@ public class Handler { * <var>obj</var> is <var>token</var>. If <var>token</var> is null, * all callbacks and messages will be removed. */ - public final void removeCallbacksAndMessages(Object token) { + public final void removeCallbacksAndMessages(@Nullable Object token) { mQueue.removeCallbacksAndMessages(this, token); } @@ -798,7 +796,7 @@ public class Handler { * Check if there are any pending posts of messages with code 'what' and * whose obj is 'object' in the message queue. */ - public final boolean hasMessages(int what, Object object) { + public final boolean hasMessages(int what, @Nullable Object object) { return mQueue.hasMessages(this, what, object); } @@ -806,17 +804,18 @@ public class Handler { * Check if there are any pending posts of messages with callback r in * the message queue. */ - public final boolean hasCallbacks(Runnable r) { + public final boolean hasCallbacks(@NonNull Runnable r) { return mQueue.hasMessages(this, r, null); } // if we can get rid of this method, the handler need not remember its loop // we could instead export a getMessageQueue() method... + @NonNull public final Looper getLooper() { return mLooper; } - public final void dump(Printer pw, String prefix) { + public final void dump(@NonNull Printer pw, @NonNull String prefix) { pw.println(prefix + this + " @ " + SystemClock.uptimeMillis()); if (mLooper == null) { pw.println(prefix + "looper uninitialized"); @@ -828,7 +827,7 @@ public class Handler { /** * @hide */ - public final void dumpMine(Printer pw, String prefix) { + public final void dumpMine(@NonNull Printer pw, @NonNull String prefix) { pw.println(prefix + this + " @ " + SystemClock.uptimeMillis()); if (mLooper == null) { pw.println(prefix + "looper uninitialized"); diff --git a/core/java/android/permission/IPermissionController.aidl b/core/java/android/permission/IPermissionController.aidl index 76e911ddaf5a..4f65d244d3c1 100644 --- a/core/java/android/permission/IPermissionController.aidl +++ b/core/java/android/permission/IPermissionController.aidl @@ -38,9 +38,6 @@ oneway interface IPermissionController { void countPermissionApps(in List<String> permissionNames, int flags, in RemoteCallback callback); void getPermissionUsages(boolean countSystem, long numMillis, in RemoteCallback callback); - void isApplicationQualifiedForRole(String roleName, String packageName, - in RemoteCallback callback); - void isRoleVisible(String roleName, in RemoteCallback callback); void setRuntimePermissionGrantStateByDeviceAdmin(String callerPackageName, String packageName, String permission, int grantState, in RemoteCallback callback); } diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java index 5695e42bef8e..61511aa509b1 100644 --- a/core/java/android/permission/PermissionControllerManager.java +++ b/core/java/android/permission/PermissionControllerManager.java @@ -454,48 +454,6 @@ public final class PermissionControllerManager { } /** - * Check whether an application is qualified for a role. - * - * @param roleName name of the role to check for - * @param packageName package name of the application to check for - * @param executor Executor on which to invoke the callback - * @param callback Callback to receive the result - * - * @hide - */ - @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) - public void isApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName, - @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { - checkStringNotEmpty(roleName); - checkStringNotEmpty(packageName); - checkNotNull(executor); - checkNotNull(callback); - - mRemoteService.scheduleRequest(new PendingIsApplicationQualifiedForRoleRequest( - mRemoteService, roleName, packageName, executor, callback)); - } - - /** - * Check whether a role should be visible to user. - * - * @param roleName name of the role to check for - * @param executor Executor on which to invoke the callback - * @param callback Callback to receive the result - * - * @hide - */ - @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) - public void isRoleVisible(@NonNull String roleName, - @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { - checkStringNotEmpty(roleName); - checkNotNull(executor); - checkNotNull(callback); - - mRemoteService.scheduleRequest(new PendingIsRoleVisibleRequest(mRemoteService, roleName, - executor, callback)); - } - - /** * A connection to the remote service */ static final class RemoteService extends @@ -513,7 +471,8 @@ public final class PermissionControllerManager { RemoteService(@NonNull Context context, @NonNull ComponentName componentName, @NonNull UserHandle user) { super(context, SERVICE_INTERFACE, componentName, user.getIdentifier(), - service -> Log.e(TAG, "RemoteService " + service + " died"), false, false, 1); + service -> Log.e(TAG, "RemoteService " + service + " died"), + context.getMainThreadHandler(), false, false, 1); } /** @@ -1188,109 +1147,4 @@ public final class PermissionControllerManager { } } } - - /** - * Request for {@link #isApplicationQualifiedForRole}. - */ - private static final class PendingIsApplicationQualifiedForRoleRequest extends - AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> { - - private final @NonNull String mRoleName; - private final @NonNull String mPackageName; - private final @NonNull Consumer<Boolean> mCallback; - - private final @NonNull RemoteCallback mRemoteCallback; - - private PendingIsApplicationQualifiedForRoleRequest(@NonNull RemoteService service, - @NonNull String roleName, @NonNull String packageName, - @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { - super(service); - - mRoleName = roleName; - mPackageName = packageName; - mCallback = callback; - - mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> { - long token = Binder.clearCallingIdentity(); - try { - boolean qualified; - if (result != null) { - qualified = result.getBoolean(KEY_RESULT); - } else { - qualified = false; - } - callback.accept(qualified); - } finally { - Binder.restoreCallingIdentity(token); - finish(); - } - }), null); - } - - @Override - protected void onTimeout(RemoteService remoteService) { - mCallback.accept(false); - } - - @Override - public void run() { - try { - getService().getServiceInterface().isApplicationQualifiedForRole(mRoleName, - mPackageName, mRemoteCallback); - } catch (RemoteException e) { - Log.e(TAG, "Error checking whether application qualifies for role", e); - } - } - } - - /** - * Request for {@link #isRoleVisible}. - */ - private static final class PendingIsRoleVisibleRequest extends - AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> { - - private final @NonNull String mRoleName; - private final @NonNull Consumer<Boolean> mCallback; - - private final @NonNull RemoteCallback mRemoteCallback; - - private PendingIsRoleVisibleRequest(@NonNull RemoteService service, - @NonNull String roleName, @NonNull @CallbackExecutor Executor executor, - @NonNull Consumer<Boolean> callback) { - super(service); - - mRoleName = roleName; - mCallback = callback; - - mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> { - long token = Binder.clearCallingIdentity(); - try { - boolean visible; - if (result != null) { - visible = result.getBoolean(KEY_RESULT); - } else { - visible = false; - } - callback.accept(visible); - } finally { - Binder.restoreCallingIdentity(token); - finish(); - } - }), null); - } - - @Override - protected void onTimeout(RemoteService remoteService) { - mCallback.accept(false); - } - - @Override - public void run() { - try { - getService().getServiceInterface().isRoleVisible(mRoleName, mRemoteCallback); - } catch (RemoteException e) { - Log.e(TAG, "Error checking whether role should be visible", e); - } - } - } } diff --git a/core/java/android/permission/PermissionControllerService.java b/core/java/android/permission/PermissionControllerService.java index d375c10e6d4c..2313d5972cbd 100644 --- a/core/java/android/permission/PermissionControllerService.java +++ b/core/java/android/permission/PermissionControllerService.java @@ -112,6 +112,9 @@ public abstract class PermissionControllerService extends Service { /** * Restore a backup of the runtime permissions. * + * <p>If an app mentioned in the backup is not installed the state should be saved to later + * be restored via {@link #onRestoreDelayedRuntimePermissionsBackup}. + * * @param user The user to restore * @param backup The stream to read the backup from */ @@ -120,7 +123,8 @@ public abstract class PermissionControllerService extends Service { @NonNull InputStream backup); /** - * Restore a delayed backup of the runtime permissions. + * Restore the permission state of an app that was provided in + * {@link #onRestoreRuntimePermissionsBackup} but could not be restored back then. * * @param packageName The app to restore * @param user The user to restore @@ -174,26 +178,6 @@ public abstract class PermissionControllerService extends Service { boolean countSystem, long numMillis); /** - * Check whether an application is qualified for a role. - * - * @param roleName name of the role to check for - * @param packageName package name of the application to check for - * - * @return whether the application is qualified for the role - */ - public abstract boolean onIsApplicationQualifiedForRole(@NonNull String roleName, - @NonNull String packageName); - - /** - * Check whether a role should be visible to user. - * - * @param roleName name of the role to check for - * - * @return whether the role should be visible to user - */ - public abstract boolean onIsRoleVisible(@NonNull String roleName); - - /** * Set the runtime permission state from a device admin. * * @param callerPackageName The package name of the admin requesting the change @@ -339,32 +323,6 @@ public abstract class PermissionControllerService extends Service { } @Override - public void isApplicationQualifiedForRole(String roleName, String packageName, - RemoteCallback callback) { - checkStringNotEmpty(roleName); - checkStringNotEmpty(packageName); - checkNotNull(callback, "callback"); - - enforceCallingPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, null); - - mHandler.sendMessage(obtainMessage( - PermissionControllerService::isApplicationQualifiedForRole, - PermissionControllerService.this, roleName, packageName, callback)); - } - - @Override - public void isRoleVisible(String roleName, RemoteCallback callback) { - checkStringNotEmpty(roleName); - checkNotNull(callback, "callback"); - - enforceCallingPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, null); - - mHandler.sendMessage(obtainMessage( - PermissionControllerService::isRoleVisible, - PermissionControllerService.this, roleName, callback)); - } - - @Override public void setRuntimePermissionGrantStateByDeviceAdmin(String callerPackageName, String packageName, String permission, int grantState, RemoteCallback callback) { @@ -458,21 +416,6 @@ public abstract class PermissionControllerService extends Service { } } - private void isApplicationQualifiedForRole(@NonNull String roleName, - @NonNull String packageName, @NonNull RemoteCallback callback) { - boolean qualified = onIsApplicationQualifiedForRole(roleName, packageName); - Bundle result = new Bundle(); - result.putBoolean(PermissionControllerManager.KEY_RESULT, qualified); - callback.sendResult(result); - } - - private void isRoleVisible(@NonNull String roleName, @NonNull RemoteCallback callback) { - boolean visible = onIsRoleVisible(roleName); - Bundle result = new Bundle(); - result.putBoolean(PermissionControllerManager.KEY_RESULT, visible); - callback.sendResult(result); - } - private void setRuntimePermissionGrantStateByDeviceAdmin(@NonNull String callerPackageName, @NonNull String packageName, @NonNull String permission, @PermissionGrantState int grantState, @NonNull RemoteCallback callback) { diff --git a/core/java/android/preference/DialogPreference.java b/core/java/android/preference/DialogPreference.java index 888029679018..e6564664d522 100644 --- a/core/java/android/preference/DialogPreference.java +++ b/core/java/android/preference/DialogPreference.java @@ -349,16 +349,31 @@ public abstract class DialogPreference extends Preference implements dialog.show(); } + /** + * Get the DecorView. + * @return the DecorView for the current dialog window, if it exists. + * If the window does not exist, null is returned. + */ + private View getDecorView() { + if (mDialog != null && mDialog.getWindow() != null) { + return mDialog.getWindow().getDecorView(); + } + return null; + } + void postDismiss() { removeDismissCallbacks(); - View decorView = mDialog.getWindow().getDecorView(); - decorView.post(mDismissRunnable); + View decorView = getDecorView(); + if (decorView != null) { + // If decorView is null, dialog was already dismissed + decorView.post(mDismissRunnable); + } } private void removeDismissCallbacks() { - if (mDialog != null && mDialog.getWindow() != null - && mDialog.getWindow().getDecorView() != null) { - mDialog.getWindow().getDecorView().removeCallbacks(mDismissRunnable); + View decorView = getDecorView(); + if (decorView != null) { + decorView.removeCallbacks(mDismissRunnable); } } diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index 60c8d3612cd0..0ac7c37ee293 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -323,18 +323,40 @@ public final class DeviceConfig { */ @SystemApi public interface Rollback { + + /** + * Namespace for flags that can be changed immediately after becoming available on device. + */ String NAMESPACE = "rollback"; + /** + * Namespace for flags that can be changed only after reboot. + */ String BOOT_NAMESPACE = "rollback_boot"; /** - * Timeout in milliseconds for enabling package rollback. + * Timeout duration in milliseconds for enabling package rollback. If we fail to enable + * rollback within that period, the install will proceed without rollback enabled. + * + * <p>If flag value is negative, the default value will be assigned. + * + * Flag type: {@code long} + * Namespace: Rollback.NAMESPACE */ String ENABLE_ROLLBACK_TIMEOUT = "enable_rollback_timeout"; - /** - * The lifetime duration of rollback packages in millis - */ + /** + * Lifetime duration of rollback packages in millis. A rollback will be available for + * at most that duration of time after a package is installed with + * {@link PackageInstaller.SessionParams#setEnableRollback()}. + * + * <p>If flag value is negative, the default value will be assigned. + * + * @see RollbackManager + * + * Flag type: {@code long} + * Namespace: Rollback.BOOT_NAMESPACE + */ String ROLLBACK_LIFETIME_IN_MILLIS = "rollback_lifetime_in_millis"; } diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java index cb794ad023e3..2143a0deb723 100644 --- a/core/java/android/provider/DocumentsProvider.java +++ b/core/java/android/provider/DocumentsProvider.java @@ -471,10 +471,12 @@ public abstract class DocumentsProvider extends ContentProvider { * the most recently modified documents. * <p> * If this method is overriden by the concrete DocumentsProvider and - * QUERY_ARGS_LIMIT is specified with a nonnegative int under queryArgs, the - * result will be limited by that number and QUERY_ARG_LIMIT will be - * specified under EXTRA_HONORED_ARGS. Otherwise, a default 64 limit will - * be used and no QUERY_ARG* will be specified under EXTRA_HONORED_ARGS. + * {@link ContentResolver#QUERY_ARG_LIMIT} is specified with a nonnegative + * int under queryArgs, the result will be limited by that number and + * {@link ContentResolver#QUERY_ARG_LIMIT} will be specified under + * {@link ContentResolver#EXTRA_HONORED_ARGS}. Otherwise, a default 64 limit + * will be used and no QUERY_ARG* will be specified under + * {@link ContentResolver#EXTRA_HONORED_ARGS}. * <p> * Recent documents do not support change notifications. * diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index ecbd673a0981..5f363730b897 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7557,6 +7557,15 @@ public final class Settings { private static final Validator SKIP_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; /** + * Count of successful gestures. + * @hide + */ + public static final String SKIP_GESTURE_COUNT = "skip_gesture_count"; + + private static final Validator SKIP_GESTURE_COUNT_VALIDATOR = + NON_NEGATIVE_INTEGER_VALIDATOR; + + /** * Gesture that silences sound (alarms, notification, calls). * @hide */ @@ -7565,6 +7574,34 @@ public final class Settings { private static final Validator SILENCE_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; /** + * Count of successful silence alarms gestures. + * @hide + */ + public static final String SILENCE_ALARMS_GESTURE_COUNT = "silence_alarms_gesture_count"; + + /** + * Count of successful silence timer gestures. + * @hide + */ + public static final String SILENCE_TIMER_GESTURE_COUNT = "silence_timer_gesture_count"; + + /** + * Count of successful silence call gestures. + * @hide + */ + public static final String SILENCE_CALL_GESTURE_COUNT = "silence_call_gesture_count"; + + /** + * Count of successful silence notification gestures. + * @hide + */ + public static final String SILENCE_NOTIFICATION_GESTURE_COUNT = + "silence_notification_gesture_count"; + + private static final Validator SILENCE_GESTURE_COUNT_VALIDATOR = + NON_NEGATIVE_INTEGER_VALIDATOR; + + /** * The current night mode that has been selected by the user. Owned * and controlled by UiModeManagerService. Constants are as per * UiModeManager. @@ -8011,6 +8048,16 @@ public final class Settings { BOOLEAN_VALIDATOR; /** + * Whether or not face unlock dismisses the keyguard. + * @hide + */ + public static final String FACE_UNLOCK_DISMISSES_KEYGUARD = + "face_unlock_dismisses_keyguard"; + + private static final Validator FACE_UNLOCK_DISMISSES_KEYGUARD_VALIDATOR = + BOOLEAN_VALIDATOR; + + /** * Whether or not face unlock is allowed for apps (through BiometricPrompt). * @hide */ @@ -8684,6 +8731,7 @@ public final class Settings { NFC_PAYMENT_DEFAULT_COMPONENT, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, FACE_UNLOCK_KEYGUARD_ENABLED, + FACE_UNLOCK_DISMISSES_KEYGUARD, FACE_UNLOCK_APP_ENABLED, FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, ASSIST_GESTURE_ENABLED, @@ -8723,6 +8771,11 @@ public final class Settings { SILENCE_GESTURE, THEME_CUSTOMIZATION_OVERLAY_PACKAGES, AWARE_ENABLED, + SKIP_GESTURE_COUNT, + SILENCE_ALARMS_GESTURE_COUNT, + SILENCE_NOTIFICATION_GESTURE_COUNT, + SILENCE_CALL_GESTURE_COUNT, + SILENCE_TIMER_GESTURE_COUNT, }; /** @@ -8845,6 +8898,8 @@ public final class Settings { VALIDATORS.put(AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_KEYGUARD_ENABLED, FACE_UNLOCK_KEYGUARD_ENABLED_VALIDATOR); + VALIDATORS.put(FACE_UNLOCK_DISMISSES_KEYGUARD, + FACE_UNLOCK_DISMISSES_KEYGUARD_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_APP_ENABLED, FACE_UNLOCK_APP_ENABLED_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION_VALIDATOR); @@ -8897,6 +8952,11 @@ public final class Settings { VALIDATORS.put(THEME_CUSTOMIZATION_OVERLAY_PACKAGES, THEME_CUSTOMIZATION_OVERLAY_PACKAGES_VALIDATOR); VALIDATORS.put(AWARE_ENABLED, AWARE_ENABLED_VALIDATOR); + VALIDATORS.put(SKIP_GESTURE_COUNT, SKIP_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_ALARMS_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_TIMER_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_CALL_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_NOTIFICATION_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); } /** @@ -14952,6 +15012,17 @@ public final class Settings { "android.settings.panel.action.NFC"; /** + * Activity Action: Show a settings dialog containing controls for Wifi. + * <p> + * Input: Nothing. + * <p> + * Output: Nothing. + */ + @SdkConstant(SdkConstant.SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_WIFI = + "android.settings.panel.action.WIFI"; + + /** * Activity Action: Show a settings dialog containing all volume streams. * <p> * Input: Nothing. diff --git a/core/java/android/provider/TEST_MAPPING b/core/java/android/provider/TEST_MAPPING deleted file mode 100644 index 7486f7fc3931..000000000000 --- a/core/java/android/provider/TEST_MAPPING +++ /dev/null @@ -1,12 +0,0 @@ -{ - "presubmit": [ - { - "name": "FrameworksCoreTests", - "options": [ - { - "include-filter": "android.provider.SettingsBackupTest" - } - ] - } - ] -} diff --git a/core/java/android/service/carrier/CarrierIdentifier.java b/core/java/android/service/carrier/CarrierIdentifier.java index 3b7392fcb052..6629233ef590 100644 --- a/core/java/android/service/carrier/CarrierIdentifier.java +++ b/core/java/android/service/carrier/CarrierIdentifier.java @@ -55,7 +55,7 @@ public class CarrierIdentifier implements Parcelable { private @Nullable String mGid1; private @Nullable String mGid2; private int mCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID; - private int mPreciseCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID; + private int mSpecificCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID; public CarrierIdentifier(String mcc, String mnc, @Nullable String spn, @Nullable String imsi, @Nullable String gid1, @Nullable String gid2) { @@ -72,12 +72,12 @@ public class CarrierIdentifier implements Parcelable { * @param gid2 group id level 2 * @param carrierid carrier unique identifier {@link TelephonyManager#getSimCarrierId()}, used * to uniquely identify the carrier and look up the carrier configurations. - * @param preciseCarrierId precise carrier identifier - * {@link TelephonyManager#getSimPreciseCarrierId()} + * @param specificCarrierId specific carrier identifier + * {@link TelephonyManager#getSimSpecificCarrierId()} */ public CarrierIdentifier(@NonNull String mcc, @NonNull String mnc, @Nullable String spn, @Nullable String imsi, @Nullable String gid1, @Nullable String gid2, - int carrierid, int preciseCarrierId) { + int carrierid, int specificCarrierId) { mMcc = mcc; mMnc = mnc; mSpn = spn; @@ -85,7 +85,7 @@ public class CarrierIdentifier implements Parcelable { mGid1 = gid1; mGid2 = gid2; mCarrierId = carrierid; - mPreciseCarrierId = preciseCarrierId; + mSpecificCarrierId = specificCarrierId; } /** @@ -162,11 +162,17 @@ public class CarrierIdentifier implements Parcelable { } /** - * Returns the precise carrier id. - * @see TelephonyManager#getSimPreciseCarrierId() + * A specific carrier ID returns the fine-grained carrier ID of the current subscription. + * It can represent the fact that a carrier may be in effect an aggregation of other carriers + * (ie in an MVNO type scenario) where each of these specific carriers which are used to make + * up the actual carrier service may have different carrier configurations. + * A specific carrier ID could also be used, for example, in a scenario where a carrier requires + * different carrier configuration for different service offering such as a prepaid plan. + * + * @see TelephonyManager#getSimSpecificCarrierId() */ - public int getPreciseCarrierId() { - return mPreciseCarrierId; + public int getSpecificCarrierId() { + return mSpecificCarrierId; } @Override @@ -186,12 +192,12 @@ public class CarrierIdentifier implements Parcelable { && Objects.equals(mGid1, that.mGid1) && Objects.equals(mGid2, that.mGid2) && Objects.equals(mCarrierId, that.mCarrierId) - && Objects.equals(mPreciseCarrierId, that.mPreciseCarrierId); + && Objects.equals(mSpecificCarrierId, that.mSpecificCarrierId); } @Override public int hashCode(){ - return Objects.hash(mMcc, mMnc, mSpn, mImsi, mGid1, mGid2, mCarrierId, mPreciseCarrierId); + return Objects.hash(mMcc, mMnc, mSpn, mImsi, mGid1, mGid2, mCarrierId, mSpecificCarrierId); } @Override @@ -208,7 +214,7 @@ public class CarrierIdentifier implements Parcelable { out.writeString(mGid1); out.writeString(mGid2); out.writeInt(mCarrierId); - out.writeInt(mPreciseCarrierId); + out.writeInt(mSpecificCarrierId); } @Override @@ -221,7 +227,7 @@ public class CarrierIdentifier implements Parcelable { + ",gid1=" + mGid1 + ",gid2=" + mGid2 + ",carrierid=" + mCarrierId - + ",mPreciseCarrierId=" + mPreciseCarrierId + + ",specificCarrierId=" + mSpecificCarrierId + "}"; } @@ -234,7 +240,7 @@ public class CarrierIdentifier implements Parcelable { mGid1 = in.readString(); mGid2 = in.readString(); mCarrierId = in.readInt(); - mPreciseCarrierId = in.readInt(); + mSpecificCarrierId = in.readInt(); } /** @hide */ diff --git a/core/java/android/service/contentsuggestions/ContentSuggestionsService.java b/core/java/android/service/contentsuggestions/ContentSuggestionsService.java index 28143003fcc4..45a8466bfca1 100644 --- a/core/java/android/service/contentsuggestions/ContentSuggestionsService.java +++ b/core/java/android/service/contentsuggestions/ContentSuggestionsService.java @@ -54,8 +54,8 @@ public abstract class ContentSuggestionsService extends Service { * The action for the intent used to define the content suggestions service. * * <p>To be supported, the service must also require the - * * {@link android.Manifest.permission#BIND_CONTENT_SUGGESTIONS_SERVICE} permission so - * * that other applications can not abuse it. + * * {@link android.Manifest.permission#BIND_CONTENT_SUGGESTIONS_SERVICE} permission so + * * that other applications can not abuse it. */ public static final String SERVICE_INTERFACE = "android.service.contentsuggestions.ContentSuggestionsService"; @@ -72,7 +72,7 @@ public abstract class ContentSuggestionsService extends Service { } mHandler.sendMessage( - obtainMessage(ContentSuggestionsService::processContextImage, + obtainMessage(ContentSuggestionsService::onProcessContextImage, ContentSuggestionsService.this, taskId, wrappedBuffer, imageContextRequestExtras)); @@ -81,7 +81,8 @@ public abstract class ContentSuggestionsService extends Service { @Override public void suggestContentSelections(SelectionsRequest request, ISelectionsCallback callback) { - mHandler.sendMessage(obtainMessage(ContentSuggestionsService::suggestContentSelections, + mHandler.sendMessage(obtainMessage( + ContentSuggestionsService::onSuggestContentSelections, ContentSuggestionsService.this, request, wrapSelectionsCallback(callback))); } @@ -89,14 +90,15 @@ public abstract class ContentSuggestionsService extends Service { @Override public void classifyContentSelections(ClassificationsRequest request, IClassificationsCallback callback) { - mHandler.sendMessage(obtainMessage(ContentSuggestionsService::classifyContentSelections, + mHandler.sendMessage(obtainMessage( + ContentSuggestionsService::onClassifyContentSelections, ContentSuggestionsService.this, request, wrapClassificationCallback(callback))); } @Override public void notifyInteraction(String requestId, Bundle interaction) { mHandler.sendMessage( - obtainMessage(ContentSuggestionsService::notifyInteraction, + obtainMessage(ContentSuggestionsService::onNotifyInteraction, ContentSuggestionsService.this, requestId, interaction)); } }; @@ -122,25 +124,41 @@ public abstract class ContentSuggestionsService extends Service { * Called by the system to provide the snapshot for the task associated with the given * {@param taskId}. */ - public abstract void processContextImage( - int taskId, @Nullable Bitmap contextImage, @NonNull Bundle extras); + public void onProcessContextImage( + int taskId, @Nullable Bitmap contextImage, @NonNull Bundle extras) { + // TODO(b/127532182): remove after next prebuilt drop. + processContextImage(taskId, contextImage, extras); + } /** - * Called by a client app to make a request for content selections. + * Content selections have been request through {@link ContentSuggestionsManager}, implementer + * should reply on the callback with selections. */ - public abstract void suggestContentSelections(@NonNull SelectionsRequest request, - @NonNull ContentSuggestionsManager.SelectionsCallback callback); + public void onSuggestContentSelections(@NonNull SelectionsRequest request, + @NonNull ContentSuggestionsManager.SelectionsCallback callback) { + // TODO(b/127532182): remove after next prebuilt drop. + suggestContentSelections(request, callback); + } /** - * Called by a client app to classify the provided content selections. + * Content classifications have been request through {@link ContentSuggestionsManager}, + * implementer should reply on the callback with classifications. */ - public abstract void classifyContentSelections(@NonNull ClassificationsRequest request, - @NonNull ContentSuggestionsManager.ClassificationsCallback callback); + public void onClassifyContentSelections(@NonNull ClassificationsRequest request, + @NonNull ContentSuggestionsManager.ClassificationsCallback callback) { + // TODO(b/127532182): remove after next prebuilt drop. + classifyContentSelections(request, callback); + } /** - * Called by a client app to report an interaction. + * User interactions have been reported through {@link ContentSuggestionsManager}, implementer + * should handle those interactions. */ - public abstract void notifyInteraction(@NonNull String requestId, @NonNull Bundle interaction); + public void onNotifyInteraction( + @NonNull String requestId, @NonNull Bundle interaction) { + // TODO(b/127532182): remove after next prebuilt drop. + notifyInteraction(requestId, interaction); + } private ContentSuggestionsManager.SelectionsCallback wrapSelectionsCallback( ISelectionsCallback callback) { @@ -163,4 +181,42 @@ public abstract class ContentSuggestionsService extends Service { } }); } + + + /** + * For temporary compat reason, remove with b/127532182 + * @deprecated use {@link #onProcessContextImage(int, Bitmap, Bundle)} instead. + */ + @Deprecated + public void processContextImage( + int taskId, @Nullable Bitmap contextImage, @NonNull Bundle extras) { + } + + /** + * For temporary compat reason, remove with b/127532182 + * @deprecated use {@link #onSuggestContentSelections(SelectionsRequest, + * ContentSuggestionsManager.SelectionsCallback)} instead. + */ + @Deprecated + public void suggestContentSelections(@NonNull SelectionsRequest request, + @NonNull ContentSuggestionsManager.SelectionsCallback callback) { + } + + /** + * For temporary compat reason, remove with b/127532182 + * @deprecated use {@link #onClassifyContentSelections(ClassificationsRequest, + * ContentSuggestionsManager.ClassificationsCallback)} instead. + */ + @Deprecated + public void classifyContentSelections(@NonNull ClassificationsRequest request, + @NonNull ContentSuggestionsManager.ClassificationsCallback callback) { + } + + /** + * For temporary compat reason, remove with b/127532182 + * @deprecated use {@link #onNotifyInteraction(String, Bundle)} instead. + */ + @Deprecated + public void notifyInteraction(@NonNull String requestId, @NonNull Bundle interaction) { + } } diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java index 0836327bd07e..43151005f673 100644 --- a/core/java/android/service/notification/StatusBarNotification.java +++ b/core/java/android/service/notification/StatusBarNotification.java @@ -16,6 +16,7 @@ package android.service.notification; +import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.app.Notification; import android.app.NotificationManager; @@ -299,7 +300,7 @@ public class StatusBarNotification implements Parcelable { * Might be different from {@link #getPackageName()} if the app owning the notification has * a {@link NotificationManager#setNotificationDelegate(String) notification delegate}. */ - public String getOpPkg() { + public @NonNull String getOpPkg() { return opPkg; } diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index 24d746e0dfe2..defe2cefc1f7 100644 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -643,7 +643,7 @@ public class StaticLayout extends Layout { .setBreakStrategy(b.mBreakStrategy) .setHyphenationFrequency(b.mHyphenationFrequency) // TODO: Support more justification mode, e.g. letter spacing, stretching. - .setJustified(b.mJustificationMode) + .setJustificationMode(b.mJustificationMode) .setIndents(indents) .build(); diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java index b99336bb0dbf..7747a55e3e12 100644 --- a/core/java/android/util/FeatureFlagUtils.java +++ b/core/java/android/util/FeatureFlagUtils.java @@ -48,7 +48,7 @@ public class FeatureFlagUtils { DEFAULT_FLAGS = new HashMap<>(); DEFAULT_FLAGS.put("settings_audio_switcher", "true"); DEFAULT_FLAGS.put("settings_mobile_network_v2", "true"); - DEFAULT_FLAGS.put("settings_network_and_internet_v2", "false"); + DEFAULT_FLAGS.put("settings_network_and_internet_v2", "true"); DEFAULT_FLAGS.put("settings_slice_injection", "true"); DEFAULT_FLAGS.put("settings_systemui_theme", "true"); DEFAULT_FLAGS.put("settings_wifi_mac_randomization", "true"); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index fdbbe31b5557..2479497ad503 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -5974,20 +5974,28 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * this {@link View}. */ @NonNull - public List<Integer> getAttributeResolutionStack(@AttrRes int attribute) { - ArrayList<Integer> stack = new ArrayList<>(); - if (!sDebugViewAttributes || mAttributeResolutionStacks == null) { - return stack; + public int[] getAttributeResolutionStack(@AttrRes int attribute) { + if (!sDebugViewAttributes + || mAttributeResolutionStacks == null + || mAttributeResolutionStacks.get(attribute) == null) { + return new int[0]; } + int[] attributeResolutionStack = mAttributeResolutionStacks.get(attribute); + int stackSize = attributeResolutionStack.length; if (mSourceLayoutId != ID_NULL) { - stack.add(mSourceLayoutId); + stackSize++; } - int[] attributeResolutionStack = mAttributeResolutionStacks.get(attribute); - if (attributeResolutionStack == null) { - return stack; + + int currentIndex = 0; + int[] stack = new int[stackSize]; + + if (mSourceLayoutId != ID_NULL) { + stack[currentIndex] = mSourceLayoutId; + currentIndex++; } for (int i = 0; i < attributeResolutionStack.length; i++) { - stack.add(attributeResolutionStack[i]); + stack[currentIndex] = attributeResolutionStack[i]; + currentIndex++; } return stack; } @@ -6138,7 +6146,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * Stores debugging information about attributes. This should be called in a constructor by - * every custom {@link View} that uses a custom styleable. + * every custom {@link View} that uses a custom styleable. If the custom view does not call it, + * then the custom attributes used by this view will not be visible in layout inspection tools. + * * @param context Context under which this view is created. * @param styleable A reference to styleable array R.styleable.Foo * @param attrs AttributeSet used to construct this view. diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 6eceb00308e1..24f1fb5cc352 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -7794,6 +7794,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te mLastSeenPos = firstPos; final int childCount = getChildCount(); + + if (childCount <= 0) { + return; + } + final int position = mTargetPos; final int lastPos = firstPos + childCount - 1; diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index fd978f5329a5..91928b55ec60 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -420,6 +420,10 @@ public class ChooserActivity extends ResolverActivity { if (isFinishing() || isDestroyed()) { return; } + // May be null if there are no apps to perform share/open action. + if (mChooserListAdapter == null) { + return; + } final List<DisplayResolveInfo> driList = getDisplayResolveInfos(mChooserListAdapter); final List<ShortcutManager.ShareShortcutInfo> shareShortcutInfos = diff --git a/core/java/com/android/internal/colorextraction/types/Tonal.java b/core/java/com/android/internal/colorextraction/types/Tonal.java index d6a8934566b2..9d85a039420c 100644 --- a/core/java/com/android/internal/colorextraction/types/Tonal.java +++ b/core/java/com/android/internal/colorextraction/types/Tonal.java @@ -56,7 +56,6 @@ public class Tonal implements ExtractionType { private final TonalPalette mGreyPalette; private final ArrayList<TonalPalette> mTonalPalettes; - private final ArrayList<ColorRange> mBlacklistedColors; // Temporary variable to avoid allocations private float[] mTmpHSL = new float[3]; @@ -65,7 +64,6 @@ public class Tonal implements ExtractionType { ConfigParser parser = new ConfigParser(context); mTonalPalettes = parser.getTonalPalettes(); - mBlacklistedColors = parser.getBlacklistedColors(); mGreyPalette = mTonalPalettes.get(0); mTonalPalettes.remove(0); @@ -131,7 +129,7 @@ public class Tonal implements ExtractionType { Color.blue(colorValue), hsl); // Stop when we find a color that meets our criteria - if (!generatedFromBitmap || !isBlacklisted(hsl)) { + if (!generatedFromBitmap) { bestColor = color; break; } @@ -300,22 +298,6 @@ public class Tonal implements ExtractionType { return getColorPalette(palette.h, palette.s, palette.l); } - - /** - * Checks if a given color exists in the blacklist - * @param hsl float array with 3 components (H 0..360, S 0..1 and L 0..1) - * @return true if color should be avoided - */ - private boolean isBlacklisted(float[] hsl) { - for (int i = mBlacklistedColors.size() - 1; i >= 0; i--) { - ColorRange badRange = mBlacklistedColors.get(i); - if (badRange.containsColor(hsl[0], hsl[1], hsl[2])) { - return true; - } - } - return false; - } - /** * Offsets all colors by a delta, clamping values that go beyond what's * supported on the color space. @@ -364,11 +346,6 @@ public class Tonal implements ExtractionType { return minErrorIndex; } - @VisibleForTesting - public List<ColorRange> getBlacklistedColors() { - return mBlacklistedColors; - } - @Nullable private TonalPalette findTonalPalette(float h, float s) { // Fallback to a grey palette if the color is too desaturated. @@ -502,11 +479,9 @@ public class Tonal implements ExtractionType { @VisibleForTesting public static class ConfigParser { private final ArrayList<TonalPalette> mTonalPalettes; - private final ArrayList<ColorRange> mBlacklistedColors; public ConfigParser(Context context) { mTonalPalettes = new ArrayList<>(); - mBlacklistedColors = new ArrayList<>(); // Load all palettes and the blacklist from an XML. try { @@ -520,8 +495,6 @@ public class Tonal implements ExtractionType { String tagName = parser.getName(); if (tagName.equals("palettes")) { parsePalettes(parser); - } else if (tagName.equals("blacklist")) { - parseBlacklist(parser); } } else { throw new XmlPullParserException("Invalid XML event " + eventType + " - " @@ -538,28 +511,6 @@ public class Tonal implements ExtractionType { return mTonalPalettes; } - public ArrayList<ColorRange> getBlacklistedColors() { - return mBlacklistedColors; - } - - private void parseBlacklist(XmlPullParser parser) - throws XmlPullParserException, IOException { - parser.require(XmlPullParser.START_TAG, null, "blacklist"); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - String name = parser.getName(); - // Starts by looking for the entry tag - if (name.equals("range")) { - mBlacklistedColors.add(readRange(parser)); - parser.next(); - } else { - throw new XmlPullParserException("Invalid tag: " + name, parser, null); - } - } - } - private ColorRange readRange(XmlPullParser parser) throws XmlPullParserException, IOException { parser.require(XmlPullParser.START_TAG, null, "range"); diff --git a/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java b/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java index 293ffd34da8d..37f61bf650c7 100644 --- a/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java +++ b/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java @@ -19,6 +19,7 @@ package com.android.internal.infra; import android.annotation.NonNull; import android.content.ComponentName; import android.content.Context; +import android.os.Handler; import android.os.IInterface; import android.util.Slog; @@ -43,10 +44,10 @@ public abstract class AbstractMultiplePendingRequestsRemoteService<S public AbstractMultiplePendingRequestsRemoteService(@NonNull Context context, @NonNull String serviceInterface, @NonNull ComponentName componentName, int userId, - @NonNull VultureCallback<S> callback, boolean bindInstantServiceAllowed, - boolean verbose, int initialCapacity) { - super(context, serviceInterface, componentName, userId, callback, bindInstantServiceAllowed, - verbose); + @NonNull VultureCallback<S> callback, @NonNull Handler handler, + boolean bindInstantServiceAllowed, boolean verbose, int initialCapacity) { + super(context, serviceInterface, componentName, userId, callback, handler, + bindInstantServiceAllowed, verbose); mInitialCapacity = initialCapacity; } diff --git a/core/java/com/android/internal/infra/AbstractRemoteService.java b/core/java/com/android/internal/infra/AbstractRemoteService.java index 7270302f04bb..2e709de5ad53 100644 --- a/core/java/com/android/internal/infra/AbstractRemoteService.java +++ b/core/java/com/android/internal/infra/AbstractRemoteService.java @@ -28,7 +28,6 @@ import android.os.Handler; import android.os.IBinder; import android.os.IBinder.DeathRecipient; import android.os.IInterface; -import android.os.Looper; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; @@ -114,14 +113,14 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I // NOTE: must be package-protected so this class is not extended outside AbstractRemoteService(@NonNull Context context, @NonNull String serviceInterface, @NonNull ComponentName componentName, int userId, @NonNull VultureCallback<S> callback, - boolean bindInstantServiceAllowed, boolean verbose) { + @NonNull Handler handler, boolean bindInstantServiceAllowed, boolean verbose) { mContext = context; mVultureCallback = callback; mVerbose = verbose; mComponentName = componentName; mIntent = new Intent(serviceInterface).setComponent(mComponentName); mUserId = userId; - mHandler = new Handler(Looper.getMainLooper()); + mHandler = new Handler(handler.getLooper()); mBindInstantServiceAllowed = bindInstantServiceAllowed; } diff --git a/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java b/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java index 3e92a0b196ee..a70fc3e17d60 100644 --- a/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java +++ b/core/java/com/android/internal/infra/AbstractSinglePendingRequestRemoteService.java @@ -19,6 +19,7 @@ package com.android.internal.infra; import android.annotation.NonNull; import android.content.ComponentName; import android.content.Context; +import android.os.Handler; import android.os.IInterface; import android.util.Slog; @@ -42,10 +43,10 @@ public abstract class AbstractSinglePendingRequestRemoteService<S public AbstractSinglePendingRequestRemoteService(@NonNull Context context, @NonNull String serviceInterface, @NonNull ComponentName componentName, int userId, - @NonNull VultureCallback<S> callback, boolean bindInstantServiceAllowed, - boolean verbose) { - super(context, serviceInterface, componentName, userId, callback, bindInstantServiceAllowed, - verbose); + @NonNull VultureCallback<S> callback, @NonNull Handler handler, + boolean bindInstantServiceAllowed, boolean verbose) { + super(context, serviceInterface, componentName, userId, callback, handler, + bindInstantServiceAllowed, verbose); } @Override // from AbstractRemoteService diff --git a/core/java/com/android/internal/net/VpnProfile.java b/core/java/com/android/internal/net/VpnProfile.java index ec02432223de..940cc363f742 100644 --- a/core/java/com/android/internal/net/VpnProfile.java +++ b/core/java/com/android/internal/net/VpnProfile.java @@ -18,6 +18,8 @@ package com.android.internal.net; import android.annotation.UnsupportedAppUsage; import android.os.Build; +import android.net.ProxyInfo; +import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; @@ -46,6 +48,10 @@ public class VpnProfile implements Cloneable, Parcelable { public static final int TYPE_IPSEC_HYBRID_RSA = 5; public static final int TYPE_MAX = 5; + // Match these constants with R.array.vpn_proxy_settings. + public static final int PROXY_NONE = 0; + public static final int PROXY_MANUAL = 1; + // Entity fields. @UnsupportedAppUsage public final String key; // -1 @@ -68,6 +74,7 @@ public class VpnProfile implements Cloneable, Parcelable { public String ipsecUserCert = ""; // 12 public String ipsecCaCert = ""; // 13 public String ipsecServerCert = "";// 14 + public ProxyInfo proxy = null; // 15~18 // Helper fields. @UnsupportedAppUsage @@ -96,6 +103,7 @@ public class VpnProfile implements Cloneable, Parcelable { ipsecCaCert = in.readString(); ipsecServerCert = in.readString(); saveLogin = in.readInt() != 0; + proxy = in.readParcelable(null); } @Override @@ -117,6 +125,7 @@ public class VpnProfile implements Cloneable, Parcelable { out.writeString(ipsecCaCert); out.writeString(ipsecServerCert); out.writeInt(saveLogin ? 1 : 0); + out.writeParcelable(proxy, flags); } @UnsupportedAppUsage @@ -127,8 +136,8 @@ public class VpnProfile implements Cloneable, Parcelable { } String[] values = new String(value, StandardCharsets.UTF_8).split("\0", -1); - // There can be 14 or 15 values in ICS MR1. - if (values.length < 14 || values.length > 15) { + // There can be 14 - 19 Bytes in values.length. + if (values.length < 14 || values.length > 19) { return null; } @@ -151,7 +160,18 @@ public class VpnProfile implements Cloneable, Parcelable { profile.ipsecUserCert = values[12]; profile.ipsecCaCert = values[13]; profile.ipsecServerCert = (values.length > 14) ? values[14] : ""; - + if (values.length > 15) { + String host = (values.length > 15) ? values[15] : ""; + String port = (values.length > 16) ? values[16] : ""; + String exclList = (values.length > 17) ? values[17] : ""; + String pacFileUrl = (values.length > 18) ? values[18] : ""; + if (pacFileUrl.isEmpty()) { + profile.proxy = new ProxyInfo(host, port.isEmpty() ? + 0 : Integer.parseInt(port), exclList); + } else { + profile.proxy = new ProxyInfo(pacFileUrl); + } + } // else profle.proxy = null profile.saveLogin = !profile.username.isEmpty() || !profile.password.isEmpty(); return profile; } catch (Exception e) { @@ -176,6 +196,13 @@ public class VpnProfile implements Cloneable, Parcelable { builder.append('\0').append(ipsecUserCert); builder.append('\0').append(ipsecCaCert); builder.append('\0').append(ipsecServerCert); + if (proxy != null) { + builder.append('\0').append(proxy.getHost() != null ? proxy.getHost() : ""); + builder.append('\0').append(proxy.getPort()); + builder.append('\0').append(proxy.getExclusionListAsString() != null ? + proxy.getExclusionListAsString() : ""); + builder.append('\0').append(proxy.getPacFileUrl().toString()); + } return builder.toString().getBytes(StandardCharsets.UTF_8); } diff --git a/core/java/com/android/internal/os/BinderCallsStats.java b/core/java/com/android/internal/os/BinderCallsStats.java index 5688870a1788..0fb2728aed73 100644 --- a/core/java/com/android/internal/os/BinderCallsStats.java +++ b/core/java/com/android/internal/os/BinderCallsStats.java @@ -344,6 +344,7 @@ public class BinderCallsStats implements BinderInternal.Observer { resultCallStats.add(createDebugEntry("end_time_millis", SystemClock.elapsedRealtime())); resultCallStats.add( createDebugEntry("battery_time_millis", mBatteryStopwatch.getMillis())); + resultCallStats.add(createDebugEntry("sampling_interval", mPeriodicSamplingInterval)); } return resultCallStats; diff --git a/core/java/com/android/internal/os/LooperStats.java b/core/java/com/android/internal/os/LooperStats.java index c059721eb2d3..932ff572219f 100644 --- a/core/java/com/android/internal/os/LooperStats.java +++ b/core/java/com/android/internal/os/LooperStats.java @@ -165,6 +165,7 @@ public class LooperStats implements Looper.Observer { exportedEntries.add(createDebugEntry("end_time_millis", SystemClock.elapsedRealtime())); exportedEntries.add( createDebugEntry("battery_time_millis", mBatteryStopwatch.getMillis())); + exportedEntries.add(createDebugEntry("sampling_interval", mSamplingInterval)); } return exportedEntries; } diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index 2bba3c914664..70d8b453f5ae 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -369,17 +369,8 @@ public final class Zygote { * @param appInfo ApplicationInfo of the application */ protected static void allowAppFilesAcrossFork(ApplicationInfo appInfo) { - Zygote.nativeAllowFileAcrossFork(appInfo.sourceDir); - if (appInfo.splitSourceDirs != null) { - for (String path : appInfo.splitSourceDirs) { - Zygote.nativeAllowFileAcrossFork(path); - } - } - // As well as its shared libs - if (appInfo.sharedLibraryFiles != null) { - for (String path : appInfo.sharedLibraryFiles) { - Zygote.nativeAllowFileAcrossFork(path); - } + for (String path : appInfo.getAllApkPaths()) { + Zygote.nativeAllowFileAcrossFork(path); } } diff --git a/core/java/com/android/server/net/OWNERS b/core/java/com/android/server/net/OWNERS index 7311eee32a4c..d3836d4c6c57 100644 --- a/core/java/com/android/server/net/OWNERS +++ b/core/java/com/android/server/net/OWNERS @@ -1,8 +1,8 @@ set noparent codewiz@google.com -ek@google.com jchalard@google.com +junyulai@google.com lorenzo@google.com reminv@google.com satk@google.com diff --git a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp index dc536b2d2dee..be82879c8411 100644 --- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp +++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp @@ -187,20 +187,20 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr off64_t offset; if (!zipFile->getEntryInfo(zipEntry, &method, &uncompLen, NULL, &offset, &when, &crc)) { - ALOGD("Couldn't read zip entry info\n"); + ALOGE("Couldn't read zip entry info\n"); return INSTALL_FAILED_INVALID_APK; } if (!extractNativeLibs) { // check if library is uncompressed and page-aligned if (method != ZipFileRO::kCompressStored) { - ALOGD("Library '%s' is compressed - will not be able to open it directly from apk.\n", + ALOGE("Library '%s' is compressed - will not be able to open it directly from apk.\n", fileName); return INSTALL_FAILED_INVALID_APK; } if (offset % PAGE_SIZE != 0) { - ALOGD("Library '%s' is not page-aligned - will not be able to open it directly from" + ALOGE("Library '%s' is not page-aligned - will not be able to open it directly from" " apk.\n", fileName); return INSTALL_FAILED_INVALID_APK; } @@ -213,7 +213,7 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr char localFileName[nativeLibPath.size() + fileNameLen + 2]; if (strlcpy(localFileName, nativeLibPath.c_str(), sizeof(localFileName)) != nativeLibPath.size()) { - ALOGD("Couldn't allocate local file name for library"); + ALOGE("Couldn't allocate local file name for library"); return INSTALL_FAILED_INTERNAL_ERROR; } @@ -221,7 +221,7 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr if (strlcpy(localFileName + nativeLibPath.size() + 1, fileName, sizeof(localFileName) - nativeLibPath.size() - 1) != fileNameLen) { - ALOGD("Couldn't allocate local file name for library"); + ALOGE("Couldn't allocate local file name for library"); return INSTALL_FAILED_INTERNAL_ERROR; } @@ -237,24 +237,24 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr char localTmpFileName[nativeLibPath.size() + TMP_FILE_PATTERN_LEN + 1]; if (strlcpy(localTmpFileName, nativeLibPath.c_str(), sizeof(localTmpFileName)) != nativeLibPath.size()) { - ALOGD("Couldn't allocate local file name for library"); + ALOGE("Couldn't allocate local file name for library"); return INSTALL_FAILED_INTERNAL_ERROR; } if (strlcpy(localTmpFileName + nativeLibPath.size(), TMP_FILE_PATTERN, TMP_FILE_PATTERN_LEN + 1) != TMP_FILE_PATTERN_LEN) { - ALOGI("Couldn't allocate temporary file name for library"); + ALOGE("Couldn't allocate temporary file name for library"); return INSTALL_FAILED_INTERNAL_ERROR; } int fd = mkstemp(localTmpFileName); if (fd < 0) { - ALOGI("Couldn't open temporary file name: %s: %s\n", localTmpFileName, strerror(errno)); + ALOGE("Couldn't open temporary file name: %s: %s\n", localTmpFileName, strerror(errno)); return INSTALL_FAILED_CONTAINER_ERROR; } if (!zipFile->uncompressEntry(zipEntry, fd)) { - ALOGI("Failed uncompressing %s to %s\n", fileName, localTmpFileName); + ALOGE("Failed uncompressing %s to %s\n", fileName, localTmpFileName); close(fd); unlink(localTmpFileName); return INSTALL_FAILED_CONTAINER_ERROR; @@ -268,7 +268,7 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr times[1].tv_sec = modTime; times[0].tv_usec = times[1].tv_usec = 0; if (utimes(localTmpFileName, times) < 0) { - ALOGI("Couldn't change modification time on %s: %s\n", localTmpFileName, strerror(errno)); + ALOGE("Couldn't change modification time on %s: %s\n", localTmpFileName, strerror(errno)); unlink(localTmpFileName); return INSTALL_FAILED_CONTAINER_ERROR; } @@ -276,14 +276,14 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr // Set the mode to 755 static const mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; if (chmod(localTmpFileName, mode) < 0) { - ALOGI("Couldn't change permissions on %s: %s\n", localTmpFileName, strerror(errno)); + ALOGE("Couldn't change permissions on %s: %s\n", localTmpFileName, strerror(errno)); unlink(localTmpFileName); return INSTALL_FAILED_CONTAINER_ERROR; } // Finally, rename it to the final name. if (rename(localTmpFileName, localFileName) < 0) { - ALOGI("Couldn't rename %s to %s: %s\n", localTmpFileName, localFileName, strerror(errno)); + ALOGE("Couldn't rename %s to %s: %s\n", localTmpFileName, localFileName, strerror(errno)); unlink(localTmpFileName); return INSTALL_FAILED_CONTAINER_ERROR; } diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto index 445075da7f90..927c85f2db8e 100644 --- a/core/proto/android/app/settings_enums.proto +++ b/core/proto/android/app/settings_enums.proto @@ -2299,4 +2299,7 @@ enum PageId { // Open: Settings will show the conditional when Grayscale mode is on SETTINGS_CONDITION_GRAYSCALE_MODE = 1683; + + // Panel for Wifi + PANEL_WIFI = 1687; } diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto index 08286a1baffb..27a18ee9e52a 100644 --- a/core/proto/android/providers/settings/secure.proto +++ b/core/proto/android/providers/settings/secure.proto @@ -191,6 +191,21 @@ message SecureSettingsProto { optional SettingProto emergency_assistance_application = 22 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto enhanced_voice_privacy_enabled = 23 [ (android.privacy).dest = DEST_AUTOMATIC ]; + + message Gesture { + optional SettingProto aware_enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ]; + + optional SettingProto silence_alarms_count = 2 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto silence_calls_count = 3 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto silence_enabled = 4 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto silence_notification_count = 5 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto silence_timer_count = 6 [ (android.privacy).dest = DEST_AUTOMATIC ]; + + optional SettingProto skip_count = 7 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto skip_enabled = 8 [ (android.privacy).dest = DEST_AUTOMATIC ]; + } + optional Gesture gesture = 74; + optional SettingProto immersive_mode_confirmations = 24 [ (android.privacy).dest = DEST_AUTOMATIC ]; message Incall { @@ -443,6 +458,7 @@ message SecureSettingsProto { // parent profile. optional SettingProto sync_parent_sounds = 55 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto system_navigation_keys_enabled = 56 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto theme_customization_overlay_packages = 75 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto trust_agents_initialized = 57 [ (android.privacy).dest = DEST_AUTOMATIC ]; message Tts { @@ -534,13 +550,7 @@ message SecureSettingsProto { } optional Zen zen = 71; - optional SettingProto skip_gesture_enabled = 74 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto silence_gesture_enabled = 75 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto theme_customization_overlay_packages = 76 [ (android.privacy).dest = DEST_AUTOMATIC ]; - - optional SettingProto aware_enabled = 77 [ (android.privacy).dest = DEST_AUTOMATIC ]; - // Please insert fields in alphabetical order and group them into messages // if possible (to avoid reaching the method limit). - // Next tag = 78; + // Next tag = 76; } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 5d24ebce78e3..d176260a9896 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3049,12 +3049,6 @@ <permission android:name="android.permission.BIND_COMPANION_DEVICE_MANAGER_SERVICE" android:protectionLevel="signature" /> - <!-- Must be required by the RoleControllerService to ensure that only the system can bind to - it. - @hide --> - <permission android:name="android.permission.BIND_ROLE_CONTROLLER_SERVICE" - android:protectionLevel="signature" /> - <!-- @SystemApi Must be required by the RuntimePermissionPresenterService to ensure that only the system can bind to it. @hide --> diff --git a/core/res/res/anim/lock_in.xml b/core/res/res/anim/lock_in.xml index 992bc9284bee..cd4effd63182 100755 --- a/core/res/res/anim/lock_in.xml +++ b/core/res/res/anim/lock_in.xml @@ -14,111 +14,76 @@ limitations under the License. --> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:aapt="http://schemas.android.com/aapt"> + xmlns:aapt="http://schemas.android.com/aapt"> <aapt:attr name="android:drawable"> - <vector - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> + <vector android:height="32dp" android:width="32dp" android:viewportHeight="32" + android:viewportWidth="32"> <group android:name="_R_G"> - <group android:name="_R_G_L_2_G_N_3_T_0_M"> - <group - android:name="_R_G_L_2_G_N_3_T_0" - android:pivotX="2.25" - android:pivotY="2.25" - android:scaleX="0" - android:scaleY="0" - android:translateX="9.75" - android:translateY="12.75"> - <group - android:name="_R_G_L_2_G_T_1" - android:scaleX="0.12346" - android:scaleY="0.12346" - android:translateX="2.25" - android:translateY="2.373"> - <group - android:name="_R_G_L_2_G" - android:translateY="32"> - <path - android:name="_R_G_L_2_G_D_0_P_0" - android:fillAlpha="0" - android:fillColor="#ff0000" - android:fillType="nonZero" - android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " - android:trimPathStart="0.14" - android:trimPathEnd="0.89" - android:trimPathOffset="0" /> - <path - android:name="_R_G_L_2_G_D_1_P_0" - android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " - android:strokeWidth="16" - android:strokeAlpha="1" - android:strokeColor="?attr/textColor" - android:trimPathStart="0.14" - android:trimPathEnd="0.89" - android:trimPathOffset="0" /> + <group android:name="_R_G_L_2_G_N_2_N_1_T_0" android:translateX="16" + android:translateY="16" android:scaleX="1.3" android:scaleY="1.3"> + <group android:name="_R_G_L_2_G_N_2_T_0" android:translateX="-2.25" + android:translateY="0.75" android:pivotX="2.25" android:pivotY="2.25" + android:scaleX="0" android:scaleY="0"> + <group android:name="_R_G_L_2_G_T_1" android:translateX="2.25" + android:translateY="2.373" android:scaleX="0.12346" + android:scaleY="0.12346"> + <group android:name="_R_G_L_2_G" android:translateY="32"> + <path android:name="_R_G_L_2_G_D_0_P_0" android:fillColor="#ff0000" + android:fillAlpha="0" android:fillType="nonZero" + android:trimPathStart="0.14" android:trimPathEnd="0.89" + android:trimPathOffset="0" + android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "/> + <path android:name="_R_G_L_2_G_D_1_P_0" + android:strokeColor="?attr/textColor" android:strokeLineCap="round" + android:strokeLineJoin="round" android:strokeWidth="16" + android:strokeAlpha="1" android:trimPathStart="0.14" + android:trimPathEnd="0.89" android:trimPathOffset="0" + android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "/> </group> </group> </group> </group> - <group - android:name="_R_G_L_1_G" - android:pivotX="8.25" - android:pivotY="7.25" - android:scaleX="0" - android:scaleY="0" - android:translateX="3.75" - android:translateY="7.75"> - <path - android:name="_R_G_L_1_G_D_0_P_0" - android:fillAlpha="1" - android:fillColor="?attr/textColor" - android:fillType="nonZero" - android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c " /> + <group android:name="_R_G_L_1_G_N_1_T_0" android:translateX="16" + android:translateY="16" android:scaleX="1.3" android:scaleY="1.3"> + <group android:name="_R_G_L_1_G" android:translateX="-8.25" + android:translateY="-4.25" android:pivotX="8.25" android:pivotY="7.25" + android:scaleX="0" android:scaleY="0"> + <path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="?attr/textColor" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c "/> + </group> </group> - <group - android:name="_R_G_L_0_G" - android:pivotX="2.25" - android:pivotY="2.25" - android:scaleX="0" - android:scaleY="0" - android:translateX="9.75" - android:translateY="12.75"> - <path - android:name="_R_G_L_0_G_D_0_P_0" - android:fillAlpha="1" - android:fillColor="?attr/textColor" - android:fillType="nonZero" - android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " /> + <group android:name="_R_G_L_0_G_N_1_T_0" android:translateX="16" + android:translateY="16" android:scaleX="1.3" android:scaleY="1.3"> + <group android:name="_R_G_L_0_G" android:translateX="-2.25" + android:translateY="0.75" android:pivotX="2.25" android:pivotY="2.25" + android:scaleX="0" android:scaleY="0"> + <path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="?attr/textColor" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "/> + </group> </group> </group> - <group android:name="time_group" /> + <group android:name="time_group"/> </vector> </aapt:attr> <target android:name="_R_G_L_2_G_D_0_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="50" - android:propertyName="trimPathStart" - android:startOffset="0" - android:valueFrom="0.14" - android:valueTo="0.14" - android:valueType="floatType"> + <objectAnimator android:propertyName="trimPathStart" android:duration="50" + android:startOffset="0" android:valueFrom="0.14" + android:valueTo="0.14" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="67" - android:propertyName="trimPathStart" - android:startOffset="50" - android:valueFrom="0.14" - android:valueTo="0" - android:valueType="floatType"> + <objectAnimator android:propertyName="trimPathStart" android:duration="67" + android:startOffset="50" android:valueFrom="0.14" + android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> @@ -127,26 +92,20 @@ <target android:name="_R_G_L_2_G_D_0_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="50" - android:propertyName="trimPathEnd" - android:startOffset="0" - android:valueFrom="0.89" - android:valueTo="0.89" - android:valueType="floatType"> + <objectAnimator android:propertyName="trimPathEnd" android:duration="50" + android:startOffset="0" android:valueFrom="0.89" + android:valueTo="0.89" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="67" - android:propertyName="trimPathEnd" - android:startOffset="50" - android:valueFrom="0.89" - android:valueTo="1" - android:valueType="floatType"> + <objectAnimator android:propertyName="trimPathEnd" android:duration="67" + android:startOffset="50" android:valueFrom="0.89" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> @@ -155,26 +114,20 @@ <target android:name="_R_G_L_2_G_D_1_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="50" - android:propertyName="trimPathStart" - android:startOffset="0" - android:valueFrom="0.14" - android:valueTo="0.14" - android:valueType="floatType"> + <objectAnimator android:propertyName="trimPathStart" android:duration="50" + android:startOffset="0" android:valueFrom="0.14" + android:valueTo="0.14" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="67" - android:propertyName="trimPathStart" - android:startOffset="50" - android:valueFrom="0.14" - android:valueTo="0" - android:valueType="floatType"> + <objectAnimator android:propertyName="trimPathStart" android:duration="67" + android:startOffset="50" android:valueFrom="0.14" + android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> @@ -183,26 +136,20 @@ <target android:name="_R_G_L_2_G_D_1_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="50" - android:propertyName="trimPathEnd" - android:startOffset="0" - android:valueFrom="0.89" - android:valueTo="0.89" - android:valueType="floatType"> + <objectAnimator android:propertyName="trimPathEnd" android:duration="50" + android:startOffset="0" android:valueFrom="0.89" + android:valueTo="0.89" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="67" - android:propertyName="trimPathEnd" - android:startOffset="50" - android:valueFrom="0.89" - android:valueTo="1" - android:valueType="floatType"> + <objectAnimator android:propertyName="trimPathEnd" android:duration="67" + android:startOffset="50" android:valueFrom="0.89" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> @@ -211,128 +158,91 @@ <target android:name="_R_G_L_2_G_T_1"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="150" - android:pathData="M 2.25,2.373C 2.25,1.2001604776382402 2.25,-3.49116047763824 2.25,-4.664" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="0"> + <objectAnimator android:propertyName="translateXY" android:duration="150" + android:startOffset="0" android:propertyXName="translateX" + android:propertyYName="translateY" + android:pathData="M 2.25,2.373C 2.25,1.2001604776382402 2.25,-3.49116047763824 2.25,-4.664"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.2,1 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_2_G_N_3_T_0"> + <target android:name="_R_G_L_2_G_N_2_T_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="233" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.0125" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleX" android:duration="233" + android:startOffset="0" android:valueFrom="0" + android:valueTo="1.0125" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="233" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.0125" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleY" android:duration="233" + android:startOffset="0" android:valueFrom="0" + android:valueTo="1.0125" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="233" - android:valueFrom="1.0125" - android:valueTo="1" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleX" android:duration="117" + android:startOffset="233" android:valueFrom="1.0125" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" - android:startOffset="233" - android:valueFrom="1.0125" - android:valueTo="1" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleY" android:duration="117" + android:startOffset="233" android:valueFrom="1.0125" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_2_G_N_3_T_0_M"> + <target android:name="_R_G_L_2_G_N_2_N_1_T_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="0" - android:propertyName="scaleX" - android:startOffset="50" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType" /> + <objectAnimator android:propertyName="scaleX" android:duration="0" + android:startOffset="50" android:valueFrom="0" android:valueTo="1.3" + android:valueType="floatType"/> </set> </aapt:attr> </target> <target android:name="_R_G_L_1_G"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="233" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleX" android:duration="233" + android:startOffset="0" android:valueFrom="0" + android:valueTo="1.025" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.2,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="233" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleY" android:duration="233" + android:startOffset="0" android:valueFrom="0" + android:valueTo="1.025" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.2,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleX" android:duration="117" + android:startOffset="233" android:valueFrom="1.025" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleY" android:duration="117" + android:startOffset="233" android:valueFrom="1.025" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> @@ -341,48 +251,34 @@ <target android:name="_R_G_L_0_G"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="233" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.0125" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleX" android:duration="233" + android:startOffset="0" android:valueFrom="0" + android:valueTo="1.0125" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="233" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.0125" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleY" android:duration="233" + android:startOffset="0" android:valueFrom="0" + android:valueTo="1.0125" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="233" - android:valueFrom="1.0125" - android:valueTo="1" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleX" android:duration="117" + android:startOffset="233" android:valueFrom="1.0125" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" - android:startOffset="233" - android:valueFrom="1.0125" - android:valueTo="1" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleY" android:duration="117" + android:startOffset="233" android:valueFrom="1.0125" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> @@ -391,13 +287,9 @@ <target android:name="time_group"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="717" - android:propertyName="translateX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType" /> + <objectAnimator android:propertyName="translateX" android:duration="717" + android:startOffset="0" android:valueFrom="0" android:valueTo="1" + android:valueType="floatType"/> </set> </aapt:attr> </target> diff --git a/core/res/res/anim/lock_lock.xml b/core/res/res/anim/lock_lock.xml index 8b7887c7824f..ce9c8e88bf05 100755 --- a/core/res/res/anim/lock_lock.xml +++ b/core/res/res/anim/lock_lock.xml @@ -13,4 +13,277 @@ See the License for the specific language governing permissions and limitations under the License. --> -<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector android:height="24dp" android:width="24dp" android:viewportHeight="24" android:viewportWidth="24"><group android:name="_R_G"><group android:name="_R_G_L_2_G_T_1" android:translateX="12" android:translateY="15"><group android:name="_R_G_L_2_G" android:translateX="-8.25" android:translateY="-7.25"><path android:name="_R_G_L_2_G_D_0_P_0" android:fillColor="?attr/textColor" android:fillAlpha="1" android:fillType="nonZero" android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c "/></group></group><group android:name="_R_G_L_1_G_N_5_T_1" android:translateX="12" android:translateY="15"><group android:name="_R_G_L_1_G_N_5_T_0" android:translateX="-8.25" android:translateY="-7.25"><group android:name="_R_G_L_1_G" android:translateX="6" android:translateY="5" android:pivotX="2.25" android:pivotY="2.25" android:scaleX="1" android:scaleY="1"><path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="?attr/textColor" android:fillAlpha="1" android:fillType="nonZero" android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "/></group></group></group><group android:name="_R_G_L_0_G_N_5_T_1" android:translateX="12" android:translateY="15"><group android:name="_R_G_L_0_G_N_5_T_0" android:translateX="-8.25" android:translateY="-7.25"><group android:name="_R_G_L_0_G" android:translateX="-16.219" android:translateY="32.25" android:pivotX="27.965" android:pivotY="-32" android:scaleX="0.125" android:scaleY="0.125"><path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ff0000" android:fillAlpha="0" android:fillType="nonZero" android:pathData=" M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 "/><path android:name="_R_G_L_0_G_D_1_P_0" android:strokeColor="?attr/textColor" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="16" android:strokeAlpha="1" android:pathData=" M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 "/></group></group></group></group><group android:name="time_group"/></vector></aapt:attr><target android:name="_R_G_L_2_G_T_1"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateXY" android:duration="400" android:startOffset="0" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="67" android:startOffset="400" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15.594 12,15.594"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="83" android:startOffset="467" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15.594C 12,15.594 12,15.09895833581686 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_1_G"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="scaleX" android:duration="450" android:startOffset="0" android:valueFrom="1" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="scaleY" android:duration="450" android:startOffset="0" android:valueFrom="1" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="scaleX" android:duration="67" android:startOffset="450" android:valueFrom="1" android:valueTo="1.1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="scaleY" android:duration="67" android:startOffset="450" android:valueFrom="1" android:valueTo="1.1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="scaleX" android:duration="183" android:startOffset="517" android:valueFrom="1.1" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="scaleY" android:duration="183" android:startOffset="517" android:valueFrom="1.1" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_1_G_N_5_T_1"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateXY" android:duration="400" android:startOffset="0" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="67" android:startOffset="400" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15.594 12,15.594"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="83" android:startOffset="467" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15.594C 12,15.594 12,15.09895833581686 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="317" android:startOffset="0" android:valueFrom="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 " android:valueTo="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.974,0 0.458,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="133" android:startOffset="317" android:valueFrom="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " android:valueTo="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="250" android:startOffset="450" android:valueFrom="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " android:valueTo="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.414,0 0.647,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_1_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="317" android:startOffset="0" android:valueFrom="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 " android:valueTo="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.974,0 0.458,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="133" android:startOffset="317" android:valueFrom="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " android:valueTo="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="250" android:startOffset="450" android:valueFrom="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " android:valueTo="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.414,0 0.647,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_N_5_T_1"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateXY" android:duration="400" android:startOffset="0" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="67" android:startOffset="400" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15.594 12,15.594"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="83" android:startOffset="467" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15.594C 12,15.594 12,15.09895833581686 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="time_group"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateX" android:duration="717" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target></animated-vector>
\ No newline at end of file +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt"> + <aapt:attr name="android:drawable"> + <vector android:height="32dp" android:width="32dp" android:viewportHeight="32" + android:viewportWidth="32"> + <group android:name="_R_G"> + <group android:name="_R_G_L_2_G_N_1_T_0" android:translateX="16" + android:translateY="16" android:scaleX="1.3" android:scaleY="1.3"> + <group android:name="_R_G_L_2_G_T_1" android:translateX="0" + android:translateY="3"> + <group android:name="_R_G_L_2_G" android:translateX="-8.25" + android:translateY="-7.25"> + <path android:name="_R_G_L_2_G_D_0_P_0" android:fillColor="?attr/textColor" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c "/> + </group> + </group> + </group> + <group android:name="_R_G_L_1_G_N_4_N_1_T_0" android:translateX="16" + android:translateY="16" android:scaleX="1.3" android:scaleY="1.3"> + <group android:name="_R_G_L_1_G_N_4_T_1" android:translateX="0" + android:translateY="3"> + <group android:name="_R_G_L_1_G_N_4_T_0" android:translateX="-8.25" + android:translateY="-7.25"> + <group android:name="_R_G_L_1_G" android:translateX="6" + android:translateY="5" android:pivotX="2.25" + android:pivotY="2.25" android:scaleX="1" android:scaleY="1"> + <path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="?attr/textColor" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "/> + </group> + </group> + </group> + </group> + <group android:name="_R_G_L_0_G_N_4_N_1_T_0" android:translateX="16" + android:translateY="16" android:scaleX="1.3" android:scaleY="1.3"> + <group android:name="_R_G_L_0_G_N_4_T_1" android:translateX="0" + android:translateY="3"> + <group android:name="_R_G_L_0_G_N_4_T_0" android:translateX="-8.25" + android:translateY="-7.25"> + <group android:name="_R_G_L_0_G" android:translateX="-16.219" + android:translateY="32.25" android:pivotX="27.965" + android:pivotY="-32" android:scaleX="0.125" + android:scaleY="0.125"> + <path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ff0000" + android:fillAlpha="0" android:fillType="nonZero" + android:pathData=" M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 "/> + <path android:name="_R_G_L_0_G_D_1_P_0" + android:strokeColor="?attr/textColor" android:strokeLineCap="round" + android:strokeLineJoin="round" android:strokeWidth="16" + android:strokeAlpha="1" + android:pathData=" M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 "/> + </group> + </group> + </group> + </group> + </group> + <group android:name="time_group"/> + </vector> + </aapt:attr> + <target android:name="_R_G_L_2_G_T_1"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateXY" android:duration="400" + android:startOffset="0" android:propertyXName="translateX" + android:propertyYName="translateY" + android:pathData="M 0,3C 0,3.09895833581686 0,3 0,3"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateXY" android:duration="67" + android:startOffset="400" android:propertyXName="translateX" + android:propertyYName="translateY" + android:pathData="M 0,3C 0,3.09895833581686 0,3.594 0,3.594"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateXY" android:duration="83" + android:startOffset="467" android:propertyXName="translateX" + android:propertyYName="translateY" + android:pathData="M 0,3.594C 0,3.594 0,3.09895833581686 0,3"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="scaleX" android:duration="450" + android:startOffset="0" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="450" + android:startOffset="0" android:valueFrom="1" android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="67" + android:startOffset="450" android:valueFrom="1" + android:valueTo="1.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="67" + android:startOffset="450" android:valueFrom="1" + android:valueTo="1.1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="183" + android:startOffset="517" android:valueFrom="1.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="183" + android:startOffset="517" android:valueFrom="1.1" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G_N_4_T_1"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateXY" android:duration="400" + android:startOffset="0" android:propertyXName="translateX" + android:propertyYName="translateY" + android:pathData="M 0,3C 0,3.09895833581686 0,3 0,3"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateXY" android:duration="67" + android:startOffset="400" android:propertyXName="translateX" + android:propertyYName="translateY" + android:pathData="M 0,3C 0,3.09895833581686 0,3.594 0,3.594"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateXY" android:duration="83" + android:startOffset="467" android:propertyXName="translateX" + android:propertyYName="translateY" + android:pathData="M 0,3.594C 0,3.594 0,3.09895833581686 0,3"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_0_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="pathData" android:duration="317" + android:startOffset="0" + android:valueFrom="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 " + android:valueTo="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.974,0 0.458,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="133" + android:startOffset="317" + android:valueFrom="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " + android:valueTo="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="450" + android:valueFrom="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " + android:valueTo="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.414,0 0.647,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="pathData" android:duration="317" + android:startOffset="0" + android:valueFrom="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 " + android:valueTo="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.974,0 0.458,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="133" + android:startOffset="317" + android:valueFrom="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " + android:valueTo="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="250" + android:startOffset="450" + android:valueFrom="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " + android:valueTo="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.414,0 0.647,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_4_T_1"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateXY" android:duration="400" + android:startOffset="0" android:propertyXName="translateX" + android:propertyYName="translateY" + android:pathData="M 0,3C 0,3.09895833581686 0,3 0,3"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateXY" android:duration="67" + android:startOffset="400" android:propertyXName="translateX" + android:propertyYName="translateY" + android:pathData="M 0,3C 0,3.09895833581686 0,3.594 0,3.594"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateXY" android:duration="83" + android:startOffset="467" android:propertyXName="translateX" + android:propertyYName="translateY" + android:pathData="M 0,3.594C 0,3.594 0,3.09895833581686 0,3"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="time_group"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateX" android:duration="717" + android:startOffset="0" android:valueFrom="0" android:valueTo="1" + android:valueType="floatType"/> + </set> + </aapt:attr> + </target> +</animated-vector>
\ No newline at end of file diff --git a/core/res/res/anim/lock_scanning.xml b/core/res/res/anim/lock_scanning.xml index 36d8f88369a4..998c965f2199 100644 --- a/core/res/res/anim/lock_scanning.xml +++ b/core/res/res/anim/lock_scanning.xml @@ -16,43 +16,35 @@ <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"> <aapt:attr name="android:drawable"> - <vector android:height="32dp" android:width="32dp" android:viewportHeight="32" + <vector android:height="42dp" android:width="32dp" android:viewportHeight="42" android:viewportWidth="32"> <group android:name="_R_G"> - <group android:name="_R_G_L_2_G_N_1_T_0" android:pivotX="16" android:pivotY="16" - android:scaleX="1.5" android:scaleY="1.5"> - <group android:name="_R_G_L_2_G" android:translateX="7.75" + <group android:name="_R_G_L_2_G_N_5_N_1_T_0" android:translateY="5" + android:pivotX="16" android:pivotY="16" android:scaleX="2" + android:scaleY="2"> + <group android:name="_R_G_L_2_G_N_5_T_0" android:translateX="7.75" android:translateY="10.670000000000002" android:pivotX="8.25" android:pivotY="7.25" android:scaleX="0.64" android:scaleY="0.64"> - <path android:name="_R_G_L_2_G_D_0_P_0" android:fillColor="?attr/textColor" - android:fillAlpha="1" android:fillType="nonZero" - android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c "/> - </group> - </group> - <group android:name="_R_G_L_1_G_N_4_N_1_T_0" android:pivotX="16" android:pivotY="16" - android:scaleX="1.5" android:scaleY="1.5"> - <group android:name="_R_G_L_1_G_N_4_T_0" android:translateX="7.75" - android:translateY="10.670000000000002" android:pivotX="8.25" - android:pivotY="7.25" android:scaleX="0.64" android:scaleY="0.64"> - <group android:name="_R_G_L_1_G" android:translateX="6" + <group android:name="_R_G_L_2_G" android:translateX="6" android:translateY="5" android:pivotX="2.25" android:pivotY="2.25" android:scaleX="1" android:scaleY="1"> - <path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="?attr/textColor" + <path android:name="_R_G_L_2_G_D_0_P_0" android:fillColor="?attr/textColor" android:fillAlpha="1" android:fillType="nonZero" android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "/> </group> </group> </group> - <group android:name="_R_G_L_0_G_N_4_N_1_T_0" android:pivotX="16" android:pivotY="16" - android:scaleX="1.5" android:scaleY="1.5"> - <group android:name="_R_G_L_0_G_N_4_T_0" android:translateX="7.75" + <group android:name="_R_G_L_1_G_N_5_N_1_T_0" android:translateY="5" + android:pivotX="16" android:pivotY="16" android:scaleX="2" + android:scaleY="2"> + <group android:name="_R_G_L_1_G_N_5_T_0" android:translateX="7.75" android:translateY="10.670000000000002" android:pivotX="8.25" android:pivotY="7.25" android:scaleX="0.64" android:scaleY="0.64"> - <group android:name="_R_G_L_0_G_T_1" android:translateX="8.25" + <group android:name="_R_G_L_1_G_T_1" android:translateX="8.25" android:translateY="1.121" android:scaleX="0.125" android:scaleY="0.125"> - <group android:name="_R_G_L_0_G" android:translateY="25.029"> - <path android:name="_R_G_L_0_G_D_0_P_0" + <group android:name="_R_G_L_1_G" android:translateY="25.029"> + <path android:name="_R_G_L_1_G_D_0_P_0" android:strokeColor="?attr/textColor" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="16" android:strokeAlpha="1" @@ -61,6 +53,21 @@ </group> </group> </group> + <group android:name="_R_G_L_0_G_N_5_N_1_T_0" android:translateY="5" + android:pivotX="16" android:pivotY="16" android:scaleX="2" + android:scaleY="2"> + <group android:name="_R_G_L_0_G_N_5_T_0" android:translateX="7.75" + android:translateY="10.670000000000002" android:pivotX="8.25" + android:pivotY="7.25" android:scaleX="0.64" android:scaleY="0.64"> + <group android:name="_R_G_L_0_G" android:translateY="0.04699999999999971" + android:pivotX="8.25" android:pivotY="7.25" android:scaleX="1.01562" + android:scaleY="1.01563"> + <path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="?attr/textColor" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c "/> + </group> + </group> + </group> </group> <group android:name="time_group"/> </vector> @@ -68,68 +75,6 @@ <target android:name="_R_G_L_2_G"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator android:propertyName="scaleX" android:duration="83" - android:startOffset="0" android:valueFrom="0.64" - android:valueTo="0.64" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="83" - android:startOffset="0" android:valueFrom="0.64" - android:valueTo="0.64" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleX" android:duration="83" - android:startOffset="83" android:valueFrom="0.64" - android:valueTo="0.62" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="83" - android:startOffset="83" android:valueFrom="0.64" - android:valueTo="0.62" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleX" android:duration="183" - android:startOffset="167" android:valueFrom="0.62" - android:valueTo="0.8" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="183" - android:startOffset="167" android:valueFrom="0.62" - android:valueTo="0.8" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleX" android:duration="250" - android:startOffset="350" android:valueFrom="0.8" - android:valueTo="0.64" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="250" - android:startOffset="350" android:valueFrom="0.8" - android:valueTo="0.64" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_1_G"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> <objectAnimator android:propertyName="scaleX" android:duration="150" android:startOffset="0" android:valueFrom="1" android:valueTo="1" android:valueType="floatType"> @@ -175,7 +120,7 @@ </set> </aapt:attr> </target> - <target android:name="_R_G_L_1_G_N_4_T_0"> + <target android:name="_R_G_L_2_G_N_5_T_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator android:propertyName="scaleX" android:duration="83" @@ -237,7 +182,7 @@ </set> </aapt:attr> </target> - <target android:name="_R_G_L_0_G_D_0_P_0"> + <target android:name="_R_G_L_1_G_D_0_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator android:propertyName="pathData" android:duration="83" @@ -270,7 +215,7 @@ </set> </aapt:attr> </target> - <target android:name="_R_G_L_0_G_T_1"> + <target android:name="_R_G_L_1_G_T_1"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator android:propertyName="translateY" android:duration="83" @@ -297,7 +242,69 @@ </set> </aapt:attr> </target> - <target android:name="_R_G_L_0_G_N_4_T_0"> + <target android:name="_R_G_L_1_G_N_5_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="0" android:valueFrom="0.64" + android:valueTo="0.64" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="0" android:valueFrom="0.64" + android:valueTo="0.64" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="83" + android:startOffset="83" android:valueFrom="0.64" + android:valueTo="0.62" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="83" + android:startOffset="83" android:valueFrom="0.64" + android:valueTo="0.62" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="183" + android:startOffset="167" android:valueFrom="0.62" + android:valueTo="0.8" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="183" + android:startOffset="167" android:valueFrom="0.62" + android:valueTo="0.8" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="250" + android:startOffset="350" android:valueFrom="0.8" + android:valueTo="0.64" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="250" + android:startOffset="350" android:valueFrom="0.8" + android:valueTo="0.64" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_5_T_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator android:propertyName="scaleX" android:duration="83" diff --git a/core/res/res/anim/lock_to_error.xml b/core/res/res/anim/lock_to_error.xml index 4aad742be915..ddef96bf7422 100755 --- a/core/res/res/anim/lock_to_error.xml +++ b/core/res/res/anim/lock_to_error.xml @@ -19,52 +19,44 @@ <vector android:height="32dp" android:width="32dp" android:viewportHeight="32" android:viewportWidth="32"> <group android:name="_R_G"> - <group android:name="_R_G_L_2_G_N_1_T_0" android:pivotX="16" android:pivotY="16" - android:scaleX="1.5" android:scaleY="1.5"> - <group android:name="_R_G_L_2_G" android:translateX="7.75" - android:translateY="10.670000000000002" android:pivotX="8.25" - android:pivotY="7.25" android:rotation="0" android:scaleX="0.64" - android:scaleY="0.64"> + <group android:name="_R_G_L_2_G_N_2_T_0" android:translateX="7.75" + android:translateY="12.649999999999999" android:pivotX="8.25" + android:pivotY="7.25" android:rotation="0" android:scaleX="1.3" + android:scaleY="1.3"> + <group android:name="_R_G_L_2_G" android:translateX="6" + android:translateY="4.954" android:pivotX="2.25" android:pivotY="2.25" + android:scaleX="0.98462" android:scaleY="0.98462"> <path android:name="_R_G_L_2_G_D_0_P_0" android:fillColor="?attr/textColor" android:fillAlpha="1" android:fillType="nonZero" - android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c "/> + android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "/> </group> </group> - <group android:name="_R_G_L_1_G_N_4_N_1_T_0" android:pivotX="16" android:pivotY="16" - android:scaleX="1.5" android:scaleY="1.5"> - <group android:name="_R_G_L_1_G_N_4_T_0" android:translateX="7.75" - android:translateY="10.670000000000002" android:pivotX="8.25" - android:pivotY="7.25" android:rotation="0" android:scaleX="0.64" - android:scaleY="0.64"> - <group android:name="_R_G_L_1_G" android:translateX="6" - android:translateY="5"> - <path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="?attr/textColor" - android:fillAlpha="1" android:fillType="nonZero" - android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "/> - </group> + <group android:name="_R_G_L_1_G_N_2_T_0" android:translateX="7.75" + android:translateY="12.649999999999999" android:pivotX="8.25" + android:pivotY="7.25" android:rotation="0" android:scaleX="1.3" + android:scaleY="1.3"> + <group android:name="_R_G_L_1_G" android:translateX="-16.273" + android:translateY="32.312" android:pivotX="27.965" android:pivotY="-32" + android:scaleX="0.12308" android:scaleY="0.12308"> + <path android:name="_R_G_L_1_G_D_0_P_0" android:strokeColor="?attr/textColor" + android:strokeLineCap="round" android:strokeLineJoin="round" + android:strokeWidth="16" android:strokeAlpha="1" + android:pathData=" M-28.21 -25.03 C-28.21,-25.03 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.93,-26.15 27.93,-26.15 "/> </group> </group> - <group android:name="_R_G_L_0_G_N_4_N_1_T_0" android:pivotX="16" android:pivotY="16" - android:scaleX="1.5" android:scaleY="1.5"> - <group android:name="_R_G_L_0_G_N_4_T_0" android:translateX="7.75" - android:translateY="10.670000000000002" android:pivotX="8.25" - android:pivotY="7.25" android:rotation="0" android:scaleX="0.64" - android:scaleY="0.64"> - <group android:name="_R_G_L_0_G" android:translateX="-16.219" - android:translateY="32.25" android:pivotX="27.965" - android:pivotY="-32" android:scaleX="0.125" android:scaleY="0.125"> - <path android:name="_R_G_L_0_G_D_0_P_0" android:strokeColor="?attr/textColor" - android:strokeLineCap="round" android:strokeLineJoin="round" - android:strokeWidth="16" android:strokeAlpha="1" - android:pathData=" M-28.21 -25.03 C-28.21,-25.03 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.93,-26.15 27.93,-26.15 "/> - </group> - </group> + <group android:name="_R_G_L_0_G" android:translateX="7.75" + android:translateY="12.649999999999999" android:pivotX="8.25" + android:pivotY="7.25" android:rotation="0" android:scaleX="1.3" + android:scaleY="1.3"> + <path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="?attr/textColor" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c "/> </group> </group> <group android:name="time_group"/> </vector> </aapt:attr> - <target android:name="_R_G_L_2_G"> + <target android:name="_R_G_L_2_G_N_2_T_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator android:propertyName="rotation" android:duration="133" @@ -105,7 +97,7 @@ </set> </aapt:attr> </target> - <target android:name="_R_G_L_1_G_N_4_T_0"> + <target android:name="_R_G_L_1_G_N_2_T_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator android:propertyName="rotation" android:duration="133" @@ -146,7 +138,7 @@ </set> </aapt:attr> </target> - <target android:name="_R_G_L_0_G_N_4_T_0"> + <target android:name="_R_G_L_0_G"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator android:propertyName="rotation" android:duration="133" diff --git a/core/res/res/anim/lock_unlock.xml b/core/res/res/anim/lock_unlock.xml index 9cc31a0f8939..0e85c9d3f580 100755 --- a/core/res/res/anim/lock_unlock.xml +++ b/core/res/res/anim/lock_unlock.xml @@ -14,124 +14,85 @@ limitations under the License. --> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:aapt="http://schemas.android.com/aapt"> + xmlns:aapt="http://schemas.android.com/aapt"> <aapt:attr name="android:drawable"> - <vector - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> + <vector android:height="40dp" android:width="32dp" android:viewportHeight="40" + android:viewportWidth="32"> <group android:name="_R_G"> - <group - android:name="_R_G_L_2_G_T_1" - android:translateX="12" - android:translateY="15"> - <group - android:name="_R_G_L_2_G" - android:translateX="-8.25" - android:translateY="-7.25"> - <path - android:name="_R_G_L_2_G_D_0_P_0" - android:fillAlpha="1" - android:fillColor="?attr/textColor" - android:fillType="nonZero" - android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c " /> + <group android:name="_R_G_L_2_G_N_1_T_0" android:translateX="16" + android:translateY="20" android:scaleX="1.3" android:scaleY="1.3"> + <group android:name="_R_G_L_2_G_T_1" android:translateY="3"> + <group android:name="_R_G_L_2_G" android:translateX="-8.25" + android:translateY="-7.25"> + <path android:name="_R_G_L_2_G_D_0_P_0" android:fillColor="?attr/textColor" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c "/> + </group> </group> </group> - <group - android:name="_R_G_L_1_G_N_5_T_1" - android:translateX="12" - android:translateY="15"> - <group - android:name="_R_G_L_1_G_N_5_T_0" - android:translateX="-8.25" - android:translateY="-7.25"> - <group - android:name="_R_G_L_1_G" - android:pivotX="2.25" - android:pivotY="2.25" - android:scaleX="1" - android:scaleY="1" - android:translateX="6" - android:translateY="5"> - <path - android:name="_R_G_L_1_G_D_0_P_0" - android:fillAlpha="1" - android:fillColor="?attr/textColor" - android:fillType="nonZero" - android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " /> + <group android:name="_R_G_L_1_G_N_4_N_1_T_0" android:translateX="16" + android:translateY="20" android:scaleX="1.3" android:scaleY="1.3"> + <group android:name="_R_G_L_1_G_N_4_T_1" android:translateY="3"> + <group android:name="_R_G_L_1_G_N_4_T_0" android:translateX="-8.25" + android:translateY="-7.25"> + <group android:name="_R_G_L_1_G" android:translateX="6" + android:translateY="5" android:pivotX="2.25" + android:pivotY="2.25" android:scaleX="1" android:scaleY="1"> + <path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="?attr/textColor" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "/> + </group> </group> </group> </group> - <group - android:name="_R_G_L_0_G_N_5_T_1" - android:translateX="12" - android:translateY="15"> - <group - android:name="_R_G_L_0_G_N_5_T_0" - android:translateX="-8.25" - android:translateY="-7.25"> - <group - android:name="_R_G_L_0_G" - android:pivotX="27.965" - android:pivotY="-32" - android:scaleX="0.125" - android:scaleY="0.125" - android:translateX="-16.219" - android:translateY="32.25"> - <path - android:name="_R_G_L_0_G_D_0_P_0" - android:fillAlpha="0" - android:fillColor="#ff0000" - android:fillType="nonZero" - android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " /> - <path - android:name="_R_G_L_0_G_D_1_P_0" - android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " - android:strokeWidth="16" - android:strokeAlpha="1" - android:strokeColor="?attr/textColor"/> + <group android:name="_R_G_L_0_G_N_4_N_1_T_0" android:translateX="16" + android:translateY="20" android:scaleX="1.3" android:scaleY="1.3"> + <group android:name="_R_G_L_0_G_N_4_T_1" android:translateY="3"> + <group android:name="_R_G_L_0_G_N_4_T_0" android:translateX="-8.25" + android:translateY="-7.25"> + <group android:name="_R_G_L_0_G" android:translateX="-16.219" + android:translateY="32.25" android:pivotX="27.965" + android:pivotY="-32" android:scaleX="0.125" + android:scaleY="0.125"> + <path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ff0000" + android:fillAlpha="0" android:fillType="nonZero" + android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "/> + <path android:name="_R_G_L_0_G_D_1_P_0" + android:strokeColor="?attr/textColor" android:strokeLineCap="round" + android:strokeLineJoin="round" android:strokeWidth="16" + android:strokeAlpha="1" + android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "/> + </group> </group> </group> </group> </group> - <group android:name="time_group" /> + <group android:name="time_group"/> </vector> </aapt:attr> <target android:name="_R_G_L_2_G_T_1"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="133" - android:pathData="M 12,15C 12,14.85416667163372 12,14.125 12,14.125" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="0"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="0" android:valueFrom="3" + android:valueTo="1.625" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.075,0.167 0.622,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="133" - android:pathData="M 12,14.125C 12,14.125 12,15.05870145463943 12,15.324" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="133"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="133" android:valueFrom="1.625" + android:valueTo="3.699" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.352,0 0.717,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="100" - android:pathData="M 12,15.324C 12,15.40252217555046 12,14.96669441461563 12,15" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="267"> + <objectAnimator android:propertyName="translateY" android:duration="100" + android:startOffset="267" android:valueFrom="3.699" + android:valueTo="3" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.356,0 0.527,1 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> @@ -140,87 +101,60 @@ <target android:name="_R_G_L_1_G"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="100" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="1" - android:valueTo="0.85" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleX" android:duration="100" + android:startOffset="0" android:valueFrom="1" android:valueTo="0.85" + android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="100" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="1" - android:valueTo="0.85" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleY" android:duration="100" + android:startOffset="0" android:valueFrom="1" android:valueTo="0.85" + android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="283" - android:propertyName="scaleX" - android:startOffset="100" - android:valueFrom="0.85" - android:valueTo="1" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleX" android:duration="283" + android:startOffset="100" android:valueFrom="0.85" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="283" - android:propertyName="scaleY" - android:startOffset="100" - android:valueFrom="0.85" - android:valueTo="1" - android:valueType="floatType"> + <objectAnimator android:propertyName="scaleY" android:duration="283" + android:startOffset="100" android:valueFrom="0.85" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_1_G_N_5_T_1"> + <target android:name="_R_G_L_1_G_N_4_T_1"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="133" - android:pathData="M 12,15C 12,14.85416667163372 12,14.125 12,14.125" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="0"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="0" android:valueFrom="3" + android:valueTo="1.625" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.075,0.167 0.622,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="133" - android:pathData="M 12,14.125C 12,14.125 12,15.05870145463943 12,15.324" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="133"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="133" android:valueFrom="1.625" + android:valueTo="3.699" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.352,0 0.717,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="100" - android:pathData="M 12,15.324C 12,15.40252217555046 12,14.96669441461563 12,15" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="267"> + <objectAnimator android:propertyName="translateY" android:duration="100" + android:startOffset="267" android:valueFrom="3.699" + android:valueTo="3" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.356,0 0.527,1 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> @@ -229,26 +163,22 @@ <target android:name="_R_G_L_0_G_D_0_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="67" - android:propertyName="pathData" - android:startOffset="0" - android:valueFrom="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " - android:valueTo="M-27.97 -48.55 C-27.97,-48.55 -28,-53.75 -27.97,-55.48 C-27.92,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " - android:valueType="pathType"> + <objectAnimator android:propertyName="pathData" android:duration="67" + android:startOffset="0" + android:valueFrom="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " + android:valueTo="M-27.97 -59.3 C-27.97,-59.3 -28,-64.5 -27.97,-66.23 C-27.92,-68.37 -23.5,-90.63 -0.75,-90.57 C22.77,-90.51 27.75,-70.12 27.72,-69.02 C27.55,-63.63 27.97,-25.67 27.97,-25.67 " + android:valueType="pathType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.353,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.353,0 0.2,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="333" - android:propertyName="pathData" - android:startOffset="67" - android:valueFrom="M-27.97 -48.55 C-27.97,-48.55 -28,-53.75 -27.97,-55.48 C-27.92,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " - android:valueTo="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 " - android:valueType="pathType"> + <objectAnimator android:propertyName="pathData" android:duration="333" + android:startOffset="67" + android:valueFrom="M-27.97 -59.3 C-27.97,-59.3 -28,-64.5 -27.97,-66.23 C-27.92,-68.37 -23.5,-90.63 -0.75,-90.57 C22.77,-90.51 27.75,-70.12 27.72,-69.02 C27.55,-63.63 27.97,-25.67 27.97,-25.67 " + android:valueTo="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 " + android:valueType="pathType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.542,0 0.026,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.542,0 0.026,1 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> @@ -257,65 +187,50 @@ <target android:name="_R_G_L_0_G_D_1_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="67" - android:propertyName="pathData" - android:startOffset="0" - android:valueFrom="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " - android:valueTo="M-27.97 -48.55 C-27.97,-48.55 -28,-53.75 -27.97,-55.48 C-27.92,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " - android:valueType="pathType"> + <objectAnimator android:propertyName="pathData" android:duration="67" + android:startOffset="0" + android:valueFrom="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " + android:valueTo="M-27.97 -59.3 C-27.97,-59.3 -28,-64.5 -27.97,-66.23 C-27.92,-68.37 -23.5,-90.63 -0.75,-90.57 C22.77,-90.51 27.75,-70.12 27.72,-69.02 C27.55,-63.63 27.97,-25.67 27.97,-25.67 " + android:valueType="pathType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.353,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.353,0 0.2,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="333" - android:propertyName="pathData" - android:startOffset="67" - android:valueFrom="M-27.97 -48.55 C-27.97,-48.55 -28,-53.75 -27.97,-55.48 C-27.92,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " - android:valueTo="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 " - android:valueType="pathType"> + <objectAnimator android:propertyName="pathData" android:duration="333" + android:startOffset="67" + android:valueFrom="M-27.97 -59.3 C-27.97,-59.3 -28,-64.5 -27.97,-66.23 C-27.92,-68.37 -23.5,-90.63 -0.75,-90.57 C22.77,-90.51 27.75,-70.12 27.72,-69.02 C27.55,-63.63 27.97,-25.67 27.97,-25.67 " + android:valueTo="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 " + android:valueType="pathType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.542,0 0.026,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.542,0 0.026,1 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_0_G_N_5_T_1"> + <target android:name="_R_G_L_0_G_N_4_T_1"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="133" - android:pathData="M 12,15C 12,14.85416667163372 12,14.125 12,14.125" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="0"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="0" android:valueFrom="3" + android:valueTo="1.625" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator + android:pathData="M 0.0,0.0 c0.075,0.167 0.622,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="133" - android:pathData="M 12,14.125C 12,14.125 12,15.05870145463943 12,15.324" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="133"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="133" android:valueFrom="1.625" + android:valueTo="3.699" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.352,0 0.717,1 1.0,1.0"/> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="100" - android:pathData="M 12,15.324C 12,15.40252217555046 12,14.96669441461563 12,15" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="267"> + <objectAnimator android:propertyName="translateY" android:duration="100" + android:startOffset="267" android:valueFrom="3.699" + android:valueTo="3" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.356,0 0.527,1 1.0,1.0"/> </aapt:attr> </objectAnimator> </set> @@ -324,13 +239,9 @@ <target android:name="time_group"> <aapt:attr name="android:animation"> <set android:ordering="together"> - <objectAnimator - android:duration="717" - android:propertyName="translateX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType" /> + <objectAnimator android:propertyName="translateX" android:duration="717" + android:startOffset="0" android:valueFrom="0" android:valueTo="1" + android:valueType="floatType"/> </set> </aapt:attr> </target> diff --git a/core/res/res/drawable/ic_lock.xml b/core/res/res/drawable/ic_lock.xml new file mode 100644 index 000000000000..8d7143b7b49a --- /dev/null +++ b/core/res/res/drawable/ic_lock.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="?attr/textColor" + android:pathData="M16,20m-2.7,0a2.7,2.7 0,1 1,5.4 0a2.7,2.7 0,1 1,-5.4 0"/> + <path + android:fillColor="?attr/textColor" + android:pathData="M24,10.7h-2V7.3c0,-3.3 -2.7,-6 -6,-6s-6,2.7 -6,6v3.3H8c-1.5,0 -2.7,1.2 -2.7,2.7v13.3c0,1.5 1.2,2.7 2.7,2.7h16c1.5,0 2.7,-1.2 2.7,-2.7V13.3C26.7,11.9 25.5,10.7 24,10.7zM12.7,7.3C12.7,5.5 14.2,4 16,4s3.3,1.5 3.3,3.3v3.3h-6.7V7.3zM24,26.7H8V13.3h2h12h2V26.7z"/> +</vector> diff --git a/core/res/res/drawable/ic_lock_24dp.xml b/core/res/res/drawable/ic_lock_24dp.xml deleted file mode 100644 index d848426ec3f7..000000000000 --- a/core/res/res/drawable/ic_lock_24dp.xml +++ /dev/null @@ -1,30 +0,0 @@ -<!-- -Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24.0dp" - android:height="24.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="?attr/textColor" - android:pathData="M12.0,15.0m-2.0,0.0a2.0,2.0 0.0,1.0 1.0,4.0 0.0a2.0,2.0 0.0,1.0 1.0,-4.0 0.0"/> - <path - android:pathData="M0,0h24v24H0V0z" - android:fillColor="#00000000"/> - <path - android:fillColor="?attr/textColor" - android:pathData="M18.0,8.0l-1.5,0.0L16.5,5.5C16.5,3.01 14.49,1.0 12.0,1.0S7.5,3.01 7.5,5.5L7.5,8.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.1 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0C20.0,8.9 19.1,8.0 18.0,8.0zM9.5,5.5C9.5,4.12 10.62,3.0 12.0,3.0c1.38,0.0 2.5,1.12 2.5,2.5L14.5,8.0l-5.0,0.0L9.5,5.5zM18.0,20.0L6.0,20.0L6.0,10.0l1.5,0.0l9.0,0.0L18.0,10.0L18.0,20.0z"/> -</vector> diff --git a/core/res/res/drawable/ic_lock_open.xml b/core/res/res/drawable/ic_lock_open.xml new file mode 100644 index 000000000000..3a6bf931f473 --- /dev/null +++ b/core/res/res/drawable/ic_lock_open.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="?attr/textColor" + android:pathData="M16,20m-2.67,0a2.67,2.67 0,1 1,5.34 0a2.67,2.67 0,1 1,-5.34 0"/> + <path + android:fillColor="?attr/textColor" + android:pathData="M24.67,1.33a6,6 0,0 0,-6 6v3.34L8,10.67a2.67,2.67 0,0 0,-2.67 2.66L5.33,26.67A2.67,2.67 0,0 0,8 29.33L24,29.33a2.67,2.67 0,0 0,2.67 -2.66L26.67,13.33A2.67,2.67 0,0 0,24 10.67L21.33,10.67L21.33,7.33a3.34,3.34 0,0 1,6.67 0L28,8h2.67L30.67,7.33A6,6 0,0 0,24.67 1.33ZM24,13.33L24,26.67L8,26.67L8,13.33Z"/> +</vector>
\ No newline at end of file diff --git a/core/res/res/drawable/ic_lock_open_24dp.xml b/core/res/res/drawable/ic_lock_open_24dp.xml deleted file mode 100644 index 94eecad53806..000000000000 --- a/core/res/res/drawable/ic_lock_open_24dp.xml +++ /dev/null @@ -1,30 +0,0 @@ -<!-- -Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24.0dp" - android:height="24.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="?attr/textColor" - android:pathData="M12.0,15.0m-2.0,0.0a2.0,2.0 0.0,1.0 1.0,4.0 0.0a2.0,2.0 0.0,1.0 1.0,-4.0 0.0"/> - <path - android:fillColor="?attr/textColor" - android:pathData="M18.5,1.0C16.01,1.0 14.0,3.01 14.0,5.5L14.0,8.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.1 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0l-2.0,0.0L16.0,5.5C16.0,4.12 17.12,3.0 18.5,3.0C19.88,3.0 21.0,4.12 21.0,5.5L21.0,6.0l2.0,0.0L23.0,5.5C23.0,3.01 20.99,1.0 18.5,1.0zM18.0,10.0l0.0,10.0L6.0,20.0L6.0,10.0L18.0,10.0z"/> - <path - android:pathData="M0,0h24v24H0V0z" - android:fillColor="#00000000"/> -</vector> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 5b658b7ea0d9..6671ff828392 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -707,12 +707,12 @@ <string name="permgrouprequest_location">Allow <b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g></b> to access this device\'s location?</string> <!-- Subtitle of the message shown to the user when the apps requests permission to use the location only while app is in foreground [CHAR LIMIT=150]--> - <string name="permgrouprequestdetail_location">The app will only have access to the location while you\u2019re using the app.</string> + <string name="permgrouprequestdetail_location">The app will only have access to the location while you\u2019re using the app</string> <!-- Message shown to the user when the apps requests permission to use the location while app is in foreground and background. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] --> - <string name="permgroupbackgroundrequest_location">Always allow - <b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g></b> to access this device\u2019s location?</string> + <string name="permgroupbackgroundrequest_location">Allow + <b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g></b> to access this device\u2019s location <b>all the time</b>?</string> <!-- Subtitle of the message shown to the user when the apps requests permission to use the location while app is in foreground and background [CHAR LIMIT=150] --> - <string name="permgroupbackgroundrequestdetail_location">The app will always have access to the location, even when you\u2019re not using the app.</string> + <string name="permgroupbackgroundrequestdetail_location">App currently can access location only while you\u2019re using the app</string> <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> <string name="permgrouplab_calendar">Calendar</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 13551e71b371..96a3d96f0604 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1378,8 +1378,8 @@ <java-symbol type="drawable" name="ic_text_dot" /> <java-symbol type="drawable" name="ic_print" /> <java-symbol type="drawable" name="ic_print_error" /> - <java-symbol type="drawable" name="ic_lock_24dp" /> - <java-symbol type="drawable" name="ic_lock_open_24dp" /> + <java-symbol type="drawable" name="ic_lock" /> + <java-symbol type="drawable" name="ic_lock_open" /> <java-symbol type="drawable" name="jog_dial_arrow_long_left_green" /> <java-symbol type="drawable" name="jog_dial_arrow_long_right_red" /> <java-symbol type="drawable" name="jog_dial_arrow_short_left_and_right" /> diff --git a/core/res/res/xml/color_extraction.xml b/core/res/res/xml/color_extraction.xml index 93ab0ff26754..c3ebe4e7c478 100644 --- a/core/res/res/xml/color_extraction.xml +++ b/core/res/res/xml/color_extraction.xml @@ -246,109 +246,4 @@ 0.6549019607843137,0.7549019607843137,0.8509803921568627, 0.9411764705882353"/> </palettes> - <blacklist> - <!-- Red --> - <range h="0, 20" - s="0.7, 1" - l="0.21, 0.79"/> - <range h="0, 20" - s="0.3, 0.7" - l="0.355, 0.653"/> - <!-- Red Orange --> - <range h="20, 40" - s="0.7, 1" - l="0.2, 0.643"/> - <range h="20, 40" - s="0.3, 0.7" - l="0.414, 0.561"/> - <range h="20, 40" - s="0, 0.3" - l="0.343, 0.584"/> - <!-- Orange --> - <range h="40, 60" - s="0.7, 1" - l="0.173, 0.38"/> - <range h="40, 60" - s="0.3, 0.7" - l="0.233, 0.427"/> - <range h="40, 60" - s="0, 0.3" - l="0.231, 0.48"/> - <!-- Yellow 60 --> - <range h="60, 80" - s="0.7, 1" - l="0.15, 0.40"/> - <range h="60, 80" - s="0.3, 0.7" - l="0.15, 0.42"/> - <range h="60, 80" - s="0, 0.3" - l="0.35, 0.57"/> - <!-- Yellow Green 80 --> - <range h="80, 100" - s="0.7, 1" - l="0.36, 0.65"/> - <range h="80, 100" - s="0.3, 0.7" - l="0.48, 0.57"/> - <!-- Yellow green 100 --> - <range h="100, 120" - s="0.7, 1" - l="0.388, 0.67"/> - <range h="100, 120" - s="0.3, 0.7" - l="0.424, 0.58"/> - <!-- Green --> - <range h="120, 140" - s="0.7, 1" - l="0.37, 0.65"/> - <range h="120, 140" - s="0.3, 0.7" - l="0.435, 0.58"/> - <!-- Green Blue 140 --> - <range h="140, 160" - s="0.7, 1" - l="0.43, 0.641"/> - <!-- Seaoam --> - <range h="160, 180" - s="0.7, 1" - l="0.496, 0.567"/> - <!-- Cyan --> - <range h="180, 200" - s="0.7, 1" - l="0.52, 0.729"/> - <!-- Blue --> - <range h="220, 240" - s="0.7, 1" - l="0.396, 0.571"/> - <range h="220, 240" - s="0.3, 0.7" - l="0.425, 0.551"/> - <!-- Blue Purple 240 --> - <range h="240, 260" - s="0.7, 1" - l="0.418, 0.639"/> - <range h="220, 240" - s="0.3, 0.7" - l="0.441, 0.576"/> - <!-- Blue Purple 260 --> - <range h="260, 280" - s="0.3, 1" - l="0.461, 0.553"/> - <!-- Fuchsia --> - <range h="300, 320" - s="0.7, 1" - l="0.484, 0.588"/> - <range h="300, 320" - s="0.3, 0.7" - l="0.48, 0.592"/> - <!-- Pink --> - <range h="320, 340" - s="0.7, 1" - l="0.466, 0.629"/> - <!-- Soft red --> - <range h="340, 360" - s="0.7, 1" - l="0.437, 0.596"/> - </blacklist> -</colorextraction>
\ No newline at end of file +</colorextraction> diff --git a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java index c4632f7cfc0b..eb9c7b66d642 100644 --- a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java @@ -642,8 +642,9 @@ public class BinderCallsStatsTest { long startTime = SystemClock.elapsedRealtime(); TestBinderCallsStats bcs = new TestBinderCallsStats(); bcs.setAddDebugEntries(true); + bcs.setSamplingInterval(10); ArrayList<BinderCallsStats.ExportedCallStat> callStats = bcs.getExportedCallStats(); - assertEquals(3, callStats.size()); + assertEquals(4, callStats.size()); BinderCallsStats.ExportedCallStat debugEntry1 = callStats.get(0); assertEquals("", debugEntry1.className); assertEquals("__DEBUG_start_time_millis", debugEntry1.methodName); @@ -656,6 +657,9 @@ public class BinderCallsStatsTest { assertEquals("", debugEntry3.className); assertEquals("__DEBUG_battery_time_millis", debugEntry3.methodName); assertTrue(debugEntry3.latencyMicros >= 0); + BinderCallsStats.ExportedCallStat debugEntry4 = callStats.get(3); + assertEquals("__DEBUG_sampling_interval", debugEntry4.methodName); + assertEquals(10, debugEntry4.latencyMicros); } @Test diff --git a/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java b/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java index 3edf5f87258b..7917a06cb9b7 100644 --- a/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/LooperStatsTest.java @@ -452,6 +452,7 @@ public final class LooperStatsTest { public void testAddsDebugEntries() { TestableLooperStats looperStats = new TestableLooperStats(1, 100); looperStats.setAddDebugEntries(true); + looperStats.setSamplingInterval(10); Message message = mHandlerFirst.obtainMessage(1000); message.when = looperStats.getSystemUptimeMillis(); @@ -459,7 +460,7 @@ public final class LooperStatsTest { looperStats.messageDispatched(token, message); List<LooperStats.ExportedEntry> entries = looperStats.getEntries(); - assertThat(entries).hasSize(4); + assertThat(entries).hasSize(5); LooperStats.ExportedEntry debugEntry1 = entries.get(1); assertThat(debugEntry1.handlerClassName).isEqualTo(""); assertThat(debugEntry1.messageName).isEqualTo("__DEBUG_start_time_millis"); @@ -474,6 +475,9 @@ public final class LooperStatsTest { assertThat(debugEntry3.handlerClassName).isEqualTo(""); assertThat(debugEntry3.messageName).isEqualTo("__DEBUG_battery_time_millis"); assertThat(debugEntry3.totalLatencyMicros).isAtLeast(0L); + LooperStats.ExportedEntry debugEntry4 = entries.get(4); + assertThat(debugEntry4.messageName).isEqualTo("__DEBUG_sampling_interval"); + assertThat(debugEntry4.totalLatencyMicros).isEqualTo(10L); } @Test diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index e617c42cc70d..9eeb43b579bc 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -1733,7 +1733,7 @@ public class Paint { * @return the paint's extra word-spacing for drawing text in pixels. * @see #setWordSpacing(float) */ - public float getWordSpacing() { + public @Px float getWordSpacing() { return nGetWordSpacing(mNativePaint); } @@ -1746,7 +1746,7 @@ public class Paint { * @param wordSpacing set the paint's extra word-spacing for drawing text in pixels. * @see #getWordSpacing() */ - public void setWordSpacing(float wordSpacing) { + public void setWordSpacing(@Px float wordSpacing) { nSetWordSpacing(mNativePaint, wordSpacing); } @@ -2706,6 +2706,8 @@ public class Paint { } /** + * Retrieve the text boundary box and store to bounds. + * * Return in bounds (allocated by the caller) the smallest rectangle that * encloses all of the characters, with an implied origin at (0,0). * @@ -2725,6 +2727,8 @@ public class Paint { } /** + * Retrieve the text boundary box and store to bounds. + * * Return in bounds (allocated by the caller) the smallest rectangle that * encloses all of the characters, with an implied origin at (0,0). * @@ -2736,7 +2740,8 @@ public class Paint { * @param end 1 past the last char in the text to measure * @param bounds returns the unioned bounds of all the text. Must be allocated by the caller */ - public void getTextBounds(CharSequence text, int start, int end, Rect bounds) { + public void getTextBounds(@NonNull CharSequence text, int start, int end, + @NonNull Rect bounds) { if ((start | end | (end - start) | (text.length() - end)) < 0) { throw new IndexOutOfBoundsException(); } diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java index e93e757410e0..95187149b985 100644 --- a/graphics/java/android/graphics/Typeface.java +++ b/graphics/java/android/graphics/Typeface.java @@ -34,6 +34,7 @@ import android.graphics.fonts.FontVariationAxis; import android.graphics.fonts.SystemFonts; import android.os.Build; import android.os.Build.VERSION_CODES; +import android.os.ParcelFileDescriptor; import android.provider.FontRequest; import android.provider.FontsContract; import android.text.FontConfig; @@ -368,7 +369,7 @@ public class Typeface { private final AssetManager mAssetManager; private final String mPath; - private final Font.Builder mFontBuilder; + private final @Nullable Font.Builder mFontBuilder; private String mFallbackFamilyName; @@ -395,7 +396,16 @@ public class Typeface { * @param fd The file descriptor. The passed fd must be mmap-able. */ public Builder(@NonNull FileDescriptor fd) { - mFontBuilder = new Font.Builder(fd); + Font.Builder builder; + try { + builder = new Font.Builder(ParcelFileDescriptor.dup(fd)); + } catch (IOException e) { + // We cannot tell the error to developer at this moment since we cannot change the + // public API signature. Instead, silently fallbacks to system fallback in the build + // method as the same as other error cases. + builder = null; + } + mFontBuilder = builder; mAssetManager = null; mPath = null; } @@ -585,6 +595,9 @@ public class Typeface { * @return Newly created Typeface. May return null if some parameters are invalid. */ public Typeface build() { + if (mFontBuilder == null) { + return resolveFallbackTypeface(); + } try { final Font font = mFontBuilder.build(); final String key = mAssetManager == null ? null : createAssetUid( @@ -687,7 +700,7 @@ public class Typeface { * </pre> * </p> */ - public static class CustomFallbackBuilder { + public static final class CustomFallbackBuilder { private static final int MAX_CUSTOM_FALLBACK = 64; private final ArrayList<FontFamily> mFamilies = new ArrayList<>(); private String mFallbackName = null; @@ -728,7 +741,7 @@ public class Typeface { * @param familyName a family name to be used for fallback if the provided fonts can not be * used */ - public CustomFallbackBuilder setSystemFallback(@NonNull String familyName) { + public @NonNull CustomFallbackBuilder setSystemFallback(@NonNull String familyName) { Preconditions.checkNotNull(familyName); mFallbackName = familyName; return this; @@ -743,7 +756,7 @@ public class Typeface { * * @param style a font style */ - public CustomFallbackBuilder setStyle(@NonNull FontStyle style) { + public @NonNull CustomFallbackBuilder setStyle(@NonNull FontStyle style) { mStyle = style; return this; } @@ -758,7 +771,7 @@ public class Typeface { * @param family a fallback family * @throws IllegalArgumentException if you give more than 64 custom fallback families */ - public CustomFallbackBuilder addCustomFallback(@NonNull FontFamily family) { + public @NonNull CustomFallbackBuilder addCustomFallback(@NonNull FontFamily family) { Preconditions.checkNotNull(family); Preconditions.checkArgument(mFamilies.size() < getMaxCustomFallbackCount(), "Custom fallback limit exceeded(" + getMaxCustomFallbackCount() + ")"); @@ -771,7 +784,7 @@ public class Typeface { * * @return the Typeface object */ - public Typeface build() { + public @NonNull Typeface build() { final int userFallbackSize = mFamilies.size(); final FontFamily[] fallback = SystemFonts.getSystemFallback(mFallbackName); final long[] ptrArray = new long[fallback.length + userFallbackSize]; diff --git a/graphics/java/android/graphics/fonts/Font.java b/graphics/java/android/graphics/fonts/Font.java index 7f165bfc6a7d..f715f43344d3 100644 --- a/graphics/java/android/graphics/fonts/Font.java +++ b/graphics/java/android/graphics/fonts/Font.java @@ -22,6 +22,7 @@ import android.annotation.Nullable; import android.content.res.AssetManager; import android.content.res.Resources; import android.os.LocaleList; +import android.os.ParcelFileDescriptor; import android.util.TypedValue; import com.android.internal.util.Preconditions; @@ -31,7 +32,6 @@ import dalvik.annotation.optimization.CriticalNative; import libcore.util.NativeAllocationRegistry; import java.io.File; -import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; @@ -53,7 +53,7 @@ public final class Font { /** * A builder class for creating new Font. */ - public static class Builder { + public static final class Builder { private static final NativeAllocationRegistry sAssetByteBufferRegistroy = new NativeAllocationRegistry(ByteBuffer.class.getClassLoader(), nGetReleaseNativeAssetFunc(), 64); @@ -122,7 +122,7 @@ public final class Font { * * @param fd a file descriptor */ - public Builder(@NonNull FileDescriptor fd) { + public Builder(@NonNull ParcelFileDescriptor fd) { this(fd, 0, -1); } @@ -133,9 +133,9 @@ public final class Font { * @param offset an offset to of the font data in the file * @param size a size of the font data. If -1 is passed, use until end of the file. */ - public Builder(@NonNull FileDescriptor fd, @IntRange(from = 0) long offset, + public Builder(@NonNull ParcelFileDescriptor fd, @IntRange(from = 0) long offset, @IntRange(from = -1) long size) { - try (FileInputStream fis = new FileInputStream(fd)) { + try (FileInputStream fis = new FileInputStream(fd.getFileDescriptor())) { final FileChannel fc = fis.getChannel(); size = (size == -1) ? fc.size() - offset : size; mBuffer = fc.map(FileChannel.MapMode.READ_ONLY, offset, size); @@ -467,7 +467,7 @@ public final class Font { * @see Builder#setSlant(int) * @return a font style */ - public FontStyle getStyle() { + public @NonNull FontStyle getStyle() { return mFontStyle; } diff --git a/graphics/java/android/graphics/fonts/FontFamily.java b/graphics/java/android/graphics/fonts/FontFamily.java index c0f1b163ea11..4772c1cff7eb 100644 --- a/graphics/java/android/graphics/fonts/FontFamily.java +++ b/graphics/java/android/graphics/fonts/FontFamily.java @@ -61,7 +61,7 @@ public final class FontFamily { /** * A builder class for creating new FontFamily. */ - public static class Builder { + public static final class Builder { private static final NativeAllocationRegistry sFamilyRegistory = new NativeAllocationRegistry(FontFamily.class.getClassLoader(), nGetReleaseNativeFamily(), 64); @@ -152,7 +152,7 @@ public final class FontFamily { * @param index an index of the font * @return a registered font */ - public Font getFont(@IntRange(from = 0) int index) { + public @NonNull Font getFont(@IntRange(from = 0) int index) { return mFonts.get(index); } @@ -161,7 +161,7 @@ public final class FontFamily { * * @return the number of fonts registered in this family. */ - public int getSize() { + public @IntRange(from = 1) int getSize() { return mFonts.size(); } diff --git a/graphics/java/android/graphics/text/LineBreaker.java b/graphics/java/android/graphics/text/LineBreaker.java index 16479095a63a..046bbcffb76a 100644 --- a/graphics/java/android/graphics/text/LineBreaker.java +++ b/graphics/java/android/graphics/text/LineBreaker.java @@ -177,10 +177,10 @@ public class LineBreaker { /** * Helper class for creating a {@link LineBreaker}. */ - public static class Builder { + public static final class Builder { private @BreakStrategy int mBreakStrategy = BREAK_STRATEGY_SIMPLE; private @HyphenationFrequency int mHyphenationFrequency = HYPHENATION_FREQUENCY_NONE; - private @JustificationMode int mJustified = JUSTIFICATION_MODE_NONE; + private @JustificationMode int mJustificationMode = JUSTIFICATION_MODE_NONE; private @Nullable int[] mIndents = null; /** @@ -189,7 +189,7 @@ public class LineBreaker { * You can change the line breaking behavior by setting break strategy. The default value is * {@link #BREAK_STRATEGY_SIMPLE}. */ - public Builder setBreakStrategy(@BreakStrategy int breakStrategy) { + public @NonNull Builder setBreakStrategy(@BreakStrategy int breakStrategy) { mBreakStrategy = breakStrategy; return this; } @@ -200,7 +200,8 @@ public class LineBreaker { * You can change the amount of automatic hyphenation used. The default value is * {@link #HYPHENATION_FREQUENCY_NONE}. */ - public Builder setHyphenationFrequency(@HyphenationFrequency int hyphenationFrequency) { + public @NonNull Builder setHyphenationFrequency( + @HyphenationFrequency int hyphenationFrequency) { mHyphenationFrequency = hyphenationFrequency; return this; } @@ -212,8 +213,8 @@ public class LineBreaker { * internal parameters for justification. * The default value is {@link #JUSTIFICATION_MODE_NONE} */ - public Builder setJustified(@JustificationMode int justified) { - mJustified = justified; + public @NonNull Builder setJustificationMode(@JustificationMode int justificationMode) { + mJustificationMode = justificationMode; return this; } @@ -224,7 +225,7 @@ public class LineBreaker { * amount is the sum of both left and right indentations. For lines past the last element in * the array, the indentation amount of the last element is used. */ - public Builder setIndents(@Nullable int[] indents) { + public @NonNull Builder setIndents(@Nullable int[] indents) { mIndents = indents; return this; } @@ -234,8 +235,9 @@ public class LineBreaker { * * You can reuse the Builder instance even after calling this method. */ - public LineBreaker build() { - return new LineBreaker(mBreakStrategy, mHyphenationFrequency, mJustified, mIndents); + public @NonNull LineBreaker build() { + return new LineBreaker(mBreakStrategy, mHyphenationFrequency, mJustificationMode, + mIndents); } } @@ -412,7 +414,7 @@ public class LineBreaker { } /** - * Returns a packed packed hyphen edit for the line. + * Returns a packed hyphen edit for the line. * * @param lineIndex an index of the line. * @return a packed hyphen edit for the line. @@ -451,7 +453,7 @@ public class LineBreaker { * @param constraints for a single paragraph * @param lineNumber a line number of this paragraph */ - public Result computeLineBreaks( + public @NonNull Result computeLineBreaks( @NonNull MeasuredText measuredPara, @NonNull ParagraphConstraints constraints, @IntRange(from = 0) int lineNumber) { diff --git a/graphics/java/android/graphics/text/MeasuredText.java b/graphics/java/android/graphics/text/MeasuredText.java index 2536619bb7c8..480aff289dfc 100644 --- a/graphics/java/android/graphics/text/MeasuredText.java +++ b/graphics/java/android/graphics/text/MeasuredText.java @@ -168,7 +168,7 @@ public class MeasuredText { * * Note: The appendStyle and appendReplacementRun should be called to cover the text length. */ - public static class Builder { + public static final class Builder { private static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( MeasuredText.class.getClassLoader(), nGetReleaseFunc(), 1024); @@ -227,7 +227,7 @@ public class MeasuredText { * text * @param isRtl true if the text is in RTL context, otherwise false. */ - public Builder appendStyleRun(@NonNull Paint paint, @IntRange(from = 0) int length, + public @NonNull Builder appendStyleRun(@NonNull Paint paint, @IntRange(from = 0) int length, boolean isRtl) { Preconditions.checkNotNull(paint); Preconditions.checkArgument(length > 0, "length can not be negative"); @@ -253,8 +253,8 @@ public class MeasuredText { * text * @param width a replacement width of the range */ - public Builder appendReplacementRun(@NonNull Paint paint, - @IntRange(from = 0) int length, @FloatRange(from = 0) float width) { + public @NonNull Builder appendReplacementRun(@NonNull Paint paint, + @IntRange(from = 0) int length, @Px @FloatRange(from = 0) float width) { Preconditions.checkArgument(length > 0, "length can not be negative"); final int end = mCurrentOffset + length; Preconditions.checkArgument(end <= mText.length, "Replacement exceeds the text length"); @@ -275,7 +275,7 @@ public class MeasuredText { * * @param computeHyphenation true if you want to use automatic hyphenations. */ - public Builder setComputeHyphenation(boolean computeHyphenation) { + public @NonNull Builder setComputeHyphenation(boolean computeHyphenation) { mComputeHyphenation = computeHyphenation; return this; } @@ -292,7 +292,7 @@ public class MeasuredText { * * @param computeLayout true if you want to retrieve full layout info, e.g. bbox. */ - public Builder setComputeLayout(boolean computeLayout) { + public @NonNull Builder setComputeLayout(boolean computeLayout) { mComputeLayout = computeLayout; return this; } @@ -305,7 +305,7 @@ public class MeasuredText { * @throws IllegalStateException if the whole text is not covered by one or more runs (style * or replacement) */ - public MeasuredText build() { + public @NonNull MeasuredText build() { ensureNativePtrNoReuse(); if (mCurrentOffset != mText.length) { throw new IllegalStateException("Style info has not been provided for all text."); diff --git a/libs/androidfw/AttributeResolution.cpp b/libs/androidfw/AttributeResolution.cpp index cc177af7be6f..e62fb614e195 100644 --- a/libs/androidfw/AttributeResolution.cpp +++ b/libs/androidfw/AttributeResolution.cpp @@ -388,7 +388,7 @@ void ApplyStyle(Theme* theme, ResXMLParser* xml_parser, uint32_t def_style_attr, out_values[STYLE_RESOURCE_ID] = resid; out_values[STYLE_CHANGING_CONFIGURATIONS] = type_set_flags; out_values[STYLE_DENSITY] = config.density; - out_values[SYTLE_SOURCE_RESOURCE_ID] = value_source_resid; + out_values[STYLE_SOURCE_RESOURCE_ID] = value_source_resid; if (value.dataType != Res_value::TYPE_NULL || value.data == Res_value::DATA_NULL_EMPTY) { indices_idx++; diff --git a/libs/androidfw/include/androidfw/AttributeResolution.h b/libs/androidfw/include/androidfw/AttributeResolution.h index 0cc1d3c56cc4..d71aad29d917 100644 --- a/libs/androidfw/include/androidfw/AttributeResolution.h +++ b/libs/androidfw/include/androidfw/AttributeResolution.h @@ -33,7 +33,7 @@ enum { STYLE_RESOURCE_ID = 3, STYLE_CHANGING_CONFIGURATIONS = 4, STYLE_DENSITY = 5, - SYTLE_SOURCE_RESOURCE_ID = 6 + STYLE_SOURCE_RESOURCE_ID = 6 }; // These are all variations of the same method. They each perform the exact same operation, diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index 1ff7ffe6bf87..e0ed3e4940a8 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -134,6 +134,7 @@ void RenderNode::removeAnimator(const sp<BaseRenderNodeAnimator>& animator) { void RenderNode::damageSelf(TreeInfo& info) { if (isRenderable()) { + mDamageGenerationId = info.damageGenerationId; if (properties().getClipDamageToBounds()) { info.damageAccumulator->dirty(0, 0, properties().getWidth(), properties().getHeight()); } else { @@ -199,6 +200,12 @@ void RenderNode::pushLayerUpdate(TreeInfo& info) { * stencil buffer may be needed. Views that use a functor to draw will be forced onto a layer. */ void RenderNode::prepareTreeImpl(TreeObserver& observer, TreeInfo& info, bool functorsNeedLayer) { + if (mDamageGenerationId == info.damageGenerationId) { + // We hit the same node a second time in the same tree. We don't know the minimal + // damage rect anymore, so just push the biggest we can onto our parent's transform + // We push directly onto parent in case we are clipped to bounds but have moved position. + info.damageAccumulator->dirty(DIRTY_MIN, DIRTY_MIN, DIRTY_MAX, DIRTY_MAX); + } info.damageAccumulator->pushTransform(this); if (info.mode == TreeInfo::MODE_FULL) { diff --git a/libs/hwui/RenderNode.h b/libs/hwui/RenderNode.h index 6060123ed759..23e7a0e60554 100644 --- a/libs/hwui/RenderNode.h +++ b/libs/hwui/RenderNode.h @@ -255,6 +255,8 @@ private: DisplayList* mDisplayList; DisplayList* mStagingDisplayList; + int64_t mDamageGenerationId; + friend class AnimatorManager; AnimatorManager mAnimatorManager; diff --git a/libs/hwui/TreeInfo.cpp b/libs/hwui/TreeInfo.cpp index 808a12a311e2..cdad20ec6caa 100644 --- a/libs/hwui/TreeInfo.cpp +++ b/libs/hwui/TreeInfo.cpp @@ -24,6 +24,7 @@ TreeInfo::TreeInfo(TraversalMode mode, renderthread::CanvasContext& canvasContex : mode(mode) , prepareTextures(mode == MODE_FULL) , canvasContext(canvasContext) + , damageGenerationId(canvasContext.getFrameNumber()) , disableForceDark(canvasContext.useForceDark() ? 0 : 1) {} } // namespace android::uirenderer diff --git a/libs/hwui/TreeInfo.h b/libs/hwui/TreeInfo.h index a0d960527ca6..04eabac395f0 100644 --- a/libs/hwui/TreeInfo.h +++ b/libs/hwui/TreeInfo.h @@ -87,6 +87,7 @@ public: // Must not be null during actual usage DamageAccumulator* damageAccumulator = nullptr; + int64_t damageGenerationId = 0; LayerUpdateQueue* layerUpdateQueue = nullptr; ErrorHandler* errorHandler = nullptr; diff --git a/media/apex/java/android/media/MediaPlayer2.java b/media/apex/java/android/media/MediaPlayer2.java index f6b2031bc456..5cd36216929e 100644 --- a/media/apex/java/android/media/MediaPlayer2.java +++ b/media/apex/java/android/media/MediaPlayer2.java @@ -1985,7 +1985,7 @@ public class MediaPlayer2 implements AutoCloseable * When the language is unknown or could not be determined, * ISO-639-2 language code, "und", is returned. */ - public @Nullable String getLanguage() { + public @NonNull String getLanguage() { String language = mFormat.getString(MediaFormat.KEY_LANGUAGE); return language == null ? "und" : language; } diff --git a/media/apex/java/android/media/MediaSession2.java b/media/apex/java/android/media/MediaSession2.java index 148e16c68cee..09ac9caf831b 100644 --- a/media/apex/java/android/media/MediaSession2.java +++ b/media/apex/java/android/media/MediaSession2.java @@ -749,6 +749,10 @@ public class MediaSession2 implements AutoCloseable { * You can reject the connection by returning {@code null}. In that case, controller * receives {@link MediaController2.ControllerCallback#onDisconnected(MediaController2)} * and cannot be used. + * <p> + * The controller hasn't connected yet in this method, so calls to the controller + * (e.g. {@link #sendSessionCommand}) would be ignored. Override {@link #onPostConnect} for + * the custom initialization for the controller instead. * * @param session the session for this event * @param controller controller information. @@ -763,6 +767,10 @@ public class MediaSession2 implements AutoCloseable { /** * Called immediately after a controller is connected. This is a convenient method to add * custom initialization between the session and a controller. + * <p> + * Note that calls to the controller (e.g. {@link #sendSessionCommand}) work here but don't + * work in {@link #onConnect} because the controller hasn't connected yet in + * {@link #onConnect}. * * @param session the session for this event * @param controller controller information. diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index bc91ca3df3a2..4cd897122d64 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -73,6 +73,12 @@ import java.util.regex.Pattern; * Supported formats are: JPEG, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW, RAF and HEIF. * <p> * Attribute mutation is supported for JPEG image files. + * <p> + * Note: It is recommended to use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a> + * <a href="{@docRoot}reference/androidx/exifinterface/media/ExifInterface.html">ExifInterface + * Library</a> since it is a superset of this class. In addition to the functionalities of this + * class, it supports parsing extra metadata such as exposure and data compression information + * as well as setting extra metadata such as GPS and datetime information. */ public class ExifInterface { private static final String TAG = "ExifInterface"; @@ -1316,14 +1322,14 @@ public class ExifInterface { } @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) - private final String mFilename; - private final FileDescriptor mSeekableFileDescriptor; - private final AssetManager.AssetInputStream mAssetInputStream; - private final boolean mIsInputStream; + private String mFilename; + private FileDescriptor mSeekableFileDescriptor; + private AssetManager.AssetInputStream mAssetInputStream; + private boolean mIsInputStream; private int mMimeType; @UnsupportedAppUsage private final HashMap[] mAttributes = new HashMap[EXIF_TAGS.length]; - private Set<Integer> mAttributesOffsets = new HashSet<>(EXIF_TAGS.length); + private Set<Integer> mHandledIfdOffsets = new HashSet<>(EXIF_TAGS.length); private ByteOrder mExifByteOrder = ByteOrder.BIG_ENDIAN; @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private boolean mHasThumbnail; @@ -1350,7 +1356,10 @@ public class ExifInterface { * Reads Exif tags from the specified image file. */ public ExifInterface(@NonNull File file) throws IOException { - this(file.getAbsolutePath()); + if (file == null) { + throw new NullPointerException("file cannot be null"); + } + initForFilename(file.getName()); } /** @@ -1358,23 +1367,9 @@ public class ExifInterface { */ public ExifInterface(@NonNull String filename) throws IOException { if (filename == null) { - throw new IllegalArgumentException("filename cannot be null"); - } - FileInputStream in = null; - mAssetInputStream = null; - mFilename = filename; - mIsInputStream = false; - try { - in = new FileInputStream(filename); - if (isSeekableFD(in.getFD())) { - mSeekableFileDescriptor = in.getFD(); - } else { - mSeekableFileDescriptor = null; - } - loadAttributes(in); - } finally { - IoUtils.closeQuietly(in); + throw new NullPointerException("filename cannot be null"); } + initForFilename(filename); } /** @@ -1384,7 +1379,7 @@ public class ExifInterface { */ public ExifInterface(@NonNull FileDescriptor fileDescriptor) throws IOException { if (fileDescriptor == null) { - throw new IllegalArgumentException("fileDescriptor cannot be null"); + throw new NullPointerException("fileDescriptor cannot be null"); } mAssetInputStream = null; mFilename = null; @@ -1418,7 +1413,7 @@ public class ExifInterface { */ public ExifInterface(@NonNull InputStream inputStream) throws IOException { if (inputStream == null) { - throw new IllegalArgumentException("inputStream cannot be null"); + throw new NullPointerException("inputStream cannot be null"); } mFilename = null; if (inputStream instanceof AssetManager.AssetInputStream) { @@ -1443,6 +1438,9 @@ public class ExifInterface { * @param tag the name of the tag. */ private @Nullable ExifAttribute getExifAttribute(@NonNull String tag) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } // Retrieves all tag groups. The value from primary image tag group has a higher priority // than the value from the thumbnail tag group if there are more than one candidates. for (int i = 0; i < EXIF_TAGS.length; ++i) { @@ -1461,6 +1459,9 @@ public class ExifInterface { * @param tag the name of the tag. */ public @Nullable String getAttribute(@NonNull String tag) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } ExifAttribute attribute = getExifAttribute(tag); if (attribute != null) { if (!sTagSetForCompatibility.contains(tag)) { @@ -1499,6 +1500,9 @@ public class ExifInterface { * @param defaultValue the value to return if the tag is not available. */ public int getAttributeInt(@NonNull String tag, int defaultValue) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } ExifAttribute exifAttribute = getExifAttribute(tag); if (exifAttribute == null) { return defaultValue; @@ -1520,6 +1524,9 @@ public class ExifInterface { * @param defaultValue the value to return if the tag is not available. */ public double getAttributeDouble(@NonNull String tag, double defaultValue) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } ExifAttribute exifAttribute = getExifAttribute(tag); if (exifAttribute == null) { return defaultValue; @@ -1539,6 +1546,9 @@ public class ExifInterface { * @param value the value of the tag. */ public void setAttribute(@NonNull String tag, @Nullable String value) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } // Convert the given value to rational values for backwards compatibility. if (value != null && sTagSetForCompatibility.contains(tag)) { if (tag.equals(TAG_GPS_TIMESTAMP)) { @@ -1708,6 +1718,9 @@ public class ExifInterface { * determine whether the image data format is JPEG or not. */ private void loadAttributes(@NonNull InputStream in) throws IOException { + if (in == null) { + throw new NullPointerException("inputstream shouldn't be null"); + } try { // Initialize mAttributes. for (int i = 0; i < EXIF_TAGS.length; ++i) { @@ -2043,6 +2056,9 @@ public class ExifInterface { * that means offsets may have changed. */ public @Nullable long[] getAttributeRange(@NonNull String tag) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } if (mModified) { throw new IllegalStateException( "The underlying file has been modified since being parsed"); @@ -2064,6 +2080,9 @@ public class ExifInterface { * no tag was found. */ public @Nullable byte[] getAttributeBytes(@NonNull String tag) { + if (tag == null) { + throw new NullPointerException("tag shouldn't be null"); + } final ExifAttribute attribute = getExifAttribute(tag); if (attribute != null) { return attribute.bytes; @@ -2234,6 +2253,24 @@ public class ExifInterface { } } + private void initForFilename(String filename) throws IOException { + FileInputStream in = null; + mAssetInputStream = null; + mFilename = filename; + mIsInputStream = false; + try { + in = new FileInputStream(filename); + if (isSeekableFD(in.getFD())) { + mSeekableFileDescriptor = in.getFD(); + } else { + mSeekableFileDescriptor = null; + } + loadAttributes(in); + } finally { + IoUtils.closeQuietly(in); + } + } + // Checks the type of image file private int getMimeType(BufferedInputStream in) throws IOException { in.mark(SIGNATURE_CHECK_SIZE); @@ -3085,6 +3122,9 @@ public class ExifInterface { // Reads image file directory, which is a tag group in EXIF. private void readImageFileDirectory(ByteOrderedDataInputStream dataInputStream, @IfdType int ifdType) throws IOException { + // Save offset of current IFD to prevent reading an IFD that is already read. + mHandledIfdOffsets.add(dataInputStream.mPosition); + if (dataInputStream.mPosition + 2 > dataInputStream.mLength) { // Return if there is no data from the offset. return; @@ -3223,9 +3263,7 @@ public class ExifInterface { // 1. Exists within the boundaries of the input stream // 2. Does not point to a previously read IFD. if (offset > 0L && offset < dataInputStream.mLength) { - if (!mAttributesOffsets.contains((int) offset)) { - // Save offset of current IFD to prevent reading an IFD that is already read - mAttributesOffsets.add(dataInputStream.mPosition); + if (!mHandledIfdOffsets.contains((int) offset)) { dataInputStream.seek(offset); readImageFileDirectory(dataInputStream, nextIfdType); } else { @@ -3279,9 +3317,7 @@ public class ExifInterface { // 1. Exists within the boundaries of the input stream // 2. Does not point to a previously read IFD. if (nextIfdOffset > 0L && nextIfdOffset < dataInputStream.mLength) { - if (!mAttributesOffsets.contains(nextIfdOffset)) { - // Save offset of current IFD to prevent reading an IFD that is already read. - mAttributesOffsets.add(dataInputStream.mPosition); + if (!mHandledIfdOffsets.contains(nextIfdOffset)) { dataInputStream.seek(nextIfdOffset); // Do not overwrite thumbnail IFD data if it alreay exists. if (mAttributes[IFD_TYPE_THUMBNAIL].isEmpty()) { diff --git a/media/java/android/media/PlayerBase.java b/media/java/android/media/PlayerBase.java index b302b06df782..50caf733da9d 100644 --- a/media/java/android/media/PlayerBase.java +++ b/media/java/android/media/PlayerBase.java @@ -52,6 +52,10 @@ public abstract class PlayerBase { // parameters of the player that affect AppOps protected AudioAttributes mAttributes; + + // volumes of the subclass "player volumes", as seen by the client of the subclass + // (e.g. what was passed in AudioTrack.setVolume(float)). The actual volume applied is + // the combination of the player volume, and the PlayerBase pan and volume multipliers protected float mLeftVolume = 1.0f; protected float mRightVolume = 1.0f; protected float mAuxEffectSendLevel = 0.0f; @@ -79,6 +83,8 @@ public abstract class PlayerBase { private float mPanMultiplierL = 1.0f; @GuardedBy("mLock") private float mPanMultiplierR = 1.0f; + @GuardedBy("mLock") + private float mVolMultiplier = 1.0f; /** * Constructor. Must be given audio attributes, as they are required for AppOps. @@ -199,18 +205,33 @@ public abstract class PlayerBase { mPanMultiplierR = 1.0f + p; } } - baseSetVolume(mLeftVolume, mRightVolume); + updatePlayerVolume(); } - void baseSetVolume(float leftVolume, float rightVolume) { + private void updatePlayerVolume() { + final float finalLeftVol, finalRightVol; final boolean isRestricted; synchronized (mLock) { + finalLeftVol = mVolMultiplier * mLeftVolume * mPanMultiplierL; + finalRightVol = mVolMultiplier * mRightVolume * mPanMultiplierR; + isRestricted = isRestricted_sync(); + } + playerSetVolume(isRestricted /*muting*/, finalLeftVol, finalRightVol); + } + + void setVolumeMultiplier(float vol) { + synchronized (mLock) { + this.mVolMultiplier = vol; + } + updatePlayerVolume(); + } + + void baseSetVolume(float leftVolume, float rightVolume) { + synchronized (mLock) { mLeftVolume = leftVolume; mRightVolume = rightVolume; - isRestricted = isRestricted_sync(); } - playerSetVolume(isRestricted/*muting*/, - leftVolume * mPanMultiplierL, rightVolume * mPanMultiplierR); + updatePlayerVolume(); } int baseSetAuxEffectSendLevel(float level) { @@ -466,7 +487,7 @@ public abstract class PlayerBase { public void setVolume(float vol) { final PlayerBase pb = mWeakPB.get(); if (pb != null) { - pb.baseSetVolume(vol, vol); + pb.setVolumeMultiplier(vol); } } diff --git a/native/android/OWNERS b/native/android/OWNERS index b3f50aab7503..266764a6f607 100644 --- a/native/android/OWNERS +++ b/native/android/OWNERS @@ -1,4 +1,4 @@ set noparent -per-file libandroid_net.map.txt, net.c = codewiz@google.com, ek@google.com, jchalard@google.com +per-file libandroid_net.map.txt, net.c = codewiz@google.com, jchalard@google.com, junyulai@google.com per-file libandroid_net.map.txt, net.c = lorenzo@google.com, reminv@google.com, satk@google.com diff --git a/native/android/choreographer.cpp b/native/android/choreographer.cpp index 3fecd53b43e2..63e073405fe0 100644 --- a/native/android/choreographer.cpp +++ b/native/android/choreographer.cpp @@ -37,6 +37,7 @@ static inline const char* toString(bool value) { struct FrameCallback { AChoreographer_frameCallback callback; + AChoreographer_frameCallback64 callback64; void* data; nsecs_t dueTime; @@ -50,8 +51,8 @@ struct FrameCallback { class Choreographer : public DisplayEventDispatcher, public MessageHandler { public: - void postFrameCallback(AChoreographer_frameCallback cb, void* data); - void postFrameCallbackDelayed(AChoreographer_frameCallback cb, void* data, nsecs_t delay); + void postFrameCallbackDelayed(AChoreographer_frameCallback cb, + AChoreographer_frameCallback64 cb64, void* data, nsecs_t delay); enum { MSG_SCHEDULE_CALLBACKS = 0, @@ -107,14 +108,10 @@ Choreographer::Choreographer(const sp<Looper>& looper) : DisplayEventDispatcher(looper), mLooper(looper), mThreadId(std::this_thread::get_id()) { } -void Choreographer::postFrameCallback(AChoreographer_frameCallback cb, void* data) { - postFrameCallbackDelayed(cb, data, 0); -} - void Choreographer::postFrameCallbackDelayed( - AChoreographer_frameCallback cb, void* data, nsecs_t delay) { + AChoreographer_frameCallback cb, AChoreographer_frameCallback64 cb64, void* data, nsecs_t delay) { nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); - FrameCallback callback{cb, data, now + delay}; + FrameCallback callback{cb, cb64, data, now + delay}; { AutoMutex _l{mLock}; mCallbacks.push(callback); @@ -156,7 +153,11 @@ void Choreographer::dispatchVsync(nsecs_t timestamp, PhysicalDisplayId, uint32_t } } for (const auto& cb : callbacks) { - cb.callback(timestamp, cb.data); + if (cb.callback64 != nullptr) { + cb.callback64(timestamp, cb.data); + } else if (cb.callback != nullptr) { + cb.callback(timestamp, cb.data); + } } } @@ -204,10 +205,21 @@ AChoreographer* AChoreographer_getInstance() { void AChoreographer_postFrameCallback(AChoreographer* choreographer, AChoreographer_frameCallback callback, void* data) { - AChoreographer_to_Choreographer(choreographer)->postFrameCallback(callback, data); + AChoreographer_to_Choreographer(choreographer)->postFrameCallbackDelayed( + callback, nullptr, data, 0); } void AChoreographer_postFrameCallbackDelayed(AChoreographer* choreographer, AChoreographer_frameCallback callback, void* data, long delayMillis) { AChoreographer_to_Choreographer(choreographer)->postFrameCallbackDelayed( - callback, data, ms2ns(delayMillis)); + callback, nullptr, data, ms2ns(delayMillis)); +} +void AChoreographer_postFrameCallback64(AChoreographer* choreographer, + AChoreographer_frameCallback64 callback, void* data) { + AChoreographer_to_Choreographer(choreographer)->postFrameCallbackDelayed( + nullptr, callback, data, 0); +} +void AChoreographer_postFrameCallbackDelayed64(AChoreographer* choreographer, + AChoreographer_frameCallback64 callback, void* data, uint32_t delayMillis) { + AChoreographer_to_Choreographer(choreographer)->postFrameCallbackDelayed( + nullptr, callback, data, ms2ns(delayMillis)); } diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt index a3db2d6a5055..e1dc40636ca5 100644 --- a/native/android/libandroid.map.txt +++ b/native/android/libandroid.map.txt @@ -21,6 +21,8 @@ LIBANDROID { AChoreographer_getInstance; # introduced=24 AChoreographer_postFrameCallback; # introduced=24 AChoreographer_postFrameCallbackDelayed; # introduced=24 + AChoreographer_postFrameCallback64; # introduced=29 + AChoreographer_postFrameCallbackDelayed64; # introduced=29 AConfiguration_copy; AConfiguration_delete; AConfiguration_diff; diff --git a/packages/CaptivePortalLogin/OWNERS b/packages/CaptivePortalLogin/OWNERS index 7311eee32a4c..d3836d4c6c57 100644 --- a/packages/CaptivePortalLogin/OWNERS +++ b/packages/CaptivePortalLogin/OWNERS @@ -1,8 +1,8 @@ set noparent codewiz@google.com -ek@google.com jchalard@google.com +junyulai@google.com lorenzo@google.com reminv@google.com satk@google.com diff --git a/packages/NetworkStack/OWNERS b/packages/NetworkStack/OWNERS index a395465e5f21..0e1e65df818f 100644 --- a/packages/NetworkStack/OWNERS +++ b/packages/NetworkStack/OWNERS @@ -1,5 +1,6 @@ codewiz@google.com jchalard@google.com +junyulai@google.com lorenzo@google.com reminv@google.com satk@google.com diff --git a/packages/NetworkStack/TEST_MAPPING b/packages/NetworkStack/TEST_MAPPING index 55ba5916b7d8..fe9731fe577e 100644 --- a/packages/NetworkStack/TEST_MAPPING +++ b/packages/NetworkStack/TEST_MAPPING @@ -1,5 +1,5 @@ { - "postsubmit": [ + "presubmit": [ { "name": "NetworkStackTests" } diff --git a/packages/NetworkStack/src/android/net/metrics/DataStallStatsUtils.java b/packages/NetworkStack/src/android/net/metrics/DataStallStatsUtils.java index 17a36ad4e6d2..d1ca109036b4 100644 --- a/packages/NetworkStack/src/android/net/metrics/DataStallStatsUtils.java +++ b/packages/NetworkStack/src/android/net/metrics/DataStallStatsUtils.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.net.captiveportal.CaptivePortalProbeResult; import android.util.Log; +import android.util.StatsLog; import com.android.internal.util.HexDump; import com.android.server.connectivity.nano.DataStallEventProto; @@ -36,6 +37,7 @@ import com.android.server.connectivity.nano.DataStallEventProto; */ public class DataStallStatsUtils { private static final String TAG = DataStallStatsUtils.class.getSimpleName(); + private static final int DATA_STALL_EVENT_ID = 121; private static final boolean DBG = false; private static int probeResultToEnum(@Nullable final CaptivePortalProbeResult result) { @@ -61,6 +63,13 @@ public class DataStallStatsUtils { Log.d(TAG, "write: " + stats + " with result: " + validationResult + ", dns: " + HexDump.toHexString(stats.mDns)); } - // TODO(b/124613085): Send to Statsd once the public StatsLog API is ready. + // TODO(b/124613085): Update API once the public StatsLog API is ready. + StatsLog.write(DATA_STALL_EVENT_ID, + stats.mEvaluationType, + validationResult, + stats.mNetworkType, + stats.mWifiInfo, + stats.mCellularInfo, + stats.mDns); } } diff --git a/packages/NetworkStack/src/com/android/server/util/PermissionUtil.java b/packages/NetworkStack/src/com/android/server/util/PermissionUtil.java index f6eb900c4910..6fbeeadb7e72 100644 --- a/packages/NetworkStack/src/com/android/server/util/PermissionUtil.java +++ b/packages/NetworkStack/src/com/android/server/util/PermissionUtil.java @@ -33,7 +33,9 @@ public final class PermissionUtil { public static void checkNetworkStackCallingPermission() { // TODO: check that the calling PID is the system server. final int caller = getCallingUid(); - if (caller != Process.SYSTEM_UID && UserHandle.getAppId(caller) != Process.BLUETOOTH_UID) { + if (caller != Process.SYSTEM_UID + && UserHandle.getAppId(caller) != Process.BLUETOOTH_UID + && UserHandle.getAppId(caller) != Process.PHONE_UID) { throw new SecurityException("Invalid caller: " + caller); } } diff --git a/packages/NetworkStack/tests/Android.bp b/packages/NetworkStack/tests/Android.bp index f22b6472847c..e64f28481982 100644 --- a/packages/NetworkStack/tests/Android.bp +++ b/packages/NetworkStack/tests/Android.bp @@ -22,7 +22,6 @@ android_test { resource_dirs: ["res"], static_libs: [ "androidx.test.rules", - "frameworks-base-testutils", "mockito-target-extended-minus-junit4", "NetworkStackLib", "testables", diff --git a/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java b/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java index 19902293b61a..bd488ea4145f 100644 --- a/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java +++ b/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java @@ -34,6 +34,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AlarmManager; +import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.net.ConnectivityManager; @@ -46,14 +47,11 @@ import android.net.RouteInfo; import android.net.shared.InitialConfiguration; import android.net.shared.ProvisioningConfiguration; import android.net.util.InterfaceParams; -import android.provider.Settings; -import android.test.mock.MockContentResolver; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.R; -import com.android.internal.util.test.FakeSettingsProvider; import com.android.server.NetworkObserver; import com.android.server.NetworkObserverRegistry; @@ -94,7 +92,7 @@ public class IpClientTest { @Mock private IIpClientCallbacks mCb; @Mock private AlarmManager mAlarm; @Mock private IpClient.Dependencies mDependencies; - private MockContentResolver mContentResolver; + @Mock private ContentResolver mContentResolver; private NetworkObserver mObserver; private InterfaceParams mIfParams; @@ -109,9 +107,6 @@ public class IpClientTest { when(mDependencies.getNetd(any())).thenReturn(mNetd); when(mResources.getInteger(R.integer.config_networkAvoidBadWifi)) .thenReturn(DEFAULT_AVOIDBADWIFI_CONFIG_VALUE); - - mContentResolver = new MockContentResolver(); - mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); when(mContext.getContentResolver()).thenReturn(mContentResolver); mIfParams = null; diff --git a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java index ee2baf20bb8e..34ca6ac2ac20 100644 --- a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java +++ b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java @@ -525,7 +525,7 @@ public class NetworkMonitorTest { wrappedMonitor.setLastProbeTime(SystemClock.elapsedRealtime() - 1000); makeDnsTimeoutEvent(wrappedMonitor, 5); assertTrue(wrappedMonitor.isDataStall()); - verify(mDataStallStatsUtils, times(1)).write(any(), any()); + verify(mDataStallStatsUtils, times(1)).write(makeEmptyDataStallDetectionStats(), any()); } @Test @@ -534,7 +534,7 @@ public class NetworkMonitorTest { wrappedMonitor.setLastProbeTime(SystemClock.elapsedRealtime() - 1000); makeDnsTimeoutEvent(wrappedMonitor, 3); assertFalse(wrappedMonitor.isDataStall()); - verify(mDataStallStatsUtils, never()).write(any(), any()); + verify(mDataStallStatsUtils, never()).write(makeEmptyDataStallDetectionStats(), any()); } @Test @@ -586,6 +586,10 @@ public class NetworkMonitorTest { } } + private DataStallDetectionStats makeEmptyDataStallDetectionStats() { + return new DataStallDetectionStats.Builder().build(); + } + private void setDataStallEvaluationType(int type) { when(mDependencies.getSetting(any(), eq(Settings.Global.DATA_STALL_EVALUATION_TYPE), anyInt())).thenReturn(type); diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index cfc76b70275f..835fcc2445c4 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor gegrond op jou gebruik"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor gegrond op jou gebruik (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Sal op grond van jou gebruik waarskynlik hou tot omtrent <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Sal op grond van jou gebruik waarskynlik hou tot omtrent <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Sal waarskynlik hou tot omtrent <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 6e6d58fb4470..11dde979f496 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) ገደማ ቀርቷል"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"በአጠቃቀምዎ መሠረት <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ገደማ ቀርቷል"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"በአጠቃቀምዎ መሠረት <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) ገደማ ቀርቷል"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ቀርቷል"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"በአጠቃቀምዎ (<xliff:g id="LEVEL">%2$s</xliff:g>) መሠረት እስከ <xliff:g id="TIME">%1$s</xliff:g> ገደማ መቆየት አለበት"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"በአጠቃቀምዎ መሠረት እስከ <xliff:g id="TIME">%1$s</xliff:g> ገደማ መቆየት አለበት"</string> <string name="power_discharge_by" msgid="6453537733650125582">"እስከ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) ገደማ ድረስ መቆየት አለበት"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 18d47ace8608..10d4ee587564 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"يتبقى <xliff:g id="TIME_REMAINING">%1$s</xliff:g> تقريبًا (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"يتبقى <xliff:g id="TIME_REMAINING">%1$s</xliff:g> تقريبًا، بناءً على استخدامك"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"يتبقى <xliff:g id="TIME_REMAINING">%1$s</xliff:g> تقريبًا، بناءً على استخدامك (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"الوقت المتبقي: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"قد تكفي طاقة البطارية حتى حوالي الساعة <xliff:g id="TIME">%1$s</xliff:g> حسب استخدامك (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"قد تكفي طاقة البطارية حتى حوالي الساعة <xliff:g id="TIME">%1$s</xliff:g> حسب استخدامك."</string> <string name="power_discharge_by" msgid="6453537733650125582">"قد تكفي طاقة البطارية حتى حوالي الساعة <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 68f1e6fb6f13..dee399e3c3aa 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"প্রায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি প্ৰায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি প্রায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব"</string> <string name="power_discharge_by" msgid="6453537733650125582">"বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 8e6e07d17d09..73e3d51f373c 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Təxminən <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qalıb (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"İstifadəyə əsasən təxminən <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qalıb"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"İstifadəyə əsasən təxminən <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qalıb (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> qalıb"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"İstifadəyə (<xliff:g id="LEVEL">%2$s</xliff:g>) əsasən təxminən <xliff:g id="TIME">%1$s</xliff:g> olana qədər davam edəcək"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"İstifadəyə əsasən təxminən <xliff:g id="TIME">%1$s</xliff:g> olana qədər davam edəcək"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Təxminən <xliff:g id="TIME">%1$s</xliff:g> olana qədər davam edəcək (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 1cdd1fd30984..47b536c75c35 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Preostalo je oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Preostalo je oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na osnovu korišćenja"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Preostalo je oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na osnovu korišćenja (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Još <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Trajaće približno do <xliff:g id="TIME">%1$s</xliff:g> na osnovu korišćenja (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Trajaće približno do <xliff:g id="TIME">%1$s</xliff:g> na osnovu korišćenja"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Trajaće približno do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 1a60c3d1a531..ee662fa5af6c 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Зараду (<xliff:g id="LEVEL">%2$s</xliff:g>) хопіць прыблізна на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Зараду пры такім выкарыстанні хопіць прыблізна на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Зараду (<xliff:g id="LEVEL">%2$s</xliff:g>) пры такім выкарыстанні хопіць прыблізна на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Хопіць на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Зараду (<xliff:g id="LEVEL">%2$s</xliff:g>) хопіць прыблізна да <xliff:g id="TIME">%1$s</xliff:g> пры цяперашнім узроўні выкарыстання"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Зараду хопіць прыблізна да <xliff:g id="TIME">%1$s</xliff:g> пры цяперашнім узроўні выкарыстання"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Зараду (<xliff:g id="LEVEL">%2$s</xliff:g>) хопіць прыблізна да <xliff:g id="TIME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index aaedce4bf1a2..4e4ac9bd3d06 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Още около <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Още около <xliff:g id="TIME_REMAINING">%1$s</xliff:g> въз основа на използването"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Още около <xliff:g id="TIME_REMAINING">%1$s</xliff:g> въз основа на използването (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Още <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Следва да издържи приблизително до <xliff:g id="TIME">%1$s</xliff:g> въз основа на използването (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Следва да издържи приблизително до <xliff:g id="TIME">%1$s</xliff:g> въз основа на използването"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Следва да издържи приблизително до <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 4f2913101c38..c7d1c0a61dd9 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"আর আনুমানিক <xliff:g id="TIME_REMAINING">%1$s</xliff:g> চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ব্যবহারের উপর ভিত্তি করে আর আনুমানিক <xliff:g id="TIME_REMAINING">%1$s</xliff:g> চলবে"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ব্যবহারের উপর ভিত্তি করে আর আনুমানিক <xliff:g id="TIME_REMAINING">%1$s</xliff:g> চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"আর <xliff:g id="TIME_REMAINING">%1$s</xliff:g> চলবে"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"বর্তমান ব্যবহার অনুযায়ী আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"বর্তমান ব্যবহার অনুযায়ী আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত চলবে"</string> <string name="power_discharge_by" msgid="6453537733650125582">"আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index 4193d5250570..d5d13d10ffe3 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na osnovu vaše potrošnje"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na osnovu vaše potrošnje (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Još <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Trebala bi trajati otprilike do <xliff:g id="TIME">%1$s</xliff:g> na osnovu vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Trebala bi trajati otprilike do <xliff:g id="TIME">%1$s</xliff:g> na osnovu vaše upotrebe"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Trebala bi trajati do otprilike <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 9c3e4d94cf26..c000a3c1281b 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Temps restant aproximat: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Temps restant: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"La bateria hauria de durar aproximadament fins a les <xliff:g id="TIME">%1$s</xliff:g> segons l\'ús que en fas (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"La bateria hauria de durar aproximadament fins a les <xliff:g id="TIME">%1$s</xliff:g> segons l\'ús que en fas"</string> <string name="power_discharge_by" msgid="6453537733650125582">"La bateria hauria de durar aproximadament fins a les <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index b6507bccce1d..37b7c516ec9d 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Zbývá asi <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Při vašem obvyklém využití zbývá asi <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Při vašem obvyklém využití (<xliff:g id="LEVEL">%2$s</xliff:g>) zbývá asi <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Zbývá <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Při vašem obvyklém využití (<xliff:g id="LEVEL">%2$s</xliff:g>) vydrží asi do <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Při vašem obvyklém využití vydrží asi do <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Vydrží asi do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index a870cf883590..628df26b602e 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Ca. <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Ca. <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage, alt efter hvordan du bruger enheden"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Ca. <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage, alt efter hvordan du bruger enheden (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Bør holde indtil ca. <xliff:g id="TIME">%1$s</xliff:g> baseret på dit forbrug (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Bør holde indtil ca. <xliff:g id="TIME">%1$s</xliff:g> baseret på dit forbrug"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Bør holde indtil ca. <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index bb420a6c4d12..7b63f3420dfb 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, basierend auf deiner Nutzung"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, basierend auf deiner Nutzung (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Noch <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Sollte basierend auf deiner Nutzung etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Sollte basierend auf deiner Nutzung etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Sollte etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 22c1b26dc2fa..7ddd3fc58bf8 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Απομένει/ουν περίπου <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Απομένει/ουν περίπου <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, βάσει της χρήσης σας"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Απομένει/ουν περίπου <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, βάσει της χρήσης σας (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Απομένει/ουν <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου, ανάλογα με τη χρήση σας (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου, ανάλογα με τη χρήση σας"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index d4f4e5e1104a..47f31b436891 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index d4f4e5e1104a..47f31b436891 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index d4f4e5e1104a..47f31b436891 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index d4f4e5e1104a..47f31b436891 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index 98b63eec19dc..bb36101b7cf2 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index e803abdac612..22d4748678ea 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Tiempo restante: aproximadamente <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tiempo restante: aproximadamente <xliff:g id="TIME_REMAINING">%1$s</xliff:g> en función de tu uso"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tiempo restante: aproximadamente <xliff:g id="TIME_REMAINING">%1$s</xliff:g> en función de tu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tiempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Duración aproximada hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Duración aproximada hasta: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index f336f1b465cd..47b1dfa1f5c5 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Tiempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tiempo restante aproximado según tu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tiempo restante aproximado según tu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tiempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Duración aproximada hasta: <xliff:g id="TIME">%1$s</xliff:g> (según el uso)"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 14ac8272432f..1a704e29553b 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Ligikaudu <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäänud (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Teie kasutuse põhjal on jäänud ligikaudu <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Teie kasutuse põhjal on jäänud ligikaudu <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Jäänud on <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Peaks teie kasutuse põhjal kestma kuni <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Peaks teie kasutuse põhjal kestma kuni <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Peaks kestma kuni <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index 04710c7bb0cb..9e1af11ba477 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> inguru gelditzen dira (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Erabilera kontuan izanda, <xliff:g id="TIME_REMAINING">%1$s</xliff:g> inguru gelditzen dira"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Erabilera kontuan izanda, <xliff:g id="TIME_REMAINING">%1$s</xliff:g> inguru gelditzen dira (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> gelditzen dira"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Erabileraren arabera, ordu honetara arte iraungo du, gutxi gorabehera: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Erabileraren arabera, ordu honetara arte iraungo du, gutxi gorabehera: <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Ordu honetara arte iraungo du, gutxi gorabehera: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 8f5509255f51..087a7ff0e835 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"براساس مصرفتان، تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"براساس مصرفتان، تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"با توجه به میزان مصرفتان (<xliff:g id="LEVEL">%2$s</xliff:g>)، باید حدوداً تا <xliff:g id="TIME">%1$s</xliff:g> شارژ داشته باشید"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"باتوجه به میزان مصرفتان، باید حدوداً تا <xliff:g id="TIME">%1$s</xliff:g> شارژ داشته باشید"</string> <string name="power_discharge_by" msgid="6453537733650125582">"باید حدوداً تا <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) شارژ داشته باشید"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 5802a03f1070..ac1f8a5a9738 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Noin <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Noin <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä käyttösi perusteella"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Noin <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä käyttösi perusteella (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Varaus loppuu käyttösi perusteella noin <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Varaus loppuu käyttösi perusteella noin <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Varaus loppuu noin <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index ec8d6b086418..acbc0287fa99 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Il reste environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Il reste environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> en fonction de votre usage"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Il reste environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> en fonction de votre usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Temps restant : <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>, en fonction de votre usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>, en fonction de votre usage"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 0b620d80cbb2..080074aaab9b 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Temps restant : environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Temps restant en fonction de votre utilisation : environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Temps restant en fonction de votre utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>) : environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Temps restant : <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de votre utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de votre utilisation"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index b4d7fcb9270f..26ee53dfbfd1 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Tempo restante aproximado (<xliff:g id="LEVEL">%2$s</xliff:g>): <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tempo restante aproximado en función do uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tempo restante aproximado en función do uso (<xliff:g id="LEVEL">%2$s</xliff:g>): <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"En función do uso, debería durar aproximadamente ata a seguinte hora: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"En función do uso, debería durar aproximadamente ata a seguinte hora: <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Debería durar aproximadamente ata a seguinte hora: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 36e04bb5f2bf..937fc3077d86 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"લગભગ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> બાકી છે (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> બાકી છે"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> બાકી છે (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> બાકી છે"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME">%1$s</xliff:g> સુધી ચાલવી જોઈએ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME">%1$s</xliff:g> સુધી ચાલવી જોઈએ"</string> <string name="power_discharge_by" msgid="6453537733650125582">"લગભગ <xliff:g id="TIME">%1$s</xliff:g> સુધી ચાલવી જોઈએ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 8b1ca93d9acd..0026d3e63c77 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"बैटरी लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> में खत्म हो जाएगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"आपके इस्तेमाल के हिसाब से बैटरी लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> में खत्म हो जाएगी"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"आपके इस्तेमाल के हिसाब से बैटरी लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> में खत्म हो जाएगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> में बैटरी खत्म हो जाएगी"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"आपके इस्तेमाल के हिसाब से बैटरी लगभग <xliff:g id="TIME">%1$s</xliff:g> चलेगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"आपके इस्तेमाल के हिसाब से बैटरी लगभग <xliff:g id="TIME">%1$s</xliff:g> चलेगी"</string> <string name="power_discharge_by" msgid="6453537733650125582">"बैटरी लगभग <xliff:g id="TIME">%1$s</xliff:g> चलेगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index b4cbbdbf3af9..f06d01d3046b 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Još otprilike <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Još otprilike <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na temelju vaše upotrebe"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Još otprilike <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na temelju vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Još <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> na temelju vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> na temelju vaše upotrebe"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 589eb59d4299..92b4e2013ec2 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Körülbelül <xliff:g id="TIME_REMAINING">%1$s</xliff:g> maradt hátra (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Körülbelül <xliff:g id="TIME_REMAINING">%1$s</xliff:g> maradt hátra az eszköz használata alapján"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Körülbelül <xliff:g id="TIME_REMAINING">%1$s</xliff:g> maradt hátra az eszköz használata alapján (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> maradt hátra"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"A használat alapján nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"A használat alapján nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index ba62c84407a9..b5e5cf5d8a98 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Լիցքը (<xliff:g id="LEVEL">%2$s</xliff:g>) կբավարարի մոտ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Լիցքը կբավարարի մոտ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>՝ կախված օգտագործման եղանակից"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Լիցքը (<xliff:g id="LEVEL">%2$s</xliff:g>) կբավարարի մոտ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>՝ կախված օգտագործման եղանակից"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Լիցքը կբավարարի <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Լիցքը (<xliff:g id="LEVEL">%2$s</xliff:g>) պետք է, որ բավականացնի մոտ <xliff:g id="TIME">%1$s</xliff:g>՝ կախված օգտագործման եղանակից"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Լիցքը պետք է, որ բավականացնի մոտ <xliff:g id="TIME">%1$s</xliff:g>՝ կախված օգտագործման եղանակից"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Լիցքը (<xliff:g id="LEVEL">%2$s</xliff:g>) պետք է, որ բավականացնի մոտ <xliff:g id="TIME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index c5d8f30d332f..6bd2876456fa 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Sekitar <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Sekitar <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi berdasarkan penggunaan Anda"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Sekitar <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi berdasarkan penggunaan Anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Akan bertahan kira-kira sampai <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan Anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Akan bertahan kira-kira sampai <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan Anda"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Akan bertahan kira-kira sampai <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index 58505f55e6e5..87006ac3c669 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Um það bil <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Um það bil <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir miðað við notkun þína"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Um það bil <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir miðað við notkun þína (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Ætti að endast til u.þ.b. <xliff:g id="TIME">%1$s</xliff:g> miðað við notkun þína (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Ætti að endast til u.þ.b. <xliff:g id="TIME">%1$s</xliff:g> miðað við notkun þína"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Ætti að endast til u.þ.b. <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 6d863aa2a982..b00badac94b0 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Tempo rimanente: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tempo rimanente in base al tuo utilizzo: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> circa"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tempo rimanente in base al tuo utilizzo (<xliff:g id="LEVEL">%2$s</xliff:g>): <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tempo rimanente: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Tempo stimato rimanente in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Tempo stimato rimanente in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Tempo stimato rimanente: <xliff:g id="TIME">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 89d6361395eb..ae16ecbb28bb 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"הזמן הנותר: בערך <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"הזמן הנותר על סמך השימוש שלך: בערך <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"הזמן הנותר על סמך השימוש שלך: בערך <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"הזמן הנותר: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"אמורה להחזיק מעמד בערך עד <xliff:g id="TIME">%1$s</xliff:g> על סמך השימוש במכשיר (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"אמורה להחזיק מעמד בערך עד <xliff:g id="TIME">%1$s</xliff:g> על סמך השימוש במכשיר"</string> <string name="power_discharge_by" msgid="6453537733650125582">"אמורה להחזיק מעמד בערך עד <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 233e8e80b646..cc7ff1eaabda 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(使用状況に基づく)"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(使用状況に基づく)(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"残り時間: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"電池切れの推定時間: <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"電池切れの推定時間: <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)"</string> <string name="power_discharge_by" msgid="6453537733650125582">"電池切れの推定時間: <xliff:g id="TIME">%1$s</xliff:g>(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 09bea2a0795f..c54fdfd8386d 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"დარჩა დაახლოებით <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"დარჩა დაახლოებით <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, ბატარეის მოხმარების გათვალისწინებით"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"დარჩა დაახლოებით <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, ბატარეის მოხმარების გათვალისწინებით (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"დარჩენილია <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>, ოხმარების გათვალისწინებით (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>, მოხმარების გათვალისწინებით"</string> <string name="power_discharge_by" msgid="6453537733650125582">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 8670ec96012e..e2b40bbd0abb 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Шамамен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> қалды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Пайдалану деректеріңізге сәйкес енді шамамен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> қалды"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Пайдалану деректеріңізге сәйкес енді шамамен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> қалды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> қалды"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Пайдалануға байланысты шамамен <xliff:g id="TIME">%1$s</xliff:g> уақытқа жетеді (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Пайдалануға байланысты шамамен <xliff:g id="TIME">%1$s</xliff:g> уақытқа жетеді"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Шамамен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) уақытқа жетеді"</string> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 6bf8a0f3266f..165483178e36 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"នៅសល់ប្រហែល <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ទៀត (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"នៅសល់ប្រហែល <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ទៀត ផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"នៅសល់ប្រហែល <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ទៀត ផ្អែកលើការប្រើប្រាស់របស់អ្នក (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"នៅសល់ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ទៀត"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"គួរតែអាចប្រើបានរហូតដល់ម៉ោងប្រហែល <xliff:g id="TIME">%1$s</xliff:g> ដោយផ្អែកលើការប្រើប្រាស់របស់អ្នក (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"គួរតែអាចប្រើបានរហូតដល់ម៉ោងប្រហែល <xliff:g id="TIME">%1$s</xliff:g> ដោយផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string> <string name="power_discharge_by" msgid="6453537733650125582">"គួរតែអាចប្រើបានរហូតដល់ម៉ោងប្រហែល <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 1e9a0d51ee67..457a163b776e 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"(<xliff:g id="LEVEL">%2$s</xliff:g>) ತಲುಪಲು <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಸಮಯ ಬಾಕಿ ಉಳಿದಿದೆ"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ ಸುಮಾರು <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಸಮಯ ಬಾಕಿ ಉಳಿದಿದೆ"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ನಿಮ್ಮ ಬಳಕೆಯ (<xliff:g id="LEVEL">%2$s</xliff:g>) ಆಧಾರದ ಮೇಲೆ ಸುಮಾರು <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಉಳಿದಿದೆ"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಉಳಿದಿದೆ"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"ನಿಮ್ಮ ಬಳಕೆ (<xliff:g id="LEVEL">%2$s</xliff:g>) ಆಧರಿಸಿ <xliff:g id="TIME">%1$s</xliff:g> ಸಮಯದವರೆಗೆ ಫೋನ್ ರನ್ ಆಗಬೇಕು"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"ನಿಮ್ಮ ಬಳಕೆ ಆಧರಿಸಿ <xliff:g id="TIME">%1$s</xliff:g> ಸಮಯದವರೆಗೆ ಫೋನ್ ರನ್ ಆಗಬೇಕು"</string> <string name="power_discharge_by" msgid="6453537733650125582">"<xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) ಸಮಯದವರೆಗೆ ಫೋನ್ ರನ್ ಆಗಬೇಕು"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 877866c7c320..d19b9f2dd62f 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"남은 시간 약 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"내 사용량을 기준으로 약 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> 남음"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"내 사용량(<xliff:g id="LEVEL">%2$s</xliff:g>)을 기준으로 약 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> 남음"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"남은 시간: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"사용량(<xliff:g id="LEVEL">%2$s</xliff:g>)을 기준으로 약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"사용량을 기준으로 약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능"</string> <string name="power_discharge_by" msgid="6453537733650125582">"약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 9e4a9a8a1250..9bc6d58a6494 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Болжол менен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> калды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> калды"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> калды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> калды"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) кийин өчөт"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME">%1$s</xliff:g> кийин өчөт"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Болжол менен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) кийин өчөт"</string> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 7e6aaacea44e..5c10aabc7d70 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"ເຫຼືອອີກປະມານ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ເຫຼືອອີກປະມານ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ເຫຼືອອີກປະມານ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"ເຫຼືອອີກ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 71b8cf0ff375..d437bc768b20 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Liko maždaug <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Liko maždaug <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, atsižvelgiant į naudojimą"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Liko maždaug <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, atsižvelgiant į naudojimą (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Liko <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Pagal tai, kaip naudojama, turėtų išsikrauti maždaug po <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Pagal tai, kaip naudojama, turėtų išsikrauti maždaug po <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Turėtų išsikrauti maždaug po <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 82ec0ae5b1cd..afa91274d507 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Aptuvenais atlikušais laiks: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Ņemot vērā lietojumu, atlikušais laiks: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Ņemot vērā lietojumu, atlikušais laiks: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Atlikušais laiks: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Ņemot vērā lietojumu (<xliff:g id="LEVEL">%2$s</xliff:g>), darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g>."</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Ņemot vērā lietojumu, darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index c99ef681b899..ebc4fda5c7c5 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Уште околу <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Уште околу <xliff:g id="TIME_REMAINING">%1$s</xliff:g> според вашето користење"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Уште околу <xliff:g id="TIME_REMAINING">%1$s</xliff:g> според вашето користење (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Уште <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g> според вашето користење (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g> според вашето користење"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index ae97fb24f573..f04bfcc5c677 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"ഏതാണ്ട് <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏതാണ്ട് <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏതാണ്ട് <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> വരെ നീണ്ടുനിൽക്കേണ്ടതാണ് (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> വരെ നീണ്ടുനിൽക്കേണ്ടതാണ്"</string> <string name="power_discharge_by" msgid="6453537733650125582">"ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> വരെ നീണ്ടുനിൽക്കേണ്ടതാണ് (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 10c1415c7630..498b855e0b7d 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Ойролцоогоор <xliff:g id="TIME_REMAINING">%1$s</xliff:g> үлдсэн (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Таны хэрэглээнд үндэслэн ойролцоогоор <xliff:g id="TIME_REMAINING">%1$s</xliff:g> үлдсэн"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Таны хэрэглээнд үндэслэн ойролцоогоор <xliff:g id="TIME_REMAINING">%1$s</xliff:g> үлдсэн (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> үлдсэн"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Таны хэрэглээнд (<xliff:g id="LEVEL">%2$s</xliff:g>) тулгуурлан ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> хүртэл барих ёстой"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Таны хэрэглээнд тулгуурлан ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> хүртэл барих ёстой"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> хүртэл барих ёстой (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 88de8f43b888..7729f2166e9d 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"अंदाजे <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाकी आहे (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"तुमच्या वापरावर आधारित अंदाजे <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाकी आहे"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"तुमच्या वापरावर आधारित अंदाजे <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाकी आहे (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाकी"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"तुमच्या वापरावर अवलंबून सुमारे <xliff:g id="TIME">%1$s</xliff:g> पर्यंत टिकावी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"तुमच्या वापरावर अवलंबून सुमारे <xliff:g id="TIME">%1$s</xliff:g> पर्यंत टिकावी"</string> <string name="power_discharge_by" msgid="6453537733650125582">"सुमारे <xliff:g id="TIME">%1$s</xliff:g> पर्यंत टिकेल (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index e98418d55fb6..236e30d307b2 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Kira-kira <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Kira-kira <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi berdasarkan penggunaan anda"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Kira-kira <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi berdasarkan penggunaan anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan anda"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index ed2aae63f295..88eef5607a67 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ခန့် ကျန်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"သင်၏ အသုံးပြုမှု အပေါ် မူတည်၍ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ခန့် ကျန်သည်"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"သင်၏ အသုံးပြုမှု အပေါ် မူတည်၍ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ခန့် ကျန်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ကျန်သည်"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"သင်၏ အသုံးပြုမှုအပေါ် မူတည်၍ <xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"သင်၏ အသုံးပြုမှုအပေါ် အခြေခံ၍ <xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည်"</string> <string name="power_discharge_by" msgid="6453537733650125582">"<xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 93e53e52f968..259ed34a3ca7 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Omtrent <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Omtrent <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår basert på bruken din"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Omtrent <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår basert på bruken din (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Skal vare til omtrent <xliff:g id="TIME">%1$s</xliff:g>, basert på bruken din (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Skal vare til omtrent <xliff:g id="TIME">%1$s</xliff:g>, basert på bruken din"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Skal vare til omtrent <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index ac15f1b55564..451691b7f538 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाँकी छ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"तपाईंको प्रयोगको आधारमा लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाँकी छ"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"तपाईंको प्रयोगको आधारमा लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाँकी छ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाँकी छ"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"तपाईंको प्रयोगका आधारमा लगभग <xliff:g id="TIME">%1$s</xliff:g> सम्म टिक्नु पर्छ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"तपाईंको प्रयोगका आधारमा लगभग <xliff:g id="TIME">%1$s</xliff:g> सम्म टिक्नु पर्छ"</string> <string name="power_discharge_by" msgid="6453537733650125582">"ब्याट्री लगभग <xliff:g id="TIME">%1$s</xliff:g> सम्म टिक्नु पर्छ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 959c1eac1d7d..00c36decf55f 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> resterend (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> resterend op basis van je gebruik"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> resterend op basis van je gebruik (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> resterend"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Is nog genoeg tot ongeveer <xliff:g id="TIME">%1$s</xliff:g> op basis van je gebruik (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Is nog genoeg tot ongeveer <xliff:g id="TIME">%1$s</xliff:g> op basis van je gebruik"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Is nog genoeg tot ongeveer <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 847586e06cfc..b24b4a29e91c 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"ପାଖାପାଖି <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ପାଇଁ (<xliff:g id="LEVEL">%2$s</xliff:g>) ବଳକା ଅଛି"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ଆପଣଙ୍କ ବ୍ୟବହାରକୁ ଆଧାର କରି ପାଖାପାଖି <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ବଳକା ଅଛି"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ଆପଣଙ୍କର ବ୍ୟବହାରକୁ ଆଧାର କରି (<xliff:g id="LEVEL">%2$s</xliff:g>) ପାଖାପାଖି <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ବଳକା ଅଛି"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ବଳକା ଅଛି"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"ଆପଣଙ୍କର ବ୍ୟବହାରକୁ ଆଧାର କରି ବ୍ୟାଟେରୀ <xliff:g id="TIME">%1$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ ଚାଲିବ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"ଆପଣଙ୍କର ବ୍ୟବହାରକୁ ଆଧାର କରି ବ୍ୟାଟେରୀ <xliff:g id="TIME">%1$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ ଚାଲିବ"</string> <string name="power_discharge_by" msgid="6453537733650125582">"ବ୍ୟାଟେରୀ ପାଖାପାଖି <xliff:g id="TIME">%1$s</xliff:g> ଚାଲିବ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 0675b6be525e..21a7ab9b27ce 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"ਲਗਭਗ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਬਾਕੀ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਬਾਕੀ"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਬਾਕੀ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਬਾਕੀ"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਚੱਲੇਗਾ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਚੱਲੇਗਾ"</string> <string name="power_discharge_by" msgid="6453537733650125582">"ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਚੱਲੇਗਾ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 505e3959244d..e053514b18ce 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Jeszcze około <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Jeszcze około <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (na podstawie Twojego sposobu korzystania)"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Jeszcze około <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) (na podstawie Twojego sposobu korzystania)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Jeszcze <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Na podstawie Twojego sposobu korzystania (<xliff:g id="LEVEL">%2$s</xliff:g>) jeszcze około <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Na podstawie Twojego sposobu korzystania jeszcze około <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Powinno wystarczyć do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index c0f31a6a5f73..46b2f937c16d 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Tempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tempo restante aproximado, com base no seu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tempo restante aproximado, com base no seu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 08c3cc82c259..dd7861d5dabc 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Resta(m) cerca de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Resta(m) cerca de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> com base na sua utilização"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Resta(m) cerca de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> com base na sua utilização (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Resta(m) <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g> com base na sua utilização (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g> com base na sua utilização."</string> <string name="power_discharge_by" msgid="6453537733650125582">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index c0f31a6a5f73..46b2f937c16d 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Tempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tempo restante aproximado, com base no seu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tempo restante aproximado, com base no seu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 015eb9240fc5..3364ce5a6d3b 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Timp aproximativ rămas: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"În baza utilizării, timpul rămas este de aproximativ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"În baza utilizării, timpul rămas este de aproximativ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Timp rămas: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"În baza utilizării, ar trebui să reziste până la aproximativ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"În baza utilizării, ar trebui să reziste până la aproximativ <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Ar trebui să reziste până la <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index b0b592caf6c7..ffd477db821a 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Заряда (<xliff:g id="LEVEL">%2$s</xliff:g>) хватит примерно на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Заряда хватит примерно на <xliff:g id="TIME_REMAINING">%1$s</xliff:g> при текущем уровне расхода"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Заряда (<xliff:g id="LEVEL">%2$s</xliff:g>) хватит примерно на <xliff:g id="TIME_REMAINING">%1$s</xliff:g> при текущем уровне расхода"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Заряда хватит на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"При текущем уровне использования (<xliff:g id="LEVEL">%2$s</xliff:g>) заряда хватит примерно до <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"При текущем уровне использования заряда хватит примерно до <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Заряда (<xliff:g id="LEVEL">%2$s</xliff:g>) хватит примерно до <xliff:g id="TIME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index ca7a96227d99..f3372b3c1ed2 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ක් පමණ ඉතිරියි (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ඔබේ භාවිතය මත පදනම්ව <xliff:g id="TIME_REMAINING">%1$s</xliff:g> පමණ ඉතිරිව ඇත"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ඔබේ භාවිතය මත පදනම්ව <xliff:g id="TIME_REMAINING">%1$s</xliff:g> පමණ ඉතිරිව ඇත (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ඉතිරිව ඇත"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"<xliff:g id="TIME">%1$s</xliff:g> පමණ වන තෙක් (<xliff:g id="LEVEL">%2$s</xliff:g>) ඔබේ භාවිතය මත පදනම්ව තිබිය යුුතුය"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"ඔබේ භාවිතය මත පදනම්ව <xliff:g id="TIME">%1$s</xliff:g> පමන වන තෙක් තිබිය යුතුය"</string> <string name="power_discharge_by" msgid="6453537733650125582">"<xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) පමණ වන තෙක් තිබිය යුතුය"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index dd7efdd50a59..5451a0be6729 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Zostáva približne <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Zostáva približne <xliff:g id="TIME_REMAINING">%1$s</xliff:g> – závisí to od intenzity využitia"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Zostáva približne <xliff:g id="TIME_REMAINING">%1$s</xliff:g> – závisí to od intenzity využitia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Zostáva <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Mal by vydržať približne do <xliff:g id="TIME">%1$s</xliff:g> v závislosti od využitia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Mal by vydržať približne do <xliff:g id="TIME">%1$s</xliff:g> v závislosti od využitia"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Mal by vydržať približne <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index fada686f00d1..57265ca31514 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Še približno <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Glede na način uporabe še približno <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Glede na način uporabe še približno <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Še <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Naprava bi morala glede na način uporabe (<xliff:g id="LEVEL">%2$s</xliff:g>) delovati do približno <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Naprava bi morala glede na način uporabe delovati do približno <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Naprava bi morala delovati do približno <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 2132767193c5..231cc1e900fa 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Rreth <xliff:g id="TIME_REMAINING">%1$s</xliff:g> të mbetura (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Rreth <xliff:g id="TIME_REMAINING">%1$s</xliff:g> të mbetura bazuar në përdorimin tënd"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Rreth <xliff:g id="TIME_REMAINING">%1$s</xliff:g> të mbetura bazuar në përdorimin tënd (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> të mbetura"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g> bazuar në përdorimin tënd (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g> bazuar në përdorimin tënd"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 6cf4b208c544..42900f71b2f0 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Преостало је око <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Преостало је око <xliff:g id="TIME_REMAINING">%1$s</xliff:g> на основу коришћења"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Преостало је око <xliff:g id="TIME_REMAINING">%1$s</xliff:g> на основу коришћења (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Још <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Трајаће приближно до <xliff:g id="TIME">%1$s</xliff:g> на основу коришћења (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Трајаће приближно до <xliff:g id="TIME">%1$s</xliff:g> на основу коришћења"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Трајаће приближно до <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index f2950dcf2808..cc5b76bbebcd 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Cirka <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kvar (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Cirka <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kvar utifrån din användning"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Cirka <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kvar utifrån din användning (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> kvar"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Bör räcka ungefär till klockan <xliff:g id="TIME">%1$s</xliff:g> utifrån din användning (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Bör räcka ungefär till klockan <xliff:g id="TIME">%1$s</xliff:g> utifrån din användning"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Bör räcka ungefär till klockan <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index d8a74a14c40f..ebe15016d4ab 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Zimesalia takribani <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Zimesalia takribani <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kulingana na jinsi unavyoitumia"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Zimesalia takribani <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kulingana na jinsi unavyoitumia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Zimesalia <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Inapaswa kudumu kwa takribani <xliff:g id="TIME">%1$s</xliff:g> kulingana na jinsi unavyoitumia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Inapaswa kudumu hadi <xliff:g id="TIME">%1$s</xliff:g> kulingana na jinsi unavyoitumia"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Inapaswa kudumu kwa takribani <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 3cf43c844354..951bf99adca4 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"கிட்டத்தட்ட <xliff:g id="TIME_REMAINING">%1$s</xliff:g> மீதமுள்ளது (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"உபயோகத்தின் அடிப்படையில் கிட்டத்தட்ட <xliff:g id="TIME_REMAINING">%1$s</xliff:g> மீதமுள்ளது"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"உபயோகத்தின் அடிப்படையில் கிட்டத்தட்ட <xliff:g id="TIME_REMAINING">%1$s</xliff:g> மீதமுள்ளது (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> மீதமுள்ளது"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"நீங்கள் பயன்படுத்துவதன் அடிப்படையில், <xliff:g id="TIME">%1$s</xliff:g> வரை உபயோகிக்க முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"நீங்கள் பயன்படுத்துவதன் அடிப்படையில் <xliff:g id="TIME">%1$s</xliff:g> வரை உபயோகிக்க முடியும்"</string> <string name="power_discharge_by" msgid="6453537733650125582">"<xliff:g id="TIME">%1$s</xliff:g> வரை பயன்படுத்த முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index e4dd85f8d248..f7b98d1d46cd 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"దాదాపు <xliff:g id="TIME_REMAINING">%1$s</xliff:g> సమయం మిగిలి ఉంది (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"మీ వినియోగం ఆధారంగా దాదాపు <xliff:g id="TIME_REMAINING">%1$s</xliff:g> సమయం మిగిలి ఉంది"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"మీ వినియోగం ఆధారంగా దాదాపు <xliff:g id="TIME_REMAINING">%1$s</xliff:g> సమయం మిగిలి ఉంది (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> మిగిలి ఉంది"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"మీ వినియోగం ఆధారంగా <xliff:g id="TIME">%1$s</xliff:g> వరకు ఉండాలి (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"మీ వినియోగం ఆధారంగా దాదాపు <xliff:g id="TIME">%1$s</xliff:g> వరకు ఉండాలి"</string> <string name="power_discharge_by" msgid="6453537733650125582">"దాదాపు <xliff:g id="TIME">%1$s</xliff:g> వరకు ఉండాలి (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index cf8362fe4d37..7d161bb7dee4 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"เหลืออีกประมาณ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"เหลืออีกประมาณ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"เหลืออีกประมาณ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"เหลืออีก <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"น่าจะใช้งานได้ถึงเวลาประมาณ <xliff:g id="TIME">%1$s</xliff:g> เมื่อดูจากการใช้งานของคุณ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"น่าจะใช้งานได้ถึงเวลาประมาณ <xliff:g id="TIME">%1$s</xliff:g> เมื่อดูจากการใช้งานของคุณ"</string> <string name="power_discharge_by" msgid="6453537733650125582">"น่าจะใช้งานได้ถึงเวลาประมาณ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index e690800eb9a7..e9a2a6f9728f 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Humigit-kumulang <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ang natitira (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Humigit-kumulang <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ang natitira batay sa iyong paggamit"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Humigit-kumulang <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ang natitira batay sa iyong paggamit (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ang natitira"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Tatagal dapat nang hanggang humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> batay sa iyong paggamit (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Tatagal dapat nang hanggang humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> batay sa iyong paggamit"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Tatagal dapat nang hanggang humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index ea340e8e92e6..73f1c40e3b6a 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Yaklaşık <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Kullanımınıza dayalı olarak yaklaşık <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Kullanımınıza dayalı olarak yaklaşık <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Kullanımınıza göre saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Kullanımınıza göre saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index cf90ed16efaf..41d68838cb09 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Залишилося приблизно <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Згідно з даними про використання залишилося приблизно <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Згідно з даними про використання залишилося приблизно <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Залишилося <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"На основі даних про використання (<xliff:g id="LEVEL">%2$s</xliff:g>), вистачить приблизно до <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"На основі даних про використання, вистачить приблизно до <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Вистачить приблизно до <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index c22362927e31..0478a76dc4e2 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی ہے (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی ہے"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی ہے (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی ہے"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">%1$s</xliff:g> تک بیٹری چلے گی (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">%1$s</xliff:g> تک بیٹری چلے گی"</string> <string name="power_discharge_by" msgid="6453537733650125582">"تقریباً <xliff:g id="TIME">%1$s</xliff:g> تک بیٹری چلے گی (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 2851bafd4639..d4eb44bb9a79 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Taxminan <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qoldi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Joriy holatda taxminan <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qoldi"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Joriy holatda taxminan <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qoldi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> qoldi"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Joriy holatda taxminan <xliff:g id="TIME">%1$s</xliff:g> gacha davom etadi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Joriy holatda taxminan <xliff:g id="TIME">%1$s</xliff:g> gacha davom etadi"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Taxminan <xliff:g id="TIME">%1$s</xliff:g> gacha davom etadi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 3fb101e6deec..050ee9cdcbd6 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Còn khoảng <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Còn khoảng <xliff:g id="TIME_REMAINING">%1$s</xliff:g> dựa trên mức sử dụng của bạn"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Còn khoảng <xliff:g id="TIME_REMAINING">%1$s</xliff:g> dựa trên mức sử dụng của bạn (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Còn <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 0a318d752ae7..e25e4dcf38c3 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"大约还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"根据您的使用情况,大约还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"根据您的使用情况,大约还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"根据您的使用情况,估计能用到<xliff:g id="TIME">%1$s</xliff:g>(目前电量为 <xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"根据您的使用情况,估计能用到<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"目前电量为 <xliff:g id="LEVEL">%2$s</xliff:g>,估计能用到<xliff:g id="TIME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 06bee941ff0c..3e357b1ce450 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"還有大約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"根據您的使用情況,還有大約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"根據您的使用情況,還有大約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"還有 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"根據您的使用情況 (<xliff:g id="LEVEL">%2$s</xliff:g>),電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"根據您的使用情況,電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index a5074d9db005..60330eff4a10 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"目前電量為 <xliff:g id="LEVEL">%2$s</xliff:g>,還能使用約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"根據你的使用情形,還能使用約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"根據你的使用情形,目前電量為 <xliff:g id="LEVEL">%2$s</xliff:g>,還能使用約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"還能使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"根據你的使用情形,目前電量為 <xliff:g id="LEVEL">%2$s</xliff:g>,預估可持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"根據你的使用情形,預估可持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by" msgid="6453537733650125582">"目前電量 <xliff:g id="LEVEL">%2$s</xliff:g>,預估還能持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 589209399839..a1be06c94d9f 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -377,7 +377,8 @@ <string name="power_discharging_duration" msgid="8848256785736335185">"Cishe u-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> osele (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Cishe u-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> osele ngokususelwe ekusebenziseni wakho"</string> <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Cishe u-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> osele ngokususelwe ekusebenziseni kwakho (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> esele"</string> + <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> + <skip /> <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Kumele ihlale cishe kube ngu-<xliff:g id="TIME">%1$s</xliff:g> kusukela ekusetshenzisweni kwakho (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Kumele ihlale cishe kube ngu-<xliff:g id="TIME">%1$s</xliff:g> kusukela ekusetshenzisweni kwakho"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Kumele ihlale cishe kube ngu-<xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index f4c7275a828a..c60e8c321ec5 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -950,6 +950,8 @@ <string name="power_discharge_by_only">Should last until about <xliff:g id="time">%1$s</xliff:g></string> <!-- [CHAR_LIMIT=100] Label for estimated time that phone will run out of battery --> <string name="power_discharge_by_only_short">Until <xliff:g id="time" example="12 PM">%1$s</xliff:g></string> + <!-- [CHAR_LIMIT=100] Extend the battery life past a certain time --> + <string name="power_suggestion_extend_battery">Extend battery life past <xliff:g id="time" example="12 PM">%1$s</xliff:g></string> <!-- [CHAR_LIMIT=60] label for estimated remaining duration of battery when under a certain amount --> <string name="power_remaining_less_than_duration_only">Less than <xliff:g id="threshold">%1$s</xliff:g> remaining</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java index bed303078805..785dd561d1b7 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java @@ -108,12 +108,43 @@ public class A2dpProfile implements LocalBluetoothProfile { return true; } + /** + * Get A2dp devices matching connection states{ + * @code BluetoothProfile.STATE_CONNECTED, + * @code BluetoothProfile.STATE_CONNECTING, + * @code BluetoothProfile.STATE_DISCONNECTING} + * + * @return Matching device list + */ public List<BluetoothDevice> getConnectedDevices() { - if (mService == null) return new ArrayList<BluetoothDevice>(0); - return mService.getDevicesMatchingConnectionStates( - new int[] {BluetoothProfile.STATE_CONNECTED, - BluetoothProfile.STATE_CONNECTING, - BluetoothProfile.STATE_DISCONNECTING}); + return getDevicesByStates(new int[] { + BluetoothProfile.STATE_CONNECTED, + BluetoothProfile.STATE_CONNECTING, + BluetoothProfile.STATE_DISCONNECTING}); + } + + /** + * Get A2dp devices matching connection states{ + * @code BluetoothProfile.STATE_DISCONNECTED, + * @code BluetoothProfile.STATE_CONNECTED, + * @code BluetoothProfile.STATE_CONNECTING, + * @code BluetoothProfile.STATE_DISCONNECTING} + * + * @return Matching device list + */ + public List<BluetoothDevice> getConnectableDevices() { + return getDevicesByStates(new int[] { + BluetoothProfile.STATE_DISCONNECTED, + BluetoothProfile.STATE_CONNECTED, + BluetoothProfile.STATE_CONNECTING, + BluetoothProfile.STATE_DISCONNECTING}); + } + + private List<BluetoothDevice> getDevicesByStates(int[] states) { + if (mService == null) { + return new ArrayList<BluetoothDevice>(0); + } + return mService.getDevicesMatchingConnectionStates(states); } public boolean connect(BluetoothDevice device) { diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java index 41c1d60ca551..ebaeb742b198 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java @@ -106,12 +106,43 @@ public class HearingAidProfile implements LocalBluetoothProfile { return true; } + /** + * Get Hearing Aid devices matching connection states{ + * @code BluetoothProfile.STATE_CONNECTED, + * @code BluetoothProfile.STATE_CONNECTING, + * @code BluetoothProfile.STATE_DISCONNECTING} + * + * @return Matching device list + */ public List<BluetoothDevice> getConnectedDevices() { - if (mService == null) return new ArrayList<BluetoothDevice>(0); - return mService.getDevicesMatchingConnectionStates( - new int[] {BluetoothProfile.STATE_CONNECTED, - BluetoothProfile.STATE_CONNECTING, - BluetoothProfile.STATE_DISCONNECTING}); + return getDevicesByStates(new int[] { + BluetoothProfile.STATE_CONNECTED, + BluetoothProfile.STATE_CONNECTING, + BluetoothProfile.STATE_DISCONNECTING}); + } + + /** + * Get Hearing Aid devices matching connection states{ + * @code BluetoothProfile.STATE_DISCONNECTED, + * @code BluetoothProfile.STATE_CONNECTED, + * @code BluetoothProfile.STATE_CONNECTING, + * @code BluetoothProfile.STATE_DISCONNECTING} + * + * @return Matching device list + */ + public List<BluetoothDevice> getConnectableDevices() { + return getDevicesByStates(new int[] { + BluetoothProfile.STATE_DISCONNECTED, + BluetoothProfile.STATE_CONNECTED, + BluetoothProfile.STATE_CONNECTING, + BluetoothProfile.STATE_DISCONNECTING}); + } + + private List<BluetoothDevice> getDevicesByStates(int[] states) { + if (mService == null) { + return new ArrayList<BluetoothDevice>(0); + } + return mService.getDevicesMatchingConnectionStates(states); } public boolean connect(BluetoothDevice device) { diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java index 52d7e2cedeb7..5600dd279b95 100644 --- a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java +++ b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java @@ -101,7 +101,29 @@ public class PowerUtil { if (drainTimeMs <= ONE_DAY_MILLIS) { return getRegularTimeRemainingShortString(context, drainTimeMs); } else { - return getMoreThanOneDayShortString(context, drainTimeMs); + return getMoreThanOneDayShortString(context, drainTimeMs, + R.string.power_remaining_duration_only_short); + } + } + + /** + * This method produces the text used in Settings battery tip to describe the effect after + * use the tip. + * + * @param context + * @param drainTimeMs The estimated time remaining before the phone dies in milliseconds. + * @return a properly formatted and localized string + */ + public static String getBatteryTipStringFormatted(Context context, long drainTimeMs) { + if (drainTimeMs <= 0) { + return null; + } + if (drainTimeMs <= ONE_DAY_MILLIS) { + return context.getString(R.string.power_suggestion_extend_battery, + getDateTimeStringFromMs(context, drainTimeMs)); + } else { + return getMoreThanOneDayShortString(context, drainTimeMs, + R.string.power_remaining_only_more_than_subtext); } } @@ -144,12 +166,13 @@ public class PowerUtil { } } - private static String getMoreThanOneDayShortString(Context context, long drainTimeMs) { + private static String getMoreThanOneDayShortString(Context context, long drainTimeMs, + int resId) { final long roundedTimeMs = roundTimeToNearestThreshold(drainTimeMs, ONE_HOUR_MILLIS); CharSequence timeString = StringUtil.formatElapsedTime(context, roundedTimeMs, false /* withSeconds */); - return context.getString(R.string.power_remaining_duration_only_short, timeString); + return context.getString(resId, timeString); } private static String getMoreThanTwoDaysString(Context context, String percentageString) { @@ -169,17 +192,8 @@ public class PowerUtil { private static String getRegularTimeRemainingString(Context context, long drainTimeMs, String percentageString, boolean basedOnUsage) { - // Get the time of day we think device will die rounded to the nearest 15 min. - final long roundedTimeOfDayMs = - roundTimeToNearestThreshold( - System.currentTimeMillis() + drainTimeMs, - FIFTEEN_MINUTES_MILLIS); - // convert the time to a properly formatted string. - String skeleton = android.text.format.DateFormat.getTimeFormatString(context); - DateFormat fmt = DateFormat.getInstanceForSkeleton(skeleton); - Date date = Date.from(Instant.ofEpochMilli(roundedTimeOfDayMs)); - CharSequence timeString = fmt.format(date); + CharSequence timeString = getDateTimeStringFromMs(context, drainTimeMs); if (TextUtils.isEmpty(percentageString)) { int id = basedOnUsage @@ -194,6 +208,20 @@ public class PowerUtil { } } + private static CharSequence getDateTimeStringFromMs(Context context, long drainTimeMs) { + // Get the time of day we think device will die rounded to the nearest 15 min. + final long roundedTimeOfDayMs = + roundTimeToNearestThreshold( + System.currentTimeMillis() + drainTimeMs, + FIFTEEN_MINUTES_MILLIS); + + // convert the time to a properly formatted string. + String skeleton = android.text.format.DateFormat.getTimeFormatString(context); + DateFormat fmt = DateFormat.getInstanceForSkeleton(skeleton); + Date date = Date.from(Instant.ofEpochMilli(roundedTimeOfDayMs)); + return fmt.format(date); + } + private static String getRegularTimeRemainingShortString(Context context, long drainTimeMs) { // Get the time remaining rounded to the nearest 15 min final long roundedTimeMs = roundTimeToNearestThreshold(drainTimeMs, FIFTEEN_MINUTES_MILLIS); @@ -231,4 +259,4 @@ public class PowerUtil { return time - remainder + multiple; } } -} +}
\ No newline at end of file diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java index 7ef31df6ab26..61fdbd54ead1 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java @@ -42,6 +42,7 @@ public class PowerUtilTest { private static final long THIRTY_HOURS_MILLIS = Duration.ofHours(30).toMillis(); private static final String NORMAL_CASE_EXPECTED_PREFIX = "Should last until about"; private static final String ENHANCED_SUFFIX = " based on your usage"; + private static final String EXTEND_PREFIX = "Extend battery life past"; // matches a time (ex: '1:15 PM', '2 AM', '23:00') private static final String TIME_OF_DAY_REGEX = " (\\d)+:?(\\d)* ((AM)*)|((PM)*)"; // matches a percentage with parenthesis (ex: '(10%)') @@ -176,6 +177,24 @@ public class PowerUtilTest { } @Test + public void getBatteryTipStringFormatted_moreThanOneDay_usesCorrectString() { + String info = PowerUtil.getBatteryTipStringFormatted(mContext, + THREE_DAYS_MILLIS); + + assertThat(info).isEqualTo("More than 3 days remaining"); + } + + @Test + public void getBatteryTipStringFormatted_lessThanOneDay_usesCorrectString() { + String info = PowerUtil.getBatteryTipStringFormatted(mContext, + SEVENTEEN_MIN_MILLIS); + + // ex: Extend battery life past 1:15 PM + assertThat(info).containsMatch(Pattern.compile( + EXTEND_PREFIX + TIME_OF_DAY_REGEX)); + } + + @Test public void testRoundToNearestThreshold_roundsCorrectly() { // test some pretty normal values assertThat(PowerUtil.roundTimeToNearestThreshold(1200, 1000)).isEqualTo(1000); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 2d5606cf4b97..a33f9a8709d9 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -1919,6 +1919,36 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Secure.ENHANCED_VOICE_PRIVACY_ENABLED, SecureSettingsProto.ENHANCED_VOICE_PRIVACY_ENABLED); + + final long gestureToken = p.start(SecureSettingsProto.GESTURE); + dumpSetting(s, p, + Settings.Secure.AWARE_ENABLED, + SecureSettingsProto.Gesture.AWARE_ENABLED); + + dumpSetting(s, p, + Settings.Secure.SILENCE_ALARMS_GESTURE_COUNT, + SecureSettingsProto.Gesture.SILENCE_ALARMS_COUNT); + dumpSetting(s, p, + Settings.Secure.SILENCE_CALL_GESTURE_COUNT, + SecureSettingsProto.Gesture.SILENCE_CALLS_COUNT); + dumpSetting(s, p, + Settings.Secure.SILENCE_GESTURE, + SecureSettingsProto.Gesture.SILENCE_ENABLED); + dumpSetting(s, p, + Settings.Secure.SILENCE_NOTIFICATION_GESTURE_COUNT, + SecureSettingsProto.Gesture.SILENCE_NOTIFICATION_COUNT); + dumpSetting(s, p, + Settings.Secure.SILENCE_TIMER_GESTURE_COUNT, + SecureSettingsProto.Gesture.SILENCE_TIMER_COUNT); + + dumpSetting(s, p, + Settings.Secure.SKIP_GESTURE_COUNT, + SecureSettingsProto.Gesture.SKIP_COUNT); + dumpSetting(s, p, + Settings.Secure.SKIP_GESTURE, + SecureSettingsProto.Gesture.SKIP_ENABLED); + p.end(gestureToken); + dumpSetting(s, p, Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS, SecureSettingsProto.IMMERSIVE_MODE_CONFIRMATIONS); @@ -2284,6 +2314,9 @@ class SettingsProtoDumpUtil { Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, SecureSettingsProto.SYSTEM_NAVIGATION_KEYS_ENABLED); dumpSetting(s, p, + Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES, + SecureSettingsProto.THEME_CUSTOMIZATION_OVERLAY_PACKAGES); + dumpSetting(s, p, Settings.Secure.TRUST_AGENTS_INITIALIZED, SecureSettingsProto.TRUST_AGENTS_INITIALIZED); @@ -2401,22 +2434,6 @@ class SettingsProtoDumpUtil { SecureSettingsProto.Zen.SETTINGS_SUGGESTION_VIEWED); p.end(zenToken); - dumpSetting(s, p, - Settings.Secure.SKIP_GESTURE, - SecureSettingsProto.SKIP_GESTURE_ENABLED); - - dumpSetting(s, p, - Settings.Secure.SILENCE_GESTURE, - SecureSettingsProto.SILENCE_GESTURE_ENABLED); - - dumpSetting(s, p, - Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES, - SecureSettingsProto.THEME_CUSTOMIZATION_OVERLAY_PACKAGES); - - dumpSetting(s, p, - Settings.Secure.AWARE_ENABLED, - SecureSettingsProto.AWARE_ENABLED); - // Please insert new settings using the same order as in SecureSettingsProto. p.end(token); diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 9d6fc9ed85c2..6df6c7355e3b 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -135,6 +135,7 @@ <uses-permission android:name="android.permission.MANAGE_BIOMETRIC" /> <uses-permission android:name="android.permission.MANAGE_SLICE_PERMISSIONS" /> <uses-permission android:name="android.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS" /> + <uses-permission android:name="android.permission.GET_RUNTIME_PERMISSIONS" /> <!-- Needed for WallpaperManager.clear in ImageWallpaper.updateWallpaperLocked --> <uses-permission android:name="android.permission.SET_WALLPAPER"/> diff --git a/packages/SystemUI/res-keyguard/layout/type_clock.xml b/packages/SystemUI/res-keyguard/layout/type_aod_clock.xml index 89bbc09132bd..28ff5a253317 100644 --- a/packages/SystemUI/res-keyguard/layout/type_clock.xml +++ b/packages/SystemUI/res-keyguard/layout/type_aod_clock.xml @@ -19,13 +19,5 @@ android:layout_width="match_parent" android:layout_height="match_parent" > - <com.android.keyguard.clock.TypographicClock - android:id="@+id/type_clock" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingStart="50dp" - android:textAlignment="viewStart" - style="@style/widget_big" - android:textSize="40dp" - /> + <include layout="@layout/typographic_clock" /> </com.android.keyguard.clock.ClockLayout> diff --git a/packages/SystemUI/res-keyguard/layout/typographic_clock.xml b/packages/SystemUI/res-keyguard/layout/typographic_clock.xml new file mode 100644 index 000000000000..73bb4b9a0fc9 --- /dev/null +++ b/packages/SystemUI/res-keyguard/layout/typographic_clock.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. + --> +<com.android.keyguard.clock.TypographicClock + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/type_clock" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingStart="50dp" + android:textAlignment="viewStart" + style="@style/widget_big" + android:textSize="40dp" + /> diff --git a/packages/SystemUI/res/drawable/ic_media_projection_permission.xml b/packages/SystemUI/res/drawable/ic_media_projection_permission.xml new file mode 100644 index 000000000000..f46d137c1259 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_media_projection_permission.xml @@ -0,0 +1,26 @@ +<!-- +Copyright (C) 2019 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. +--> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:insetLeft="2.5dp" + android:insetRight="2.5dp"> + <vector android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path android:fillColor="#FF000000" android:pathData="M1,18v3h3C4,19.34 2.66,18 1,18zM1,14v2c2.76,0 5,2.24 5,5h2C8,17.13 4.87,14 1,14zM1,10v2c4.97,0 9,4.03 9,9h2C12,14.92 7.07,10 1,10zM21,3H3C1.9,3 1,3.9 1,5v3h2V5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2V5C23,3.9 22.1,3 21,3z"/> + <path android:fillColor="#FF0000" android:pathData="M19,7H5v1.63c3.96,1.28 7.09,4.41 8.37,8.37H19V7z"/> + </vector> +</inset> diff --git a/packages/SystemUI/res/layout/global_actions_grid_item.xml b/packages/SystemUI/res/layout/global_actions_grid_item.xml index 5dee09dac947..999c7b8c34b3 100644 --- a/packages/SystemUI/res/layout/global_actions_grid_item.xml +++ b/packages/SystemUI/res/layout/global_actions_grid_item.xml @@ -35,7 +35,7 @@ android:layout_marginBottom="@dimen/global_actions_grid_item_icon_bottom_margin" android:layout_marginLeft="@dimen/global_actions_grid_item_icon_side_margin" android:layout_marginRight="@dimen/global_actions_grid_item_icon_side_margin" - android:scaleType="center" + android:scaleType="centerInside" android:alpha="?android:attr/primaryContentAlpha" /> diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml index d4957c903a49..adc0b417dea3 100644 --- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml +++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml @@ -83,7 +83,7 @@ android:layout_height="@dimen/keyguard_lock_height" android:layout_gravity="bottom|center_horizontal" android:layout_marginBottom="@dimen/keyguard_lock_padding" - android:src="@*android:drawable/ic_lock_24dp" + android:src="@*android:drawable/ic_lock" android:contentDescription="@string/accessibility_unlock_button" android:scaleType="center" /> diff --git a/packages/SystemUI/res/values-sw392dp-land/dimens.xml b/packages/SystemUI/res/values-sw392dp-land/dimens.xml new file mode 100644 index 000000000000..c718614d3958 --- /dev/null +++ b/packages/SystemUI/res/values-sw392dp-land/dimens.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2019 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 + --> +<resources> + + <!-- Global actions grid --> + <dimen name="global_actions_grid_vertical_padding">3dp</dimen> + <dimen name="global_actions_grid_horizontal_padding">0dp</dimen> + + <dimen name="global_actions_grid_item_side_margin">6dp</dimen> + <dimen name="global_actions_grid_item_vertical_margin">10dp</dimen> + +</resources> + diff --git a/packages/SystemUI/res/values-sw392dp/dimens.xml b/packages/SystemUI/res/values-sw392dp/dimens.xml new file mode 100644 index 000000000000..6fa6692c4d90 --- /dev/null +++ b/packages/SystemUI/res/values-sw392dp/dimens.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2019 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 + --> +<resources> + <!-- Global actions grid --> + <dimen name="global_actions_grid_container_bottom_margin">4dp</dimen> + + <dimen name="global_actions_grid_vertical_padding">0dp</dimen> + <dimen name="global_actions_grid_horizontal_padding">3dp</dimen> + + <dimen name="global_actions_grid_item_side_margin">10dp</dimen> + <dimen name="global_actions_grid_item_vertical_margin">6dp</dimen> + <dimen name="global_actions_grid_item_width">72dp</dimen> + <dimen name="global_actions_grid_item_height">72dp</dimen> + + <dimen name="global_actions_grid_item_icon_width">22dp</dimen> + <dimen name="global_actions_grid_item_icon_height">22dp</dimen> + <dimen name="global_actions_grid_item_icon_top_margin">12dp</dimen> + <dimen name="global_actions_grid_item_icon_side_margin">22dp</dimen> + <dimen name="global_actions_grid_item_icon_bottom_margin">4dp</dimen> + +</resources> + diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 121cdd807edd..33e19745653a 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -40,6 +40,9 @@ <!-- Whether or not we show the number in the bar. --> <bool name="config_statusBarShowNumber">false</bool> + <!-- If the lock screen should be dismissed after biometric auth. --> + <bool name="config_faceAuthDismissesKeyguard">false</bool> + <!-- Vibrator pattern for camera gesture launch. --> <integer-array translatable="false" name="config_cameraLaunchGestureVibePattern"> <item>0</item> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 445744036972..f54f7163d9da 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -677,9 +677,9 @@ <dimen name="keyguard_affordance_width">56dp</dimen> <!-- The width/height of the unlock icon view on keyguard. --> - <dimen name="keyguard_lock_height">32dp</dimen> - <dimen name="keyguard_lock_width">32dp</dimen> - <dimen name="keyguard_lock_padding">24dp</dimen> + <dimen name="keyguard_lock_height">42dp</dimen> + <dimen name="keyguard_lock_width">42dp</dimen> + <dimen name="keyguard_lock_padding">19dp</dimen> <dimen name="keyguard_indication_margin_bottom">65dp</dimen> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java index 10996e884fb5..794c30a7c7c1 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java @@ -217,4 +217,11 @@ public class WindowManagerWrapper { WindowManagerGlobal.getWindowManagerService().registerPinnedStackListener( DEFAULT_DISPLAY, mPinnedStackListenerForwarder); } + + /** + * Removes a pinned stack listener. + */ + public void removePinnedStackListener(IPinnedStackListener listener) { + mPinnedStackListenerForwarder.removeListener(listener); + } } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java index 4d8cf963ff50..59ee2679ca3d 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java @@ -76,8 +76,10 @@ public class ClockLayout extends FrameLayout { protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); - final float offsetX = getBurnInOffset(mBurnInPreventionOffsetX, true); - final float offsetY = getBurnInOffset(mBurnInPreventionOffsetY, false); + final float offsetX = getBurnInOffset(mBurnInPreventionOffsetX * 2, true) + - mBurnInPreventionOffsetX; + final float offsetY = getBurnInOffset(mBurnInPreventionOffsetY * 2, false) + - mBurnInPreventionOffsetY; // Put digital clock in two left corner of the screen. if (mDigitalClock != null) { diff --git a/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java index 69f86c7886d3..387f2656c6f8 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java @@ -51,7 +51,7 @@ public class TypeClockController implements ClockPlugin { /** * Small clock shown on lock screen above stack scroller. */ - private View mLockClockContainer; + private TypographicClock mLockClock; /** * Controller for transition into dark state. @@ -69,13 +69,15 @@ public class TypeClockController implements ClockPlugin { } private void createViews() { - mView = mLayoutInflater.inflate(R.layout.type_clock, null); + mView = mLayoutInflater.inflate(R.layout.type_aod_clock, null); mTypeClock = mView.findViewById(R.id.type_clock); // For now, this view is used to hide the default digital clock. // Need better transition to lock screen. - mLockClockContainer = mLayoutInflater.inflate(R.layout.digital_clock, null); - mLockClockContainer.setVisibility(View.GONE); + mLockClock = (TypographicClock) mLayoutInflater.inflate(R.layout.typographic_clock, null); + mLockClock.setVisibility(View.GONE); + + mDarkController = new CrossFadeDarkController(mView, mLockClock); } @Override @@ -95,10 +97,10 @@ public class TypeClockController implements ClockPlugin { @Override public View getView() { - if (mLockClockContainer == null) { + if (mLockClock == null) { createViews(); } - return mLockClockContainer; + return mLockClock; } @Override @@ -115,6 +117,7 @@ public class TypeClockController implements ClockPlugin { @Override public void setTextColor(int color) { mTypeClock.setTextColor(color); + mLockClock.setTextColor(color); } @Override @@ -122,21 +125,28 @@ public class TypeClockController implements ClockPlugin { if (colorPalette == null || colorPalette.length == 0) { return; } - final int length = colorPalette.length; - mTypeClock.setClockColor(colorPalette[Math.max(0, length - 5)]); + final int color = colorPalette[Math.max(0, colorPalette.length - 5)]; + mTypeClock.setClockColor(color); + mLockClock.setClockColor(color); } @Override public void onTimeTick() { mTypeClock.onTimeChanged(); + mLockClock.onTimeChanged(); } @Override - public void setDarkAmount(float darkAmount) {} + public void setDarkAmount(float darkAmount) { + if (mDarkController != null) { + mDarkController.setDarkAmount(darkAmount); + } + } @Override public void onTimeZoneChanged(TimeZone timeZone) { mTypeClock.onTimeZoneChanged(timeZone); + mLockClock.onTimeZoneChanged(timeZone); } @Override diff --git a/packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java b/packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java index 7bce3c5cb63f..572ab30d7019 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java @@ -119,4 +119,12 @@ public class TypographicClock extends TextView { mTime.setTimeZone(mTimeZone != null ? mTimeZone : TimeZone.getDefault()); onTimeChanged(); } + + /** + * Overriding hasOverlappingRendering as false to improve performance of crossfading. + */ + @Override + public boolean hasOverlappingRendering() { + return false; + } } diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java index c013df385987..ace086f7af2c 100644 --- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java @@ -20,6 +20,7 @@ import static com.android.systemui.Dependency.BG_LOOPER_NAME; import android.app.AppOpsManager; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Handler; import android.os.Looper; import android.os.UserHandle; @@ -203,26 +204,37 @@ public class AppOpsControllerImpl implements AppOpsController, } /** + * Does the app-op item refer to a user sensitive permission. Only user sensitive permission + * should be shown to the user by default. + * + * @param item The item + * + * @return {@code true} iff the app-op item is user sensitive + */ + private boolean isUserSensitive(AppOpItem item) { + String permission = AppOpsManager.opToPermission(item.getCode()); + if (permission == null) { + return false; + } + int permFlags = mContext.getPackageManager().getPermissionFlags(permission, + item.getPackageName(), UserHandle.getUserHandleForUid(item.getUid())); + return (permFlags & PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED) != 0; + } + + /** * Returns a copy of the list containing all the active AppOps that the controller tracks. * * @return List of active AppOps information */ public List<AppOpItem> getActiveAppOps() { - ArrayList<AppOpItem> active; - synchronized (mActiveItems) { - active = new ArrayList<>(mActiveItems); - } - synchronized (mNotedItems) { - active.addAll(mNotedItems); - } - return active; + return getActiveAppOpsForUser(UserHandle.USER_ALL); } /** * Returns a copy of the list containing all the active AppOps that the controller tracks, for * a given user id. * - * @param userId User id to track + * @param userId User id to track, can be {@link UserHandle#USER_ALL} * * @return List of active AppOps information for that user id */ @@ -232,7 +244,8 @@ public class AppOpsControllerImpl implements AppOpsController, final int numActiveItems = mActiveItems.size(); for (int i = 0; i < numActiveItems; i++) { AppOpItem item = mActiveItems.get(i); - if (UserHandle.getUserId(item.getUid()) == userId) { + if ((userId == UserHandle.USER_ALL || UserHandle.getUserId(item.getUid()) == userId) + && isUserSensitive(item)) { list.add(item); } } @@ -241,7 +254,8 @@ public class AppOpsControllerImpl implements AppOpsController, final int numNotedItems = mNotedItems.size(); for (int i = 0; i < numNotedItems; i++) { AppOpItem item = mNotedItems.get(i); - if (UserHandle.getUserId(item.getUid()) == userId) { + if ((userId == UserHandle.USER_ALL || UserHandle.getUserId(item.getUid()) == userId) + && isUserSensitive(item)) { list.add(item); } } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index 03e453f364eb..eb85589f3781 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -23,8 +23,9 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static com.android.systemui.statusbar.StatusBarState.SHADE; import static com.android.systemui.statusbar.notification.NotificationAlertingManager.alertAgain; +import static java.lang.annotation.RetentionPolicy.SOURCE; + import android.annotation.Nullable; -import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityTaskManager; import android.app.IActivityTaskManager; @@ -43,6 +44,7 @@ import android.view.IPinnedStackListener; import android.view.ViewGroup; import android.widget.FrameLayout; +import androidx.annotation.IntDef; import androidx.annotation.MainThread; import com.android.internal.annotations.VisibleForTesting; @@ -60,7 +62,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationFlag; import com.android.systemui.statusbar.phone.StatusBarWindowController; -import java.util.List; +import java.lang.annotation.Retention; import javax.inject.Inject; import javax.inject.Singleton; @@ -73,10 +75,22 @@ import javax.inject.Singleton; */ @Singleton public class BubbleController implements BubbleExpandedView.OnBubbleBlockedListener { - private static final int MAX_BUBBLES = 5; // TODO: actually enforce this private static final String TAG = "BubbleController"; + private static final int MAX_BUBBLES = 5; // TODO: actually enforce this + + @Retention(SOURCE) + @IntDef({DISMISS_USER_GESTURE, DISMISS_AGED, DISMISS_TASK_FINISHED, DISMISS_BLOCKED, + DISMISS_NOTIF_CANCEL, DISMISS_ACCESSIBILITY_ACTION}) + @interface DismissReason {} + static final int DISMISS_USER_GESTURE = 1; + static final int DISMISS_AGED = 2; + static final int DISMISS_TASK_FINISHED = 3; + static final int DISMISS_BLOCKED = 4; + static final int DISMISS_NOTIF_CANCEL = 5; + static final int DISMISS_ACCESSIBILITY_ACTION = 6; + // Enables some subset of notifs to automatically become bubbles private static final boolean DEBUG_ENABLE_AUTO_BUBBLE = false; @@ -251,11 +265,11 @@ public class BubbleController implements BubbleExpandedView.OnBubbleBlockedListe /** * Tell the stack of bubbles to be dismissed, this will remove all of the bubbles in the stack. */ - void dismissStack() { + void dismissStack(@DismissReason int reason) { if (mStackView == null) { return; } - mStackView.stackDismissed(); + mStackView.stackDismissed(reason); updateVisibility(); mNotificationEntryManager.updateNotifications(); @@ -307,9 +321,9 @@ public class BubbleController implements BubbleExpandedView.OnBubbleBlockedListe * Must be called from the main thread. */ @MainThread - void removeBubble(String key) { + void removeBubble(String key, int reason) { if (mStackView != null) { - mStackView.removeBubble(key); + mStackView.removeBubble(key, reason); } mNotificationEntryManager.updateNotifications(); updateVisibility(); @@ -323,7 +337,7 @@ public class BubbleController implements BubbleExpandedView.OnBubbleBlockedListe boolean samePackage = entry.notification.getPackageName().equals( e.notification.getPackageName()); if (samePackage) { - removeBubble(entry.key); + removeBubble(entry.key, DISMISS_BLOCKED); } } } @@ -380,7 +394,7 @@ public class BubbleController implements BubbleExpandedView.OnBubbleBlockedListe } if (!removedByUser) { // This was a cancel so we should remove the bubble - removeBubble(entry.key); + removeBubble(entry.key, DISMISS_NOTIF_CANCEL); } } }; @@ -491,24 +505,6 @@ public class BubbleController implements BubbleExpandedView.OnBubbleBlockedListe @MainThread private class BubbleTaskStackListener extends TaskStackChangeListener { - @Nullable - private ActivityManager.StackInfo findStackInfo(int taskId) throws RemoteException { - final List<ActivityManager.StackInfo> stackInfoList = - mActivityTaskManager.getAllStackInfos(); - // Iterate through stacks from top to bottom. - final int stackCount = stackInfoList.size(); - for (int stackIndex = 0; stackIndex < stackCount; stackIndex++) { - final ActivityManager.StackInfo stackInfo = stackInfoList.get(stackIndex); - // Iterate through tasks from top to bottom. - for (int taskIndex = stackInfo.taskIds.length - 1; taskIndex >= 0; taskIndex--) { - if (stackInfo.taskIds[taskIndex] == taskId) { - return stackInfo; - } - } - } - return null; - } - @Override public void onTaskMovedToFront(RunningTaskInfo taskInfo) { if (mStackView != null && taskInfo.displayId == Display.DEFAULT_DISPLAY) { @@ -516,15 +512,8 @@ public class BubbleController implements BubbleExpandedView.OnBubbleBlockedListe } } - /** - * This is a workaround for the case when the activity had to be created in a new task. - * Existing code in ActivityStackSupervisor checks the display where the activity - * ultimately ended up, displays an error message toast, and calls this method instead of - * onTaskMovedToFront. - */ @Override - public void onActivityLaunchOnSecondaryDisplayFailed(RunningTaskInfo taskInfo) { - // TODO(b/124058588): move to ActivityView.StateCallback, filter on virtualDisplay ID + public void onActivityLaunchOnSecondaryDisplayRerouted() { if (mStackView != null) { mStackView.collapseStack(); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index 25ee87a13b74..856b9d6c27e4 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -135,7 +135,8 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList public void onTaskRemovalStarted(int taskId) { if (mEntry != null) { // Must post because this is called from a binder thread. - post(() -> mBubbleController.removeBubble(mEntry.key)); + post(() -> mBubbleController.removeBubble(mEntry.key, + BubbleController.DISMISS_TASK_FINISHED)); } } }; diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 97aa7864a79c..888e3fe282a8 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -19,6 +19,8 @@ package com.android.systemui.bubbles; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; +import android.app.Notification; +import android.app.PendingIntent; import android.content.Context; import android.content.res.Resources; import android.graphics.Outline; @@ -49,6 +51,7 @@ import androidx.dynamicanimation.animation.SpringForce; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.ViewClippingUtil; import com.android.systemui.R; +import com.android.systemui.bubbles.BubbleController.DismissReason; import com.android.systemui.bubbles.animation.ExpandedAnimationController; import com.android.systemui.bubbles.animation.PhysicsAnimationLayout; import com.android.systemui.bubbles.animation.StackAnimationController; @@ -62,26 +65,7 @@ import java.math.RoundingMode; */ public class BubbleStackView extends FrameLayout { private static final String TAG = "BubbleStackView"; - - /** - * Friction applied to fling animations. Since the stack must land on one of the sides of the - * screen, we want less friction horizontally so that the stack has a better chance of making it - * to the side without needing a spring. - */ - private static final float FLING_FRICTION_X = 1.15f; - private static final float FLING_FRICTION_Y = 1.5f; - - /** - * Damping ratio to use for the stack spring animation used to spring the stack to its final - * position after a fling. - */ - private static final float SPRING_DAMPING_RATIO = 0.85f; - - /** - * Minimum fling velocity required to trigger moving the stack from one side of the screen to - * the other. - */ - private static final float ESCAPE_VELOCITY = 750f; + private static final boolean DEBUG = false; private Point mDisplaySize; @@ -252,7 +236,7 @@ public class BubbleStackView extends FrameLayout { } switch (action) { case AccessibilityNodeInfo.ACTION_DISMISS: - stackDismissed(); + stackDismissed(BubbleController.DISMISS_ACCESSIBILITY_ACTION); return true; case AccessibilityNodeInfo.ACTION_COLLAPSE: collapseStack(); @@ -376,18 +360,12 @@ public class BubbleStackView extends FrameLayout { /** * Remove a bubble from the stack. */ - public void removeBubble(String key) { + public void removeBubble(String key, int reason) { Bubble b = mBubbleData.removeBubble(key); if (b == null) { return; } - b.entry.setBubbleDismissed(true); - - // Remove it from the views - int removedIndex = mBubbleContainer.indexOfChild(b.iconView); - b.expandedView.cleanUpExpandedState(); - mBubbleContainer.removeView(b.iconView); - + int removedIndex = dismissBubble(b, reason); int bubbleCount = mBubbleContainer.getChildCount(); if (bubbleCount == 0) { // If no bubbles remain, collapse the entire stack. @@ -405,26 +383,63 @@ public class BubbleStackView extends FrameLayout { mExpandedBubble = null; } } + // TODO: consider logging reason code logBubbleEvent(b, StatsLog.BUBBLE_UICHANGED__ACTION__DISMISSED); } /** * Dismiss the stack of bubbles. */ - public void stackDismissed() { + public void stackDismissed(int reason) { for (Bubble bubble : mBubbleData.getBubbles()) { - bubble.entry.setBubbleDismissed(true); - bubble.expandedView.cleanUpExpandedState(); + dismissBubble(bubble, reason); } mBubbleData.clear(); collapseStack(); mBubbleContainer.removeAllViews(); mExpandedViewContainer.removeAllViews(); + // TODO: consider logging reason code logBubbleEvent(null /* no bubble associated with bubble stack dismiss */, StatsLog.BUBBLE_UICHANGED__ACTION__STACK_DISMISSED); } /** + * Marks the notification entry as dismissed, cleans up Bubble icon and expanded view UI + * elements and calls deleteIntent if necessary. + * + * <p>Note: This does not remove the Bubble from BubbleData. + * + * @param bubble the Bubble being dismissed + * @param reason code for the reason the dismiss was triggered + * @see BubbleController.DismissReason + */ + private int dismissBubble(Bubble bubble, @DismissReason int reason) { + if (DEBUG) { + Log.d(TAG, "dismissBubble: " + bubble + " reason=" + reason); + } + bubble.entry.setBubbleDismissed(true); + bubble.expandedView.cleanUpExpandedState(); + + // Remove it from the views + int removedIndex = mBubbleContainer.indexOfChild(bubble.iconView); + mBubbleContainer.removeViewAt(removedIndex); + + if (reason == BubbleController.DISMISS_USER_GESTURE) { + Notification.BubbleMetadata bubbleMetadata = bubble.entry.getBubbleMetadata(); + PendingIntent deleteIntent = bubbleMetadata.getDeleteIntent(); + if (deleteIntent != null) { + try { + deleteIntent.send(); + } catch (PendingIntent.CanceledException e) { + Log.w(TAG, "Failed to send delete intent for bubble with key: " + + (bubble.entry != null ? bubble.entry.key : " null entry")); + } + } + } + return removedIndex; + } + + /** * Updates a bubble in the stack. * * @param entry the entry to update in the stack. @@ -653,50 +668,7 @@ public class BubbleStackView extends FrameLayout { return; } - final boolean stackOnLeftSide = x - - mBubbleContainer.getChildAt(0).getWidth() / 2 - < mDisplaySize.x / 2; - - final boolean stackShouldFlingLeft = stackOnLeftSide - ? velX < ESCAPE_VELOCITY - : velX < -ESCAPE_VELOCITY; - - final RectF stackBounds = mStackAnimationController.getAllowableStackPositionRegion(); - - // Target X translation (either the left or right side of the screen). - final float destinationRelativeX = stackShouldFlingLeft - ? stackBounds.left : stackBounds.right; - - // Minimum velocity required for the stack to make it to the side of the screen. - final float escapeVelocity = getMinXVelocity( - x, - destinationRelativeX, - FLING_FRICTION_X); - - // Use the touch event's velocity if it's sufficient, otherwise use the minimum velocity so - // that it'll make it all the way to the side of the screen. - final float startXVelocity = stackShouldFlingLeft - ? Math.min(escapeVelocity, velX) - : Math.max(escapeVelocity, velX); - - mStackAnimationController.flingThenSpringFirstBubbleWithStackFollowing( - DynamicAnimation.TRANSLATION_X, - startXVelocity, - FLING_FRICTION_X, - new SpringForce() - .setStiffness(SpringForce.STIFFNESS_LOW) - .setDampingRatio(SPRING_DAMPING_RATIO), - destinationRelativeX); - - mStackAnimationController.flingThenSpringFirstBubbleWithStackFollowing( - DynamicAnimation.TRANSLATION_Y, - velY, - FLING_FRICTION_Y, - new SpringForce() - .setStiffness(SpringForce.STIFFNESS_LOW) - .setDampingRatio(SPRING_DAMPING_RATIO), - /* destination */ null); - + mStackAnimationController.flingStackThenSpringToEdge(x, velX, velY); logBubbleEvent(null /* no bubble associated with bubble stack move */, StatsLog.BUBBLE_UICHANGED__ACTION__STACK_MOVED); } @@ -741,20 +713,6 @@ public class BubbleStackView extends FrameLayout { } } - /** - * Minimum velocity, in pixels/second, required to get from x to destX while being slowed by a - * given frictional force. - * - * This is not derived using real math, I just made it up because the math in FlingAnimation - * looks hard and this seems to work. It doesn't actually matter because if it doesn't make it - * to the edge via Fling, it'll get Spring'd there anyway. - * - * TODO(tsuji, or someone who likes math): Figure out math. - */ - private float getMinXVelocity(float x, float destX, float friction) { - return (destX - x) * (friction * 5) + ESCAPE_VELOCITY; - } - @Override public void getBoundsOnScreen(Rect outRect) { if (!mIsExpanded) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java index c8eebac4da3e..a7170d0256e3 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java @@ -140,7 +140,7 @@ class BubbleTouchHandler implements View.OnTouchListener { case MotionEvent.ACTION_UP: trackMovement(event); if (mInDismissTarget && isStack) { - mController.dismissStack(); + mController.dismissStack(BubbleController.DISMISS_USER_GESTURE); } else if (mMovedEnough) { mVelocityTracker.computeCurrentVelocity(/* maxVelocity */ 1000); final float velX = mVelocityTracker.getXVelocity(); @@ -152,7 +152,8 @@ class BubbleTouchHandler implements View.OnTouchListener { mStack.onBubbleDragFinish( mTouchedView, viewX, viewY, velX, velY, /* dismissed */ dismissed); if (dismissed) { - mController.removeBubble(((BubbleView) mTouchedView).getKey()); + mController.removeBubble(((BubbleView) mTouchedView).getKey(), + BubbleController.DISMISS_USER_GESTURE); } } } else if (mTouchedView == mStack.getExpandedBubbleView()) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java b/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java index af5035be1cfe..3c4bc7259a62 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java @@ -61,12 +61,35 @@ public class StackAnimationController extends private static final float DEFAULT_BOUNCINESS = 0.85f; /** + * Friction applied to fling animations. Since the stack must land on one of the sides of the + * screen, we want less friction horizontally so that the stack has a better chance of making it + * to the side without needing a spring. + */ + private static final float FLING_FRICTION_X = 1.15f; + private static final float FLING_FRICTION_Y = 1.5f; + + /** + * Damping ratio to use for the stack spring animation used to spring the stack to its final + * position after a fling. + */ + private static final float SPRING_DAMPING_RATIO = 0.85f; + + /** + * Minimum fling velocity required to trigger moving the stack from one side of the screen to + * the other. + */ + private static final float ESCAPE_VELOCITY = 750f; + + /** * The canonical position of the stack. This is typically the position of the first bubble, but * we need to keep track of it separately from the first bubble's translation in case there are * no bubbles, or the first bubble was just added and being animated to its new position. */ private PointF mStackPosition = new PointF(); + /** The most recent position in which the stack was resting on the edge of the screen. */ + private PointF mRestingStackPosition; + /** The height of the most recently visible IME. */ private float mImeHeight = 0f; @@ -135,6 +158,65 @@ public class StackAnimationController extends } /** + * Flings the stack starting with the given velocities, springing it to the nearest edge + * afterward. + */ + public void flingStackThenSpringToEdge(float x, float velX, float velY) { + final boolean stackOnLeftSide = x - mIndividualBubbleSize / 2 < mLayout.getWidth() / 2; + + final boolean stackShouldFlingLeft = stackOnLeftSide + ? velX < ESCAPE_VELOCITY + : velX < -ESCAPE_VELOCITY; + + final RectF stackBounds = getAllowableStackPositionRegion(); + + // Target X translation (either the left or right side of the screen). + final float destinationRelativeX = stackShouldFlingLeft + ? stackBounds.left : stackBounds.right; + + // Minimum velocity required for the stack to make it to the targeted side of the screen, + // taking friction into account (4.2f is the number that friction scalars are multiplied by + // in DynamicAnimation.DragForce). This is an estimate - it could possibly be slightly off, + // but the SpringAnimation at the end will ensure that it reaches the destination X + // regardless. + final float minimumVelocityToReachEdge = + (destinationRelativeX - x) * (FLING_FRICTION_X * 4.2f); + + // Use the touch event's velocity if it's sufficient, otherwise use the minimum velocity so + // that it'll make it all the way to the side of the screen. + final float startXVelocity = stackShouldFlingLeft + ? Math.min(minimumVelocityToReachEdge, velX) + : Math.max(minimumVelocityToReachEdge, velX); + + flingThenSpringFirstBubbleWithStackFollowing( + DynamicAnimation.TRANSLATION_X, + startXVelocity, + FLING_FRICTION_X, + new SpringForce() + .setStiffness(SpringForce.STIFFNESS_LOW) + .setDampingRatio(SPRING_DAMPING_RATIO), + destinationRelativeX); + + flingThenSpringFirstBubbleWithStackFollowing( + DynamicAnimation.TRANSLATION_Y, + velY, + FLING_FRICTION_Y, + new SpringForce() + .setStiffness(SpringForce.STIFFNESS_LOW) + .setDampingRatio(SPRING_DAMPING_RATIO), + /* destination */ null); + + mLayout.setEndListenerForProperties( + (animation, canceled, value, velocity) -> { + mRestingStackPosition = new PointF(); + mRestingStackPosition.set(mStackPosition); + mLayout.removeEndListenerForProperty(DynamicAnimation.TRANSLATION_X); + mLayout.removeEndListenerForProperty(DynamicAnimation.TRANSLATION_Y); + }, + DynamicAnimation.TRANSLATION_X, DynamicAnimation.TRANSLATION_Y); + } + + /** * Where the stack would be if it were snapped to the nearest horizontal edge (left or right). */ public PointF getStackPositionAlongNearestHorizontalEdge() { @@ -152,7 +234,7 @@ public class StackAnimationController extends * reducing momentum - a SpringAnimation takes over to snap the bubble to the given final * position. */ - public void flingThenSpringFirstBubbleWithStackFollowing( + protected void flingThenSpringFirstBubbleWithStackFollowing( DynamicAnimation.ViewProperty property, float vel, float friction, @@ -341,7 +423,7 @@ public class StackAnimationController extends .setDampingRatio(BubbleController.getBubbleBounciness( mLayout.getContext(), DEFAULT_BOUNCINESS)) .setStiffness(BubbleController.getBubbleStiffness( - mLayout.getContext(), (int) (DEFAULT_STIFFNESS * 100f))); + mLayout.getContext(), (int) DEFAULT_STIFFNESS)); } @Override @@ -360,8 +442,7 @@ public class StackAnimationController extends @Override void onChildRemoved(View child, int index, Runnable finishRemoval) { // Animate the child out, actually removing it once its alpha is zero. - mLayout.animateValueForChild( - DynamicAnimation.ALPHA, child, 0f, finishRemoval); + mLayout.animateValueForChild(DynamicAnimation.ALPHA, child, 0f, finishRemoval); mLayout.animateValueForChild(DynamicAnimation.SCALE_X, child, ANIMATE_IN_STARTING_SCALE); mLayout.animateValueForChild(DynamicAnimation.SCALE_Y, child, ANIMATE_IN_STARTING_SCALE); @@ -378,10 +459,13 @@ public class StackAnimationController extends /** Moves the stack, without any animation, to the starting position. */ private void moveStackToStartPosition(Runnable after) { // Post to ensure that the layout's width and height have been calculated. + mLayout.setVisibility(View.INVISIBLE); mLayout.post(() -> { setStackPosition( - getAllowableStackPositionRegion().right, - getAllowableStackPositionRegion().top + mStackStartingVerticalOffset); + mRestingStackPosition == null + ? getDefaultStartPosition() + : mRestingStackPosition); + mLayout.setVisibility(View.VISIBLE); after.run(); }); } @@ -410,9 +494,9 @@ public class StackAnimationController extends } /** Moves the stack to a position instantly, with no animation. */ - private void setStackPosition(float x, float y) { - Log.d(TAG, String.format("Setting position to (%f, %f).", x, y)); - mStackPosition.set(x, y); + private void setStackPosition(PointF pos) { + Log.d(TAG, String.format("Setting position to (%f, %f).", pos.x, pos.y)); + mStackPosition.set(pos.x, pos.y); cancelStackPositionAnimations(); @@ -420,11 +504,18 @@ public class StackAnimationController extends final float xOffset = getOffsetForChainedPropertyAnimation(DynamicAnimation.TRANSLATION_X); final float yOffset = getOffsetForChainedPropertyAnimation(DynamicAnimation.TRANSLATION_Y); for (int i = 0; i < mLayout.getChildCount(); i++) { - mLayout.getChildAt(i).setTranslationX(x + (i * xOffset)); - mLayout.getChildAt(i).setTranslationY(y + (i * yOffset)); + mLayout.getChildAt(i).setTranslationX(pos.x + (i * xOffset)); + mLayout.getChildAt(i).setTranslationY(pos.y + (i * yOffset)); } } + /** Returns the default stack position, which is on the top right. */ + private PointF getDefaultStartPosition() { + return new PointF( + getAllowableStackPositionRegion().right, + getAllowableStackPositionRegion().top + mStackStartingVerticalOffset); + } + /** Animates in the given bubble. */ private void animateInBubble(View child) { child.setTranslationY(mStackPosition.y); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java index c3d4b0faed62..847182d3ad35 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java @@ -39,7 +39,6 @@ import java.util.Calendar; */ public class DozeUi implements DozeMachine.Part { - private static final String TAG = "DozeUi"; private static final long TIME_TICK_DEADLINE_MILLIS = 90 * 1000; // 1.5min private final Context mContext; private final DozeHost mHost; @@ -94,11 +93,13 @@ public class DozeUi implements DozeMachine.Part { new DozeHost.PulseCallback() { @Override public void onPulseStarted() { - if (mMachine.getState() != DozeMachine.State.DOZE_REQUEST_PULSE) { - Log.w(TAG, "Pulse was cancelled before it could have been started"); - return; + try { + mMachine.requestState(DozeMachine.State.DOZE_PULSING); + } catch (IllegalStateException e) { + // It's possible that the pulse was asynchronously cancelled while + // we were waiting for it to start (under stress conditions.) + // In those cases we should just ignore it. b/127657926 } - mMachine.requestState(DozeMachine.State.DOZE_PULSING); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 327325378e5d..9b440664035f 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -89,6 +89,7 @@ import com.android.systemui.MultiListLayout.MultiListAdapter; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.plugins.GlobalActions.GlobalActionsManager; import com.android.systemui.plugins.GlobalActionsPanelPlugin; +import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ExtensionController; import com.android.systemui.statusbar.policy.ExtensionController.Extension; @@ -1533,7 +1534,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, View panelView = initializePanel(); if (panelView == null) { mBackgroundDrawable = new GradientDrawable(context); - mScrimAlpha = 0.7f; + mScrimAlpha = ScrimController.GRADIENT_SCRIM_ALPHA; } else { mBackgroundDrawable = context.getDrawable( com.android.systemui.R.drawable.global_action_panel_scrim); diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java b/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java index c6b53775a0b3..6c106dfe9db6 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java @@ -40,8 +40,6 @@ import android.widget.LinearLayout; public class ListGridLayout extends LinearLayout { private static final String TAG = "ListGridLayout"; private int mExpectedCount; - private int mRows; - private int mColumns; public ListGridLayout(Context context, AttributeSet attrs) { super(context, attrs); @@ -63,7 +61,7 @@ public class ListGridLayout extends LinearLayout { * Get the parent view associated with the item which should be placed at the given position. */ public ViewGroup getParentView(int index, boolean reverseSublists, boolean swapRowsAndColumns) { - if (mRows == 0) { + if (getRowCount() == 0) { return null; } int column = getParentViewIndex(index, reverseSublists, swapRowsAndColumns); @@ -77,10 +75,11 @@ public class ListGridLayout extends LinearLayout { private int getParentViewIndex(int index, boolean reverseSublists, boolean swapRowsAndColumns) { int sublistIndex; ViewGroup row; + int rows = getRowCount(); if (swapRowsAndColumns) { - sublistIndex = (int) Math.floor(index / mRows); + sublistIndex = (int) Math.floor(index / rows); } else { - sublistIndex = index % mRows; + sublistIndex = index % rows; } if (reverseSublists) { sublistIndex = reverseSublistIndex(sublistIndex); @@ -93,11 +92,9 @@ public class ListGridLayout extends LinearLayout { */ public void setExpectedCount(int count) { mExpectedCount = count; - mRows = getRowCount(); - mColumns = getColumnCount(); for (int i = 0; i < getChildCount(); i++) { - if (i <= mColumns) { + if (i <= getColumnCount()) { setSublistVisibility(i, true); } else { setSublistVisibility(i, false); @@ -113,10 +110,18 @@ public class ListGridLayout extends LinearLayout { } private int getRowCount() { + // special case for 3 to use a single row + if (mExpectedCount == 3) { + return 1; + } return (int) Math.ceil(Math.sqrt(mExpectedCount)); } private int getColumnCount() { + // special case for 3 to use a single row + if (mExpectedCount == 3) { + return 3; + } return (int) Math.round(Math.sqrt(mExpectedCount)); } } diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java index 72950088eb39..9df6ba5b1193 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java @@ -29,6 +29,7 @@ import android.graphics.Rect; import android.opengl.GLSurfaceView; import android.os.Build; import android.util.Log; +import android.util.MathUtils; import com.android.systemui.ImageWallpaper; import com.android.systemui.ImageWallpaper.ImageGLView; @@ -43,6 +44,8 @@ import javax.microedition.khronos.opengles.GL10; public class ImageWallpaperRenderer implements GLSurfaceView.Renderer, ImageWallpaper.WallpaperStatusListener, ImageRevealHelper.RevealStateListener { private static final String TAG = ImageWallpaperRenderer.class.getSimpleName(); + private static final float SCALE_VIEWPORT_MIN = 0.98f; + private static final float SCALE_VIEWPORT_MAX = 1f; private final WallpaperManager mWallpaperManager; private final ImageGLProgram mProgram; @@ -52,6 +55,8 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer, private final ImageGLView mGLView; private float mXOffset = 0f; private float mYOffset = 0f; + private int mWidth = 0; + private int mHeight = 0; public ImageWallpaperRenderer(Context context, ImageGLView glView) { mWallpaperManager = context.getSystemService(WallpaperManager.class); @@ -87,6 +92,8 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer, Log.d(TAG, "onSurfaceChanged: width=" + width + ", height=" + height + ", xOffset=" + mXOffset + ", yOffset=" + mYOffset); } + mWidth = width; + mHeight = height; mWallpaper.adjustTextureCoordinates(mWallpaperManager.getBitmap(), width, height, mXOffset, mYOffset); } @@ -102,10 +109,21 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer, glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_PER85), per85); glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_REVEAL), reveal); + scaleViewport(reveal); mWallpaper.useTexture(); mWallpaper.draw(); } + private void scaleViewport(float reveal) { + // Interpolation between SCALE_VIEWPORT_MAX and SCALE_VIEWPORT_MIN by reveal. + float vpScaled = MathUtils.lerp(SCALE_VIEWPORT_MAX, SCALE_VIEWPORT_MIN, reveal); + // Calculate the offset amount from the lower left corner. + float offset = (SCALE_VIEWPORT_MAX - vpScaled) / 2; + // Change the viewport. + glViewport((int) (mWidth * offset), (int) (mHeight * offset), + (int) (mWidth * vpScaled), (int) (mHeight * vpScaled)); + } + @Override public void onAmbientModeChanged(boolean inAmbientMode, long duration) { mImageRevealHelper.updateAwake(!inAmbientMode, duration); diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java index 9bca2cc434ac..9f0f53e0d508 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java @@ -135,7 +135,7 @@ public class MediaProjectionPermissionActivity extends Activity mDialog = new AlertDialog.Builder(this) .setTitle(dialogTitle) - .setIcon(aInfo.loadIcon(packageManager)) + .setIcon(R.drawable.ic_media_projection_permission) .setMessage(message) .setPositiveButton(R.string.media_projection_action_text, this) .setNegativeButton(android.R.string.cancel, this) diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index bed0c45b7db9..341461bf7202 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -42,9 +42,11 @@ import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Matrix; @@ -743,6 +745,15 @@ class GlobalScreenshot { return (x - flashDurationPct) / (1f - flashDurationPct); } }; + + Resources r = mContext.getResources(); + if ((r.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) + == Configuration.UI_MODE_NIGHT_YES) { + mScreenshotView.getBackground().setTint(Color.BLACK); + } else { + mScreenshotView.getBackground().setTintList(null); + } + ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); anim.setDuration(SCREENSHOT_DROP_IN_DURATION); anim.addListener(new AnimatorListenerAdapter() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java index b820dc09657a..a630e49d850a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java @@ -461,9 +461,6 @@ public class NotificationRemoteInputManager implements Dumpable { } public boolean shouldKeepForRemoteInputHistory(NotificationEntry entry) { - if (entry.isDismissed()) { - return false; - } if (!FORCE_REMOTE_INPUT_HISTORY) { return false; } @@ -471,9 +468,6 @@ public class NotificationRemoteInputManager implements Dumpable { } public boolean shouldKeepForSmartReplyHistory(NotificationEntry entry) { - if (entry.isDismissed()) { - return false; - } if (!FORCE_REMOTE_INPUT_HISTORY) { return false; } @@ -661,9 +655,6 @@ public class NotificationRemoteInputManager implements Dumpable { protected class RemoteInputActiveExtender extends RemoteInputExtender { @Override public boolean shouldExtendLifetime(@NonNull NotificationEntry entry) { - if (entry.isDismissed()) { - return false; - } return mRemoteInputController.isRemoteInputActive(entry); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java index 4ed9ae4d5142..7d224fb13e2d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java @@ -159,16 +159,19 @@ public class NotificationEntryManager implements } public void performRemoveNotification(StatusBarNotification n) { - final int rank = mNotificationData.getRank(n.getKey()); - final int count = mNotificationData.getActiveNotifications().size(); - NotificationVisibility.NotificationLocation location = - NotificationLogger.getNotificationLocation(getNotificationData().get(n.getKey())); - final NotificationVisibility nv = NotificationVisibility.obtain(n.getKey(), rank, count, - true, location); + final NotificationVisibility nv = obtainVisibility(n.getKey()); removeNotificationInternal( n.getKey(), null, nv, false /* forceRemove */, true /* removedByUser */); } + private NotificationVisibility obtainVisibility(String key) { + final int rank = mNotificationData.getRank(key); + final int count = mNotificationData.getActiveNotifications().size(); + NotificationVisibility.NotificationLocation location = + NotificationLogger.getNotificationLocation(getNotificationData().get(key)); + return NotificationVisibility.obtain(key, rank, count, true, location); + } + private void abortExistingInflation(String key) { if (mPendingNotifications.containsKey(key)) { NotificationEntry entry = mPendingNotifications.get(key); @@ -226,8 +229,8 @@ public class NotificationEntryManager implements @Override public void removeNotification(String key, NotificationListenerService.RankingMap ranking) { - removeNotificationInternal( - key, ranking, null, false /* forceRemove */, false /* removedByUser */); + removeNotificationInternal(key, ranking, obtainVisibility(key), false /* forceRemove */, + false /* removedByUser */); } private void removeNotificationInternal( @@ -245,7 +248,8 @@ public class NotificationEntryManager implements if (entry != null) { // If a manager needs to keep the notification around for whatever reason, we // keep the notification - if (!forceRemove) { + boolean entryDismissed = entry.isRowDismissed(); + if (!forceRemove && !entryDismissed) { for (NotificationLifetimeExtender extender : mNotificationLifetimeExtenders) { if (extender.shouldExtendLifetime(entry)) { mLatestRankingMap = ranking; @@ -272,6 +276,7 @@ public class NotificationEntryManager implements mNotificationData.remove(key, ranking); updateNotifications(); Dependency.get(LeakDetector.class).trackGarbage(entry); + removedByUser |= entryDismissed; for (NotificationEntryListener listener : mNotificationEntryListeners) { listener.onEntryRemoved(entry, visibility, removedByUser); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 5cd1210f7c9f..f1373d142402 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -543,14 +543,6 @@ public final class NotificationEntry { return row == null || row.isRemoved(); } - /** - * @return {@code true} if the row is null or dismissed - */ - public boolean isDismissed() { - //TODO: recycling - return row == null || row.isDismissed(); - } - public boolean isRowPinned() { return row != null && row.isPinned(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 2162ea70fe84..410eeae4e946 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -22,17 +22,21 @@ import android.os.Handler; import android.os.PowerManager; import android.os.SystemClock; import android.os.Trace; +import android.provider.Settings; import android.util.Log; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.LatencyTracker; import com.android.keyguard.KeyguardConstants; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.Dependency; +import com.android.systemui.R; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.tuner.TunerService; import java.io.PrintWriter; @@ -95,6 +99,17 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { */ private static final float BIOMETRIC_COLLAPSE_SPEEDUP_FACTOR = 1.1f; + /** + * If face unlock dismisses the lock screen or keeps user on keyguard by default on this device. + */ + private final boolean mFaceDismissesKeyguardByDefault; + + /** + * If face unlock dismisses the lock screen or keeps user on keyguard for the current user. + */ + @VisibleForTesting + protected boolean mFaceDismissesKeyguard; + private final NotificationMediaManager mMediaManager; private final PowerManager mPowerManager; private final Handler mHandler; @@ -115,14 +130,42 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { private boolean mPendingShowBouncer; private boolean mHasScreenTurnedOnSinceAuthenticating; + private final TunerService.Tunable mFaceDismissedKeyguardTunable = new TunerService.Tunable() { + @Override + public void onTuningChanged(String key, String newValue) { + int defaultValue = mFaceDismissesKeyguardByDefault ? 1 : 0; + mFaceDismissesKeyguard = Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, + defaultValue, KeyguardUpdateMonitor.getCurrentUser()) != 0; + } + }; + public BiometricUnlockController(Context context, + DozeScrimController dozeScrimController, + KeyguardViewMediator keyguardViewMediator, + ScrimController scrimController, + StatusBar statusBar, + UnlockMethodCache unlockMethodCache, Handler handler, + KeyguardUpdateMonitor keyguardUpdateMonitor, + TunerService tunerService) { + this(context, dozeScrimController, keyguardViewMediator, scrimController, statusBar, + unlockMethodCache, handler, keyguardUpdateMonitor, tunerService, + context.getResources() + .getInteger(com.android.internal.R.integer.config_wakeUpDelayDoze), + context.getResources().getBoolean(R.bool.config_faceAuthDismissesKeyguard)); + } + + @VisibleForTesting + protected BiometricUnlockController(Context context, DozeScrimController dozeScrimController, KeyguardViewMediator keyguardViewMediator, ScrimController scrimController, StatusBar statusBar, UnlockMethodCache unlockMethodCache, Handler handler, KeyguardUpdateMonitor keyguardUpdateMonitor, - int wakeUpDelay) { + TunerService tunerService, + int wakeUpDelay, + boolean faceDismissesKeyguard) { mContext = context; mPowerManager = context.getSystemService(PowerManager.class); mUpdateMonitor = keyguardUpdateMonitor; @@ -138,6 +181,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { mUnlockMethodCache = unlockMethodCache; mHandler = handler; mWakeUpDelay = wakeUpDelay; + mFaceDismissesKeyguardByDefault = faceDismissesKeyguard; + tunerService.addTunable(mFaceDismissedKeyguardTunable, + Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD); } public void setStatusBarKeyguardViewManager( @@ -344,27 +390,28 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { private int calculateMode(BiometricSourceType biometricSourceType) { boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithBiometricAllowed(); boolean deviceDreaming = mUpdateMonitor.isDreaming(); - boolean isFace = biometricSourceType == BiometricSourceType.FACE; + boolean faceStayingOnKeyguard = biometricSourceType == BiometricSourceType.FACE + && !mFaceDismissesKeyguard; if (!mUpdateMonitor.isDeviceInteractive()) { if (!mStatusBarKeyguardViewManager.isShowing()) { return MODE_ONLY_WAKE; } else if (mDozeScrimController.isPulsing() && unlockingAllowed) { - return isFace ? MODE_NONE : MODE_WAKE_AND_UNLOCK_PULSING; + return faceStayingOnKeyguard ? MODE_NONE : MODE_WAKE_AND_UNLOCK_PULSING; } else if (unlockingAllowed || !mUnlockMethodCache.isMethodSecure()) { return MODE_WAKE_AND_UNLOCK; } else { return MODE_SHOW_BOUNCER; } } - if (unlockingAllowed && deviceDreaming && !isFace) { + if (unlockingAllowed && deviceDreaming && !faceStayingOnKeyguard) { return MODE_WAKE_AND_UNLOCK_FROM_DREAM; } if (mStatusBarKeyguardViewManager.isShowing()) { if (mStatusBarKeyguardViewManager.isBouncerShowing() && unlockingAllowed) { return MODE_DISMISS_BOUNCER; } else if (unlockingAllowed) { - return isFace ? MODE_ONLY_WAKE : MODE_UNLOCK; + return faceStayingOnKeyguard ? MODE_ONLY_WAKE : MODE_UNLOCK; } else if (!mStatusBarKeyguardViewManager.isBouncerShowing()) { return MODE_SHOW_BOUNCER; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 64e76d39af78..b7d1fc697f2a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -203,10 +203,10 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange case STATE_SCANNING_FACE: // Error animation also starts and ands on the padlock. case STATE_BIOMETRICS_ERROR: - iconRes = com.android.internal.R.drawable.ic_lock_24dp; + iconRes = com.android.internal.R.drawable.ic_lock; break; case STATE_LOCK_OPEN: - iconRes = com.android.internal.R.drawable.ic_lock_open_24dp; + iconRes = com.android.internal.R.drawable.ic_lock_open; break; default: throw new IllegalArgumentException(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index c38908280ed9..b540fb49af01 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -42,6 +42,7 @@ import android.annotation.IntDef; import android.annotation.SuppressLint; import android.app.StatusBarManager; import android.content.Context; +import android.content.pm.ParceledListSlice; import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Point; @@ -59,6 +60,8 @@ import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.Gravity; +import android.view.IPinnedStackController; +import android.view.IPinnedStackListener; import android.view.MotionEvent; import android.view.Surface; import android.view.View; @@ -355,6 +358,46 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav } }; + private final IPinnedStackListener.Stub mImeChangedListener = new IPinnedStackListener.Stub() { + @Override + public void onListenerRegistered(IPinnedStackController controller) { + } + + @Override + public void onImeVisibilityChanged(boolean imeVisible, int imeHeight) { + post(() -> { + // When the ime changes visibility, resize the edge panels to not cover the ime + final int width = mPrototypeController.getEdgeSensitivityWidth(); + final int height = mContext.getDisplay().getHeight() - imeHeight + - getResources().getDimensionPixelOffset(R.dimen.status_bar_height); + if (mLeftEdgePanel != null) { + mLeftEdgePanel.setDimensions(width, height); + } + if (mRightEdgePanel != null) { + mRightEdgePanel.setDimensions(width, height); + } + }); + } + + @Override + public void onShelfVisibilityChanged(boolean shelfVisible, int shelfHeight) { + } + + @Override + public void onMinimizedStateChanged(boolean isMinimized) { + } + + @Override + public void onMovementBoundsChanged(Rect insetBounds, Rect normalBounds, + Rect animatingBounds, boolean fromImeAdjustment, boolean fromShelfAdjustment, + int displayRotation) { + } + + @Override + public void onActionsChanged(ParceledListSlice actions) { + } + }; + public NavigationBarView(Context context, AttributeSet attrs) { super(context, attrs); @@ -1296,13 +1339,19 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav int height = mPrototypeController.getEdgeSensitivityHeight(); // Explicitly left and right, not start and end as this is device relative. mLeftEdgePanel = NavigationBarEdgePanel.create(getContext(), width, height, - Gravity.LEFT | Gravity.BOTTOM); + Gravity.LEFT | Gravity.TOP); mRightEdgePanel = NavigationBarEdgePanel.create(getContext(), width, height, - Gravity.RIGHT | Gravity.BOTTOM); + Gravity.RIGHT | Gravity.TOP); mLeftEdgePanel.setOnTouchListener(mEdgePanelTouchListener); mRightEdgePanel.setOnTouchListener(mEdgePanelTouchListener); wm.addView(mLeftEdgePanel, mLeftEdgePanel.getLayoutParams()); wm.addView(mRightEdgePanel, mRightEdgePanel.getLayoutParams()); + + try { + WindowManagerWrapper.getInstance().addPinnedStackListener(mImeChangedListener); + } catch (RemoteException e) { + Log.e(TAG, "Failed to register pinned stack listener", e); + } } } @@ -1327,6 +1376,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav if (mRightEdgePanel != null) { wm.removeView(mRightEdgePanel); } + WindowManagerWrapper.getInstance().removePinnedStackListener(mImeChangedListener); } private void setUpSwipeUpOnboarding(boolean connectedToOverviewProxy) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 8714a51f98d4..265fa2cd2328 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -421,6 +421,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo interpolatedFract); mCurrentInFrontAlpha = 0; } + mCurrentBehindTint = ColorUtils.blendARGB(ScrimState.BOUNCER.getBehindTint(), + mState.getBehindTint(), interpolatedFract); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java index bbeebd654b4e..ccf5e4eb0ac4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -54,6 +54,8 @@ public enum ScrimState { } else { mAnimationDuration = ScrimController.ANIMATION_DURATION; } + mCurrentInFrontTint = Color.BLACK; + mCurrentBehindTint = Color.BLACK; mCurrentBehindAlpha = mScrimBehindAlphaKeyguard; mCurrentInFrontAlpha = 0; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 0ca4e730b8ec..183226507117 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -225,6 +225,7 @@ import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.statusbar.policy.UserInfoControllerImpl; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.ZenModeController; +import com.android.systemui.tuner.TunerService; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.volume.VolumeComponent; @@ -1208,8 +1209,7 @@ public class StatusBar extends SystemUI implements DemoMode, mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController, keyguardViewMediator, mScrimController, this, UnlockMethodCache.getInstance(mContext), - new Handler(), mKeyguardUpdateMonitor, mContext.getResources().getInteger( - com.android.internal.R.integer.config_wakeUpDelayDoze)); + new Handler(), mKeyguardUpdateMonitor, Dependency.get(TunerService.class)); mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this, getBouncerContainer(), mNotificationPanel, mBiometricUnlockController); mKeyguardIndicationController diff --git a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java index 73ee0bdfc619..b9afea155ccf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java @@ -22,11 +22,14 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.app.AppOpsManager; +import android.content.pm.PackageManager; import android.os.UserHandle; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -47,12 +50,15 @@ import org.mockito.MockitoAnnotations; @TestableLooper.RunWithLooper public class AppOpsControllerTest extends SysuiTestCase { private static final String TEST_PACKAGE_NAME = "test"; - private static final int TEST_UID = 0; - private static final int TEST_UID_OTHER = 500000; + private static final int TEST_UID = UserHandle.getUid(0, 0); + private static final int TEST_UID_OTHER = UserHandle.getUid(1, 0); + private static final int TEST_UID_NON_USER_SENSITIVE = UserHandle.getUid(2, 0); @Mock private AppOpsManager mAppOpsManager; @Mock + private PackageManager mPackageManager; + @Mock private AppOpsController.Callback mCallback; @Mock private AppOpsControllerImpl.H mMockHandler; @@ -65,6 +71,18 @@ public class AppOpsControllerTest extends SysuiTestCase { getContext().addMockSystemService(AppOpsManager.class, mAppOpsManager); + // All permissions of TEST_UID and TEST_UID_OTHER are user sensitive. None of + // TEST_UID_NON_USER_SENSITIVE are user sensitive. + getContext().setMockPackageManager(mPackageManager); + when(mPackageManager.getPermissionFlags(anyString(), anyString(), + eq(UserHandle.getUserHandleForUid(TEST_UID)))).thenReturn( + PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED); + when(mPackageManager.getPermissionFlags(anyString(), anyString(), + eq(UserHandle.getUserHandleForUid(TEST_UID_OTHER)))).thenReturn( + PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED); + when(mPackageManager.getPermissionFlags(anyString(), anyString(), + eq(UserHandle.getUserHandleForUid(TEST_UID_NON_USER_SENSITIVE)))).thenReturn(0); + mController = new AppOpsControllerImpl(mContext, Dependency.get(Dependency.BG_LOOPER)); } @@ -157,6 +175,14 @@ public class AppOpsControllerTest extends SysuiTestCase { } @Test + public void nonUserSensitiveOpsAreIgnored() { + mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO, + TEST_UID_NON_USER_SENSITIVE, TEST_PACKAGE_NAME, true); + assertEquals(0, mController.getActiveAppOpsForUser( + UserHandle.getUserId(TEST_UID_NON_USER_SENSITIVE)).size()); + } + + @Test public void opNotedScheduledForRemoval() { mController.setBGHandler(mMockHandler); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java index 0fd783423464..42c221a91422 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java @@ -20,10 +20,13 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.IActivityManager; +import android.app.PendingIntent; import android.content.Context; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -83,6 +86,9 @@ public class BubbleControllerTest extends SysuiTestCase { @Mock private BubbleController.BubbleExpandListener mBubbleExpandListener; + @Mock + private PendingIntent mDeleteIntent; + private BubbleData mBubbleData; @Before @@ -98,9 +104,9 @@ public class BubbleControllerTest extends SysuiTestCase { // Need notifications for bubbles mNotificationTestHelper = new NotificationTestHelper(mContext); - mRow = mNotificationTestHelper.createBubble(); - mRow2 = mNotificationTestHelper.createBubble(); - mNoChannelRow = mNotificationTestHelper.createBubble(); + mRow = mNotificationTestHelper.createBubble(mDeleteIntent); + mRow2 = mNotificationTestHelper.createBubble(mDeleteIntent); + mNoChannelRow = mNotificationTestHelper.createBubble(mDeleteIntent); // Return non-null notification data from the NEM when(mNotificationEntryManager.getNotificationData()).thenReturn(mNotificationData); @@ -141,11 +147,10 @@ public class BubbleControllerTest extends SysuiTestCase { verify(mBubbleStateChangeListener).onHasBubblesChanged(true); - mBubbleController.removeBubble(mRow.getEntry().key); + mBubbleController.removeBubble(mRow.getEntry().key, BubbleController.DISMISS_USER_GESTURE); assertFalse(mStatusBarWindowController.getBubblesShowing()); assertTrue(mRow.getEntry().isBubbleDismissed()); verify(mNotificationEntryManager).updateNotifications(); - verify(mBubbleStateChangeListener).onHasBubblesChanged(false); } @@ -155,7 +160,7 @@ public class BubbleControllerTest extends SysuiTestCase { mBubbleController.updateBubble(mRow2.getEntry(), true /* updatePosition */); assertTrue(mBubbleController.hasBubbles()); - mBubbleController.dismissStack(); + mBubbleController.dismissStack(BubbleController.DISMISS_USER_GESTURE); assertFalse(mStatusBarWindowController.getBubblesShowing()); verify(mNotificationEntryManager).updateNotifications(); assertTrue(mRow.getEntry().isBubbleDismissed()); @@ -271,7 +276,8 @@ public class BubbleControllerTest extends SysuiTestCase { assertFalse(mRow2.getEntry().showInShadeWhenBubble()); // Dismiss currently expanded - mBubbleController.removeBubble(stackView.getExpandedBubbleView().getKey()); + mBubbleController.removeBubble(stackView.getExpandedBubbleView().getKey(), + BubbleController.DISMISS_USER_GESTURE); verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow2.getEntry().key); // Make sure next bubble is selected @@ -279,7 +285,8 @@ public class BubbleControllerTest extends SysuiTestCase { verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().key); // Dismiss that one - mBubbleController.removeBubble(stackView.getExpandedBubbleView().getKey()); + mBubbleController.removeBubble(stackView.getExpandedBubbleView().getKey(), + BubbleController.DISMISS_USER_GESTURE); // Make sure state changes and collapse happens verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().key); @@ -299,6 +306,28 @@ public class BubbleControllerTest extends SysuiTestCase { assertTrue(mRow.getEntry().showInShadeWhenBubble()); } + @Test + public void testDeleteIntent_removeBubble_aged() throws PendingIntent.CanceledException { + mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */); + mBubbleController.removeBubble(mRow.getEntry().key, BubbleController.DISMISS_AGED); + verify(mDeleteIntent, never()).send(); + } + + @Test + public void testDeleteIntent_removeBubble_user() throws PendingIntent.CanceledException { + mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */); + mBubbleController.removeBubble(mRow.getEntry().key, BubbleController.DISMISS_USER_GESTURE); + verify(mDeleteIntent, times(1)).send(); + } + + @Test + public void testDeleteIntent_dismissStack() throws PendingIntent.CanceledException { + mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */); + mBubbleController.updateBubble(mRow2.getEntry(), true /* updatePosition */); + mBubbleController.dismissStack(BubbleController.DISMISS_USER_GESTURE); + verify(mDeleteIntent, times(2)).send(); + } + static class TestableBubbleController extends BubbleController { TestableBubbleController(Context context, diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java index cf25a9d59aaf..2ee73f30ea5a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java @@ -198,6 +198,26 @@ public class StackAnimationControllerTest extends PhysicsAnimationLayoutTestCase assertEquals(0, mLayout.getChildAt(0).getTranslationX(), .1f); } + @Test + public void testRestoredAtRestingPosition() throws InterruptedException { + mStackController.flingStackThenSpringToEdge(0, 5000, 5000); + + waitForPropertyAnimations( + DynamicAnimation.TRANSLATION_X, DynamicAnimation.TRANSLATION_Y); + waitForLayoutMessageQueue(); + + final PointF prevStackPos = mStackController.getStackPosition(); + + mLayout.removeAllViews(); + mLayout.addView(new FrameLayout(getContext())); + + waitForLayoutMessageQueue(); + waitForPropertyAnimations( + DynamicAnimation.TRANSLATION_X, DynamicAnimation.TRANSLATION_Y); + + assertEquals(prevStackPos, mStackController.getStackPosition()); + } + /** * Checks every child view to make sure it's stacked at the given coordinates, off to the left * or right side depending on offset multiplier. @@ -217,7 +237,7 @@ public class StackAnimationControllerTest extends PhysicsAnimationLayoutTestCase */ private class TestableStackController extends StackAnimationController { @Override - public void flingThenSpringFirstBubbleWithStackFollowing( + protected void flingThenSpringFirstBubbleWithStackFollowing( DynamicAnimation.ViewProperty property, float vel, float friction, SpringForce spring, Float finalPosition) { mMainThreadHandler.post(() -> diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java index cef78db1b16b..de155055b76b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.app.ActivityManager; import android.app.Instrumentation; import android.app.Notification; +import android.app.Notification.BubbleMetadata; import android.app.NotificationChannel; import android.app.PendingIntent; import android.content.Context; @@ -152,8 +153,18 @@ public class NotificationTestHelper { * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble. */ public ExpandableNotificationRow createBubble() throws Exception { + return createBubble(null); + } + + /** + * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble. + * + * @param deleteIntent the intent to assign to {@link BubbleMetadata#deleteIntent} + */ + public ExpandableNotificationRow createBubble(@Nullable PendingIntent deleteIntent) + throws Exception { Notification n = createNotification(false /* isGroupSummary */, - null /* groupKey */, true /* isBubble */); + null /* groupKey */, true /* isBubble */, deleteIntent); return generateRow(n, PKG, UID, USER_HANDLE, 0 /* extraInflationFlags */, IMPORTANCE_HIGH); } @@ -196,7 +207,8 @@ public class NotificationTestHelper { * @return a notification that is in the group specified or standalone if unspecified */ private Notification createNotification(boolean isGroupSummary, @Nullable String groupKey) { - return createNotification(isGroupSummary, groupKey, false /* isBubble */); + return createNotification(isGroupSummary, groupKey, false /* isBubble */, + null /* bubbleDeleteIntent */); } /** @@ -208,7 +220,8 @@ public class NotificationTestHelper { * @return a notification that is in the group specified or standalone if unspecified */ private Notification createNotification(boolean isGroupSummary, - @Nullable String groupKey, boolean isBubble) { + @Nullable String groupKey, boolean isBubble, + @Nullable PendingIntent bubbleDeleteIntent) { Notification publicVersion = new Notification.Builder(mContext).setSmallIcon( R.drawable.ic_person) .setCustomContentView(new RemoteViews(mContext.getPackageName(), @@ -227,7 +240,8 @@ public class NotificationTestHelper { notificationBuilder.setGroup(groupKey); } if (isBubble) { - notificationBuilder.setBubbleMetadata(makeBubbleMetadata()); + BubbleMetadata metadata = makeBubbleMetadata(bubbleDeleteIntent); + notificationBuilder.setBubbleMetadata(metadata); } return notificationBuilder.build(); } @@ -291,11 +305,13 @@ public class NotificationTestHelper { return row; } - private Notification.BubbleMetadata makeBubbleMetadata() { + private BubbleMetadata makeBubbleMetadata(PendingIntent deleteIntent) { Intent target = new Intent(mContext, BubblesTestActivity.class); PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, target, 0); - return new Notification.BubbleMetadata.Builder() + + return new BubbleMetadata.Builder() .setIntent(bubbleIntent) + .setDeleteIntent(deleteIntent) .setTitle("bubble title") .setIcon(Icon.createWithResource(mContext, 1)) .setDesiredHeight(314) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java index 554374432135..c8005ddacdb1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java @@ -347,7 +347,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase { verify(mPresenter).updateNotificationViews(); verify(mEntryListener).onEntryRemoved( - mEntry, null, false /* removedByUser */); + eq(mEntry), any(), eq(false) /* removedByUser */); verify(mRow).setRemoved(); assertNull(mEntryManager.getNotificationData().get(mSbn.getKey())); @@ -360,7 +360,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase { mEntryManager.removeNotification("not_a_real_key", mRankingMap); verify(mEntryListener, never()).onEntryRemoved( - mEntry, null, false /* removedByUser */); + eq(mEntry), any(), eq(false) /* removedByUser */); } @Test @@ -373,7 +373,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase { mEntryManager.removeNotification(mSbn.getKey(), mRankingMap); verify(mEntryListener, never()).onEntryRemoved( - mEntry, null, false /* removedByUser */); + eq(mEntry), any(), eq(false /* removedByUser */)); } @Test @@ -455,7 +455,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase { verify(extender).setShouldManageLifetime(mEntry, true); // THEN the notification is retained assertNotNull(mEntryManager.getNotificationData().get(mSbn.getKey())); - verify(mEntryListener, never()).onEntryRemoved(mEntry, null, false); + verify(mEntryListener, never()).onEntryRemoved(eq(mEntry), any(), eq(false)); } @Test @@ -474,7 +474,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase { // THEN the notification is removed assertNull(mEntryManager.getNotificationData().get(mSbn.getKey())); - verify(mEntryListener).onEntryRemoved(mEntry, null, false); + verify(mEntryListener).onEntryRemoved(eq(mEntry), any(), eq(false)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index 7be4756c5a4d..057f752b5ad1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -36,6 +36,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.tuner.TunerService; import org.junit.Before; import org.junit.Test; @@ -68,6 +69,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { private StatusBar mStatusBar; @Mock private UnlockMethodCache mUnlockMethodCache; + @Mock + private TunerService mTunerService; private BiometricUnlockController mBiometricUnlockController; @Before @@ -79,9 +82,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager); mDependency.injectTestDependency(StatusBarWindowController.class, mStatusBarWindowController); - mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController, - mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache, - new Handler(), mUpdateMonitor, 0 /* wakeUpDelay */); + mBiometricUnlockController = new TestableBiometricUnlockController( + false /* faceDismissesKeyguard */); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); } @@ -136,6 +138,19 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { } @Test + public void onBiometricAuthenticated_whenFace_dismissingKeyguard() { + mBiometricUnlockController = new TestableBiometricUnlockController( + true /* faceDismissesKeyguard */); + mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); + + when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); + mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, + BiometricSourceType.FACE); + + verify(mStatusBarKeyguardViewManager).animateCollapsePanels(anyFloat()); + } + + @Test public void onBiometricAuthenticated_whenFaceOnBouncer_dismissBouncer() { when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true); @@ -156,4 +171,15 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat()); } + + private class TestableBiometricUnlockController extends BiometricUnlockController { + + TestableBiometricUnlockController(boolean faceDismissesKeyguard) { + super(mContext, mDozeScrimController, + mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache, + new Handler(), mUpdateMonitor, mTunerService, 0 /* wakeUpDelay */, + faceDismissesKeyguard); + mFaceDismissesKeyguard = faceDismissesKeyguard; + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 6db36243bb07..7e5c3db046e1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -51,6 +51,7 @@ import com.android.systemui.statusbar.ScrimView; import com.android.systemui.util.wakelock.WakeLock; import com.android.systemui.utils.os.FakeHandler; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -99,12 +100,13 @@ public class ScrimControllerTest extends SysuiTestCase { visible -> mScrimVisibility = visible, mDozeParamenters, mAlarmManager); mScrimController.setHasBackdrop(false); mScrimController.setWallpaperSupportsAmbientMode(false); + mScrimController.transitionTo(ScrimState.KEYGUARD); + mScrimController.finishAnimationsImmediately(); } - @Test - public void initialState() { - Assert.assertEquals("ScrimController should start initialized", - mScrimController.getState(), ScrimState.UNINITIALIZED); + @After + public void tearDown() { + mScrimController.finishAnimationsImmediately(); } @Test @@ -114,7 +116,7 @@ public class ScrimControllerTest extends SysuiTestCase { // Front scrim should be transparent // Back scrim should be visible without tint assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_SEMI_TRANSPARENT); - assertScrimTint(mScrimBehind, false /* tinted */); + assertScrimTint(mScrimBehind, true /* tinted */); } @Test @@ -307,13 +309,13 @@ public class ScrimControllerTest extends SysuiTestCase { reset(mScrimBehind); mScrimController.setPanelExpansion(0f); mScrimController.setPanelExpansion(1.0f); - mScrimController.onPreDraw(); + mScrimController.finishAnimationsImmediately(); Assert.assertEquals("Scrim alpha should change after setPanelExpansion", mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f); mScrimController.setPanelExpansion(0f); - mScrimController.onPreDraw(); + mScrimController.finishAnimationsImmediately(); Assert.assertEquals("Scrim alpha should change after setPanelExpansion", mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f); @@ -336,6 +338,7 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setExpansionAffectsAlpha(true); mScrimController.setPanelExpansion(0.1f); + mScrimController.finishAnimationsImmediately(); Assert.assertNotEquals("Scrim opacity should change when setExpansionAffectsAlpha " + "is true", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f); } diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto index 91b161d3192f..9673a84018e4 100644 --- a/proto/src/metrics_constants/metrics_constants.proto +++ b/proto/src/metrics_constants/metrics_constants.proto @@ -7087,6 +7087,9 @@ message MetricsEvent { //ACTION: Log result for each card's eligibility check ACTION_CONTEXTUAL_CARD_ELIGIBILITY = 1686; + // Panel for Wifi + PANEL_WIFI = 1687; + // ---- End Q Constants, all Q constants go above this line ---- // Add new aosp constants above this line. // END OF AOSP CONSTANTS diff --git a/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java b/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java index 45ea86f9e74e..922b3271e20c 100644 --- a/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java +++ b/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java @@ -46,7 +46,8 @@ public class RemoteAppPredictionService extends ComponentName componentName, int userId, RemoteAppPredictionServiceCallbacks callback, boolean bindInstantServiceAllowed, boolean verbose) { - super(context, serviceInterface, componentName, userId, callback, bindInstantServiceAllowed, + super(context, serviceInterface, componentName, userId, callback, + context.getMainThreadHandler(), bindInstantServiceAllowed, verbose, /* initialCapacity= */ 1); } diff --git a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java index a38c3cf9975e..aaba1edc73d6 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java @@ -55,7 +55,7 @@ final class RemoteAugmentedAutofillService boolean bindInstantServiceAllowed, boolean verbose, int idleUnbindTimeoutMs, int requestTimeoutMs) { super(context, AugmentedAutofillService.SERVICE_INTERFACE, serviceName, userId, callbacks, - bindInstantServiceAllowed, verbose); + context.getMainThreadHandler(), bindInstantServiceAllowed, verbose); mIdleUnbindTimeoutMs = idleUnbindTimeoutMs; mRequestTimeoutMs = requestTimeoutMs; diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java index e8a52b4a12a9..b8a7d44a4d10 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java @@ -64,7 +64,7 @@ final class RemoteFillService RemoteFillService(Context context, ComponentName componentName, int userId, FillServiceCallbacks callbacks, boolean bindInstantServiceAllowed) { super(context, AutofillService.SERVICE_INTERFACE, componentName, userId, callbacks, - bindInstantServiceAllowed, sVerbose); + context.getMainThreadHandler(), bindInstantServiceAllowed, sVerbose); mCallbacks = callbacks; } diff --git a/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java b/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java index f7ac7b8c61b2..1d2d6254f759 100644 --- a/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java +++ b/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java @@ -46,7 +46,8 @@ final class RemoteContentCaptureService ContentCaptureServiceCallbacks callbacks, boolean bindInstantServiceAllowed, boolean verbose, int idleUnbindTimeoutMs) { super(context, serviceInterface, serviceComponentName, userId, callbacks, - bindInstantServiceAllowed, verbose, /* initialCapacity= */ 2); + context.getMainThreadHandler(), bindInstantServiceAllowed, verbose, + /* initialCapacity= */ 2); mServerCallback = callback.asBinder(); mIdleUnbindTimeoutMs = idleUnbindTimeoutMs; diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerServiceShellCommand.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerServiceShellCommand.java index e34f1eadcd02..08cc69d8f505 100644 --- a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerServiceShellCommand.java +++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerServiceShellCommand.java @@ -43,29 +43,13 @@ public class ContentSuggestionsManagerServiceShellCommand extends ShellCommand { } final PrintWriter pw = getOutPrintWriter(); switch (cmd) { - case "set": { - final String what = getNextArgRequired(); - switch (what) { - case "temporary-service": { - final int userId = Integer.parseInt(getNextArgRequired()); - String serviceName = getNextArg(); - if (serviceName == null) { - mService.resetTemporaryService(userId); - return 0; - } - final int duration = Integer.parseInt(getNextArgRequired()); - mService.setTemporaryService(userId, serviceName, duration); - pw.println("ContentSuggestionsService temporarily set to " + serviceName - + " for " + duration + "ms"); - break; - } - } - } - break; + case "set": + return requestSet(pw); + case "get": + return requestGet(pw); default: return handleDefaultCommands(cmd); } - return 0; } @Override @@ -76,9 +60,72 @@ public class ContentSuggestionsManagerServiceShellCommand extends ShellCommand { pw.println(" Prints this help text."); pw.println(""); pw.println(" set temporary-service USER_ID [COMPONENT_NAME DURATION]"); - pw.println(" Temporarily (for DURATION ms) changes the service implemtation."); + pw.println(" Temporarily (for DURATION ms) changes the service implementation."); pw.println(" To reset, call with just the USER_ID argument."); pw.println(""); + pw.println(" set default-service-enabled USER_ID [true|false]"); + pw.println(" Enable / disable the default service for the user."); + pw.println(""); + pw.println(" get default-service-enabled USER_ID"); + pw.println(" Checks whether the default service is enabled for the user."); + pw.println(""); + } + } + + private int requestSet(PrintWriter pw) { + final String what = getNextArgRequired(); + + switch(what) { + case "temporary-service": + return setTemporaryService(pw); + case "default-service-enabled": + return setDefaultServiceEnabled(); + default: + pw.println("Invalid set: " + what); + return -1; + } + } + + private int requestGet(PrintWriter pw) { + final String what = getNextArgRequired(); + switch(what) { + case "default-service-enabled": + return getDefaultServiceEnabled(pw); + default: + pw.println("Invalid get: " + what); + return -1; } } + + private int setTemporaryService(PrintWriter pw) { + final int userId = Integer.parseInt(getNextArgRequired()); + String serviceName = getNextArg(); + if (serviceName == null) { + mService.resetTemporaryService(userId); + return 0; + } + final int duration = Integer.parseInt(getNextArgRequired()); + mService.setTemporaryService(userId, serviceName, duration); + pw.println("ContentSuggestionsService temporarily set to " + serviceName + + " for " + duration + "ms"); + return 0; + } + + private int setDefaultServiceEnabled() { + final int userId = getNextIntArgRequired(); + final boolean enabled = Boolean.parseBoolean(getNextArg()); + mService.setDefaultServiceEnabled(userId, enabled); + return 0; + } + + private int getDefaultServiceEnabled(PrintWriter pw) { + final int userId = getNextIntArgRequired(); + final boolean enabled = mService.isDefaultServiceEnabled(userId); + pw.println(enabled); + return 0; + } + + private int getNextIntArgRequired() { + return Integer.parseInt(getNextArgRequired()); + } } diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/RemoteContentSuggestionsService.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/RemoteContentSuggestionsService.java index bf48d7623255..442972a1e477 100644 --- a/services/contentsuggestions/java/com/android/server/contentsuggestions/RemoteContentSuggestionsService.java +++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/RemoteContentSuggestionsService.java @@ -47,7 +47,8 @@ public class RemoteContentSuggestionsService extends int userId, Callbacks callbacks, boolean bindInstantServiceAllowed, boolean verbose) { super(context, ContentSuggestionsService.SERVICE_INTERFACE, serviceName, userId, callbacks, - bindInstantServiceAllowed, verbose, /* initialCapacity= */ 1); + context.getMainThreadHandler(), bindInstantServiceAllowed, verbose, + /* initialCapacity= */ 1); } @Override diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 219e04659581..199477ce26c9 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -71,6 +71,7 @@ import android.net.INetworkMonitorCallbacks; import android.net.INetworkPolicyListener; import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; +import android.net.ITetheringEventCallback; import android.net.InetAddresses; import android.net.IpPrefix; import android.net.LinkProperties; @@ -3798,6 +3799,22 @@ public class ConnectivityService extends IConnectivityManager.Stub mTethering.getLatestTetheringEntitlementResult(type, receiver, showEntitlementUi); } + /** Register tethering event callback. */ + @Override + public void registerTetheringEventCallback(ITetheringEventCallback callback, + String callerPkg) { + ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg); + mTethering.registerTetheringEventCallback(callback); + } + + /** Unregister tethering event callback. */ + @Override + public void unregisterTetheringEventCallback(ITetheringEventCallback callback, + String callerPkg) { + ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg); + mTethering.unregisterTetheringEventCallback(callback); + } + // Called when we lose the default network and have no replacement yet. // This will automatically be cleared after X seconds or a new default network // becomes CONNECTED, whichever happens first. The timer is started by the diff --git a/services/core/java/com/android/server/DynamicAndroidService.java b/services/core/java/com/android/server/DynamicAndroidService.java index 12a3f02325d2..8488941587fb 100644 --- a/services/core/java/com/android/server/DynamicAndroidService.java +++ b/services/core/java/com/android/server/DynamicAndroidService.java @@ -118,7 +118,9 @@ public class DynamicAndroidService extends IDynamicAndroidService.Stub implement if (gsiService.isGsiRunning()) { return gsiService.disableGsiInstall(); } else { - return gsiService.setGsiBootable() == 0; + final int status = gsiService.getGsiBootStatus(); + final boolean singleBoot = (status == IGsiService.BOOT_STATUS_SINGLE_BOOT); + return gsiService.setGsiBootable(singleBoot) == 0; } } @@ -129,6 +131,6 @@ public class DynamicAndroidService extends IDynamicAndroidService.Stub implement @Override public boolean commit() throws RemoteException { - return getGsiService().setGsiBootable() == 0; + return getGsiService().setGsiBootable(true) == 0; } } diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index bbd51ad2743e..c2a06117cf14 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -3210,18 +3210,6 @@ public class LocationManagerService extends ILocationManager.Stub { continue; } - if (!reportLocationAccessNoThrow( - receiver.mCallerIdentity.mPid, - receiver.mCallerIdentity.mUid, - receiver.mCallerIdentity.mPackageName, - receiver.mAllowedResolutionLevel)) { - if (D) { - Log.d(TAG, "skipping loc update for no op app: " + - receiver.mCallerIdentity.mPackageName); - } - continue; - } - Location notifyLocation; if (receiver.mAllowedResolutionLevel < RESOLUTION_LEVEL_FINE) { notifyLocation = coarseLocation; // use coarse location @@ -3238,6 +3226,20 @@ public class LocationManagerService extends ILocationManager.Stub { } else { lastLoc.set(notifyLocation); } + // Report location access before delivering location to the client. This will + // note location delivery to appOps, so it should be called only when a + // location is really being delivered to the client. + if (!reportLocationAccessNoThrow( + receiver.mCallerIdentity.mPid, + receiver.mCallerIdentity.mUid, + receiver.mCallerIdentity.mPackageName, + receiver.mAllowedResolutionLevel)) { + if (D) { + Log.d(TAG, "skipping loc update for no op app: " + + receiver.mCallerIdentity.mPackageName); + } + continue; + } if (!receiver.callLocationChangedLocked(notifyLocation)) { Slog.w(TAG, "RemoteException calling onLocationChanged on " + receiver); diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index dc394d0ad482..5582ad77c731 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -2512,6 +2512,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub modifyRoute(MODIFY_OPERATION_ADD, INetd.LOCAL_NET_ID, route); } } + + // IPv6 link local should be activated always. + modifyRoute(MODIFY_OPERATION_ADD, INetd.LOCAL_NET_ID, + new RouteInfo(new IpPrefix("fe80::/64"), null, iface)); } @Override diff --git a/services/core/java/com/android/server/TestNetworkService.java b/services/core/java/com/android/server/TestNetworkService.java new file mode 100644 index 000000000000..e64ab78d1ed2 --- /dev/null +++ b/services/core/java/com/android/server/TestNetworkService.java @@ -0,0 +1,338 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server; + +import static com.android.internal.util.Preconditions.checkNotNull; + +import android.annotation.NonNull; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.INetd; +import android.net.ITestNetworkManager; +import android.net.IpPrefix; +import android.net.LinkAddress; +import android.net.LinkProperties; +import android.net.NetworkAgent; +import android.net.NetworkCapabilities; +import android.net.NetworkInfo; +import android.net.NetworkInfo.DetailedState; +import android.net.RouteInfo; +import android.net.StringNetworkSpecifier; +import android.net.TestNetworkInterface; +import android.net.util.NetdService; +import android.os.Binder; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.INetworkManagementService; +import android.os.Looper; +import android.os.ParcelFileDescriptor; +import android.os.RemoteException; +import android.util.SparseArray; + +import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; + +import java.io.UncheckedIOException; +import java.net.Inet4Address; +import java.net.Inet6Address; +import java.net.InterfaceAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.concurrent.atomic.AtomicInteger; + +/** @hide */ +class TestNetworkService extends ITestNetworkManager.Stub { + @NonNull private static final String TAG = TestNetworkService.class.getSimpleName(); + @NonNull private static final String TEST_NETWORK_TYPE = "TEST_NETWORK"; + @NonNull private static final String TEST_TUN_PREFIX = "testtun"; + @NonNull private static final AtomicInteger sTestTunIndex = new AtomicInteger(); + + @NonNull private final Context mContext; + @NonNull private final INetworkManagementService mNMS; + @NonNull private final INetd mNetd; + + @NonNull private final HandlerThread mHandlerThread; + @NonNull private final Handler mHandler; + + // Native method stubs + private static native int jniCreateTun(@NonNull String iface); + + @VisibleForTesting + protected TestNetworkService( + @NonNull Context context, @NonNull INetworkManagementService netManager) { + mHandlerThread = new HandlerThread("TestNetworkServiceThread"); + mHandlerThread.start(); + mHandler = new Handler(mHandlerThread.getLooper()); + + mContext = checkNotNull(context, "missing Context"); + mNMS = checkNotNull(netManager, "missing INetworkManagementService"); + mNetd = checkNotNull(NetdService.getInstance(), "could not get netd instance"); + } + + /** + * Create a TUN interface with the given interface name and link addresses + * + * <p>This method will return the FileDescriptor to the TUN interface. Close it to tear down the + * TUN interface. + */ + @Override + public TestNetworkInterface createTunInterface(@NonNull LinkAddress[] linkAddrs) { + enforceTestNetworkPermissions(mContext); + + checkNotNull(linkAddrs, "missing linkAddrs"); + + String iface = TEST_TUN_PREFIX + sTestTunIndex.getAndIncrement(); + return Binder.withCleanCallingIdentity( + () -> { + try { + ParcelFileDescriptor tunIntf = + ParcelFileDescriptor.adoptFd(jniCreateTun(iface)); + for (LinkAddress addr : linkAddrs) { + mNetd.interfaceAddAddress( + iface, + addr.getAddress().getHostAddress(), + addr.getPrefixLength()); + } + + return new TestNetworkInterface(tunIntf, iface); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + }); + } + + // Tracker for TestNetworkAgents + @GuardedBy("mTestNetworkTracker") + @NonNull + private final SparseArray<TestNetworkAgent> mTestNetworkTracker = new SparseArray<>(); + + public class TestNetworkAgent extends NetworkAgent implements IBinder.DeathRecipient { + private static final int NETWORK_SCORE = 1; // Use a low, non-zero score. + + private final int mUid; + @NonNull private final NetworkInfo mNi; + @NonNull private final NetworkCapabilities mNc; + @NonNull private final LinkProperties mLp; + + @GuardedBy("mBinderLock") + @NonNull + private IBinder mBinder; + + @NonNull private final Object mBinderLock = new Object(); + + private TestNetworkAgent( + @NonNull Looper looper, + @NonNull Context context, + @NonNull NetworkInfo ni, + @NonNull NetworkCapabilities nc, + @NonNull LinkProperties lp, + int uid, + @NonNull IBinder binder) + throws RemoteException { + super(looper, context, TEST_NETWORK_TYPE, ni, nc, lp, NETWORK_SCORE); + + mUid = uid; + mNi = ni; + mNc = nc; + mLp = lp; + + synchronized (mBinderLock) { + mBinder = binder; // Binder null-checks in create() + + try { + mBinder.linkToDeath(this, 0); + } catch (RemoteException e) { + binderDied(); + throw e; // Abort, signal failure up the stack. + } + } + } + + /** + * If the Binder object dies, this function is called to free the resources of this + * TestNetworkAgent + */ + @Override + public void binderDied() { + teardown(); + } + + @Override + protected void unwanted() { + teardown(); + } + + private void teardown() { + mNi.setDetailedState(DetailedState.DISCONNECTED, null, null); + mNi.setIsAvailable(false); + sendNetworkInfo(mNi); + + // Synchronize on mBinderLock to ensure that unlinkToDeath is never called more than + // once (otherwise it could throw an exception) + synchronized (mBinderLock) { + // If mBinder is null, this Test Network has already been cleaned up. + if (mBinder == null) return; + mBinder.unlinkToDeath(this, 0); + mBinder = null; + } + + // Has to be in TestNetworkAgent to ensure all teardown codepaths properly clean up + // resources, even for binder death or unwanted calls. + synchronized (mTestNetworkTracker) { + mTestNetworkTracker.remove(netId); + } + } + } + + private TestNetworkAgent registerTestNetworkAgent( + @NonNull Looper looper, + @NonNull Context context, + @NonNull String iface, + int callingUid, + @NonNull IBinder binder) + throws RemoteException, SocketException { + checkNotNull(looper, "missing Looper"); + checkNotNull(context, "missing Context"); + // iface and binder validity checked by caller + + // Build network info with special testing type + NetworkInfo ni = new NetworkInfo(ConnectivityManager.TYPE_TEST, 0, TEST_NETWORK_TYPE, ""); + ni.setDetailedState(DetailedState.CONNECTED, null, null); + ni.setIsAvailable(true); + + // Build narrow set of NetworkCapabilities, useful only for testing + NetworkCapabilities nc = new NetworkCapabilities(); + nc.clearAll(); // Remove default capabilities. + nc.addTransportType(NetworkCapabilities.TRANSPORT_TEST); + nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED); + nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); + nc.setNetworkSpecifier(new StringNetworkSpecifier(iface)); + + // Build LinkProperties + LinkProperties lp = new LinkProperties(); + lp.setInterfaceName(iface); + + // Find the currently assigned addresses, and add them to LinkProperties + boolean allowIPv4 = false, allowIPv6 = false; + NetworkInterface netIntf = NetworkInterface.getByName(iface); + checkNotNull(netIntf, "No such network interface found: " + netIntf); + + for (InterfaceAddress intfAddr : netIntf.getInterfaceAddresses()) { + lp.addLinkAddress( + new LinkAddress(intfAddr.getAddress(), intfAddr.getNetworkPrefixLength())); + + if (intfAddr.getAddress() instanceof Inet6Address) { + allowIPv6 |= !intfAddr.getAddress().isLinkLocalAddress(); + } else if (intfAddr.getAddress() instanceof Inet4Address) { + allowIPv4 = true; + } + } + + // Add global routes (but as non-default, non-internet providing network) + if (allowIPv4) { + lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null, iface)); + } + if (allowIPv6) { + lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null, iface)); + } + + return new TestNetworkAgent(looper, context, ni, nc, lp, callingUid, binder); + } + + /** + * Sets up a Network with extremely limited privileges, guarded by the MANAGE_TEST_NETWORKS + * permission. + * + * <p>This method provides a Network that is useful only for testing. + */ + @Override + public void setupTestNetwork(@NonNull String iface, @NonNull IBinder binder) { + enforceTestNetworkPermissions(mContext); + + checkNotNull(iface, "missing Iface"); + checkNotNull(binder, "missing IBinder"); + + if (!(iface.startsWith(INetd.IPSEC_INTERFACE_PREFIX) + || iface.startsWith(TEST_TUN_PREFIX))) { + throw new IllegalArgumentException( + "Cannot create network for non ipsec, non-testtun interface"); + } + + // Setup needs to be done with NETWORK_STACK privileges. + int callingUid = Binder.getCallingUid(); + Binder.withCleanCallingIdentity( + () -> { + try { + mNMS.setInterfaceUp(iface); + + // Synchronize all accesses to mTestNetworkTracker to prevent the case + // where: + // 1. TestNetworkAgent successfully binds to death of binder + // 2. Before it is added to the mTestNetworkTracker, binder dies, + // binderDied() is called (on a different thread) + // 3. This thread is pre-empted, put() is called after remove() + synchronized (mTestNetworkTracker) { + TestNetworkAgent agent = + registerTestNetworkAgent( + mHandler.getLooper(), + mContext, + iface, + callingUid, + binder); + + mTestNetworkTracker.put(agent.netId, agent); + } + } catch (SocketException e) { + throw new UncheckedIOException(e); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + }); + } + + /** Teardown a test network */ + @Override + public void teardownTestNetwork(int netId) { + enforceTestNetworkPermissions(mContext); + + TestNetworkAgent agent; + synchronized (mTestNetworkTracker) { + agent = mTestNetworkTracker.get(netId); + } + + if (agent == null) { + return; // Already torn down + } else if (agent.mUid != Binder.getCallingUid()) { + throw new SecurityException("Attempted to modify other user's test networks"); + } + + // Safe to be called multiple times. + agent.teardown(); + } + + // STOPSHIP: Change this back to android.Manifest.permission.MANAGE_TEST_NETWORKS + private static final String PERMISSION_NAME = "dummy"; + + public static void enforceTestNetworkPermissions(@NonNull Context context) { + // STOPSHIP: Re-enable these checks. Disabled until adoptShellPermissionIdentity() can be + // called from CTS test code. + if (false) { + context.enforceCallingOrSelfPermission(PERMISSION_NAME, "TestNetworkService"); + } + } +} diff --git a/services/core/java/com/android/server/attention/AttentionManagerService.java b/services/core/java/com/android/server/attention/AttentionManagerService.java index 47c9b8639760..5965d592cf4f 100644 --- a/services/core/java/com/android/server/attention/AttentionManagerService.java +++ b/services/core/java/com/android/server/attention/AttentionManagerService.java @@ -127,8 +127,7 @@ public class AttentionManagerService extends SystemService { } private boolean isServiceEnabled() { - final String enabled = DeviceConfig.getProperty(NAMESPACE, SERVICE_ENABLED); - return enabled == null ? DEFAULT_SERVICE_ENABLED : "true".equals(enabled); + return DeviceConfig.getBoolean(NAMESPACE, SERVICE_ENABLED, DEFAULT_SERVICE_ENABLED); } /** diff --git a/services/core/java/com/android/server/connectivity/PacManager.java b/services/core/java/com/android/server/connectivity/PacManager.java index 97896889f243..1ac09ad462a1 100644 --- a/services/core/java/com/android/server/connectivity/PacManager.java +++ b/services/core/java/com/android/server/connectivity/PacManager.java @@ -70,9 +70,8 @@ public class PacManager { private static final long MAX_PAC_SIZE = 20 * 1000 * 1000; // Return values for #setCurrentProxyScriptUrl - enum ToSendOrNotToSendBroadcast { - DONT_SEND_BROADCAST, DO_SEND_BROADCAST - } + public static final boolean DONT_SEND_BROADCAST = false; + public static final boolean DO_SEND_BROADCAST = true; private String mCurrentPac; @GuardedBy("mProxyLock") @@ -176,11 +175,11 @@ public class PacManager { * @param proxy Proxy information that is about to be broadcast. * @return Returns whether the broadcast should be sent : either DO_ or DONT_SEND_BROADCAST */ - synchronized ToSendOrNotToSendBroadcast setCurrentProxyScriptUrl(ProxyInfo proxy) { + synchronized boolean setCurrentProxyScriptUrl(ProxyInfo proxy) { if (!Uri.EMPTY.equals(proxy.getPacFileUrl())) { if (proxy.getPacFileUrl().equals(mPacUrl) && (proxy.getPort() > 0)) { // Allow to send broadcast, nothing to do. - return ToSendOrNotToSendBroadcast.DO_SEND_BROADCAST; + return DO_SEND_BROADCAST; } mPacUrl = proxy.getPacFileUrl(); mCurrentDelay = DELAY_1; @@ -188,7 +187,7 @@ public class PacManager { mHasDownloaded = false; getAlarmManager().cancel(mPacRefreshIntent); bind(); - return ToSendOrNotToSendBroadcast.DONT_SEND_BROADCAST; + return DONT_SEND_BROADCAST; } else { getAlarmManager().cancel(mPacRefreshIntent); synchronized (mProxyLock) { @@ -204,7 +203,7 @@ public class PacManager { } } } - return ToSendOrNotToSendBroadcast.DO_SEND_BROADCAST; + return DO_SEND_BROADCAST; } } diff --git a/services/core/java/com/android/server/connectivity/ProxyTracker.java b/services/core/java/com/android/server/connectivity/ProxyTracker.java index a671287324af..e715890fb211 100644 --- a/services/core/java/com/android/server/connectivity/ProxyTracker.java +++ b/services/core/java/com/android/server/connectivity/ProxyTracker.java @@ -208,8 +208,7 @@ public class ProxyTracker { public void sendProxyBroadcast() { final ProxyInfo defaultProxy = getDefaultProxy(); final ProxyInfo proxyInfo = null != defaultProxy ? defaultProxy : new ProxyInfo("", 0, ""); - if (mPacManager.setCurrentProxyScriptUrl(proxyInfo) - == PacManager.ToSendOrNotToSendBroadcast.DONT_SEND_BROADCAST) { + if (mPacManager.setCurrentProxyScriptUrl(proxyInfo) == PacManager.DONT_SEND_BROADCAST) { return; } if (DBG) Slog.d(TAG, "sending Proxy Broadcast for " + proxyInfo); diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 3b4b6f85372b..35704d404ff3 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -62,6 +62,7 @@ import android.content.res.Resources; import android.hardware.usb.UsbManager; import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; +import android.net.ITetheringEventCallback; import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; @@ -82,6 +83,7 @@ import android.os.INetworkManagementService; import android.os.Looper; import android.os.Message; import android.os.Parcel; +import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.UserHandle; @@ -184,6 +186,9 @@ public class Tethering extends BaseNetworkObserver { private final VersionedBroadcastListener mDefaultSubscriptionChange; private final TetheringDependencies mDeps; private final EntitlementManager mEntitlementMgr; + private final Handler mHandler; + private final RemoteCallbackList<ITetheringEventCallback> mTetheringEventCallbacks = + new RemoteCallbackList<>(); private volatile TetheringConfiguration mConfig; private InterfaceSet mCurrentUpstreamIfaceSet; @@ -193,6 +198,7 @@ public class Tethering extends BaseNetworkObserver { private boolean mRndisEnabled; // track the RNDIS function enabled state // True iff. WiFi tethering should be started when soft AP is ready. private boolean mWifiTetherRequested; + private Network mTetherUpstream; public Tethering(Context context, INetworkManagementService nmService, INetworkStatsService statsService, INetworkPolicyManager policyManager, @@ -213,9 +219,9 @@ public class Tethering extends BaseNetworkObserver { mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper, deps); mTetherMasterSM.start(); - final Handler smHandler = mTetherMasterSM.getHandler(); - mOffloadController = new OffloadController(smHandler, - mDeps.getOffloadHardwareInterface(smHandler, mLog), + mHandler = mTetherMasterSM.getHandler(); + mOffloadController = new OffloadController(mHandler, + mDeps.getOffloadHardwareInterface(mHandler, mLog), mContext.getContentResolver(), mNMService, mLog); mUpstreamNetworkMonitor = deps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog, @@ -227,7 +233,7 @@ public class Tethering extends BaseNetworkObserver { mEntitlementMgr = mDeps.getEntitlementManager(mContext, mTetherMasterSM, mLog, systemProperties); mCarrierConfigChange = new VersionedBroadcastListener( - "CarrierConfigChangeListener", mContext, smHandler, filter, + "CarrierConfigChangeListener", mContext, mHandler, filter, (Intent ignored) -> { mLog.log("OBSERVED carrier config change"); updateConfiguration(); @@ -237,7 +243,7 @@ public class Tethering extends BaseNetworkObserver { filter = new IntentFilter(); filter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED); mDefaultSubscriptionChange = new VersionedBroadcastListener( - "DefaultSubscriptionChangeListener", mContext, smHandler, filter, + "DefaultSubscriptionChangeListener", mContext, mHandler, filter, (Intent ignored) -> { mLog.log("OBSERVED default data subscription change"); updateConfiguration(); @@ -248,14 +254,13 @@ public class Tethering extends BaseNetworkObserver { // Load tethering configuration. updateConfiguration(); - startStateMachineUpdaters(); + startStateMachineUpdaters(mHandler); } - private void startStateMachineUpdaters() { + private void startStateMachineUpdaters(Handler handler) { mCarrierConfigChange.startListening(); mDefaultSubscriptionChange.startListening(); - final Handler handler = mTetherMasterSM.getHandler(); IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_STATE); filter.addAction(CONNECTIVITY_ACTION); @@ -1229,8 +1234,13 @@ public class Tethering extends BaseNetworkObserver { sendMessageDelayed(CMD_RETRY_UPSTREAM, UPSTREAM_SETTLE_TIME_MS); } } - mUpstreamNetworkMonitor.setCurrentUpstream((ns != null) ? ns.network : null); setUpstreamNetwork(ns); + final Network newUpstream = (ns != null) ? ns.network : null; + if (mTetherUpstream != newUpstream) { + mTetherUpstream = newUpstream; + mUpstreamNetworkMonitor.setCurrentUpstream(mTetherUpstream); + reportUpstreamChanged(mTetherUpstream); + } } protected void setUpstreamNetwork(NetworkState ns) { @@ -1413,6 +1423,10 @@ public class Tethering extends BaseNetworkObserver { mUpstreamNetworkMonitor.stop(); notifyDownstreamsOfNewUpstreamIface(null); handleNewUpstreamNetworkState(null); + if (mTetherUpstream != null) { + mTetherUpstream = null; + reportUpstreamChanged(null); + } } private boolean updateUpstreamWanted() { @@ -1684,6 +1698,40 @@ public class Tethering extends BaseNetworkObserver { } } + /** Register tethering event callback */ + public void registerTetheringEventCallback(ITetheringEventCallback callback) { + mHandler.post(() -> { + try { + callback.onUpstreamChanged(mTetherUpstream); + } catch (RemoteException e) { + // Not really very much to do here. + } + mTetheringEventCallbacks.register(callback); + }); + } + + /** Unregister tethering event callback */ + public void unregisterTetheringEventCallback(ITetheringEventCallback callback) { + mHandler.post(() -> { + mTetheringEventCallbacks.unregister(callback); + }); + } + + private void reportUpstreamChanged(Network network) { + final int length = mTetheringEventCallbacks.beginBroadcast(); + try { + for (int i = 0; i < length; i++) { + try { + mTetheringEventCallbacks.getBroadcastItem(i).onUpstreamChanged(network); + } catch (RemoteException e) { + // Not really very much to do here. + } + } + } finally { + mTetheringEventCallbacks.finishBroadcast(); + } + } + @Override public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { // Binder.java closes the resource for us. diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 59fffb40fba7..8005dda3faf9 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1842,6 +1842,7 @@ public class Vpn { config.interfaze = iface; config.session = profile.name; config.isMetered = false; + config.proxyInfo = profile.proxy; config.addLegacyRoutes(profile.routes); if (!profile.dnsServers.isEmpty()) { diff --git a/services/core/java/com/android/server/display/color/ColorDisplayService.java b/services/core/java/com/android/server/display/color/ColorDisplayService.java index b1e5510b3adc..23117760f45f 100644 --- a/services/core/java/com/android/server/display/color/ColorDisplayService.java +++ b/services/core/java/com/android/server/display/color/ColorDisplayService.java @@ -1276,11 +1276,17 @@ public final class ColorDisplayService extends SystemService { } boolean isActivatedSetting() { + if (mCurrentUser == UserHandle.USER_NULL) { + return false; + } return Secure.getIntForUser(getContext().getContentResolver(), Secure.NIGHT_DISPLAY_ACTIVATED, 0, mCurrentUser) == 1; } int getColorTemperatureSetting() { + if (mCurrentUser == UserHandle.USER_NULL) { + return NOT_SET; + } return clampNightDisplayColorTemperature(Secure.getIntForUser( getContext().getContentResolver(), Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE, NOT_SET, diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 3052330e33bd..2c361e1f24af 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -949,7 +949,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } - class ImmsBroadcastReceiver extends BroadcastReceiver { + /** + * {@link BroadcastReceiver} that is intended to listen to broadcasts sent to the system user + * only. + */ + private final class ImmsBroadcastReceiverForSystemUser extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); @@ -977,6 +981,35 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } /** + * {@link BroadcastReceiver} that is intended to listen to broadcasts sent to all the users. + */ + private final class ImmsBroadcastReceiverForAllUsers extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) { + final PendingResult pendingResult = getPendingResult(); + if (pendingResult == null) { + return; + } + // sender userId can be a real user ID or USER_ALL. + final int senderUserId = pendingResult.getSendingUserId(); + if (senderUserId != UserHandle.USER_ALL) { + final int resolvedUserId = PER_PROFILE_IME_ENABLED + ? senderUserId : mUserManagerInternal.getProfileParentId(senderUserId); + if (resolvedUserId != mSettings.getCurrentUserId()) { + // A background user is trying to hide the dialog. Ignore. + return; + } + } + hideInputMethodMenu(); + } else { + Slog.w(TAG, "Unexpected intent " + intent); + } + } + } + + /** * Handles {@link Intent#ACTION_LOCALE_CHANGED}. * * <p>Note: For historical reasons, {@link Intent#ACTION_LOCALE_CHANGED} has been sent to all @@ -1544,36 +1577,18 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mMyPackageMonitor.register(mContext, null, UserHandle.ALL, true); mSettingsObserver.registerContentObserverLocked(currentUserId); - final IntentFilter broadcastFilter = new IntentFilter(); - broadcastFilter.addAction(Intent.ACTION_USER_ADDED); - broadcastFilter.addAction(Intent.ACTION_USER_REMOVED); - broadcastFilter.addAction(Intent.ACTION_LOCALE_CHANGED); - broadcastFilter.addAction(ACTION_SHOW_INPUT_METHOD_PICKER); - mContext.registerReceiver(new ImmsBroadcastReceiver(), broadcastFilter); - mContext.registerReceiverAsUser( - new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - // Intent is guaranteed to be ACTION_CLOSE_SYSTEM_DIALOGS here. - final PendingResult pendingResult = getPendingResult(); - if (pendingResult == null) { - return; - } - // sender userId can be a real user ID or USER_ALL. - final int senderUserId = pendingResult.getSendingUserId(); - if (senderUserId != UserHandle.USER_ALL) { - final int resolvedUserId = PER_PROFILE_IME_ENABLED - ? senderUserId - : mUserManagerInternal.getProfileParentId(senderUserId); - if (resolvedUserId != mSettings.getCurrentUserId()) { - // A background user is trying to hide the dialog. Ignore. - return; - } - } - hideInputMethodMenu(); - } - }, UserHandle.ALL, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), - null, null); + final IntentFilter broadcastFilterForSystemUser = new IntentFilter(); + broadcastFilterForSystemUser.addAction(Intent.ACTION_USER_ADDED); + broadcastFilterForSystemUser.addAction(Intent.ACTION_USER_REMOVED); + broadcastFilterForSystemUser.addAction(Intent.ACTION_LOCALE_CHANGED); + broadcastFilterForSystemUser.addAction(ACTION_SHOW_INPUT_METHOD_PICKER); + mContext.registerReceiver(new ImmsBroadcastReceiverForSystemUser(), + broadcastFilterForSystemUser); + + final IntentFilter broadcastFilterForAllUsers = new IntentFilter(); + broadcastFilterForAllUsers.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); + mContext.registerReceiverAsUser(new ImmsBroadcastReceiverForAllUsers(), + UserHandle.ALL, broadcastFilterForAllUsers, null, null); final String defaultImiId = mSettings.getSelectedInputMethod(); final boolean imeSelectedOnBoot = !TextUtils.isEmpty(defaultImiId); diff --git a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java index 500c388ec99e..a2515c8bb8cc 100644 --- a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java @@ -29,6 +29,8 @@ import android.annotation.Nullable; import android.annotation.UserIdInt; import android.annotation.WorkerThread; import android.app.AppOpsManager; +import android.app.Notification; +import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -44,6 +46,7 @@ import android.inputmethodservice.MultiClientInputMethodServiceDelegate; import android.net.Uri; import android.os.Binder; import android.os.Build; +import android.os.Bundle; import android.os.Debug; import android.os.Handler; import android.os.HandlerThread; @@ -66,6 +69,7 @@ import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.InputMethodSystemProperty; +import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.inputmethod.IMultiClientInputMethod; import com.android.internal.inputmethod.IMultiClientInputMethodPrivilegedOperations; @@ -73,6 +77,8 @@ import com.android.internal.inputmethod.IMultiClientInputMethodSession; import com.android.internal.inputmethod.StartInputFlags; import com.android.internal.inputmethod.StartInputReason; import com.android.internal.inputmethod.UnbindReason; +import com.android.internal.messages.nano.SystemMessageProto; +import com.android.internal.notification.SystemNotificationChannels; import com.android.internal.util.function.pooled.PooledLambda; import com.android.internal.view.IInputContext; import com.android.internal.view.IInputMethodClient; @@ -96,8 +102,15 @@ import java.util.WeakHashMap; * we can switch the implementation at the boot time.</p> */ public final class MultiClientInputMethodManagerService { - static final String TAG = "MultiClientInputMethodManagerService"; - static final boolean DEBUG = false; + private static final String TAG = "MultiClientInputMethodManagerService"; + private static final boolean DEBUG = false; + + private static final String PER_DISPLAY_FOCUS_DISABLED_WARNING_TITLE = + "config_perDisplayFocusEnabled is not true."; + + private static final String PER_DISPLAY_FOCUS_DISABLED_WARNING_MSG = + "Consider rebuilding the system image after enabling config_perDisplayFocusEnabled to " + + "make IME focus compatible with multi-client IME mode."; private static final long RECONNECT_DELAY_MSEC = 1000; @@ -465,8 +478,33 @@ public final class MultiClientInputMethodManagerService { onPackageAdded(intent); } }, filter, null, mHandler); + break; + } + case SystemService.PHASE_BOOT_COMPLETED: { + final boolean perDisplayFocusEnabled = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_perDisplayFocusEnabled); + if (!perDisplayFocusEnabled) { + final Bundle extras = new Bundle(); + extras.putBoolean(Notification.EXTRA_ALLOW_DURING_SETUP, true); + mContext.getSystemService(NotificationManager.class).notifyAsUser(TAG, + SystemMessageProto.SystemMessage.NOTE_SELECT_INPUT_METHOD, + new Notification.Builder(mContext, + SystemNotificationChannels.VIRTUAL_KEYBOARD) + .setContentTitle(PER_DISPLAY_FOCUS_DISABLED_WARNING_TITLE) + .setStyle(new Notification.BigTextStyle() + .bigText(PER_DISPLAY_FOCUS_DISABLED_WARNING_MSG)) + .setSmallIcon(R.drawable.ic_notification_ime_default) + .setWhen(0) + .setOngoing(true) + .setLocalOnly(true) + .addExtras(extras) + .setCategory(Notification.CATEGORY_SYSTEM) + .setColor(mContext.getColor( + R.color.system_notification_accent_color)) + .build(), UserHandle.ALL); + } + break; } - break; } } diff --git a/services/core/java/com/android/server/inputmethod/multi-client-ime.md b/services/core/java/com/android/server/inputmethod/multi-client-ime.md index 3021d2faae30..ba92cd2d4690 100644 --- a/services/core/java/com/android/server/inputmethod/multi-client-ime.md +++ b/services/core/java/com/android/server/inputmethod/multi-client-ime.md @@ -39,7 +39,9 @@ Thus the first decision we made was that to support such special multi-display e ## How to test -On AOSP-based development devices (e.g. phones) where `android.os.Build.IS_DEBUGGABLE` returns `true` and you can have root access, you can enable multi-client IME feature by setting a valid component name that supports multi-client IME protocol to the system property `persist.debug.multi_client_ime`. Reboot is required for this to take effect. +For multi-client IME to properly work, an internal boolean resource `com.android.internal.R.bool.config_perDisplayFocusEnabled` needs to be `true`. Since this value cannot be overridden at the run time, you may need to rebuild the system image to enable per-display focus mode. + +As for multi-client IME mode itself, you can enable multi-client IME mode just by setting a valid component name that supports multi-client IME protocol to the system property `persist.debug.multi_client_ime`, as long as `android.os.Build.IS_DEBUGGABLE` returns `true` and you can have root access. Reboot is required for this to take effect. ```shell # Build and install a sample multi-client IME diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java index 4f8b1dcc6bb4..62553067996d 100644 --- a/services/core/java/com/android/server/job/JobStore.java +++ b/services/core/java/com/android/server/job/JobStore.java @@ -174,6 +174,7 @@ public final class JobStore { public void getRtcCorrectedJobsLocked(final ArrayList<JobStatus> toAdd, final ArrayList<JobStatus> toRemove) { final long elapsedNow = sElapsedRealtimeClock.millis(); + final IActivityManager am = ActivityManager.getService(); // Find the jobs that need to be fixed up, collecting them for post-iteration // replacement with their new versions @@ -182,9 +183,11 @@ public final class JobStore { if (utcTimes != null) { Pair<Long, Long> elapsedRuntimes = convertRtcBoundsToElapsed(utcTimes, elapsedNow); - toAdd.add(new JobStatus(job, job.getBaseHeartbeat(), + JobStatus newJob = new JobStatus(job, job.getBaseHeartbeat(), elapsedRuntimes.first, elapsedRuntimes.second, - 0, job.getLastSuccessfulRunTime(), job.getLastFailedRunTime())); + 0, job.getLastSuccessfulRunTime(), job.getLastFailedRunTime()); + newJob.prepareLocked(am); + toAdd.add(newJob); toRemove.add(job); } }); diff --git a/services/core/java/com/android/server/net/OWNERS b/services/core/java/com/android/server/net/OWNERS index 2e91f998076d..28ae6a417bd3 100644 --- a/services/core/java/com/android/server/net/OWNERS +++ b/services/core/java/com/android/server/net/OWNERS @@ -1,12 +1,11 @@ set noparent codewiz@google.com -ek@google.com jchalard@google.com jsharkey@android.com +junyulai@google.com lorenzo@google.com reminv@google.com satk@google.com -silberst@google.com sudheersai@google.com yamasani@google.com diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 9281bf86d984..d25360a40346 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2477,29 +2477,27 @@ public class NotificationManagerService extends SystemService { checkCallerIsSameApp(callingPkg); final int callingUid = Binder.getCallingUid(); UserHandle user = UserHandle.getUserHandleForUid(callingUid); - try { - ApplicationInfo info = - mPackageManager.getApplicationInfo(delegate, - MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, - user.getIdentifier()); - if (info != null) { - mPreferencesHelper.setNotificationDelegate( - callingPkg, callingUid, delegate, info.uid); - handleSavePolicyFile(); + if (delegate == null) { + mPreferencesHelper.revokeNotificationDelegate(callingPkg, Binder.getCallingUid()); + handleSavePolicyFile(); + } else { + try { + ApplicationInfo info = + mPackageManager.getApplicationInfo(delegate, + MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, + user.getIdentifier()); + if (info != null) { + mPreferencesHelper.setNotificationDelegate( + callingPkg, callingUid, delegate, info.uid); + handleSavePolicyFile(); + } + } catch (RemoteException e) { + e.rethrowFromSystemServer(); } - } catch (RemoteException e) { - // :( } } @Override - public void revokeNotificationDelegate(String callingPkg) { - checkCallerIsSameApp(callingPkg); - mPreferencesHelper.revokeNotificationDelegate(callingPkg, Binder.getCallingUid()); - handleSavePolicyFile(); - } - - @Override public String getNotificationDelegate(String callingPkg) { // callable by Settings also checkCallerIsSystemOrSameApp(callingPkg); @@ -7196,7 +7194,7 @@ public class NotificationManagerService extends SystemService { @Override protected String getRequiredPermission() { - // only signature/privileged apps can be bound + // only signature/privileged apps can be bound. return android.Manifest.permission.REQUEST_NOTIFICATION_ASSISTANT_SERVICE; } diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index a3b72fd02654..3a4bcca46966 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -482,9 +482,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } if (callingUid == Process.SYSTEM_UID) { - params.installFlags |= PackageManager.INSTALL_RESPECT_ALLOW_DOWNGRADE; + params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE; } else { - params.installFlags &= ~PackageManager.INSTALL_RESPECT_ALLOW_DOWNGRADE; + params.installFlags &= ~PackageManager.INSTALL_ALLOW_DOWNGRADE; } boolean isApex = (params.installFlags & PackageManager.INSTALL_APEX) != 0; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 251b34bc3684..4dcab5e7abdd 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -14702,6 +14702,9 @@ public class PackageManagerService extends IPackageManager.Stub DeviceConfig.Rollback.NAMESPACE, DeviceConfig.Rollback.ENABLE_ROLLBACK_TIMEOUT, DEFAULT_ENABLE_ROLLBACK_TIMEOUT); + if (rollbackTimeout < 0) { + rollbackTimeout = DEFAULT_ENABLE_ROLLBACK_TIMEOUT; + } final Message msg = mHandler.obtainMessage( ENABLE_ROLLBACK_TIMEOUT); msg.arg1 = enableRollbackToken; diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index ff81ad56f45f..a12005bc3719 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -820,9 +820,9 @@ public class PackageManagerServiceUtils { // platform builds. // // In case of user builds, downgrade is permitted only for the system server initiated - // sessions. This is enforced by INSTALL_RESPECT_ALLOW_DOWNGRADE flag parameter. + // sessions. This is enforced by INSTALL_ALLOW_DOWNGRADE flag parameter. final boolean downgradeRequested = - (installFlags & PackageManager.INSTALL_ALLOW_DOWNGRADE) != 0; + (installFlags & PackageManager.INSTALL_REQUEST_DOWNGRADE) != 0; if (!downgradeRequested) { return false; } @@ -832,7 +832,7 @@ public class PackageManagerServiceUtils { if (isDebuggable) { return true; } - return (installFlags & PackageManager.INSTALL_RESPECT_ALLOW_DOWNGRADE) != 0; + return (installFlags & PackageManager.INSTALL_ALLOW_DOWNGRADE) != 0; } /** diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 114810d9127b..912a50e0ca38 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -2337,7 +2337,7 @@ class PackageManagerShellCommand extends ShellCommand { sessionParams.installFlags |= PackageManager.INSTALL_INTERNAL; break; case "-d": - sessionParams.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE; + sessionParams.installFlags |= PackageManager.INSTALL_REQUEST_DOWNGRADE; break; case "-g": sessionParams.installFlags |= PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS; diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 59e5d7716369..aced1a2adf66 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -979,7 +979,7 @@ public final class Settings { // Try to revoke as an install permission which is for all users. // The package is gone - no need to keep flags for applying policy. permissionsState.updatePermissionFlags(bp, userId, - PackageManager.MASK_PERMISSION_FLAGS, 0); + PackageManager.MASK_PERMISSION_FLAGS_ALL, 0); if (permissionsState.revokeInstallPermission(bp) == PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED) { @@ -2165,7 +2165,7 @@ public final class Settings { XmlUtils.skipCurrentTag(parser); } else { permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL, - PackageManager.MASK_PERMISSION_FLAGS, flags); + PackageManager.MASK_PERMISSION_FLAGS_ALL, flags); } } else { if (permissionsState.revokeInstallPermission(bp) == @@ -2174,7 +2174,7 @@ public final class Settings { XmlUtils.skipCurrentTag(parser); } else { permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL, - PackageManager.MASK_PERMISSION_FLAGS, flags); + PackageManager.MASK_PERMISSION_FLAGS_ALL, flags); } } } else { @@ -5240,7 +5240,7 @@ public final class Settings { if (bp != null) { permissionsState.revokeRuntimePermission(bp, userId); permissionsState.updatePermissionFlags(bp, userId, - PackageManager.MASK_PERMISSION_FLAGS, 0); + PackageManager.MASK_PERMISSION_FLAGS_ALL, 0); } } } @@ -5354,10 +5354,10 @@ public final class Settings { if (granted) { permissionsState.grantRuntimePermission(bp, userId); permissionsState.updatePermissionFlags(bp, userId, - PackageManager.MASK_PERMISSION_FLAGS, flags); + PackageManager.MASK_PERMISSION_FLAGS_ALL, flags); } else { permissionsState.updatePermissionFlags(bp, userId, - PackageManager.MASK_PERMISSION_FLAGS, flags); + PackageManager.MASK_PERMISSION_FLAGS_ALL, flags); } } break; diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index ac7338e751e3..f7d8e0e27831 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -32,7 +32,7 @@ import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_WHEN_REQU import static android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED; import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET; -import static android.content.pm.PackageManager.MASK_PERMISSION_FLAGS; +import static android.content.pm.PackageManager.MASK_PERMISSION_FLAGS_ALL; import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; import static android.os.UserHandle.getAppId; import static android.os.UserHandle.getUid; @@ -980,7 +980,7 @@ public class PermissionManagerService { // Revoke the runtime permission and clear the flags. origPermissions.revokeRuntimePermission(bp, userId); origPermissions.updatePermissionFlags(bp, userId, - PackageManager.MASK_PERMISSION_FLAGS, 0); + PackageManager.MASK_PERMISSION_FLAGS_ALL, 0); // If we revoked a permission permission, we have to write. updatedUserIds = ArrayUtils.appendInt( updatedUserIds, userId); @@ -1043,7 +1043,7 @@ public class PermissionManagerService { } permissionsState.updatePermissionFlags(bp, userId, - MASK_PERMISSION_FLAGS, flags); + MASK_PERMISSION_FLAGS_ALL, flags); } } break; @@ -1058,7 +1058,7 @@ public class PermissionManagerService { if (origPermissions.revokeInstallPermission(bp) != PERMISSION_OPERATION_FAILURE) { origPermissions.updatePermissionFlags(bp, UserHandle.USER_ALL, - PackageManager.MASK_PERMISSION_FLAGS, 0); + MASK_PERMISSION_FLAGS_ALL, 0); changedInstallPermission = true; } @@ -1094,7 +1094,7 @@ public class PermissionManagerService { } permissionsState.updatePermissionFlags(bp, userId, - MASK_PERMISSION_FLAGS, flags); + MASK_PERMISSION_FLAGS_ALL, flags); } } break; @@ -1114,7 +1114,7 @@ public class PermissionManagerService { PERMISSION_OPERATION_FAILURE) { // Also drop the permission flags. permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL, - PackageManager.MASK_PERMISSION_FLAGS, 0); + MASK_PERMISSION_FLAGS_ALL, 0); changedInstallPermission = true; Slog.i(TAG, "Un-granting permission " + perm + " from package " + pkg.packageName @@ -2180,7 +2180,7 @@ public class PermissionManagerService { if (bp != null) { permissionsState.revokeInstallPermission(bp); permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL, - PackageManager.MASK_PERMISSION_FLAGS, 0); + MASK_PERMISSION_FLAGS_ALL, 0); } } } @@ -2199,7 +2199,7 @@ public class PermissionManagerService { if (bp != null) { permissionsState.revokeRuntimePermission(bp, userId); permissionsState.updatePermissionFlags(bp, userId, - PackageManager.MASK_PERMISSION_FLAGS, 0); + MASK_PERMISSION_FLAGS_ALL, 0); runtimePermissionChangedUserIds = ArrayUtils.appendInt( runtimePermissionChangedUserIds, userId); } @@ -2229,7 +2229,7 @@ public class PermissionManagerService { return 0; } - enforceGrantRevokeRuntimePermissionPermissions("getPermissionFlags"); + enforceGrantRevokeGetRuntimePermissionPermissions("getPermissionFlags"); enforceCrossUserPermission(callingUid, userId, true, // requireFullPermission @@ -2596,6 +2596,20 @@ public class PermissionManagerService { } } + private void enforceGrantRevokeGetRuntimePermissionPermissions(@NonNull String message) { + if (mContext.checkCallingOrSelfPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS) + != PackageManager.PERMISSION_GRANTED + && mContext.checkCallingOrSelfPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS) + != PackageManager.PERMISSION_GRANTED + && mContext.checkCallingOrSelfPermission(Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException(message + " requires " + + Manifest.permission.GRANT_RUNTIME_PERMISSIONS + " or " + + Manifest.permission.REVOKE_RUNTIME_PERMISSIONS + " or " + + Manifest.permission.GET_RUNTIME_PERMISSIONS); + } + } + /** * Checks if the request is from the system or an app that has INTERACT_ACROSS_USERS * or INTERACT_ACROSS_USERS_FULL permissions, if the userid is not for the caller. diff --git a/services/core/java/com/android/server/role/RemoteRoleControllerService.java b/services/core/java/com/android/server/role/RemoteRoleControllerService.java deleted file mode 100644 index 4fb40db8597c..000000000000 --- a/services/core/java/com/android/server/role/RemoteRoleControllerService.java +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.role; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.UserIdInt; -import android.annotation.WorkerThread; -import android.app.role.IRoleManagerCallback; -import android.app.role.RoleManager; -import android.app.role.RoleManagerCallback; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.os.Handler; -import android.os.IBinder; -import android.os.RemoteException; -import android.os.UserHandle; -import android.rolecontrollerservice.IRoleControllerService; -import android.rolecontrollerservice.RoleControllerService; -import android.util.Log; -import android.util.Slog; - -import com.android.internal.util.function.pooled.PooledLambda; -import com.android.server.FgThread; - -import java.util.ArrayDeque; -import java.util.Arrays; -import java.util.Queue; - -/** - * Handles connection with {@link RoleControllerService}. - */ -public class RemoteRoleControllerService { - - static final boolean DEBUG = false; - private static final String LOG_TAG = RemoteRoleControllerService.class.getSimpleName(); - - @NonNull - private final Connection mConnection; - - public RemoteRoleControllerService(@UserIdInt int userId, @NonNull Context context) { - mConnection = new Connection(userId, context); - } - - /** - * Add a specific application to the holders of a role. If the role is exclusive, the previous - * holder will be replaced. - * - * @see RoleControllerService#onAddRoleHolder(String, String, int, RoleManagerCallback) - */ - public void onAddRoleHolder(@NonNull String roleName, @NonNull String packageName, - @RoleManager.ManageHoldersFlags int flags, @NonNull IRoleManagerCallback callback) { - mConnection.enqueueCall(new Connection.Call((service, callbackDelegate) -> - service.onAddRoleHolder(roleName, packageName, flags, callbackDelegate), callback)); - } - - /** - * Remove a specific application from the holders of a role. - * - * @see RoleControllerService#onRemoveRoleHolder(String, String, int, RoleManagerCallback) - */ - public void onRemoveRoleHolder(@NonNull String roleName, @NonNull String packageName, - @RoleManager.ManageHoldersFlags int flags, @NonNull IRoleManagerCallback callback) { - mConnection.enqueueCall(new Connection.Call((service, callbackDelegate) -> - service.onRemoveRoleHolder(roleName, packageName, flags, callbackDelegate), - callback)); - } - - /** - * Remove all holders of a role. - * - * @see RoleControllerService#onClearRoleHolders(String, int, RoleManagerCallback) - */ - public void onClearRoleHolders(@NonNull String roleName, - @RoleManager.ManageHoldersFlags int flags, @NonNull IRoleManagerCallback callback) { - mConnection.enqueueCall(new Connection.Call((service, callbackDelegate) -> - service.onClearRoleHolders(roleName, flags, callbackDelegate), callback)); - } - - /** - * Performs granting of default roles and permissions and appops - * - * @see RoleControllerService#onGrantDefaultRoles(RoleManagerCallback) - */ - public void onGrantDefaultRoles(@NonNull IRoleManagerCallback callback) { - mConnection.enqueueCall(new Connection.Call(IRoleControllerService::onGrantDefaultRoles, - callback)); - } - - /** - * @see RoleControllerService#onSmsKillSwitchToggled(boolean) - */ - public void onSmsKillSwitchToggled(boolean smsRestrictionEnabled) { - mConnection.enqueueCall(new Connection.Call( - (s, cb) -> s.onSmsKillSwitchToggled(smsRestrictionEnabled), - new IRoleManagerCallback.Default() { - @Override - public void onFailure() { - Slog.e(LOG_TAG, "Failed onSmsKillSwitchToggled"); - } - })); - } - - private static final class Connection implements ServiceConnection { - - private static final long UNBIND_DELAY_MILLIS = 15 * 1000; - - @UserIdInt - private final int mUserId; - - @NonNull - private final Context mContext; - - @NonNull - private final Handler mHandler = FgThread.getHandler(); - - private boolean mBound; - - @Nullable - private IRoleControllerService mService; - - @NonNull - private final Queue<Call> mPendingCalls = new ArrayDeque<>(); - - @NonNull - private final Runnable mUnbindRunnable = this::unbind; - - Connection(@UserIdInt int userId, @NonNull Context context) { - mUserId = userId; - mContext = context; - } - - @Override - @WorkerThread - public void onServiceConnected(@NonNull ComponentName name, @NonNull IBinder service) { - mService = IRoleControllerService.Stub.asInterface(service); - executePendingCalls(); - } - - @WorkerThread - private void executePendingCalls() { - while (!mPendingCalls.isEmpty()) { - Call call = mPendingCalls.poll(); - call.execute(mService); - } - scheduleUnbind(); - } - - @Override - @WorkerThread - public void onServiceDisconnected(@NonNull ComponentName name) { - mService = null; - } - - @Override - @WorkerThread - public void onBindingDied(@NonNull ComponentName name) { - unbind(); - } - - public void enqueueCall(@NonNull Call call) { - if (DEBUG) { - Slog.i(LOG_TAG, "Enqueue " + call); - } - mHandler.executeOrSendMessage(PooledLambda.obtainMessage(Connection::executeCall, this, - call)); - } - - @WorkerThread - private void executeCall(@NonNull Call call) { - ensureBound(); - if (mService == null) { - if (DEBUG) { - Slog.i(LOG_TAG, "Delaying until service connected: " + call); - } - mPendingCalls.offer(call); - return; - } - call.execute(mService); - scheduleUnbind(); - } - - @WorkerThread - private void ensureBound() { - mHandler.removeCallbacks(mUnbindRunnable); - if (!mBound) { - Intent intent = new Intent(RoleControllerService.SERVICE_INTERFACE); - intent.setPackage(mContext.getPackageManager() - .getPermissionControllerPackageName()); - // Use direct handler to ensure onServiceConnected callback happens in the same - // call frame, as required by onGrantDefaultRoles - // - // Note that as a result, onServiceConnected may happen not on main thread! - mBound = mContext.bindServiceAsUser(intent, this, Context.BIND_AUTO_CREATE, - mHandler, UserHandle.of(mUserId)); - } - } - - private void scheduleUnbind() { - mHandler.removeCallbacks(mUnbindRunnable); - mHandler.postDelayed(mUnbindRunnable, UNBIND_DELAY_MILLIS); - } - - @WorkerThread - private void unbind() { - if (mBound) { - mService = null; - mContext.unbindService(this); - mBound = false; - } - } - - public static class Call { - - private static final int TIMEOUT_MILLIS = 15 * 1000; - - @NonNull - private final CallExecutor mCallExecutor; - - @NonNull - private final IRoleManagerCallback mCallback; - - @NonNull - private final Handler mHandler = FgThread.getHandler(); - - @NonNull - private final Runnable mTimeoutRunnable = this::notifyTimeout; - - private boolean mCallbackNotified; - - @Nullable - private final String mDebugName; - - private Call(@NonNull CallExecutor callExecutor, - @NonNull IRoleManagerCallback callback) { - mCallExecutor = callExecutor; - mCallback = callback; - mDebugName = DEBUG - ? Arrays.stream(Thread.currentThread().getStackTrace()) - .filter(s -> s.getClassName().equals( - RemoteRoleControllerService.class.getName())) - .findFirst() - .get() - .getMethodName() - : null; - } - - @WorkerThread - public void execute(IRoleControllerService service) { - if (DEBUG) { - Slog.i(LOG_TAG, "Executing " + this); - } - try { - mHandler.postDelayed(mTimeoutRunnable, TIMEOUT_MILLIS); - mCallExecutor.execute(service, new CallbackDelegate()); - } catch (RemoteException e) { - Slog.e(LOG_TAG, "Error calling RoleControllerService", e); - notifyCallback(false); - } - } - - @WorkerThread - private void notifyTimeout() { - Slog.e(LOG_TAG, "Call timed out, calling onFailure()"); - notifyCallback(false); - } - - @WorkerThread - private void notifyCallback(boolean success) { - if (DEBUG) { - Log.i(LOG_TAG, "notifyCallback(" + this - + ", success = " + success + ")"); - } - if (mCallbackNotified) { - return; - } - mCallbackNotified = true; - mHandler.removeCallbacks(mTimeoutRunnable); - try { - if (success) { - mCallback.onSuccess(); - } else { - mCallback.onFailure(); - } - } catch (RemoteException e) { - Slog.e(LOG_TAG, "Error calling " + (success ? "onSuccess()" : "onFailure()") - + " callback", e); - } - } - - @Override - public String toString() { - return DEBUG ? mDebugName : "Call with callback: " + mCallback; - } - - @FunctionalInterface - public interface CallExecutor { - - @WorkerThread - void execute(IRoleControllerService service, IRoleManagerCallback callbackDelegate) - throws RemoteException; - } - - private class CallbackDelegate extends IRoleManagerCallback.Stub { - - @Override - public void onSuccess() throws RemoteException { - mHandler.sendMessage(PooledLambda.obtainMessage(Call::notifyCallback, Call.this, - true)); - } - - @Override - public void onFailure() throws RemoteException { - mHandler.sendMessage(PooledLambda.obtainMessage(Call::notifyCallback, Call.this, - false)); - } - } - } - } -} diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java index f533ad167761..059e6d70064e 100644 --- a/services/core/java/com/android/server/role/RoleManagerService.java +++ b/services/core/java/com/android/server/role/RoleManagerService.java @@ -28,6 +28,7 @@ import android.app.AppOpsManager; import android.app.role.IOnRoleHoldersChangedListener; import android.app.role.IRoleManager; import android.app.role.IRoleManagerCallback; +import android.app.role.RoleControllerManager; import android.app.role.RoleManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -97,6 +98,8 @@ public class RoleManagerService extends SystemService implements RoleUserState.C private static final String LOG_TAG = RoleManagerService.class.getSimpleName(); + private static final boolean DEBUG = false; + @NonNull private final UserManagerInternal mUserManagerInternal; @NonNull @@ -123,12 +126,11 @@ public class RoleManagerService extends SystemService implements RoleUserState.C private final SparseArray<RoleUserState> mUserStates = new SparseArray<>(); /** - * Maps user id to its controller service. + * Maps user id to its controller. */ @GuardedBy("mLock") @NonNull - private final SparseArray<RemoteRoleControllerService> mControllerServices = - new SparseArray<>(); + private final SparseArray<RoleControllerManager> mControllers = new SparseArray<>(); /** * Maps user id to its list of listeners. @@ -190,9 +192,9 @@ public class RoleManagerService extends SystemService implements RoleUserState.C @Override public void onReceive(Context context, Intent intent) { int userId = UserHandle.getUserId(intent.getIntExtra(Intent.EXTRA_UID, -1)); - if (RemoteRoleControllerService.DEBUG) { - Slog.i(LOG_TAG, - "Packages changed - re-running initial grants for user " + userId); + if (DEBUG) { + Slog.i(LOG_TAG, "Packages changed - re-running initial grants for user " + + userId); } performInitialGrantsIfNecessary(userId); } @@ -255,12 +257,12 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } }); try { - result.get(5, TimeUnit.SECONDS); + result.get(30, TimeUnit.SECONDS); userState.setPackagesHash(packagesHash); } catch (InterruptedException | ExecutionException | TimeoutException e) { Slog.e(LOG_TAG, "Failed to grant defaults for user " + userId, e); } - } else if (RemoteRoleControllerService.DEBUG) { + } else if (DEBUG) { Slog.i(LOG_TAG, "Already ran grants for package state " + packagesHash); } } @@ -326,14 +328,22 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } @NonNull - private RemoteRoleControllerService getOrCreateControllerService(@UserIdInt int userId) { + private RoleControllerManager getOrCreateControllerService(@UserIdInt int userId) { synchronized (mLock) { - RemoteRoleControllerService controllerService = mControllerServices.get(userId); - if (controllerService == null) { - controllerService = new RemoteRoleControllerService(userId, getContext()); - mControllerServices.put(userId, controllerService); + RoleControllerManager controller = mControllers.get(userId); + if (controller == null) { + Context systemContext = getContext(); + Context context; + try { + context = systemContext.createPackageContextAsUser( + systemContext.getPackageName(), 0, UserHandle.of(userId)); + } catch (NameNotFoundException e) { + throw new RuntimeException(e); + } + controller = new RoleControllerManager(context, FgThread.getHandler()); + mControllers.put(userId, controller); } - return controllerService; + return controller; } } @@ -362,7 +372,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C RoleUserState userState; synchronized (mLock) { listeners = mListeners.removeReturnOld(userId); - mControllerServices.remove(userId); + mControllers.remove(userId); userState = mUserStates.removeReturnOld(userId); } if (listeners != null) { diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index d3e1a05061d2..871f9f862945 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -356,7 +356,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { PackageInstaller packageInstaller = pm.getPackageInstaller(); PackageInstaller.SessionParams parentParams = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); - parentParams.setAllowDowngrade(true); + parentParams.setRequestDowngrade(true); parentParams.setMultiPackage(); if (data.isStaged()) { parentParams.setStaged(); @@ -377,7 +377,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { params.setInstallerPackageName(installerPackageName); } } - params.setAllowDowngrade(true); + params.setRequestDowngrade(true); if (data.isStaged()) { params.setStaged(); } @@ -535,6 +535,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { DeviceConfig.Rollback.BOOT_NAMESPACE, DeviceConfig.Rollback.ROLLBACK_LIFETIME_IN_MILLIS, DEFAULT_ROLLBACK_LIFETIME_DURATION_MILLIS); + if (mRollbackLifetimeDurationInMillis < 0) { + mRollbackLifetimeDurationInMillis = DEFAULT_ROLLBACK_LIFETIME_DURATION_MILLIS; + } } void onBootCompleted() { diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index 1ae85b823fd0..9a5ec2ab17dc 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -450,10 +450,17 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { } void onSystemReady() { - mPersisterQueue.startPersisting(); mLaunchParamsPersister.onSystemReady(); } + void onUserUnlocked(int userId) { + // Only start persisting when the first user is unlocked. The method call is + // idempotent so there is no side effect to call it again when the second user is + // unlocked. + mPersisterQueue.startPersisting(); + mLaunchParamsPersister.onUnlockUser(userId); + } + public ActivityMetricsLogger getActivityMetricsLogger() { return mActivityMetricsLogger; } diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 5a746eb1f385..2b23ff084391 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1809,7 +1809,7 @@ class ActivityStarter { } } - mNotTop = (mLaunchFlags & FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null; + mNotTop = (mLaunchFlags & FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? sourceRecord : null; mInTask = inTask; // In some flows in to this function, we retrieve the task record and hold on to it diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index f100efc9bb89..794a4b84dcaa 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -954,7 +954,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public void onUnlockUser(int userId) { synchronized (mService.getGlobalLock()) { - mService.mStackSupervisor.mLaunchParamsPersister.onUnlockUser(userId); + mService.mStackSupervisor.onUserUnlocked(userId); } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 515ac52178a8..db590308460b 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -392,7 +392,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo final ArrayList<WindowToken> mExitingTokens = new ArrayList<>(); /** Detect user tapping outside of current focused task bounds .*/ - TaskTapPointerEventListener mTapDetector; + @VisibleForTesting + final TaskTapPointerEventListener mTapDetector; /** Detect user tapping outside of current focused stack bounds .*/ private Region mTouchExcludeRegion = new Region(); @@ -876,14 +877,17 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mBoundsAnimationController = new BoundsAnimationController(service.mContext, mAppTransition, AnimationThread.getHandler(), animationHandler); - if (mWmService.mInputManager != null) { - final InputChannel inputChannel = mWmService.mInputManager.monitorInput("Display " - + mDisplayId, mDisplayId); - mPointerEventDispatcher = inputChannel != null - ? new PointerEventDispatcher(inputChannel) : null; - } else { - mPointerEventDispatcher = null; - } + final InputChannel inputChannel = mWmService.mInputManager.monitorInput( + "PointerEventDispatcher" + mDisplayId, mDisplayId); + mPointerEventDispatcher = new PointerEventDispatcher(inputChannel); + + // Tap Listeners are supported for: + // 1. All physical displays (multi-display). + // 2. VirtualDisplays on VR, AA (and everything else). + mTapDetector = new TaskTapPointerEventListener(mWmService, this); + registerPointerEventListener(mTapDetector); + registerPointerEventListener(mWmService.mMousePositionTracker); + mDisplayPolicy = new DisplayPolicy(service, this); mDisplayRotation = new DisplayRotation(service, this); if (isDefaultDisplay) { @@ -1511,19 +1515,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mDisplayFrames.onDisplayInfoUpdated(mDisplayInfo, calculateDisplayCutoutForRotation(mDisplayInfo.rotation)); - - // Tap Listeners are supported for: - // 1. All physical displays (multi-display). - // 2. VirtualDisplays on VR, AA (and everything else). - if (mPointerEventDispatcher != null && mTapDetector == null) { - if (DEBUG_DISPLAY) { - Slog.d(TAG, - "Registering PointerEventListener for DisplayId: " + mDisplayId); - } - mTapDetector = new TaskTapPointerEventListener(mWmService, this); - registerPointerEventListener(mTapDetector); - registerPointerEventListener(mWmService.mMousePositionTracker); - } } /** @@ -2450,9 +2441,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mTmpRegion.set(mTmpRect); mTouchExcludeRegion.op(mTmpRegion, Op.UNION); } - if (mTapDetector != null) { - mTapDetector.setTouchExcludeRegion(mTouchExcludeRegion); - } + mTapDetector.setTouchExcludeRegion(mTouchExcludeRegion); } /** @@ -2502,11 +2491,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mWmService.stopFreezingDisplayLocked(); super.removeImmediately(); if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Removing display=" + this); - if (mPointerEventDispatcher != null && mTapDetector != null) { - unregisterPointerEventListener(mTapDetector); - unregisterPointerEventListener(mWmService.mMousePositionTracker); - mTapDetector = null; - } + mPointerEventDispatcher.dispose(); mWmService.mAnimator.removeDisplayLocked(mDisplayId); mWindowingLayer.release(); mOverlayLayer.release(); @@ -2516,7 +2501,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mRemovingDisplay = false; } - mDisplayPolicy.onDisplayRemoved(); mWmService.mWindowPlacerLocked.requestTraversal(); } @@ -4825,15 +4809,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } void registerPointerEventListener(@NonNull PointerEventListener listener) { - if (mPointerEventDispatcher != null) { - mPointerEventDispatcher.registerInputEventListener(listener); - } + mPointerEventDispatcher.registerInputEventListener(listener); } void unregisterPointerEventListener(@NonNull PointerEventListener listener) { - if (mPointerEventDispatcher != null) { - mPointerEventDispatcher.unregisterInputEventListener(listener); - } + mPointerEventDispatcher.unregisterInputEventListener(listener); } void prepareAppTransition(@WindowManager.TransitionType int transit, diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 5862d43d663d..e48361fa0667 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -221,7 +221,6 @@ public class DisplayPolicy { } } - @VisibleForTesting private final SystemGesturesPointerEventListener mSystemGestures; private volatile int mLidState = LID_ABSENT; @@ -548,10 +547,6 @@ public class DisplayPolicy { return mDisplayContent.getDisplayId(); } - void onDisplayRemoved() { - mDisplayContent.unregisterPointerEventListener(mSystemGestures); - } - void configure(int width, int height, int shortSizeDp) { // Allow the navigation bar to move on non-square small devices (phones). mNavigationBarCanMove = width != height && shortSizeDp < 600; diff --git a/services/core/java/com/android/server/wm/PersisterQueue.java b/services/core/java/com/android/server/wm/PersisterQueue.java index a17ee6581ea6..9dc3d6a81338 100644 --- a/services/core/java/com/android/server/wm/PersisterQueue.java +++ b/services/core/java/com/android/server/wm/PersisterQueue.java @@ -131,10 +131,8 @@ class PersisterQueue { } /** - * - * @param item - * @param flush - * @param <T> + * Updates the last item found in the queue that matches the given item, or adds it to the end + * of the queue if no such item is found. */ synchronized <T extends WriteQueueItem> void updateLastOrAddItem(T item, boolean flush) { final T itemToUpdate = findLastItem(item::matches, (Class<T>) item.getClass()); @@ -149,10 +147,6 @@ class PersisterQueue { /** * Removes all items with which given predicate returns {@code true}. - * - * @param predicate the predicate - * @param clazz - * @param <T> */ synchronized <T extends WriteQueueItem> void removeItems(Predicate<T> predicate, Class<T> clazz) { diff --git a/services/core/java/com/android/server/wm/PointerEventDispatcher.java b/services/core/java/com/android/server/wm/PointerEventDispatcher.java index f815fa058d55..8d08aa370b44 100644 --- a/services/core/java/com/android/server/wm/PointerEventDispatcher.java +++ b/services/core/java/com/android/server/wm/PointerEventDispatcher.java @@ -28,11 +28,13 @@ import com.android.server.UiThread; import java.util.ArrayList; public class PointerEventDispatcher extends InputEventReceiver { - ArrayList<PointerEventListener> mListeners = new ArrayList<PointerEventListener>(); - PointerEventListener[] mListenersArray = new PointerEventListener[0]; + private final InputChannel mInputChannel; + private final ArrayList<PointerEventListener> mListeners = new ArrayList<>(); + private PointerEventListener[] mListenersArray = new PointerEventListener[0]; public PointerEventDispatcher(InputChannel inputChannel) { super(inputChannel, UiThread.getHandler().getLooper()); + mInputChannel = inputChannel; } @Override @@ -87,4 +89,15 @@ public class PointerEventDispatcher extends InputEventReceiver { mListenersArray = null; } } + + /** Dispose the associated input channel and clean up the listeners. */ + @Override + public void dispose() { + super.dispose(); + mInputChannel.dispose(); + synchronized (mListeners) { + mListeners.clear(); + mListenersArray = null; + } + } } diff --git a/services/core/java/com/android/server/wm/TaskPersister.java b/services/core/java/com/android/server/wm/TaskPersister.java index d50af385865e..06bdcc04e9c8 100644 --- a/services/core/java/com/android/server/wm/TaskPersister.java +++ b/services/core/java/com/android/server/wm/TaskPersister.java @@ -492,16 +492,8 @@ public class TaskPersister implements PersisterQueue.Listener { return new File(userTaskIdsDir, PERSISTED_TASK_IDS_FILENAME); } - static File getUserTasksDir(int userId) { - File userTasksDir = new File(Environment.getDataSystemCeDirectory(userId), TASKS_DIRNAME); - - if (!userTasksDir.exists()) { - if (!userTasksDir.mkdir()) { - Slog.e(TAG, "Failure creating tasks directory for user " + userId + ": " - + userTasksDir); - } - } - return userTasksDir; + private static File getUserTasksDir(int userId) { + return new File(Environment.getDataSystemCeDirectory(userId), TASKS_DIRNAME); } static File getUserImagesDir(int userId) { @@ -568,8 +560,13 @@ public class TaskPersister implements PersisterQueue.Listener { FileOutputStream file = null; AtomicFile atomicFile = null; try { - atomicFile = new AtomicFile(new File( - getUserTasksDir(task.userId), + File userTasksDir = getUserTasksDir(task.userId); + if (!userTasksDir.isDirectory() && !userTasksDir.mkdirs()) { + Slog.e(TAG, "Failure creating tasks directory for user " + task.userId + + ": " + userTasksDir + " Dropping persistence for task " + task); + return; + } + atomicFile = new AtomicFile(new File(userTasksDir, String.valueOf(task.taskId) + TASK_FILENAME_SUFFIX)); file = atomicFile.startWrite(); file.write(stringWriter.toString().getBytes()); diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 5c7b287354da..050a07965b9c 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -38,6 +38,7 @@ cc_library_static { "com_android_server_SerialService.cpp", "com_android_server_storage_AppFuseBridge.cpp", "com_android_server_SystemServer.cpp", + "com_android_server_TestNetworkService.cpp", "com_android_server_tv_TvUinputBridge.cpp", "com_android_server_tv_TvInputHal.cpp", "com_android_server_vr_VrManagerService.cpp", diff --git a/services/core/jni/com_android_server_TestNetworkService.cpp b/services/core/jni/com_android_server_TestNetworkService.cpp new file mode 100644 index 000000000000..b90ff233c1ac --- /dev/null +++ b/services/core/jni/com_android_server_TestNetworkService.cpp @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2018 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. + */ + +#define LOG_NDEBUG 0 + +#define LOG_TAG "TestNetworkServiceJni" + +#include <arpa/inet.h> +#include <errno.h> +#include <fcntl.h> +#include <linux/if.h> +#include <linux/if_tun.h> +#include <linux/ipv6_route.h> +#include <linux/route.h> +#include <netinet/in.h> +#include <stdio.h> +#include <string.h> +#include <sys/ioctl.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/types.h> + +#include <log/log.h> + +#include "netutils/ifc.h" + +#include "jni.h" +#include <android-base/stringprintf.h> +#include <android-base/unique_fd.h> +#include <nativehelper/JNIHelp.h> +#include <nativehelper/ScopedUtfChars.h> + +namespace android { + +//------------------------------------------------------------------------------ + +static void throwException(JNIEnv* env, int error, const char* action, const char* iface) { + const std::string& msg = + android::base::StringPrintf("Error %s %s: %s", action, iface, strerror(error)); + + jniThrowException(env, "java/lang/IllegalStateException", msg.c_str()); +} + +static int createTunInterface(JNIEnv* env, const char* iface) { + base::unique_fd tun(open("/dev/tun", O_RDWR | O_NONBLOCK)); + ifreq ifr{}; + + // Allocate interface. + ifr.ifr_flags = IFF_TUN | IFF_NO_PI; + strlcpy(ifr.ifr_name, iface, IFNAMSIZ); + if (ioctl(tun.get(), TUNSETIFF, &ifr)) { + throwException(env, errno, "allocating", ifr.ifr_name); + return -1; + } + + // Activate interface using an unconnected datagram socket. + base::unique_fd inet6CtrlSock(socket(AF_INET6, SOCK_DGRAM, 0)); + ifr.ifr_flags = IFF_UP; + + if (ioctl(inet6CtrlSock.get(), SIOCSIFFLAGS, &ifr)) { + throwException(env, errno, "activating", ifr.ifr_name); + return -1; + } + + return tun.release(); +} + +//------------------------------------------------------------------------------ + +static jint create(JNIEnv* env, jobject /* thiz */, jstring jIface) { + ScopedUtfChars iface(env, jIface); + if (!iface.c_str()) { + jniThrowNullPointerException(env, "iface"); + return -1; + } + + int tun = createTunInterface(env, iface.c_str()); + + // Any exceptions will be thrown from the createTunInterface call + return tun; +} + +//------------------------------------------------------------------------------ + +static const JNINativeMethod gMethods[] = { + {"jniCreateTun", "(Ljava/lang/String;)I", (void*)create}, +}; + +int register_android_server_TestNetworkService(JNIEnv* env) { + return jniRegisterNativeMethods(env, "com/android/server/TestNetworkService", gMethods, + NELEM(gMethods)); +} + +}; // namespace android diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp index 6e31aedd3f76..5ffed03c86ae 100644 --- a/services/core/jni/onload.cpp +++ b/services/core/jni/onload.cpp @@ -41,6 +41,7 @@ int register_android_server_VibratorService(JNIEnv* env); int register_android_server_location_GnssLocationProvider(JNIEnv* env); int register_android_server_connectivity_Vpn(JNIEnv* env); int register_android_server_connectivity_tethering_OffloadHardwareInterface(JNIEnv*); +int register_android_server_TestNetworkService(JNIEnv* env); int register_android_server_devicepolicy_CryptoTestHelper(JNIEnv*); int register_android_server_hdmi_HdmiCecController(JNIEnv* env); int register_android_server_tv_TvUinputBridge(JNIEnv* env); @@ -85,6 +86,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) register_android_server_location_GnssLocationProvider(env); register_android_server_connectivity_Vpn(env); register_android_server_connectivity_tethering_OffloadHardwareInterface(env); + register_android_server_TestNetworkService(env); register_android_server_devicepolicy_CryptoTestHelper(env); register_android_server_ConsumerIrService(env); register_android_server_BatteryStatsService(env); diff --git a/services/net/OWNERS b/services/net/OWNERS index 7311eee32a4c..d3836d4c6c57 100644 --- a/services/net/OWNERS +++ b/services/net/OWNERS @@ -1,8 +1,8 @@ set noparent codewiz@google.com -ek@google.com jchalard@google.com +junyulai@google.com lorenzo@google.com reminv@google.com satk@google.com diff --git a/services/net/java/android/net/NetworkStackClient.java b/services/net/java/android/net/NetworkStackClient.java index 830dbbe8b8c0..eed01aecf0e2 100644 --- a/services/net/java/android/net/NetworkStackClient.java +++ b/services/net/java/android/net/NetworkStackClient.java @@ -289,7 +289,8 @@ public class NetworkStackClient { private void requestConnector(@NonNull NetworkStackCallback request) { // TODO: PID check. final int caller = Binder.getCallingUid(); - if (caller != Process.SYSTEM_UID && !UserHandle.isSameApp(caller, Process.BLUETOOTH_UID)) { + if (caller != Process.SYSTEM_UID && !UserHandle.isSameApp(caller, Process.BLUETOOTH_UID) + && !UserHandle.isSameApp(caller, Process.PHONE_UID)) { // Don't even attempt to obtain the connector and give a nice error message throw new SecurityException( "Only the system server should try to bind to the network stack."); diff --git a/services/net/java/android/net/ip/IpServer.java b/services/net/java/android/net/ip/IpServer.java index 34fc7354d63e..0e44f88d2389 100644 --- a/services/net/java/android/net/ip/IpServer.java +++ b/services/net/java/android/net/ip/IpServer.java @@ -87,7 +87,6 @@ public class IpServer extends StateMachine { return "UNKNOWN: " + state; } - private static final IpPrefix LINK_LOCAL_PREFIX = new IpPrefix("fe80::/64"); private static final byte DOUG_ADAMS = (byte) 42; private static final String USB_NEAR_IFACE_ADDR = "192.168.42.129"; @@ -557,16 +556,6 @@ public class IpServer extends StateMachine { addedPrefixes.removeAll(mLastRaParams.prefixes); } - if (mLastRaParams == null || mLastRaParams.prefixes.isEmpty()) { - // We need to be able to send unicast RAs, and clients might - // like to ping the default router's link-local address. Note - // that we never remove the link-local route from the network - // until Tethering disables tethering on the interface. We - // only need to add the link-local prefix once, but in the - // event we add it more than once netd silently ignores EEXIST. - addedPrefixes.add(LINK_LOCAL_PREFIX); - } - if (!addedPrefixes.isEmpty()) { final ArrayList<RouteInfo> toBeAdded = getLocalRoutesFor(mIfaceName, addedPrefixes); diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java index 67477cf81109..3106e40e076e 100644 --- a/telephony/java/android/provider/Telephony.java +++ b/telephony/java/android/provider/Telephony.java @@ -4372,24 +4372,24 @@ public final class Telephony { } /** - * Generates a content {@link Uri} used to receive updates on precise carrier identity + * Generates a content {@link Uri} used to receive updates on specific carrier identity * change on the given subscriptionId returned by - * {@link TelephonyManager#getSimPreciseCarrierId()}. - * @see TelephonyManager#ACTION_SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED + * {@link TelephonyManager#getSimSpecificCarrierId()}. + * @see TelephonyManager#ACTION_SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED * <p> * Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the - * precise carrier identity {@link TelephonyManager#getSimPreciseCarrierId()} + * specific carrier identity {@link TelephonyManager#getSimSpecificCarrierId()} * while your app is running. You can also use a {@link JobService} to ensure your app * is notified of changes to the {@link Uri} even when it is not running. * Note, however, that using a {@link JobService} does not guarantee timely delivery of * updates to the {@link Uri}. * * @param subscriptionId the subscriptionId to receive updates on - * @return the Uri used to observe precise carrier identity changes + * @return the Uri used to observe specific carrier identity changes */ @NonNull - public static Uri getPreciseCarrierIdUriForSubscriptionId(int subscriptionId) { - return Uri.withAppendedPath(Uri.withAppendedPath(CONTENT_URI, "precise"), + public static Uri getSpecificCarrierIdUriForSubscriptionId(int subscriptionId) { + return Uri.withAppendedPath(Uri.withAppendedPath(CONTENT_URI, "specific"), String.valueOf(subscriptionId)); } @@ -4409,26 +4409,30 @@ public final class Telephony { /** * A fine-grained carrier id. - * @see TelephonyManager#getSimPreciseCarrierId() + * The specific carrier ID would be used for configuration purposes, but apps wishing to + * know about the carrier itself should use the regular carrier ID returned by + * {@link TelephonyManager#getSimCarrierId()}. + * + * @see TelephonyManager#getSimSpecificCarrierId() * This is not a database column, only used to notify content observers for - * {@link #getPreciseCarrierIdUriForSubscriptionId(int)} + * {@link #getSpecificCarrierIdUriForSubscriptionId(int)} */ - public static final String PRECISE_CARRIER_ID = "precise_carrier_id"; + public static final String SPECIFIC_CARRIER_ID = "specific_carrier_id"; /** - * A user facing carrier name for precise carrier id {@link #PRECISE_CARRIER_ID}. - * @see TelephonyManager#getSimPreciseCarrierIdName() + * A user facing carrier name for specific carrier id {@link #SPECIFIC_CARRIER_ID}. + * @see TelephonyManager#getSimSpecificCarrierIdName() * This is not a database column, only used to notify content observers for - * {@link #getPreciseCarrierIdUriForSubscriptionId(int)} + * {@link #getSpecificCarrierIdUriForSubscriptionId(int)} */ - public static final String PRECISE_CARRIER_ID_NAME = "precise_carrier_id_name"; + public static final String SPECIFIC_CARRIER_ID_NAME = "specific_carrier_id_name"; /** * A unique parent carrier id. The parent-child * relationship can be used to further differentiate a single carrier by different networks, - * by prepaid v.s. postpaid or even by 4G v.s. 3G plan. It's an optional field. - * A carrier id with a valid parent_carrier_id is considered fine-grained carrier id, will - * not be returned as {@link #CARRIER_ID} but {@link #PRECISE_CARRIER_ID}. + * by prepaid v.s. postpaid. It's an optional field. + * A carrier id with a valid parent_carrier_id is considered fine-grained specific carrier + * ID, will not be returned as {@link #CARRIER_ID} but {@link #SPECIFIC_CARRIER_ID}. * <P>Type: INTEGER </P> * @hide */ diff --git a/telephony/java/android/telephony/AvailableNetworkInfo.java b/telephony/java/android/telephony/AvailableNetworkInfo.java index 8a7153e16e2d..a15f959a96bd 100644 --- a/telephony/java/android/telephony/AvailableNetworkInfo.java +++ b/telephony/java/android/telephony/AvailableNetworkInfo.java @@ -16,6 +16,7 @@ package android.telephony; +import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; @@ -62,11 +63,22 @@ public final class AvailableNetworkInfo implements Parcelable { /** * Describes the List of PLMN ids (MCC-MNC) associated with mSubId. * If this entry is left empty, then the platform software will not scan the network - * to revalidate the input. + * to revalidate the input else platform will scan and verify specified PLMNs are available. */ private ArrayList<String> mMccMncs; /** + * Returns the frequency bands associated with the {@link #getMccMncs() MCC/MNCs}. + * Opportunistic network service will use these bands to scan. + * + * When no specific bands are specified (empty array or null) CBRS band (B48) will be + * used for network scan. + * + * See {@link AccessNetworkConstants} for details. + */ + private ArrayList<Integer> mBands; + + /** * Return subscription Id of the available network. * This value must be one of the entry retrieved from * {@link SubscriptionManager#getOpportunisticSubscriptions} @@ -91,10 +103,20 @@ public final class AvailableNetworkInfo implements Parcelable { * to revalidate the input. * @return list of PLMN ids */ - public List<String> getMccMncs() { + public @NonNull List<String> getMccMncs() { return (List<String>) mMccMncs.clone(); } + /** + * Returns the frequency bands that need to be scanned by opportunistic network service + * + * The returned value is defined in either of {@link AccessNetworkConstants.GeranBand}, + * {@link AccessNetworkConstants.UtranBand} and {@link AccessNetworkConstants.EutranBand} + */ + public @NonNull List<Integer> getBands() { + return (List<Integer>) mBands.clone(); + } + @Override public int describeContents() { return 0; @@ -105,6 +127,7 @@ public final class AvailableNetworkInfo implements Parcelable { dest.writeInt(mSubId); dest.writeInt(mPriority); dest.writeStringList(mMccMncs); + dest.writeList(mBands); } private AvailableNetworkInfo(Parcel in) { @@ -112,12 +135,16 @@ public final class AvailableNetworkInfo implements Parcelable { mPriority = in.readInt(); mMccMncs = new ArrayList<>(); in.readStringList(mMccMncs); + mBands = new ArrayList<>(); + in.readList(mBands, Integer.class.getClassLoader()); } - public AvailableNetworkInfo(int subId, int priority, List<String> mccMncs) { + public AvailableNetworkInfo(int subId, int priority, @NonNull List<String> mccMncs, + @NonNull List<Integer> bands) { mSubId = subId; mPriority = priority; mMccMncs = new ArrayList<String>(mccMncs); + mBands = new ArrayList<Integer>(bands); } @Override @@ -135,14 +162,15 @@ public final class AvailableNetworkInfo implements Parcelable { } return (mSubId == ani.mSubId - && mPriority == ani.mPriority - && (((mMccMncs != null) - && mMccMncs.equals(ani.mMccMncs)))); + && mPriority == ani.mPriority + && (((mMccMncs != null) + && mMccMncs.equals(ani.mMccMncs))) + && mBands.equals(ani.mBands)); } @Override public int hashCode() { - return Objects.hash(mSubId, mPriority, mMccMncs); + return Objects.hash(mSubId, mPriority, mMccMncs, mBands); } public static final @android.annotation.NonNull Parcelable.Creator<AvailableNetworkInfo> CREATOR = @@ -161,9 +189,9 @@ public final class AvailableNetworkInfo implements Parcelable { @Override public String toString() { return ("AvailableNetworkInfo:" - + " mSubId: " + mSubId - + " mPriority: " + mPriority - + " mMccMncs: " + Arrays.toString(mMccMncs.toArray())); + + " mSubId: " + mSubId + + " mPriority: " + mPriority + + " mMccMncs: " + Arrays.toString(mMccMncs.toArray()) + + " mBands: " + Arrays.toString(mBands.toArray())); } } - diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index d680b89f96b6..5262cf8ce91c 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -31,6 +31,7 @@ import android.os.PersistableBundle; import android.os.RemoteException; import android.os.ServiceManager; import android.service.carrier.CarrierService; +import android.telecom.TelecomManager; import android.telephony.ims.ImsReasonInfo; import com.android.internal.telephony.ICarrierConfigLoader; @@ -71,10 +72,10 @@ public class CarrierConfigManager { * one is available for the slot index. An optional int extra * {@link TelephonyManager#EXTRA_CARRIER_ID} is included to indicate the carrier id for the * changed carrier configuration. An optional int extra - * {@link TelephonyManager#EXTRA_PRECISE_CARRIER_ID} is included to indicate the precise + * {@link TelephonyManager#EXTRA_SPECIFIC_CARRIER_ID} is included to indicate the precise * carrier id for the changed carrier configuration. * @see TelephonyManager#getSimCarrierId() - * @see TelephonyManager#getSimPreciseCarrierId() + * @see TelephonyManager#getSimSpecificCarrierId() */ public static final String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED"; @@ -2114,6 +2115,18 @@ public class CarrierConfigManager { public static final String KEY_RTT_SUPPORTED_BOOL = "rtt_supported_bool"; /** + * Boolean flag indicating whether the carrier supports TTY. + * <p> + * Note that {@link #KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL} controls availability of TTY over + * VoLTE; if {@link #KEY_TTY_SUPPORTED_BOOL} is disabled, then + * {@link #KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL} is also implicitly disabled. + * <p> + * {@link TelecomManager#isTtySupported()} should be used to determine if a device supports TTY, + * and this carrier config key should be used to see if the current carrier supports it. + */ + public static final String KEY_TTY_SUPPORTED_BOOL = "tty_supported_bool"; + + /** * Indicates if the carrier supports auto-upgrading a call to RTT when receiving a call from a * RTT-supported device. * @hide @@ -2633,6 +2646,13 @@ public class CarrierConfigManager { public static final String KEY_CDMA_ENHANCED_ROAMING_INDICATOR_FOR_HOME_NETWORK_INT_ARRAY = "cdma_enhanced_roaming_indicator_for_home_network_int_array"; + /** + * Indicates use 3GPP application to replace 3GPP2 application even if it's a CDMA/CDMA-LTE + * phone, becasue some carriers's CSIM application is present but not supported. + * @hide + */ + public static final String KEY_USE_USIM_BOOL = "use_usim_bool"; + /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -2952,6 +2972,7 @@ public class CarrierConfigManager { sDefaults.putStringArray(KEY_ROAMING_OPERATOR_STRING_ARRAY, null); sDefaults.putBoolean(KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL, false); sDefaults.putBoolean(KEY_RTT_SUPPORTED_BOOL, false); + sDefaults.putBoolean(KEY_TTY_SUPPORTED_BOOL, true); sDefaults.putBoolean(KEY_DISABLE_CHARGE_INDICATION_BOOL, false); sDefaults.putBoolean(KEY_SUPPORT_NO_REPLY_TIMER_FOR_CFNRY_BOOL, true); sDefaults.putStringArray(KEY_FEATURE_ACCESS_CODES_STRING_ARRAY, null); @@ -3017,6 +3038,7 @@ public class CarrierConfigManager { 1 /* Roaming Indicator Off */ }); sDefaults.putStringArray(KEY_EMERGENCY_NUMBER_PREFIX_STRING_ARRAY, new String[0]); + sDefaults.putBoolean(KEY_USE_USIM_BOOL, false); } /** diff --git a/telephony/java/android/telephony/CellInfo.java b/telephony/java/android/telephony/CellInfo.java index 223f3efca757..1796034431a6 100644 --- a/telephony/java/android/telephony/CellInfo.java +++ b/telephony/java/android/telephony/CellInfo.java @@ -22,7 +22,6 @@ import android.annotation.UnsupportedAppUsage; import android.hardware.radio.V1_4.CellInfo.Info; import android.os.Parcel; import android.os.Parcelable; -import android.os.SystemClock; import com.android.internal.annotations.VisibleForTesting; @@ -325,9 +324,9 @@ public abstract class CellInfo implements Parcelable { } /** @hide */ - protected CellInfo(android.hardware.radio.V1_4.CellInfo ci) { + protected CellInfo(android.hardware.radio.V1_4.CellInfo ci, long timeStamp) { this.mRegistered = ci.isRegistered; - this.mTimeStamp = SystemClock.elapsedRealtimeNanos(); + this.mTimeStamp = timeStamp; this.mCellConnectionStatus = ci.connectionStatus; } @@ -358,14 +357,14 @@ public abstract class CellInfo implements Parcelable { } /** @hide */ - public static CellInfo create(android.hardware.radio.V1_4.CellInfo ci) { + public static CellInfo create(android.hardware.radio.V1_4.CellInfo ci, long timeStamp) { if (ci == null) return null; switch (ci.info.getDiscriminator()) { - case Info.hidl_discriminator.gsm: return new CellInfoGsm(ci); - case Info.hidl_discriminator.cdma: return new CellInfoCdma(ci); - case Info.hidl_discriminator.lte: return new CellInfoLte(ci); - case Info.hidl_discriminator.wcdma: return new CellInfoWcdma(ci); - case Info.hidl_discriminator.tdscdma: return new CellInfoTdscdma(ci); + case Info.hidl_discriminator.gsm: return new CellInfoGsm(ci, timeStamp); + case Info.hidl_discriminator.cdma: return new CellInfoCdma(ci, timeStamp); + case Info.hidl_discriminator.lte: return new CellInfoLte(ci, timeStamp); + case Info.hidl_discriminator.wcdma: return new CellInfoWcdma(ci, timeStamp); + case Info.hidl_discriminator.tdscdma: return new CellInfoTdscdma(ci, timeStamp); default: return null; } } diff --git a/telephony/java/android/telephony/CellInfoCdma.java b/telephony/java/android/telephony/CellInfoCdma.java index 9c38506c92ff..82bb3961e10c 100644 --- a/telephony/java/android/telephony/CellInfoCdma.java +++ b/telephony/java/android/telephony/CellInfoCdma.java @@ -68,8 +68,8 @@ public final class CellInfoCdma extends CellInfo implements Parcelable { } /** @hide */ - public CellInfoCdma(android.hardware.radio.V1_4.CellInfo ci) { - super(ci); + public CellInfoCdma(android.hardware.radio.V1_4.CellInfo ci, long timeStamp) { + super(ci, timeStamp); final android.hardware.radio.V1_2.CellInfoCdma cic = ci.info.cdma(); mCellIdentityCdma = new CellIdentityCdma(cic.cellIdentityCdma); mCellSignalStrengthCdma = diff --git a/telephony/java/android/telephony/CellInfoGsm.java b/telephony/java/android/telephony/CellInfoGsm.java index 0d91f8093d3d..59fcd1e5c67a 100644 --- a/telephony/java/android/telephony/CellInfoGsm.java +++ b/telephony/java/android/telephony/CellInfoGsm.java @@ -64,8 +64,8 @@ public final class CellInfoGsm extends CellInfo implements Parcelable { } /** @hide */ - public CellInfoGsm(android.hardware.radio.V1_4.CellInfo ci) { - super(ci); + public CellInfoGsm(android.hardware.radio.V1_4.CellInfo ci, long timeStamp) { + super(ci, timeStamp); final android.hardware.radio.V1_2.CellInfoGsm cig = ci.info.gsm(); mCellIdentityGsm = new CellIdentityGsm(cig.cellIdentityGsm); mCellSignalStrengthGsm = new CellSignalStrengthGsm(cig.signalStrengthGsm); diff --git a/telephony/java/android/telephony/CellInfoLte.java b/telephony/java/android/telephony/CellInfoLte.java index deae6320c558..08dafe11e0d0 100644 --- a/telephony/java/android/telephony/CellInfoLte.java +++ b/telephony/java/android/telephony/CellInfoLte.java @@ -71,8 +71,8 @@ public final class CellInfoLte extends CellInfo implements Parcelable { } /** @hide */ - public CellInfoLte(android.hardware.radio.V1_4.CellInfo ci) { - super(ci); + public CellInfoLte(android.hardware.radio.V1_4.CellInfo ci, long timeStamp) { + super(ci, timeStamp); final android.hardware.radio.V1_4.CellInfoLte cil = ci.info.lte(); mCellIdentityLte = new CellIdentityLte(cil.base.cellIdentityLte); mCellSignalStrengthLte = new CellSignalStrengthLte(cil.base.signalStrengthLte); diff --git a/telephony/java/android/telephony/CellInfoTdscdma.java b/telephony/java/android/telephony/CellInfoTdscdma.java index ae43bb2237cf..93baabf34c16 100644 --- a/telephony/java/android/telephony/CellInfoTdscdma.java +++ b/telephony/java/android/telephony/CellInfoTdscdma.java @@ -65,8 +65,8 @@ public final class CellInfoTdscdma extends CellInfo implements Parcelable { } /** @hide */ - public CellInfoTdscdma(android.hardware.radio.V1_4.CellInfo ci) { - super(ci); + public CellInfoTdscdma(android.hardware.radio.V1_4.CellInfo ci, long timeStamp) { + super(ci, timeStamp); final android.hardware.radio.V1_2.CellInfoTdscdma cit = ci.info.tdscdma(); mCellIdentityTdscdma = new CellIdentityTdscdma(cit.cellIdentityTdscdma); mCellSignalStrengthTdscdma = new CellSignalStrengthTdscdma(cit.signalStrengthTdscdma); diff --git a/telephony/java/android/telephony/CellInfoWcdma.java b/telephony/java/android/telephony/CellInfoWcdma.java index d2287ea9b54c..02dbb1a5ee40 100644 --- a/telephony/java/android/telephony/CellInfoWcdma.java +++ b/telephony/java/android/telephony/CellInfoWcdma.java @@ -64,8 +64,8 @@ public final class CellInfoWcdma extends CellInfo implements Parcelable { } /** @hide */ - public CellInfoWcdma(android.hardware.radio.V1_4.CellInfo ci) { - super(ci); + public CellInfoWcdma(android.hardware.radio.V1_4.CellInfo ci, long timeStamp) { + super(ci, timeStamp); final android.hardware.radio.V1_2.CellInfoWcdma ciw = ci.info.wcdma(); mCellIdentityWcdma = new CellIdentityWcdma(ciw.cellIdentityWcdma); mCellSignalStrengthWcdma = new CellSignalStrengthWcdma(ciw.signalStrengthWcdma); diff --git a/telephony/java/android/telephony/MbmsGroupCallSession.java b/telephony/java/android/telephony/MbmsGroupCallSession.java index 269cda13bd93..f1be31fa5477 100644 --- a/telephony/java/android/telephony/MbmsGroupCallSession.java +++ b/telephony/java/android/telephony/MbmsGroupCallSession.java @@ -141,7 +141,7 @@ public class MbmsGroupCallSession implements AutoCloseable { * Create a new {@link MbmsGroupCallSession} using the system default data subscription ID. * See {@link #create(Context, int, Executor, MbmsGroupCallSessionCallback)}. */ - public static MbmsGroupCallSession create(@NonNull Context context, + public static @Nullable MbmsGroupCallSession create(@NonNull Context context, @NonNull Executor executor, @NonNull MbmsGroupCallSessionCallback callback) { return create(context, SubscriptionManager.getDefaultSubscriptionId(), executor, callback); } diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java index fae7920d1ab8..07ffaac01b0f 100644 --- a/telephony/java/android/telephony/SmsManager.java +++ b/telephony/java/android/telephony/SmsManager.java @@ -322,6 +322,7 @@ public final class SmsManager { * <code>RESULT_ERROR_GENERIC_FAILURE</code><br> * <code>RESULT_ERROR_RADIO_OFF</code><br> * <code>RESULT_ERROR_NULL_PDU</code><br> + * <code>RESULT_ERROR_NO_SERVICE</code><br> * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include * the extra "errorCode" containing a radio technology specific value, * generally only useful for troubleshooting.<br> @@ -371,19 +372,12 @@ public final class SmsManager { if (DBG) { Log.d(TAG, "for subId: " + subId + ", subscription-info: " + info); } - if (info == null) { - // There is no subscription for the given subId. That can only mean one thing: - // the caller is using a SmsManager instance with an obsolete subscription id. - // That is most probably because caller didn't invalidate SmsManager instance - // for an already deleted subscription id. - Log.e(TAG, "subId: " + subId + " for this SmsManager instance is obsolete."); - sendErrorInPendingIntent(sentIntent, SmsManager.RESULT_ERROR_NO_SERVICE); - } /* If the Subscription associated with this SmsManager instance belongs to a remote-sim, * then send the message thru the remote-sim subscription. */ - if (info.getSubscriptionType() == SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM) { + if (info != null + && info.getSubscriptionType() == SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM) { if (DBG) Log.d(TAG, "sending message thru bluetooth"); sendTextMessageBluetooth(destinationAddress, scAddress, text, sentIntent, deliveryIntent, info); @@ -391,8 +385,10 @@ public final class SmsManager { } try { + // If the subscription is invalid or default, we will use the default phone to send the + // SMS and possibly fail later in the SMS sending process. ISms iccISms = getISmsServiceOrThrow(); - iccISms.sendTextForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(), + iccISms.sendTextForSubscriber(subId, ActivityThread.currentPackageName(), destinationAddress, scAddress, text, sentIntent, deliveryIntent, persistMessage); @@ -465,6 +461,9 @@ public final class SmsManager { } private void sendErrorInPendingIntent(PendingIntent intent, int errorCode) { + if (intent == null) { + return; + } try { intent.send(errorCode); } catch (PendingIntent.CanceledException e) { diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index fb6f39d6ae8e..245f5b3a9eac 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -425,14 +425,14 @@ public class SubscriptionInfo implements Parcelable { /** * @return The MCC, as a string. */ - public String getMccString() { + public @Nullable String getMccString() { return this.mMcc; } /** * @return The MNC, as a string. */ - public String getMncString() { + public @Nullable String getMncString() { return this.mMnc; } diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 8edc5b4f404a..d9a37c6867c6 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -2706,7 +2706,8 @@ public class SubscriptionManager { * 1) Even if it's active, it will be dormant most of the time. The modem will not try * to scan or camp until it knows an available network is nearby to save power. * 2) Telephony relies on system app or carrier input to notify nearby available networks. - * See {@link TelephonyManager#updateAvailableNetworks(List)} for more information. + * See {@link TelephonyManager#updateAvailableNetworks(List, Executor, Consumer)} + * for more information. * 3) In multi-SIM devices, when the network is nearby and camped, system may automatically * switch internet data between it and default data subscription, based on carrier * recommendation and its signal strength and metered-ness, etc. @@ -2938,7 +2939,7 @@ public class SubscriptionManager { } /** - * Enabled or disable a subscription. This is currently used in the settings page. + * Enables or disables a subscription. This is currently used in the settings page. * * <p> * Permissions android.Manifest.permission.MODIFY_PHONE_STATE is required diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 7954d0e391dd..9ca57174d3aa 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -84,6 +84,7 @@ import com.android.internal.telephony.IPhoneSubInfo; import com.android.internal.telephony.ISetOpportunisticDataCallback; import com.android.internal.telephony.ITelephony; import com.android.internal.telephony.ITelephonyRegistry; +import com.android.internal.telephony.IUpdateAvailableNetworksCallback; import com.android.internal.telephony.OperatorInfo; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.RILConstants; @@ -1248,30 +1249,34 @@ public class TelephonyManager { public static final String EXTRA_CARRIER_NAME = "android.telephony.extra.CARRIER_NAME"; /** - * Broadcast Action: The subscription precise carrier identity has changed. - * The precise carrier id can be used to further differentiate a carrier by different - * networks, by prepaid v.s.postpaid or even by 4G v.s.3G plan. Each carrier has a unique - * carrier id returned by {@link #getSimCarrierId()} but could have multiple precise carrier id. - * e.g, {@link #getSimCarrierId()} will always return Tracfone (id 2022) for a Tracfone SIM, - * while {@link #getSimPreciseCarrierId()} can return Tracfone AT&T or Tracfone T-Mobile based - * on the current subscription IMSI. For carriers without any fine-grained ids, precise carrier - * id is same as carrier id. + * Broadcast Action: The subscription specific carrier identity has changed. + * + * A specific carrier ID returns the fine-grained carrier ID of the current subscription. + * It can represent the fact that a carrier may be in effect an aggregation of other carriers + * (ie in an MVNO type scenario) where each of these specific carriers which are used to make + * up the actual carrier service may have different carrier configurations. + * A specific carrier ID could also be used, for example, in a scenario where a carrier requires + * different carrier configuration for different service offering such as a prepaid plan. + * + * the specific carrier ID would be used for configuration purposes, but apps wishing to know + * about the carrier itself should use the regular carrier ID returned by + * {@link #getSimCarrierId()}. * * <p>Similar like {@link #ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED}, this intent will be * sent on the event of {@link #ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED} while its also * possible to be sent without {@link #ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED} when - * precise carrier id changes with the same carrier id. + * specific carrier ID changes while carrier ID remains the same. * e.g, the same subscription switches to different IMSI could potentially change its - * precise carrier id while carrier id remains the same. - * @see #getSimPreciseCarrierId() + * specific carrier ID while carrier id remains the same. + * @see #getSimSpecificCarrierId() * @see #getSimCarrierId() * * The intent will have the following extra values: * <ul> - * <li>{@link #EXTRA_PRECISE_CARRIER_ID} The up-to-date precise carrier id of the + * <li>{@link #EXTRA_SPECIFIC_CARRIER_ID} The up-to-date specific carrier id of the * current subscription. * </li> - * <li>{@link #EXTRA_PRECISE_CARRIER_NAME} The up-to-date name of the precise carrier id. + * <li>{@link #EXTRA_SPECIFIC_CARRIER_NAME} The up-to-date name of the specific carrier id. * </li> * <li>{@link #EXTRA_SUBSCRIPTION_ID} The subscription id associated with the changed carrier * identity. @@ -1280,30 +1285,30 @@ public class TelephonyManager { * <p class="note">This is a protected intent that can only be sent by the system. */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) - public static final String ACTION_SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED = - "android.telephony.action.SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED"; + public static final String ACTION_SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED = + "android.telephony.action.SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED"; /** - * An int extra used with {@link #ACTION_SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED} which - * indicates the updated precise carrier id returned by - * {@link TelephonyManager#getSimPreciseCarrierId()}. Note, its possible precise carrier id + * An int extra used with {@link #ACTION_SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED} which + * indicates the updated specific carrier id returned by + * {@link TelephonyManager#getSimSpecificCarrierId()}. Note, its possible specific carrier id * changes while {@link #ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED} remains the same * e.g, when subscription switch to different IMSIs. * <p>Will be {@link TelephonyManager#UNKNOWN_CARRIER_ID} if the subscription is unavailable or * the carrier cannot be identified. */ - public static final String EXTRA_PRECISE_CARRIER_ID = - "android.telephony.extra.PRECISE_CARRIER_ID"; + public static final String EXTRA_SPECIFIC_CARRIER_ID = + "android.telephony.extra.SPECIFIC_CARRIER_ID"; /** - * An string extra used with {@link #ACTION_SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED} which - * indicates the updated precise carrier name returned by - * {@link TelephonyManager#getSimPreciseCarrierIdName()}. - * <p>it's a user-facing name of the precise carrier id {@link #EXTRA_PRECISE_CARRIER_ID}, e.g, - * Tracfone-AT&T. + * An string extra used with {@link #ACTION_SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED} + * which indicates the updated specific carrier name returned by + * {@link TelephonyManager#getSimSpecificCarrierIdName()}. + * <p>it's a user-facing name of the specific carrier id {@link #EXTRA_SPECIFIC_CARRIER_ID} + * e.g, Tracfone-AT&T */ - public static final String EXTRA_PRECISE_CARRIER_NAME = - "android.telephony.extra.PRECISE_CARRIER_NAME"; + public static final String EXTRA_SPECIFIC_CARRIER_NAME = + "android.telephony.extra.SPECIFIC_CARRIER_NAME"; /** * An int extra used with {@link #ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED} to indicate the @@ -8940,17 +8945,23 @@ public class TelephonyManager { } /** - * Returns fine-grained carrier id of the current subscription. + * Returns fine-grained carrier ID of the current subscription. + * + * A specific carrier ID can represent the fact that a carrier may be in effect an aggregation + * of other carriers (ie in an MVNO type scenario) where each of these specific carriers which + * are used to make up the actual carrier service may have different carrier configurations. + * A specific carrier ID could also be used, for example, in a scenario where a carrier requires + * different carrier configuration for different service offering such as a prepaid plan. + * + * the specific carrier ID would be used for configuration purposes, but apps wishing to know + * about the carrier itself should use the regular carrier ID returned by + * {@link #getSimCarrierId()}. * - * <p>The precise carrier id can be used to further differentiate a carrier by different - * networks, by prepaid v.s.postpaid or even by 4G v.s.3G plan. Each carrier has a unique - * carrier id returned by {@link #getSimCarrierId()} but could have multiple precise carrier id. - * e.g, {@link #getSimCarrierId()} will always return Tracfone (id 2022) for a Tracfone SIM, - * while {@link #getSimPreciseCarrierId()} can return Tracfone AT&T or Tracfone T-Mobile based - * on the current subscription IMSI. + * e.g, Tracfone SIMs could return different specific carrier ID based on IMSI from current + * subscription while carrier ID remains the same. * - * <p>For carriers without any fine-grained carrier ids, return {@link #getSimCarrierId()} - * <p>Precise carrier ids are defined in the same way as carrier id + * <p>For carriers without fine-grained specific carrier ids, return {@link #getSimCarrierId()} + * <p>Specific carrier ids are defined in the same way as carrier id * <a href="https://android.googlesource.com/platform/packages/providers/TelephonyProvider/+/master/assets/carrier_list.textpb">here</a> * except each with a "parent" id linking to its top-level carrier id. * @@ -8958,11 +8969,11 @@ public class TelephonyManager { * Return {@link #UNKNOWN_CARRIER_ID} if the subscription is unavailable or the carrier cannot * be identified. */ - public int getSimPreciseCarrierId() { + public int getSimSpecificCarrierId() { try { ITelephony service = getITelephony(); if (service != null) { - return service.getSubscriptionPreciseCarrierId(getSubId()); + return service.getSubscriptionSpecificCarrierId(getSubId()); } } catch (RemoteException ex) { // This could happen if binder process crashes. @@ -8972,18 +8983,22 @@ public class TelephonyManager { /** * Similar like {@link #getSimCarrierIdName()}, returns user-facing name of the - * precise carrier id returned by {@link #getSimPreciseCarrierId()}. + * specific carrier id returned by {@link #getSimSpecificCarrierId()}. + * + * The specific carrier ID would be used for configuration purposes, but apps wishing to know + * about the carrier itself should use the regular carrier ID returned by + * {@link #getSimCarrierIdName()}. * * <p>The returned name is unlocalized. * - * @return user-facing name of the subscription precise carrier id. Return {@code null} if the + * @return user-facing name of the subscription specific carrier id. Return {@code null} if the * subscription is unavailable or the carrier cannot be identified. */ - public @Nullable CharSequence getSimPreciseCarrierIdName() { + public @Nullable CharSequence getSimSpecificCarrierIdName() { try { ITelephony service = getITelephony(); if (service != null) { - return service.getSubscriptionPreciseCarrierName(getSubId()); + return service.getSubscriptionSpecificCarrierName(getSubId()); } } catch (RemoteException ex) { // This could happen if binder process crashes. @@ -10176,6 +10191,41 @@ public class TelephonyManager { */ public static final int SET_OPPORTUNISTIC_SUB_INVALID_PARAMETER = 2; + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = {"UPDATE_AVAILABLE_NETWORKS"}, value = { + UPDATE_AVAILABLE_NETWORKS_SUCCESS, + UPDATE_AVAILABLE_NETWORKS_UNKNOWN_FAILURE, + UPDATE_AVAILABLE_NETWORKS_ABORTED, + UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS, + UPDATE_AVAILABLE_NETWORKS_NO_CARRIER_PRIVILEGE}) + public @interface UpdateAvailableNetworksResult {} + + /** + * No error. Operation succeeded. + */ + public static final int UPDATE_AVAILABLE_NETWORKS_SUCCESS = 0; + + /** + * There is a unknown failure happened. + */ + public static final int UPDATE_AVAILABLE_NETWORKS_UNKNOWN_FAILURE = 1; + + /** + * The request is aborted. + */ + public static final int UPDATE_AVAILABLE_NETWORKS_ABORTED = 2; + + /** + * The parameter passed in is invalid. + */ + public static final int UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS = 3; + + /** + * No carrier privilege. + */ + public static final int UPDATE_AVAILABLE_NETWORKS_NO_CARRIER_PRIVILEGE = 4; + /** * Set preferred opportunistic data subscription id. * @@ -10258,28 +10308,46 @@ public class TelephonyManager { * This api should be called to inform OpportunisticNetwork Service about the availability * of a network at the current location. This information will be used by OpportunisticNetwork * service to decide to attach to the network opportunistically. If an empty list is passed, - * it is assumed that no network is available. + * it is assumed that no network is available and will result in disabling the modem stack + * to save power. * Requires that the calling app has carrier privileges on both primary and * secondary subscriptions (see {@link #hasCarrierPrivileges}), or has permission * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. * @param availableNetworks is a list of available network information. - * @return true if request is accepted + * @param executor The executor of where the callback will execute. + * @param callback Callback will be triggered once it succeeds or failed. * */ @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges - public boolean updateAvailableNetworks(List<AvailableNetworkInfo> availableNetworks) { + public void updateAvailableNetworks(@NonNull List<AvailableNetworkInfo> availableNetworks, + @Nullable @CallbackExecutor Executor executor, + @UpdateAvailableNetworksResult @Nullable Consumer<Integer> callback) { String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>"; - boolean ret = false; try { IOns iOpportunisticNetworkService = getIOns(); - if (iOpportunisticNetworkService != null && availableNetworks != null) { - ret = iOpportunisticNetworkService.updateAvailableNetworks(availableNetworks, - pkgForDebug); + if (iOpportunisticNetworkService == null || availableNetworks == null) { + Binder.withCleanCallingIdentity(() -> executor.execute(() -> { + callback.accept(UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS); + })); + return; } + IUpdateAvailableNetworksCallback callbackStub = + new IUpdateAvailableNetworksCallback.Stub() { + @Override + public void onComplete(int result) { + if (executor == null || callback == null) { + return; + } + Binder.withCleanCallingIdentity(() -> executor.execute(() -> { + callback.accept(result); + })); + } + }; + iOpportunisticNetworkService.updateAvailableNetworks(availableNetworks, callbackStub, + pkgForDebug); } catch (RemoteException ex) { Rlog.e(TAG, "updateAvailableNetworks RemoteException", ex); } - return ret; } /** diff --git a/telephony/java/android/telephony/ims/ProvisioningManager.java b/telephony/java/android/telephony/ims/ProvisioningManager.java index 9104d9f4f110..d12cda8a30a4 100644 --- a/telephony/java/android/telephony/ims/ProvisioningManager.java +++ b/telephony/java/android/telephony/ims/ProvisioningManager.java @@ -154,7 +154,7 @@ public class ProvisioningManager { * @param item the IMS provisioning key constant, as defined by the OEM. * @param value the new String value of the IMS configuration constant. */ - public void onProvisioningStringChanged(int item, String value) { + public void onProvisioningStringChanged(int item, @NonNull String value) { // Base Implementation } diff --git a/telephony/java/com/android/internal/telephony/IOns.aidl b/telephony/java/com/android/internal/telephony/IOns.aidl index 0364477ead8c..2c48b6512421 100755 --- a/telephony/java/com/android/internal/telephony/IOns.aidl +++ b/telephony/java/com/android/internal/telephony/IOns.aidl @@ -19,6 +19,7 @@ package com.android.internal.telephony; import android.telephony.AvailableNetworkInfo; import com.android.internal.telephony.ISetOpportunisticDataCallback; +import com.android.internal.telephony.IUpdateAvailableNetworksCallback; interface IOns { @@ -97,9 +98,9 @@ interface IOns { * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. * @param availableNetworks is a list of available network information. * @param callingPackage caller's package name - * @return true if request is accepted + * @param callback callback upon request completion. * */ - boolean updateAvailableNetworks(in List<AvailableNetworkInfo> availableNetworks, - String callingPackage); + void updateAvailableNetworks(in List<AvailableNetworkInfo> availableNetworks, + IUpdateAvailableNetworksCallback callbackStub, String callingPackage); } diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index b90194a91382..c6fa22b38676 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -1369,7 +1369,7 @@ interface ITelephony { /** * Returns fine-grained carrier id of the current subscription. * - * <p>The precise carrier id can be used to further differentiate a carrier by different + * <p>The specific carrier id can be used to further differentiate a carrier by different * networks, by prepaid v.s.postpaid or even by 4G v.s.3G plan. Each carrier has a unique * carrier id {@link #getSimCarrierId()} but can have multiple precise carrier id. e.g, * {@link #getSimCarrierId()} will always return Tracfone (id 2022) for a Tracfone SIM, while @@ -1383,19 +1383,19 @@ interface ITelephony { * be identified. * @hide */ - int getSubscriptionPreciseCarrierId(int subId); + int getSubscriptionSpecificCarrierId(int subId); /** * Similar like {@link #getSimCarrierIdName()}, returns user-facing name of the - * precise carrier id {@link #getSimPreciseCarrierId()} + * specific carrier id {@link #getSimSpecificCarrierId()} * * <p>The returned name is unlocalized. * - * @return user-facing name of the subscription precise carrier id. Return {@code null} if the + * @return user-facing name of the subscription specific carrier id. Return {@code null} if the * subscription is unavailable or the carrier cannot be identified. * @hide */ - String getSubscriptionPreciseCarrierName(int subId); + String getSubscriptionSpecificCarrierName(int subId); /** * Returns carrier id based on MCCMNC only. This will return a MNO carrier id used for fallback diff --git a/telephony/java/com/android/internal/telephony/IUpdateAvailableNetworksCallback.aidl b/telephony/java/com/android/internal/telephony/IUpdateAvailableNetworksCallback.aidl new file mode 100644 index 000000000000..8fe086cea1f9 --- /dev/null +++ b/telephony/java/com/android/internal/telephony/IUpdateAvailableNetworksCallback.aidl @@ -0,0 +1,25 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.telephony; + +/** + * Callback to provide asynchronous result of updateAvailableNetworks. + * @hide + */ +oneway interface IUpdateAvailableNetworksCallback { + void onComplete(int result); +} diff --git a/tests/AccessibilityEventsLogger/Android.bp b/tests/AccessibilityEventsLogger/Android.bp new file mode 100644 index 000000000000..ead165602254 --- /dev/null +++ b/tests/AccessibilityEventsLogger/Android.bp @@ -0,0 +1,9 @@ +android_test { + name: "AccessibilityEventsLogger", + srcs: ["**/*.java"], + sdk_version: "current", + certificate: "platform", + optimize: { + enabled: false, + }, +} diff --git a/tests/AccessibilityEventsLogger/Android.mk b/tests/AccessibilityEventsLogger/Android.mk deleted file mode 100644 index 4224017993e2..000000000000 --- a/tests/AccessibilityEventsLogger/Android.mk +++ /dev/null @@ -1,14 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := AccessibilityEventsLogger -LOCAL_SDK_VERSION := current -LOCAL_CERTIFICATE := platform - -LOCAL_PROGUARD_ENABLED := disabled - -include $(BUILD_PACKAGE) diff --git a/tests/AccessoryDisplay/Android.mk b/tests/AccessoryDisplay/Android.mk deleted file mode 100644 index 85cb309bd720..000000000000 --- a/tests/AccessoryDisplay/Android.mk +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (C) 2013 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/AccessoryDisplay/common/Android.bp b/tests/AccessoryDisplay/common/Android.bp new file mode 100644 index 000000000000..3ce4c5718d13 --- /dev/null +++ b/tests/AccessoryDisplay/common/Android.bp @@ -0,0 +1,20 @@ +// Copyright (C) 2013 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. + +// Build the application. +java_library_static { + name: "AccessoryDisplayCommon", + sdk_version: "current", + srcs: ["src/**/*.java"], +} diff --git a/tests/AccessoryDisplay/common/Android.mk b/tests/AccessoryDisplay/common/Android.mk deleted file mode 100644 index 2d4de1564506..000000000000 --- a/tests/AccessoryDisplay/common/Android.mk +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) 2013 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -# Build the application. -include $(CLEAR_VARS) -LOCAL_MODULE := AccessoryDisplayCommon -LOCAL_MODULE_TAGS := tests -LOCAL_SDK_VERSION := current -LOCAL_SRC_FILES := $(call all-java-files-under, src) -include $(BUILD_STATIC_JAVA_LIBRARY) diff --git a/tests/AccessoryDisplay/sink/Android.bp b/tests/AccessoryDisplay/sink/Android.bp new file mode 100644 index 000000000000..4e50a81d8c24 --- /dev/null +++ b/tests/AccessoryDisplay/sink/Android.bp @@ -0,0 +1,22 @@ +// Copyright (C) 2013 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. + +// Build the application. +android_test { + name: "AccessoryDisplaySink", + sdk_version: "current", + srcs: ["src/**/*.java"], + resource_dirs: ["res"], + static_libs: ["AccessoryDisplayCommon"], +} diff --git a/tests/AccessoryDisplay/sink/Android.mk b/tests/AccessoryDisplay/sink/Android.mk deleted file mode 100644 index 772ce0c849fb..000000000000 --- a/tests/AccessoryDisplay/sink/Android.mk +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (C) 2013 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -# Build the application. -include $(CLEAR_VARS) -LOCAL_PACKAGE_NAME := AccessoryDisplaySink -LOCAL_MODULE_TAGS := tests -LOCAL_SDK_VERSION := current -LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_RESOURCE_DIR = $(LOCAL_PATH)/res -LOCAL_STATIC_JAVA_LIBRARIES := AccessoryDisplayCommon -include $(BUILD_PACKAGE) diff --git a/tests/AccessoryDisplay/source/Android.bp b/tests/AccessoryDisplay/source/Android.bp new file mode 100644 index 000000000000..6d8087f5e7dd --- /dev/null +++ b/tests/AccessoryDisplay/source/Android.bp @@ -0,0 +1,22 @@ +// Copyright (C) 2013 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. + +// Build the application. +android_test { + name: "AccessoryDisplaySource", + sdk_version: "current", + srcs: ["src/**/*.java"], + resource_dirs: ["res"], + static_libs: ["AccessoryDisplayCommon"], +} diff --git a/tests/AccessoryDisplay/source/Android.mk b/tests/AccessoryDisplay/source/Android.mk deleted file mode 100644 index 5d1085dc2a84..000000000000 --- a/tests/AccessoryDisplay/source/Android.mk +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (C) 2013 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -# Build the application. -include $(CLEAR_VARS) -LOCAL_PACKAGE_NAME := AccessoryDisplaySource -LOCAL_MODULE_TAGS := tests -LOCAL_SDK_VERSION := current -LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_RESOURCE_DIR = $(LOCAL_PATH)/res -LOCAL_STATIC_JAVA_LIBRARIES := AccessoryDisplayCommon -include $(BUILD_PACKAGE) diff --git a/tests/ActivityTests/Android.bp b/tests/ActivityTests/Android.bp new file mode 100644 index 000000000000..01828624fa4a --- /dev/null +++ b/tests/ActivityTests/Android.bp @@ -0,0 +1,6 @@ +android_test { + name: "ActivityTest", + srcs: ["**/*.java"], + platform_apis: true, + certificate: "platform", +} diff --git a/tests/ActivityTests/Android.mk b/tests/ActivityTests/Android.mk deleted file mode 100644 index 94294f6b062a..000000000000 --- a/tests/ActivityTests/Android.mk +++ /dev/null @@ -1,14 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := ActivityTest -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_MODULE_TAGS := tests -LOCAL_CERTIFICATE := platform - -LOCAL_USE_AAPT2 := true - -include $(BUILD_PACKAGE) diff --git a/tests/AmSlam/Android.bp b/tests/AmSlam/Android.bp new file mode 100644 index 000000000000..a8e575a39da4 --- /dev/null +++ b/tests/AmSlam/Android.bp @@ -0,0 +1,23 @@ +// +// 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. +// + +android_test { + name: "AmSlam", + srcs: ["**/*.java"], + sdk_version: "current", + min_sdk_version: "21", + java_version: "1.8", +} diff --git a/tests/AmSlam/Android.mk b/tests/AmSlam/Android.mk deleted file mode 100644 index 934bae03a560..000000000000 --- a/tests/AmSlam/Android.mk +++ /dev/null @@ -1,30 +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. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := AmSlam - -LOCAL_SDK_VERSION := current -LOCAL_MIN_SDK_VERSION := 21 -LOCAL_JAVA_LANGUAGE_VERSION := 1.8 - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE) diff --git a/tests/Assist/Android.bp b/tests/Assist/Android.bp new file mode 100644 index 000000000000..216e75109dde --- /dev/null +++ b/tests/Assist/Android.bp @@ -0,0 +1,5 @@ +android_test { + name: "Assist", + srcs: ["**/*.java"], + platform_apis: true, +} diff --git a/tests/Assist/Android.mk b/tests/Assist/Android.mk deleted file mode 100644 index d0d3ecaa5dec..000000000000 --- a/tests/Assist/Android.mk +++ /dev/null @@ -1,11 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := Assist -LOCAL_PRIVATE_PLATFORM_APIS := true - -include $(BUILD_PACKAGE) diff --git a/tests/BandwidthTests/Android.bp b/tests/BandwidthTests/Android.bp new file mode 100644 index 000000000000..523f5226cd2c --- /dev/null +++ b/tests/BandwidthTests/Android.bp @@ -0,0 +1,21 @@ +// +// Copyright (C) 2011 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. +// + +android_test { + name: "BandwidthEnforcementTest", + platform_apis: true, + srcs: ["src/**/*.java"], +} diff --git a/tests/BandwidthTests/Android.mk b/tests/BandwidthTests/Android.mk deleted file mode 100644 index d00fdc68cda4..000000000000 --- a/tests/BandwidthTests/Android.mk +++ /dev/null @@ -1,25 +0,0 @@ -# -# Copyright (C) 2011 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_PACKAGE_NAME := BandwidthEnforcementTest -LOCAL_PRIVATE_PLATFORM_APIS := true -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -include $(BUILD_PACKAGE) diff --git a/tests/BatteryWaster/Android.bp b/tests/BatteryWaster/Android.bp new file mode 100644 index 000000000000..4698910adb40 --- /dev/null +++ b/tests/BatteryWaster/Android.bp @@ -0,0 +1,6 @@ +android_test { + name: "BatteryWaster", + srcs: ["**/*.java"], + sdk_version: "current", + certificate: "platform", +} diff --git a/tests/BatteryWaster/Android.mk b/tests/BatteryWaster/Android.mk deleted file mode 100644 index fb244a856121..000000000000 --- a/tests/BatteryWaster/Android.mk +++ /dev/null @@ -1,12 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := BatteryWaster -LOCAL_SDK_VERSION := current -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) diff --git a/tests/BiDiTests/Android.bp b/tests/BiDiTests/Android.bp new file mode 100644 index 000000000000..c659e8c1257e --- /dev/null +++ b/tests/BiDiTests/Android.bp @@ -0,0 +1,23 @@ +// Copyright (C) 2011 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. + +android_test { + name: "BiDiTests", + // Only compile source java files in this apk. + srcs: ["src/**/*.java"], + sdk_version: "current", + optimize: { + proguard_flags_files: ["proguard.flags"], + }, +} diff --git a/tests/BiDiTests/Android.mk b/tests/BiDiTests/Android.mk deleted file mode 100644 index 78cf4be66fbe..000000000000 --- a/tests/BiDiTests/Android.mk +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (C) 2011 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -# Only compile source java files in this apk. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := BiDiTests -LOCAL_SDK_VERSION := current - -LOCAL_PROGUARD_FLAG_FILES := proguard.flags - -include $(BUILD_PACKAGE)
\ No newline at end of file diff --git a/tests/BrowserPowerTest/Android.bp b/tests/BrowserPowerTest/Android.bp new file mode 100644 index 000000000000..1d358cbe6e75 --- /dev/null +++ b/tests/BrowserPowerTest/Android.bp @@ -0,0 +1,26 @@ +// Copyright 2008, 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. + +android_test { + name: "BrowserPowerTests", + libs: [ + "android.test.runner", + "android.test.base", + ], + static_libs: ["junit"], + // Include all test java files. + srcs: ["src/**/*.java"], + platform_apis: true, + //LOCAL_INSTRUMENTATION_FOR := browserpowertest +} diff --git a/tests/BrowserPowerTest/Android.mk b/tests/BrowserPowerTest/Android.mk deleted file mode 100644 index 0934889e04d7..000000000000 --- a/tests/BrowserPowerTest/Android.mk +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 2008, The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -# We only want this apk build for tests. -LOCAL_MODULE_TAGS := tests - -LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base -LOCAL_STATIC_JAVA_LIBRARIES := junit - -# Include all test java files. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := BrowserPowerTests -LOCAL_PRIVATE_PLATFORM_APIS := true - -#LOCAL_INSTRUMENTATION_FOR := browserpowertest - -include $(BUILD_PACKAGE) diff --git a/tests/Camera2Tests/Android.mk b/tests/Camera2Tests/Android.mk deleted file mode 100644 index 5053e7d64389..000000000000 --- a/tests/Camera2Tests/Android.mk +++ /dev/null @@ -1 +0,0 @@ -include $(call all-subdir-makefiles) diff --git a/tests/Camera2Tests/SmartCamera/Android.mk b/tests/Camera2Tests/SmartCamera/Android.mk deleted file mode 100644 index 3fa8f54ae030..000000000000 --- a/tests/Camera2Tests/SmartCamera/Android.mk +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2013 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -include $(call all-subdir-makefiles) diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp b/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp index 0b16b0ecf0c1..a23ac38785f6 100644 --- a/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp +++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp @@ -15,9 +15,7 @@ cc_test_library { name: "libsmartcamera_jni", - sdk_version: "14", - srcs: [ "contrast.cpp", "brightness.cpp", @@ -29,13 +27,11 @@ cc_test_library { "sobeloperator.cpp", "stats_scorer.cpp", ], - cflags: [ "-Wall", "-Wextra", "-Werror", "-Wno-unused-parameter", ], - stl: "c++_static", } diff --git a/tests/CameraPrewarmTest/Android.bp b/tests/CameraPrewarmTest/Android.bp new file mode 100644 index 000000000000..eaf453b6f3ae --- /dev/null +++ b/tests/CameraPrewarmTest/Android.bp @@ -0,0 +1,6 @@ +android_test { + name: "CameraPrewarmTest", + srcs: ["**/*.java"], + sdk_version: "current", + certificate: "platform", +} diff --git a/tests/CameraPrewarmTest/Android.mk b/tests/CameraPrewarmTest/Android.mk deleted file mode 100644 index e12850469245..000000000000 --- a/tests/CameraPrewarmTest/Android.mk +++ /dev/null @@ -1,12 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := CameraPrewarmTest -LOCAL_SDK_VERSION := current - -LOCAL_MODULE_TAGS := tests -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) diff --git a/tests/CoreTests/Android.mk b/tests/CoreTests/Android.mk deleted file mode 100644 index 833843220098..000000000000 --- a/tests/CoreTests/Android.mk +++ /dev/null @@ -1,2 +0,0 @@ -include $(call all-subdir-makefiles) - diff --git a/tests/CoreTests/android/Android.bp b/tests/CoreTests/android/Android.bp new file mode 100644 index 000000000000..24134e8fb7f0 --- /dev/null +++ b/tests/CoreTests/android/Android.bp @@ -0,0 +1,11 @@ +android_test { + name: "LegacyCoreTests", + srcs: ["**/*.java"], + libs: [ + "android.test.runner.stubs", + "org.apache.http.legacy", + "android.test.base.stubs", + ], + sdk_version: "current", + static_libs: ["junit"], +} diff --git a/tests/CoreTests/android/Android.mk b/tests/CoreTests/android/Android.mk deleted file mode 100644 index 04f6739a6ced..000000000000 --- a/tests/CoreTests/android/Android.mk +++ /dev/null @@ -1,20 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := \ - $(call all-subdir-java-files) - -LOCAL_JAVA_LIBRARIES := \ - android.test.runner.stubs \ - org.apache.http.legacy \ - android.test.base.stubs \ - -LOCAL_SDK_VERSION := current - -LOCAL_STATIC_JAVA_LIBRARIES := junit - -LOCAL_PACKAGE_NAME := LegacyCoreTests - -include $(BUILD_PACKAGE) diff --git a/tests/DataIdleTest/Android.bp b/tests/DataIdleTest/Android.bp new file mode 100644 index 000000000000..19656ce32b29 --- /dev/null +++ b/tests/DataIdleTest/Android.bp @@ -0,0 +1,28 @@ +// +// Copyright (C) 2011 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. +// + +android_test { + name: "DataIdleTest", + platform_apis: true, + libs: [ + "android.test.runner", + "android.test.base", + ], + static_libs: ["junit"], + srcs: ["src/**/*.java"], + // We need to sign it to get access to the network usage history. + certificate: "platform", +} diff --git a/tests/DataIdleTest/Android.mk b/tests/DataIdleTest/Android.mk deleted file mode 100644 index bcf35999c96c..000000000000 --- a/tests/DataIdleTest/Android.mk +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (C) 2011 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -# We only want this apk build for tests. -LOCAL_MODULE_TAGS := tests - -LOCAL_PACKAGE_NAME := DataIdleTest -LOCAL_PRIVATE_PLATFORM_APIS := true -LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base -LOCAL_STATIC_JAVA_LIBRARIES := junit -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -# We need to sign it to get access to the network usage history. -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) diff --git a/tests/DozeTest/Android.bp b/tests/DozeTest/Android.bp new file mode 100644 index 000000000000..f1be029f58d5 --- /dev/null +++ b/tests/DozeTest/Android.bp @@ -0,0 +1,6 @@ +android_app { + name: "DozeTest", + // Only compile source java files in this apk. + srcs: ["src/**/*.java"], + platform_apis: true, +} diff --git a/tests/DozeTest/Android.mk b/tests/DozeTest/Android.mk deleted file mode 100644 index ec250ffe3aa0..000000000000 --- a/tests/DozeTest/Android.mk +++ /dev/null @@ -1,15 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -# Only compile source java files in this apk. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := DozeTest -LOCAL_PRIVATE_PLATFORM_APIS := true - -include $(BUILD_PACKAGE) - -# Use the following include to make our test apk. -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/DpiTest/Android.bp b/tests/DpiTest/Android.bp new file mode 100644 index 000000000000..7d6a78ba1581 --- /dev/null +++ b/tests/DpiTest/Android.bp @@ -0,0 +1,9 @@ +android_test { + name: "DensityTest", + srcs: ["**/*.java"], + platform_apis: true, + aaptflags: [ + "-c", + "120dpi,240dpi,160dpi,nodpi", + ], +} diff --git a/tests/DpiTest/Android.mk b/tests/DpiTest/Android.mk deleted file mode 100644 index e69d0826bb57..000000000000 --- a/tests/DpiTest/Android.mk +++ /dev/null @@ -1,13 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := DensityTest -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_MODULE_TAGS := tests - -LOCAL_AAPT_FLAGS = -c 120dpi,240dpi,160dpi,nodpi - -include $(BUILD_PACKAGE) diff --git a/tests/FeatureSplit/base/Android.bp b/tests/FeatureSplit/base/Android.bp new file mode 100644 index 000000000000..ab25464a82fc --- /dev/null +++ b/tests/FeatureSplit/base/Android.bp @@ -0,0 +1,22 @@ +// +// Copyright (C) 2014 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +android_test_helper_app { + name: "FeatureSplitBase", + srcs: ["**/*.java"], + sdk_version: "current", + export_package_resources: true, +} diff --git a/tests/FeatureSplit/base/Android.mk b/tests/FeatureSplit/base/Android.mk deleted file mode 100644 index 864646030a61..000000000000 --- a/tests/FeatureSplit/base/Android.mk +++ /dev/null @@ -1,28 +0,0 @@ -# -# Copyright (C) 2014 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_USE_AAPT2 := true -LOCAL_SRC_FILES := $(call all-subdir-java-files) -LOCAL_PACKAGE_NAME := FeatureSplitBase -LOCAL_SDK_VERSION := current -LOCAL_EXPORT_PACKAGE_RESOURCES := true - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE) diff --git a/tests/FeatureSplit/feature1/Android.bp b/tests/FeatureSplit/feature1/Android.bp new file mode 100644 index 000000000000..1a93e842cec5 --- /dev/null +++ b/tests/FeatureSplit/feature1/Android.bp @@ -0,0 +1,29 @@ +// +// Copyright (C) 2014 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +android_test { + name: "FeatureSplit1", + srcs: ["**/*.java"], + sdk_version: "current", + libs: ["FeatureSplitBase"], + aaptflags: [ + "--package-id", + "0x80", + ] + [ + "--custom-package", + "com.android.test.split.feature.one", + ], +} diff --git a/tests/FeatureSplit/feature1/Android.mk b/tests/FeatureSplit/feature1/Android.mk deleted file mode 100644 index d4d25890431e..000000000000 --- a/tests/FeatureSplit/feature1/Android.mk +++ /dev/null @@ -1,32 +0,0 @@ -# -# Copyright (C) 2014 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_USE_AAPT2 := true -LOCAL_SRC_FILES := $(call all-subdir-java-files) -LOCAL_PACKAGE_NAME := FeatureSplit1 -LOCAL_SDK_VERSION := current -LOCAL_MODULE_TAGS := tests - -LOCAL_APK_LIBRARIES := FeatureSplitBase -LOCAL_RES_LIBRARIES := FeatureSplitBase - -LOCAL_AAPT_FLAGS += --package-id 0x80 -LOCAL_AAPT_FLAGS += --custom-package com.android.test.split.feature.one - -include $(BUILD_PACKAGE) diff --git a/tests/FeatureSplit/feature2/Android.bp b/tests/FeatureSplit/feature2/Android.bp new file mode 100644 index 000000000000..a3634821f6fd --- /dev/null +++ b/tests/FeatureSplit/feature2/Android.bp @@ -0,0 +1,28 @@ +// +// Copyright (C) 2014 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +android_test { + name: "FeatureSplit2", + srcs: ["**/*.java"], + sdk_version: "current", + libs: ["FeatureSplitBase"], + aaptflags: [ + "--package-id", + "0x81", + "--custom-package", + "com.android.test.split.feature.two", + ], +} diff --git a/tests/FeatureSplit/feature2/Android.mk b/tests/FeatureSplit/feature2/Android.mk deleted file mode 100644 index 5e5e78bcfff5..000000000000 --- a/tests/FeatureSplit/feature2/Android.mk +++ /dev/null @@ -1,32 +0,0 @@ -# -# Copyright (C) 2014 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_USE_AAPT2 := true -LOCAL_SRC_FILES := $(call all-subdir-java-files) -LOCAL_PACKAGE_NAME := FeatureSplit2 -LOCAL_SDK_VERSION := current -LOCAL_MODULE_TAGS := tests - -LOCAL_APK_LIBRARIES := FeatureSplitBase -LOCAL_RES_LIBRARIES := FeatureSplitBase - -LOCAL_AAPT_FLAGS += --package-id 0x81 -LOCAL_AAPT_FLAGS += --custom-package com.android.test.split.feature.two - -include $(BUILD_PACKAGE) diff --git a/tests/FixVibrateSetting/Android.bp b/tests/FixVibrateSetting/Android.bp new file mode 100644 index 000000000000..5608a2b5e15d --- /dev/null +++ b/tests/FixVibrateSetting/Android.bp @@ -0,0 +1,6 @@ +android_app { + name: "FixVibrateSetting", + srcs: ["**/*.java"], + sdk_version: "current", + certificate: "platform", +} diff --git a/tests/FixVibrateSetting/Android.mk b/tests/FixVibrateSetting/Android.mk deleted file mode 100644 index 86db09eaa20d..000000000000 --- a/tests/FixVibrateSetting/Android.mk +++ /dev/null @@ -1,12 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := FixVibrateSetting -LOCAL_SDK_VERSION := current -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) diff --git a/tests/FrameworkPerf/Android.bp b/tests/FrameworkPerf/Android.bp new file mode 100644 index 000000000000..a259ebd05fa8 --- /dev/null +++ b/tests/FrameworkPerf/Android.bp @@ -0,0 +1,14 @@ +android_test { + name: "FrameworkPerf", + srcs: ["**/*.java"], + platform_apis: true, + libs: [ + "android.test.runner", + "android.test.base", + ], + static_libs: ["junit"], + aaptflags: [ + "-c", + "120dpi,240dpi,160dpi,161dpi,320dpi,nodpi", + ], +} diff --git a/tests/FrameworkPerf/Android.mk b/tests/FrameworkPerf/Android.mk deleted file mode 100644 index 0664d4d46253..000000000000 --- a/tests/FrameworkPerf/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := FrameworkPerf -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base -LOCAL_STATIC_JAVA_LIBRARIES := junit - -LOCAL_AAPT_FLAGS = -c 120dpi,240dpi,160dpi,161dpi,320dpi,nodpi - -include $(BUILD_PACKAGE) diff --git a/tests/GridLayoutTest/Android.bp b/tests/GridLayoutTest/Android.bp new file mode 100644 index 000000000000..b4b5ba561c3f --- /dev/null +++ b/tests/GridLayoutTest/Android.bp @@ -0,0 +1,21 @@ +// +// Copyright (C) 2010 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. +// + +android_test { + name: "GridLayoutTest", + srcs: ["**/*.java"], + sdk_version: "current", +} diff --git a/tests/GridLayoutTest/Android.mk b/tests/GridLayoutTest/Android.mk deleted file mode 100644 index e7e3ccd56986..000000000000 --- a/tests/GridLayoutTest/Android.mk +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := GridLayoutTest -LOCAL_SDK_VERSION := current - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE) diff --git a/tests/HierarchyViewerTest/Android.bp b/tests/HierarchyViewerTest/Android.bp new file mode 100644 index 000000000000..814c88328118 --- /dev/null +++ b/tests/HierarchyViewerTest/Android.bp @@ -0,0 +1,10 @@ +android_test { + name: "HierarchyViewerTest", + srcs: ["**/*.java"], + sdk_version: "current", + libs: [ + "android.test.runner.stubs", + "android.test.base.stubs", + ], + static_libs: ["junit"], +} diff --git a/tests/HierarchyViewerTest/Android.mk b/tests/HierarchyViewerTest/Android.mk deleted file mode 100644 index cf1a512b6d57..000000000000 --- a/tests/HierarchyViewerTest/Android.mk +++ /dev/null @@ -1,14 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := HierarchyViewerTest -LOCAL_SDK_VERSION := current - -LOCAL_JAVA_LIBRARIES := android.test.runner.stubs android.test.base.stubs -LOCAL_STATIC_JAVA_LIBRARIES := junit - -include $(BUILD_PACKAGE) diff --git a/tests/HugeBackup/Android.bp b/tests/HugeBackup/Android.bp new file mode 100644 index 000000000000..b44c4578a853 --- /dev/null +++ b/tests/HugeBackup/Android.bp @@ -0,0 +1,9 @@ +android_test { + name: "HugeBackup", + // Only compile source java files in this apk. + srcs: ["src/**/*.java"], + sdk_version: "current", + optimize: { + proguard_flags_files: ["proguard.flags"], + }, +} diff --git a/tests/HugeBackup/Android.mk b/tests/HugeBackup/Android.mk deleted file mode 100644 index 4789bc8118f2..000000000000 --- a/tests/HugeBackup/Android.mk +++ /dev/null @@ -1,15 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -# Only compile source java files in this apk. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := HugeBackup - -LOCAL_SDK_VERSION := current - -LOCAL_PROGUARD_FLAG_FILES := proguard.flags - -include $(BUILD_PACKAGE) diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java b/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java index fece8babb400..5ad7fb9027a2 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java @@ -16,6 +16,7 @@ package com.android.test.hwui; +import android.animation.ObjectAnimator; import android.app.Activity; import android.graphics.Color; import android.graphics.HardwareRenderer; @@ -23,12 +24,15 @@ import android.graphics.Paint; import android.graphics.RecordingCanvas; import android.graphics.RenderNode; import android.os.Bundle; -import android.util.Log; +import android.os.Handler; import android.view.SurfaceHolder; public class CustomRenderer extends Activity { - private RenderNode mContent = new RenderNode("CustomRenderer"); + private RenderNode mRootNode = new RenderNode("CustomRenderer"); + private RenderNode mChildNode = new RenderNode("RedBox"); private HardwareRenderer mRenderer = new HardwareRenderer(); + private ObjectAnimator mAnimator; + private Handler mRedrawHandler = new Handler(true); @Override protected void onCreate(Bundle savedInstanceState) { @@ -36,6 +40,64 @@ public class CustomRenderer extends Activity { getWindow().takeSurface(mSurfaceCallbacks); } + @Override + protected void onStart() { + super.onStart(); + mAnimator = ObjectAnimator.ofFloat(mChildNode, "translationY", 0, 300); + mAnimator.setRepeatMode(ObjectAnimator.REVERSE); + mAnimator.setRepeatCount(ObjectAnimator.INFINITE); + final Runnable redraw = this::draw; + mAnimator.addUpdateListener(animation -> { + mRedrawHandler.post(redraw); + }); + } + + @Override + protected void onStop() { + super.onStop(); + mAnimator.end(); + mAnimator = null; + } + + private void setupRoot(int width, int height) { + mRootNode.setPosition(0, 0, width, height); + + RecordingCanvas canvas = mRootNode.beginRecording(); + canvas.drawColor(Color.WHITE); + Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + paint.setColor(Color.BLACK); + paint.setTextAlign(Paint.Align.CENTER); + float textSize = Math.min(width, height) * .05f; + paint.setTextSize(textSize); + canvas.drawText("Hello custom renderer!", width / 2, textSize * 2, paint); + + canvas.translate(0, height / 4); + canvas.drawRenderNode(mChildNode); + canvas.translate(width / 2, 0); + canvas.drawRenderNode(mChildNode); + mRootNode.endRecording(); + + setupChild(width / 2, height / 2); + } + + private void setupChild(int width, int height) { + mChildNode.setPosition(0, 0, width, height); + mChildNode.setScaleX(.5f); + mChildNode.setScaleY(.5f); + + RecordingCanvas canvas = mChildNode.beginRecording(); + canvas.drawColor(Color.RED); + mChildNode.endRecording(); + } + + private void draw() { + // Since we are constantly pumping frames between onStart & onStop we don't really + // care about any errors that may happen. They will self-correct. + mRenderer.createRenderRequest() + .setVsyncTime(System.nanoTime()) + .syncAndDraw(); + } + private SurfaceHolder.Callback2 mSurfaceCallbacks = new SurfaceHolder.Callback2() { @Override @@ -48,24 +110,14 @@ public class CustomRenderer extends Activity { @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - mContent.setLeftTopRightBottom(0, 0, width, height); - RecordingCanvas canvas = mContent.beginRecording(); - canvas.drawColor(Color.WHITE); - Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); - paint.setColor(Color.BLACK); - paint.setTextAlign(Paint.Align.CENTER); - paint.setTextSize(Math.min(width, height) * .05f); - canvas.drawText("Hello custom renderer!", width / 2, height / 2, paint); - mContent.endRecording(); - - mRenderer.setContentRoot(mContent); + setupRoot(width, height); + + mRenderer.setContentRoot(mRootNode); mRenderer.setSurface(holder.getSurface()); - mRenderer.createRenderRequest() - .setVsyncTime(System.nanoTime()) - .setFrameCommitCallback(Runnable::run, () -> { - Log.d("CustomRenderer", "Frame committed!"); - }) - .syncAndDraw(); + draw(); + if (!mAnimator.isStarted()) { + mAnimator.start(); + } } @Override diff --git a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java index d92cfce0379b..300182dd5791 100644 --- a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java +++ b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java @@ -27,7 +27,6 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.colorextraction.ColorExtractor.GradientColors; -import com.android.internal.graphics.ColorUtils; import org.junit.Test; import org.junit.runner.RunWith; @@ -96,7 +95,6 @@ public class TonalTest { Tonal.ConfigParser config = new Tonal.ConfigParser(InstrumentationRegistry.getContext()); // 1 to avoid regression where only first item would be parsed. assertTrue("Tonal palettes are empty", config.getTonalPalettes().size() > 1); - assertTrue("Blacklisted colors are empty", config.getBlacklistedColors().size() > 1); } @Test @@ -113,41 +111,4 @@ public class TonalTest { assertTrue("L should be <= to 1.", palette.l[1] <= 1); } } - - @Test - public void tonal_blacklistTest() { - // Make sure that palette generation will fail. - final Tonal tonal = new Tonal(InstrumentationRegistry.getContext()); - - // Creating a WallpaperColors object that contains *only* blacklisted colors. - final float[] hsl = tonal.getBlacklistedColors().get(0).getCenter(); - final int blacklistedColor = ColorUtils.HSLToColor(hsl); - WallpaperColors colorsFromBitmap = new WallpaperColors(Color.valueOf(blacklistedColor), - null, null, WallpaperColors.HINT_FROM_BITMAP); - - // Make sure that palette generation will fail - final GradientColors normal = new GradientColors(); - tonal.extractInto(colorsFromBitmap, normal, new GradientColors(), - new GradientColors()); - assertTrue("Cannot generate a tonal palette from blacklisted colors.", - normal.getMainColor() == Tonal.MAIN_COLOR_DARK); - } - - @Test - public void tonal_ignoreBlacklistTest() { - final Tonal tonal = new Tonal(InstrumentationRegistry.getContext()); - - // Creating a WallpaperColors object that contains *only* blacklisted colors. - final float[] hsl = tonal.getBlacklistedColors().get(0).getCenter(); - final int blacklistedColor = ColorUtils.HSLToColor(hsl); - WallpaperColors colors = new WallpaperColors(Color.valueOf(blacklistedColor), - null, null); - - // Blacklist should be ignored when HINT_FROM_BITMAP isn't present. - final GradientColors normal = new GradientColors(); - tonal.extractInto(colors, normal, new GradientColors(), - new GradientColors()); - assertTrue("Blacklist should never be used on WallpaperColors generated using " - + "default constructor.", normal.getMainColor() == blacklistedColor); - } } diff --git a/tests/JobSchedulerTestApp/Android.bp b/tests/JobSchedulerTestApp/Android.bp new file mode 100644 index 000000000000..bac0220e5591 --- /dev/null +++ b/tests/JobSchedulerTestApp/Android.bp @@ -0,0 +1,9 @@ +android_app { + name: "JobSchedulerTestApp", + srcs: ["src/**/*.java"], + resource_dirs: ["res"], + sdk_version: "current", + optimize: { + enabled: false, + }, +} diff --git a/tests/JobSchedulerTestApp/Android.mk b/tests/JobSchedulerTestApp/Android.mk deleted file mode 100644 index 48ee1f673755..000000000000 --- a/tests/JobSchedulerTestApp/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res - -LOCAL_PACKAGE_NAME := JobSchedulerTestApp -LOCAL_SDK_VERSION := current - -LOCAL_PROGUARD_ENABLED := disabled - -include $(BUILD_PACKAGE) - diff --git a/tests/LargeAssetTest/Android.bp b/tests/LargeAssetTest/Android.bp new file mode 100644 index 000000000000..499e6a0721a1 --- /dev/null +++ b/tests/LargeAssetTest/Android.bp @@ -0,0 +1,6 @@ +android_app { + name: "LargeAssetTest", + srcs: ["**/*.java"], + sdk_version: "current", + certificate: "platform", +} diff --git a/tests/LargeAssetTest/Android.mk b/tests/LargeAssetTest/Android.mk deleted file mode 100644 index f6d98bfa094a..000000000000 --- a/tests/LargeAssetTest/Android.mk +++ /dev/null @@ -1,12 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := LargeAssetTest -LOCAL_SDK_VERSION := current -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) diff --git a/tests/LegacyAssistant/Android.bp b/tests/LegacyAssistant/Android.bp new file mode 100644 index 000000000000..fef924d1cd89 --- /dev/null +++ b/tests/LegacyAssistant/Android.bp @@ -0,0 +1,6 @@ +android_test { + name: "LegacyAssistant", + srcs: ["**/*.java"], + sdk_version: "current", + certificate: "platform", +} diff --git a/tests/LegacyAssistant/Android.mk b/tests/LegacyAssistant/Android.mk deleted file mode 100644 index a58336967f7e..000000000000 --- a/tests/LegacyAssistant/Android.mk +++ /dev/null @@ -1,12 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := LegacyAssistant -LOCAL_SDK_VERSION := current - -LOCAL_MODULE_TAGS := tests -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) diff --git a/tests/LocationTracker/Android.bp b/tests/LocationTracker/Android.bp new file mode 100644 index 000000000000..f0075a9c37bd --- /dev/null +++ b/tests/LocationTracker/Android.bp @@ -0,0 +1,5 @@ +android_test { + name: "LocationTracker", + srcs: ["**/*.java"], + sdk_version: "current", +} diff --git a/tests/LocationTracker/Android.mk b/tests/LocationTracker/Android.mk deleted file mode 100644 index 0d51b3bcf13f..000000000000 --- a/tests/LocationTracker/Android.mk +++ /dev/null @@ -1,11 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := LocationTracker -LOCAL_SDK_VERSION := current - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE) diff --git a/tests/LotsOfApps/Android.bp b/tests/LotsOfApps/Android.bp new file mode 100644 index 000000000000..68b9f88ecfd7 --- /dev/null +++ b/tests/LotsOfApps/Android.bp @@ -0,0 +1,9 @@ +android_app { + name: "LotsOfApps", + srcs: ["**/*.java"], + sdk_version: "current", + certificate: "platform", + optimize: { + enabled: false, + }, +} diff --git a/tests/LotsOfApps/Android.mk b/tests/LotsOfApps/Android.mk deleted file mode 100644 index bee3bcc7ca51..000000000000 --- a/tests/LotsOfApps/Android.mk +++ /dev/null @@ -1,14 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := LotsOfApps -LOCAL_SDK_VERSION := current -LOCAL_CERTIFICATE := platform - -LOCAL_PROGUARD_ENABLED := disabled - -include $(BUILD_PACKAGE) diff --git a/tests/LowStorageTest/Android.bp b/tests/LowStorageTest/Android.bp new file mode 100644 index 000000000000..e72e4a5e2559 --- /dev/null +++ b/tests/LowStorageTest/Android.bp @@ -0,0 +1,20 @@ +// Copyright (C) 2009 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. + +android_test { + name: "lowstoragetest", + certificate: "platform", + srcs: ["**/*.java"], + sdk_version: "current", +} diff --git a/tests/LowStorageTest/Android.mk b/tests/LowStorageTest/Android.mk deleted file mode 100644 index bdde6bdc2fe1..000000000000 --- a/tests/LowStorageTest/Android.mk +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (C) 2009 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests -LOCAL_CERTIFICATE := platform - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := lowstoragetest -LOCAL_SDK_VERSION := current - -include $(BUILD_PACKAGE) diff --git a/tests/MemoryUsage/Android.bp b/tests/MemoryUsage/Android.bp new file mode 100644 index 000000000000..aeb533882d4f --- /dev/null +++ b/tests/MemoryUsage/Android.bp @@ -0,0 +1,12 @@ +android_test { + name: "MemoryUsage", + // Only compile source java files in this apk. + srcs: ["src/**/*.java"], + platform_apis: true, + certificate: "platform", + libs: [ + "android.test.runner", + "android.test.base", + ], + static_libs: ["junit"], +} diff --git a/tests/MemoryUsage/Android.mk b/tests/MemoryUsage/Android.mk deleted file mode 100644 index 5040d5a3b90a..000000000000 --- a/tests/MemoryUsage/Android.mk +++ /dev/null @@ -1,19 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -# Only compile source java files in this apk. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := MemoryUsage -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_CERTIFICATE := platform -LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base -LOCAL_STATIC_JAVA_LIBRARIES := junit - -include $(BUILD_PACKAGE) - -# Use the following include to make our test apk. -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/NetworkSecurityConfigTest/Android.bp b/tests/NetworkSecurityConfigTest/Android.bp new file mode 100644 index 000000000000..cf8ca57862b4 --- /dev/null +++ b/tests/NetworkSecurityConfigTest/Android.bp @@ -0,0 +1,12 @@ +android_test { + name: "NetworkSecurityConfigTests", + certificate: "platform", + libs: [ + "android.test.runner", + "android.test.base", + ], + static_libs: ["junit"], + // Include all test java files. + srcs: ["src/**/*.java"], + platform_apis: true, +} diff --git a/tests/NetworkSecurityConfigTest/Android.mk b/tests/NetworkSecurityConfigTest/Android.mk deleted file mode 100644 index a6c21db16846..000000000000 --- a/tests/NetworkSecurityConfigTest/Android.mk +++ /dev/null @@ -1,20 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -# We only want this apk build for tests. -LOCAL_MODULE_TAGS := tests -LOCAL_CERTIFICATE := platform - -LOCAL_JAVA_LIBRARIES := \ - android.test.runner \ - android.test.base \ - -LOCAL_STATIC_JAVA_LIBRARIES := junit - -# Include all test java files. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := NetworkSecurityConfigTests -LOCAL_PRIVATE_PLATFORM_APIS := true - -include $(BUILD_PACKAGE) diff --git a/tests/OdmApps/Android.bp b/tests/OdmApps/Android.bp new file mode 100644 index 000000000000..d86f9cc81a5f --- /dev/null +++ b/tests/OdmApps/Android.bp @@ -0,0 +1,20 @@ +// Copyright (C) 2018 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. + +java_test_host { + name: "OdmAppsTest", + srcs: ["src/**/*.java"], + libs: ["tradefed"], + test_suites: ["device-tests"], +} diff --git a/tests/OdmApps/Android.mk b/tests/OdmApps/Android.mk deleted file mode 100644 index 64fa65325acc..000000000000 --- a/tests/OdmApps/Android.mk +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (C) 2018 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := OdmAppsTest -LOCAL_MODULE_TAGS := tests -LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_JAVA_LIBRARIES := tradefed -LOCAL_COMPATIBILITY_SUITE := device-tests -include $(BUILD_HOST_JAVA_LIBRARY) - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/OdmApps/app/Android.bp b/tests/OdmApps/app/Android.bp new file mode 100644 index 000000000000..5eb8590b6e06 --- /dev/null +++ b/tests/OdmApps/app/Android.bp @@ -0,0 +1,19 @@ +// Copyright (C) 2018 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. + +android_test { + name: "TestOdmApp", + test_suites: ["device-tests"], + sdk_version: "current", +} diff --git a/tests/OdmApps/app/Android.mk b/tests/OdmApps/app/Android.mk deleted file mode 100644 index 9eec0cc4f66f..000000000000 --- a/tests/OdmApps/app/Android.mk +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (C) 2018 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_PACKAGE_NAME := TestOdmApp -LOCAL_MODULE_TAGS := tests -LOCAL_COMPATIBILITY_SUITE := device-tests -LOCAL_SDK_VERSION := current -include $(BUILD_PACKAGE) diff --git a/tests/OdmApps/priv-app/Android.bp b/tests/OdmApps/priv-app/Android.bp new file mode 100644 index 000000000000..9dd477cf6ad3 --- /dev/null +++ b/tests/OdmApps/priv-app/Android.bp @@ -0,0 +1,19 @@ +// Copyright (C) 2018 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. + +android_test { + name: "TestOdmPrivApp", + test_suites: ["device-tests"], + sdk_version: "current", +} diff --git a/tests/OdmApps/priv-app/Android.mk b/tests/OdmApps/priv-app/Android.mk deleted file mode 100644 index d423133fc9f5..000000000000 --- a/tests/OdmApps/priv-app/Android.mk +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (C) 2018 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_PACKAGE_NAME := TestOdmPrivApp -LOCAL_MODULE_TAGS := tests -LOCAL_COMPATIBILITY_SUITE := device-tests -LOCAL_SDK_VERSION := current -include $(BUILD_PACKAGE) diff --git a/tests/OneMedia/Android.bp b/tests/OneMedia/Android.bp new file mode 100644 index 000000000000..11e12f35741c --- /dev/null +++ b/tests/OneMedia/Android.bp @@ -0,0 +1,13 @@ +android_app { + name: "OneMedia", + srcs: [ + "**/*.java", + "src/**/I*.aidl", + ], + platform_apis: true, + certificate: "platform", + libs: ["org.apache.http.legacy"], + optimize: { + enabled: false, + }, +} diff --git a/tests/OneMedia/Android.mk b/tests/OneMedia/Android.mk deleted file mode 100644 index 41f3f64235d4..000000000000 --- a/tests/OneMedia/Android.mk +++ /dev/null @@ -1,17 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -LOCAL_SRC_FILES := $(call all-subdir-java-files) \ - $(call all-Iaidl-files-under, src) - -LOCAL_PACKAGE_NAME := OneMedia -LOCAL_PRIVATE_PLATFORM_APIS := true -LOCAL_CERTIFICATE := platform - -LOCAL_JAVA_LIBRARIES += org.apache.http.legacy - -LOCAL_PROGUARD_ENABLED := disabled - -include $(BUILD_PACKAGE) diff --git a/tests/RemoteDisplayProvider/Android.bp b/tests/RemoteDisplayProvider/Android.bp new file mode 100644 index 000000000000..6c7798fb3faf --- /dev/null +++ b/tests/RemoteDisplayProvider/Android.bp @@ -0,0 +1,23 @@ +// Copyright (C) 2013 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. + +// Build the application. +android_test { + name: "RemoteDisplayProviderTest", + sdk_version: "system_current", + srcs: ["src/**/*.java"], + resource_dirs: ["res"], + libs: ["com.android.media.remotedisplay"], + certificate: "platform", +} diff --git a/tests/RemoteDisplayProvider/Android.mk b/tests/RemoteDisplayProvider/Android.mk deleted file mode 100644 index 43bf0243b55b..000000000000 --- a/tests/RemoteDisplayProvider/Android.mk +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (C) 2013 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -# Build the application. -include $(CLEAR_VARS) -LOCAL_PACKAGE_NAME := RemoteDisplayProviderTest -LOCAL_MODULE_TAGS := tests -LOCAL_SDK_VERSION := system_current -LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_RESOURCE_DIR = $(LOCAL_PATH)/res -LOCAL_JAVA_LIBRARIES := com.android.media.remotedisplay -LOCAL_CERTIFICATE := platform -include $(BUILD_PACKAGE) diff --git a/tests/RenderThreadTest/Android.bp b/tests/RenderThreadTest/Android.bp new file mode 100644 index 000000000000..165977607219 --- /dev/null +++ b/tests/RenderThreadTest/Android.bp @@ -0,0 +1,10 @@ +android_test { + name: "RenderThreadTest", + // Only compile source java files in this apk. + srcs: ["src/**/*.java"], + platform_apis: true, + static_libs: ["android-common"], + optimize: { + enabled: false, + }, +} diff --git a/tests/RenderThreadTest/Android.mk b/tests/RenderThreadTest/Android.mk deleted file mode 100644 index 4e5f35bd71ca..000000000000 --- a/tests/RenderThreadTest/Android.mk +++ /dev/null @@ -1,19 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -# Only compile source java files in this apk. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := RenderThreadTest -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_STATIC_JAVA_LIBRARIES += android-common - -LOCAL_PROGUARD_ENABLED := disabled - -include $(BUILD_PACKAGE) - -# Use the following include to make our test apk. -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java index ed8a53364ec6..a03fae0aa606 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java @@ -165,9 +165,7 @@ class RollbackTestUtils { PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller(); PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); - if (enableRollback) { - params.setEnableRollback(); - } + params.setEnableRollback(enableRollback); int sessionId = packageInstaller.createSession(params); session = packageInstaller.openSession(sessionId); @@ -224,11 +222,9 @@ class RollbackTestUtils { if (staged) { multiPackageParams.setStaged(); } - if (enableRollback) { - // TODO: Do we set this on the parent params, the child params, or - // both? - multiPackageParams.setEnableRollback(); - } + // TODO: Do we set this on the parent params, the child params, or + // both? + multiPackageParams.setEnableRollback(enableRollback); int multiPackageId = packageInstaller.createSession(multiPackageParams); PackageInstaller.Session multiPackage = packageInstaller.openSession(multiPackageId); @@ -242,9 +238,7 @@ class RollbackTestUtils { if (resourceName.endsWith(".apex")) { params.setInstallAsApex(); } - if (enableRollback) { - params.setEnableRollback(); - } + params.setEnableRollback(enableRollback); int sessionId = packageInstaller.createSession(params); session = packageInstaller.openSession(sessionId); diff --git a/tests/SerialChat/Android.bp b/tests/SerialChat/Android.bp new file mode 100644 index 000000000000..3c18035a4aab --- /dev/null +++ b/tests/SerialChat/Android.bp @@ -0,0 +1,21 @@ +// +// Copyright (C) 2011 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. +// + +android_test { + name: "SerialChat", + srcs: ["**/*.java"], + platform_apis: true, +} diff --git a/tests/SerialChat/Android.mk b/tests/SerialChat/Android.mk deleted file mode 100644 index ed6ca9991417..000000000000 --- a/tests/SerialChat/Android.mk +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (C) 2011 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := SerialChat -LOCAL_PRIVATE_PLATFORM_APIS := true - -include $(BUILD_PACKAGE) diff --git a/tests/SharedLibrary/client/Android.bp b/tests/SharedLibrary/client/Android.bp new file mode 100644 index 000000000000..dbf6dc94eb8d --- /dev/null +++ b/tests/SharedLibrary/client/Android.bp @@ -0,0 +1,6 @@ +android_test { + name: "SharedLibraryClient", + srcs: ["**/*.java"], + libs: ["SharedLibrary"], + sdk_version: "current", +} diff --git a/tests/SharedLibrary/client/Android.mk b/tests/SharedLibrary/client/Android.mk deleted file mode 100644 index 9e76c4038600..000000000000 --- a/tests/SharedLibrary/client/Android.mk +++ /dev/null @@ -1,14 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_USE_AAPT2 := true -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_RES_LIBRARIES := SharedLibrary - -LOCAL_PACKAGE_NAME := SharedLibraryClient -LOCAL_SDK_VERSION := current - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE) diff --git a/tests/SharedLibrary/lib/Android.bp b/tests/SharedLibrary/lib/Android.bp new file mode 100644 index 000000000000..f69d388ef0f1 --- /dev/null +++ b/tests/SharedLibrary/lib/Android.bp @@ -0,0 +1,11 @@ +android_app { + name: "SharedLibrary", + srcs: ["**/*.java"], + aaptflags: ["--shared-lib"], + sdk_version: "current", + export_package_resources: true, + privileged: true, + optimize: { + proguard_flags_files: ["proguard.proguard"], + }, +} diff --git a/tests/SharedLibrary/lib/Android.mk b/tests/SharedLibrary/lib/Android.mk deleted file mode 100644 index 3c1ca8764386..000000000000 --- a/tests/SharedLibrary/lib/Android.mk +++ /dev/null @@ -1,17 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) -LOCAL_USE_AAPT2 := true - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_AAPT_FLAGS := --shared-lib -LOCAL_PACKAGE_NAME := SharedLibrary -LOCAL_SDK_VERSION := current - -LOCAL_EXPORT_PACKAGE_RESOURCES := true -LOCAL_PRIVILEGED_MODULE := true -LOCAL_MODULE_TAGS := optional - -LOCAL_PROGUARD_FLAG_FILES := proguard.proguard - -include $(BUILD_PACKAGE) diff --git a/tests/ShowWhenLockedApp/Android.bp b/tests/ShowWhenLockedApp/Android.bp new file mode 100644 index 000000000000..dba564c91059 --- /dev/null +++ b/tests/ShowWhenLockedApp/Android.bp @@ -0,0 +1,5 @@ +android_test { + name: "ShowWhenLocked", + srcs: ["**/*.java"], + sdk_version: "current", +} diff --git a/tests/ShowWhenLockedApp/Android.mk b/tests/ShowWhenLockedApp/Android.mk deleted file mode 100644 index 41e0ac42a5a9..000000000000 --- a/tests/ShowWhenLockedApp/Android.mk +++ /dev/null @@ -1,11 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := ShowWhenLocked -LOCAL_SDK_VERSION := current - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE)
\ No newline at end of file diff --git a/tests/SmokeTest/Android.bp b/tests/SmokeTest/Android.bp new file mode 100644 index 000000000000..bc45ee6799b4 --- /dev/null +++ b/tests/SmokeTest/Android.bp @@ -0,0 +1,6 @@ +android_test { + name: "SmokeTestApp", + // This builds "SmokeTestApp" + srcs: ["src/**/*.java"], + sdk_version: "8", +} diff --git a/tests/SmokeTest/Android.mk b/tests/SmokeTest/Android.mk deleted file mode 100644 index 591a84e95ec7..000000000000 --- a/tests/SmokeTest/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -# This builds "SmokeTestApp" -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := SmokeTestApp - -LOCAL_SDK_VERSION := 8 - -include $(BUILD_PACKAGE) - -# This builds "SmokeTest" -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/SmokeTest/tests/Android.bp b/tests/SmokeTest/tests/Android.bp new file mode 100644 index 000000000000..ceb2d193de79 --- /dev/null +++ b/tests/SmokeTest/tests/Android.bp @@ -0,0 +1,10 @@ +android_test { + name: "SmokeTest", + // Include all test java files. + srcs: ["src/**/*.java"], + // Notice that we don't have to include the src files of SmokeTestApp because, by + // running the tests using an instrumentation targeting SmokeTestApp, we + // automatically get all of its classes loaded into our environment. + instrumentation_for: "SmokeTestApp", + sdk_version: "8", +} diff --git a/tests/SmokeTest/tests/Android.mk b/tests/SmokeTest/tests/Android.mk deleted file mode 100644 index 18e682ee8b46..000000000000 --- a/tests/SmokeTest/tests/Android.mk +++ /dev/null @@ -1,21 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -# We only want this apk build for tests. -LOCAL_MODULE_TAGS := tests - -# Include all test java files. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -# Notice that we don't have to include the src files of SmokeTestApp because, by -# running the tests using an instrumentation targeting SmokeTestApp, we -# automatically get all of its classes loaded into our environment. - -LOCAL_PACKAGE_NAME := SmokeTest - -LOCAL_INSTRUMENTATION_FOR := SmokeTestApp - -LOCAL_SDK_VERSION := 8 - -include $(BUILD_PACKAGE) - diff --git a/tests/SmokeTestApps/Android.bp b/tests/SmokeTestApps/Android.bp new file mode 100644 index 000000000000..0feb00040eac --- /dev/null +++ b/tests/SmokeTestApps/Android.bp @@ -0,0 +1,5 @@ +android_test { + name: "SmokeTestTriggerApps", + srcs: ["src/**/*.java"], + sdk_version: "current", +} diff --git a/tests/SmokeTestApps/Android.mk b/tests/SmokeTestApps/Android.mk deleted file mode 100644 index 1f564e06bb85..000000000000 --- a/tests/SmokeTestApps/Android.mk +++ /dev/null @@ -1,13 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := SmokeTestTriggerApps -LOCAL_SDK_VERSION := current - -include $(BUILD_PACKAGE) - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/SoundTriggerTestApp/Android.bp b/tests/SoundTriggerTestApp/Android.bp new file mode 100644 index 000000000000..d3a1300b8e12 --- /dev/null +++ b/tests/SoundTriggerTestApp/Android.bp @@ -0,0 +1,7 @@ +android_app { + name: "SoundTriggerTestApp", + srcs: ["**/*.java"], + platform_apis: true, + privileged: true, + certificate: "platform", +} diff --git a/tests/SoundTriggerTestApp/Android.mk b/tests/SoundTriggerTestApp/Android.mk deleted file mode 100644 index 73fb5e8eab54..000000000000 --- a/tests/SoundTriggerTestApp/Android.mk +++ /dev/null @@ -1,14 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := SoundTriggerTestApp -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_MODULE_TAGS := optional - -LOCAL_PRIVILEGED_MODULE := true -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) diff --git a/tests/Split/Android.bp b/tests/Split/Android.bp new file mode 100644 index 000000000000..d8c89bab2857 --- /dev/null +++ b/tests/Split/Android.bp @@ -0,0 +1,27 @@ +// +// Copyright (C) 2014 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +android_test { + name: "Split", + srcs: ["**/*.java"], + sdk_version: "current", + package_splits: [ + "mdpi-v4", + "hdpi-v4", + "xhdpi-v4", + "xxhdpi-v4", + ], +} diff --git a/tests/Split/Android.mk b/tests/Split/Android.mk deleted file mode 100644 index 4d15b2d4bd01..000000000000 --- a/tests/Split/Android.mk +++ /dev/null @@ -1,28 +0,0 @@ -# -# Copyright (C) 2014 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) -LOCAL_PACKAGE_NAME := Split -LOCAL_SDK_VERSION := current - -LOCAL_PACKAGE_SPLITS := mdpi-v4 hdpi-v4 xhdpi-v4 xxhdpi-v4 - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE) diff --git a/tests/StatusBar/Android.bp b/tests/StatusBar/Android.bp new file mode 100644 index 000000000000..0b650ed3afc8 --- /dev/null +++ b/tests/StatusBar/Android.bp @@ -0,0 +1,9 @@ +android_test { + name: "StatusBarTest", + srcs: ["**/*.java"], + platform_apis: true, + certificate: "platform", + optimize: { + enabled: false, + }, +} diff --git a/tests/StatusBar/Android.mk b/tests/StatusBar/Android.mk deleted file mode 100644 index e845335684bc..000000000000 --- a/tests/StatusBar/Android.mk +++ /dev/null @@ -1,14 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := StatusBarTest -LOCAL_PRIVATE_PLATFORM_APIS := true -LOCAL_CERTIFICATE := platform - -LOCAL_PROGUARD_ENABLED := disabled - -include $(BUILD_PACKAGE) diff --git a/tests/SystemUIDemoModeController/Android.bp b/tests/SystemUIDemoModeController/Android.bp new file mode 100644 index 000000000000..1e4c43792d70 --- /dev/null +++ b/tests/SystemUIDemoModeController/Android.bp @@ -0,0 +1,5 @@ +android_test { + name: "DemoModeController", + srcs: ["**/*.java"], + sdk_version: "current", +} diff --git a/tests/SystemUIDemoModeController/Android.mk b/tests/SystemUIDemoModeController/Android.mk deleted file mode 100644 index cc6fa8dfb5f7..000000000000 --- a/tests/SystemUIDemoModeController/Android.mk +++ /dev/null @@ -1,11 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := DemoModeController -LOCAL_SDK_VERSION := current - -include $(BUILD_PACKAGE) diff --git a/tests/TouchLatency/Android.bp b/tests/TouchLatency/Android.bp new file mode 100644 index 000000000000..1174bcb0d4d6 --- /dev/null +++ b/tests/TouchLatency/Android.bp @@ -0,0 +1,10 @@ +android_test { + name: "TouchLatency", + manifest: "app/src/main/AndroidManifest.xml", + // omit gradle 'build' dir + srcs: ["app/src/main/java/**/*.java"], + resource_dirs: ["app/src/main/res"], + aaptflags: ["--auto-add-overlay"], + sdk_version: "current", + test_suites: ["device-tests"], +} diff --git a/tests/TouchLatency/Android.mk b/tests/TouchLatency/Android.mk deleted file mode 100644 index 2334bd84c1f2..000000000000 --- a/tests/TouchLatency/Android.mk +++ /dev/null @@ -1,22 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_MANIFEST_FILE := app/src/main/AndroidManifest.xml - -# omit gradle 'build' dir -LOCAL_SRC_FILES := $(call all-java-files-under,app/src/main/java) - -LOCAL_RESOURCE_DIR := \ - $(LOCAL_PATH)/app/src/main/res - -LOCAL_AAPT_FLAGS := \ - --auto-add-overlay - -LOCAL_PACKAGE_NAME := TouchLatency -LOCAL_SDK_VERSION := current - -LOCAL_COMPATIBILITY_SUITE := device-tests - -include $(BUILD_PACKAGE) diff --git a/tests/TransformTest/Android.bp b/tests/TransformTest/Android.bp new file mode 100644 index 000000000000..fd7aaeb35feb --- /dev/null +++ b/tests/TransformTest/Android.bp @@ -0,0 +1,5 @@ +android_test { + name: "TransformTest", + srcs: ["**/*.java"], + sdk_version: "current", +} diff --git a/tests/TransformTest/Android.mk b/tests/TransformTest/Android.mk deleted file mode 100644 index 5340cdd5f29b..000000000000 --- a/tests/TransformTest/Android.mk +++ /dev/null @@ -1,11 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := TransformTest -LOCAL_SDK_VERSION := current - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE) diff --git a/tests/TransitionTests/Android.bp b/tests/TransitionTests/Android.bp new file mode 100644 index 000000000000..57f19e38330d --- /dev/null +++ b/tests/TransitionTests/Android.bp @@ -0,0 +1,10 @@ +android_app { + name: "TransitionTests", + // Only compile source java files in this apk. + srcs: ["src/**/*.java"], + platform_apis: true, + static_libs: ["android-common"], + optimize: { + enabled: false, + }, +} diff --git a/tests/TransitionTests/Android.mk b/tests/TransitionTests/Android.mk deleted file mode 100644 index a696156d1ee8..000000000000 --- a/tests/TransitionTests/Android.mk +++ /dev/null @@ -1,19 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -# Only compile source java files in this apk. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := TransitionTests -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_STATIC_JAVA_LIBRARIES += android-common - -LOCAL_PROGUARD_ENABLED := disabled - -include $(BUILD_PACKAGE) - -# Use the following include to make our test apk. -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/TtsTests/Android.bp b/tests/TtsTests/Android.bp new file mode 100644 index 000000000000..b137523803a6 --- /dev/null +++ b/tests/TtsTests/Android.bp @@ -0,0 +1,26 @@ +// +// Copyright (C) 2011 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. +// + +android_test { + name: "TtsTests", + srcs: ["**/*.java"], + static_libs: ["mockito-target"], + libs: [ + "android.test.runner", + "android.test.base", + ], + platform_apis: true, +} diff --git a/tests/TtsTests/Android.mk b/tests/TtsTests/Android.mk deleted file mode 100644 index 116cc0a913ee..000000000000 --- a/tests/TtsTests/Android.mk +++ /dev/null @@ -1,29 +0,0 @@ -# -# Copyright (C) 2011 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_STATIC_JAVA_LIBRARIES := mockito-target -LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base - -LOCAL_PACKAGE_NAME := TtsTests -LOCAL_PRIVATE_PLATFORM_APIS := true - -include $(BUILD_PACKAGE) diff --git a/tests/UsesFeature2Test/Android.bp b/tests/UsesFeature2Test/Android.bp new file mode 100644 index 000000000000..a1b77d07ccdc --- /dev/null +++ b/tests/UsesFeature2Test/Android.bp @@ -0,0 +1,21 @@ +// +// Copyright (C) 2014 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +android_test { + name: "UsesFeature2Test", + srcs: ["**/*.java"], + sdk_version: "current", +} diff --git a/tests/UsesFeature2Test/Android.mk b/tests/UsesFeature2Test/Android.mk deleted file mode 100644 index 4cba4ff62dd4..000000000000 --- a/tests/UsesFeature2Test/Android.mk +++ /dev/null @@ -1,26 +0,0 @@ -# -# Copyright (C) 2014 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) -LOCAL_PACKAGE_NAME := UsesFeature2Test -LOCAL_SDK_VERSION := current - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE) diff --git a/tests/VectorDrawableTest/Android.bp b/tests/VectorDrawableTest/Android.bp new file mode 100644 index 000000000000..13f318ef7c42 --- /dev/null +++ b/tests/VectorDrawableTest/Android.bp @@ -0,0 +1,21 @@ +// +// Copyright (C) 2014 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +android_test { + name: "VectorDrawableTest", + srcs: ["**/*.java"], + platform_apis: true, +} diff --git a/tests/VectorDrawableTest/Android.mk b/tests/VectorDrawableTest/Android.mk deleted file mode 100644 index 155b2bc8560c..000000000000 --- a/tests/VectorDrawableTest/Android.mk +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (C) 2014 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := VectorDrawableTest -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE) diff --git a/tests/VoiceEnrollment/Android.bp b/tests/VoiceEnrollment/Android.bp new file mode 100644 index 000000000000..e43b38c5a034 --- /dev/null +++ b/tests/VoiceEnrollment/Android.bp @@ -0,0 +1,6 @@ +android_app { + name: "VoiceEnrollment", + srcs: ["**/*.java"], + platform_apis: true, + privileged: true, +} diff --git a/tests/VoiceEnrollment/Android.mk b/tests/VoiceEnrollment/Android.mk deleted file mode 100644 index 725e2bdd74e5..000000000000 --- a/tests/VoiceEnrollment/Android.mk +++ /dev/null @@ -1,13 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := VoiceEnrollment -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_MODULE_TAGS := optional - -LOCAL_PRIVILEGED_MODULE := true - -include $(BUILD_PACKAGE) diff --git a/tests/VoiceInteraction/Android.bp b/tests/VoiceInteraction/Android.bp new file mode 100644 index 000000000000..7059473fb63f --- /dev/null +++ b/tests/VoiceInteraction/Android.bp @@ -0,0 +1,5 @@ +android_test { + name: "VoiceInteraction", + srcs: ["**/*.java"], + platform_apis: true, +} diff --git a/tests/VoiceInteraction/Android.mk b/tests/VoiceInteraction/Android.mk deleted file mode 100644 index aa48b42d57ca..000000000000 --- a/tests/VoiceInteraction/Android.mk +++ /dev/null @@ -1,11 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := VoiceInteraction -LOCAL_PRIVATE_PLATFORM_APIS := true - -include $(BUILD_PACKAGE) diff --git a/tests/WallpaperTest/Android.bp b/tests/WallpaperTest/Android.bp new file mode 100644 index 000000000000..f68b6ec2452d --- /dev/null +++ b/tests/WallpaperTest/Android.bp @@ -0,0 +1,9 @@ +android_app { + name: "WallpaperTest", + srcs: ["src/**/*.java"], + resource_dirs: ["res"], + platform_apis: true, + optimize: { + enabled: false, + }, +} diff --git a/tests/WallpaperTest/Android.mk b/tests/WallpaperTest/Android.mk deleted file mode 100644 index 4815500b68e6..000000000000 --- a/tests/WallpaperTest/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res - -LOCAL_PACKAGE_NAME := WallpaperTest -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_PROGUARD_ENABLED := disabled - -include $(BUILD_PACKAGE) - diff --git a/tests/WindowManagerStressTest/Android.bp b/tests/WindowManagerStressTest/Android.bp new file mode 100644 index 000000000000..98749a7e4512 --- /dev/null +++ b/tests/WindowManagerStressTest/Android.bp @@ -0,0 +1,21 @@ +// +// 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. +// + +android_test { + name: "WindowManagerStressTest", + srcs: ["**/*.java"], + platform_apis: true, +} diff --git a/tests/WindowManagerStressTest/Android.mk b/tests/WindowManagerStressTest/Android.mk deleted file mode 100644 index 6f4403fa86c7..000000000000 --- a/tests/WindowManagerStressTest/Android.mk +++ /dev/null @@ -1,27 +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. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := WindowManagerStressTest -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE) diff --git a/tests/appwidgets/AppWidgetHostTest/Android.bp b/tests/appwidgets/AppWidgetHostTest/Android.bp new file mode 100644 index 000000000000..24b76136c045 --- /dev/null +++ b/tests/appwidgets/AppWidgetHostTest/Android.bp @@ -0,0 +1,6 @@ +android_app { + name: "AppWidgetHostTest", + srcs: ["**/*.java"], + sdk_version: "current", + certificate: "platform", +} diff --git a/tests/appwidgets/AppWidgetHostTest/Android.mk b/tests/appwidgets/AppWidgetHostTest/Android.mk deleted file mode 100644 index c9e6c6b42b5b..000000000000 --- a/tests/appwidgets/AppWidgetHostTest/Android.mk +++ /dev/null @@ -1,12 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := AppWidgetHostTest -LOCAL_SDK_VERSION := current -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) diff --git a/tests/appwidgets/AppWidgetProviderTest/Android.bp b/tests/appwidgets/AppWidgetProviderTest/Android.bp new file mode 100644 index 000000000000..a1a599177a01 --- /dev/null +++ b/tests/appwidgets/AppWidgetProviderTest/Android.bp @@ -0,0 +1,6 @@ +android_app { + name: "AppWidgetProvider", + srcs: ["**/*.java"], + sdk_version: "current", + certificate: "platform", +} diff --git a/tests/appwidgets/AppWidgetProviderTest/Android.mk b/tests/appwidgets/AppWidgetProviderTest/Android.mk deleted file mode 100644 index b26c60b38d4a..000000000000 --- a/tests/appwidgets/AppWidgetProviderTest/Android.mk +++ /dev/null @@ -1,12 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := AppWidgetProvider -LOCAL_SDK_VERSION := current -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) diff --git a/tests/net/Android.bp b/tests/net/Android.bp new file mode 100644 index 000000000000..2539c0f66ce1 --- /dev/null +++ b/tests/net/Android.bp @@ -0,0 +1,27 @@ +//######################################################################## +// Build FrameworksNetTests package +//######################################################################## + +android_test { + name: "FrameworksNetTests", + // Include all test java files. + srcs: ["java/**/*.java"], + static_libs: [ + "frameworks-base-testutils", + "framework-protos", + "androidx.test.rules", + "mockito-target-minus-junit4", + "platform-test-annotations", + "services.core", + "services.ipmemorystore", + "services.net", + ], + libs: [ + "android.test.runner", + "android.test.base", + "android.test.mock", + ], + platform_apis: true, + test_suites: ["device-tests"], + certificate: "platform", +} diff --git a/tests/net/Android.mk b/tests/net/Android.mk deleted file mode 100644 index 2ef141f5f7d2..000000000000 --- a/tests/net/Android.mk +++ /dev/null @@ -1,37 +0,0 @@ -######################################################################### -# Build FrameworksNetTests package -######################################################################### - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -# We only want this apk build for tests. -LOCAL_MODULE_TAGS := tests - -# Include all test java files. -LOCAL_SRC_FILES := $(call all-java-files-under, java) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - frameworks-base-testutils \ - framework-protos \ - androidx.test.rules \ - mockito-target-minus-junit4 \ - platform-test-annotations \ - services.core \ - services.ipmemorystore \ - services.net - -LOCAL_JAVA_LIBRARIES := \ - android.test.runner \ - android.test.base \ - android.test.mock - -LOCAL_PACKAGE_NAME := FrameworksNetTests -LOCAL_PRIVATE_PLATFORM_APIS := true -LOCAL_COMPATIBILITY_SUITE := device-tests - -LOCAL_CERTIFICATE := platform - -LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk - -include $(BUILD_PACKAGE) diff --git a/tests/net/OWNERS b/tests/net/OWNERS index 7311eee32a4c..d3836d4c6c57 100644 --- a/tests/net/OWNERS +++ b/tests/net/OWNERS @@ -1,8 +1,8 @@ set noparent codewiz@google.com -ek@google.com jchalard@google.com +junyulai@google.com lorenzo@google.com reminv@google.com satk@google.com diff --git a/tests/net/java/android/net/DnsPacketTest.java b/tests/net/java/android/net/DnsPacketTest.java index 91ff6b3a7e06..9ede2b85af00 100644 --- a/tests/net/java/android/net/DnsPacketTest.java +++ b/tests/net/java/android/net/DnsPacketTest.java @@ -36,19 +36,19 @@ public class DnsPacketTest { int qCount, int aCount, int nsCount, int arCount) { assertEquals(header.id, id); assertEquals(header.flags, flag); - assertEquals(header.getSectionCount(DnsPacket.QDSECTION), qCount); - assertEquals(header.getSectionCount(DnsPacket.ANSECTION), aCount); - assertEquals(header.getSectionCount(DnsPacket.NSSECTION), nsCount); - assertEquals(header.getSectionCount(DnsPacket.ARSECTION), arCount); + assertEquals(header.getRecordCount(DnsPacket.QDSECTION), qCount); + assertEquals(header.getRecordCount(DnsPacket.ANSECTION), aCount); + assertEquals(header.getRecordCount(DnsPacket.NSSECTION), nsCount); + assertEquals(header.getRecordCount(DnsPacket.ARSECTION), arCount); } - private void assertSectionParses(DnsPacket.DnsSection section, String dname, + private void assertRecordParses(DnsPacket.DnsRecord record, String dname, int dtype, int dclass, int ttl, byte[] rr) { - assertEquals(section.dName, dname); - assertEquals(section.nsType, dtype); - assertEquals(section.nsClass, dclass); - assertEquals(section.ttl, ttl); - assertTrue(Arrays.equals(section.getRR(), rr)); + assertEquals(record.dName, dname); + assertEquals(record.nsType, dtype); + assertEquals(record.nsClass, dclass); + assertEquals(record.ttl, ttl); + assertTrue(Arrays.equals(record.getRR(), rr)); } class TestDnsPacket extends DnsPacket { @@ -59,8 +59,8 @@ public class DnsPacketTest { public DnsHeader getHeader() { return mHeader; } - public List<DnsSection> getSectionList(int secType) { - return mSections[secType]; + public List<DnsRecord> getRecordList(int secType) { + return mRecords[secType]; } } @@ -101,16 +101,16 @@ public class DnsPacketTest { // Header part assertHeaderParses(packet.getHeader(), 0x5566, 0x8180, 1, 1, 0, 0); - // Section part - List<DnsPacket.DnsSection> qdSectionList = - packet.getSectionList(DnsPacket.QDSECTION); - assertEquals(qdSectionList.size(), 1); - assertSectionParses(qdSectionList.get(0), "www.google.com", 1, 1, 0, null); + // Record part + List<DnsPacket.DnsRecord> qdRecordList = + packet.getRecordList(DnsPacket.QDSECTION); + assertEquals(qdRecordList.size(), 1); + assertRecordParses(qdRecordList.get(0), "www.google.com", 1, 1, 0, null); - List<DnsPacket.DnsSection> anSectionList = - packet.getSectionList(DnsPacket.ANSECTION); - assertEquals(anSectionList.size(), 1); - assertSectionParses(anSectionList.get(0), "www.google.com", 1, 1, 0x12b, + List<DnsPacket.DnsRecord> anRecordList = + packet.getRecordList(DnsPacket.ANSECTION); + assertEquals(anRecordList.size(), 1); + assertRecordParses(anRecordList.get(0), "www.google.com", 1, 1, 0x12b, new byte[]{ (byte) 0xac, (byte) 0xd9, (byte) 0xa1, (byte) 0x84 }); } @@ -143,16 +143,16 @@ public class DnsPacketTest { // Header part assertHeaderParses(packet.getHeader(), 0x7722, 0x8180, 1, 1, 0, 0); - // Section part - List<DnsPacket.DnsSection> qdSectionList = - packet.getSectionList(DnsPacket.QDSECTION); - assertEquals(qdSectionList.size(), 1); - assertSectionParses(qdSectionList.get(0), "www.google.com", 28, 1, 0, null); + // Record part + List<DnsPacket.DnsRecord> qdRecordList = + packet.getRecordList(DnsPacket.QDSECTION); + assertEquals(qdRecordList.size(), 1); + assertRecordParses(qdRecordList.get(0), "www.google.com", 28, 1, 0, null); - List<DnsPacket.DnsSection> anSectionList = - packet.getSectionList(DnsPacket.ANSECTION); - assertEquals(anSectionList.size(), 1); - assertSectionParses(anSectionList.get(0), "www.google.com", 28, 1, 0x37, + List<DnsPacket.DnsRecord> anRecordList = + packet.getRecordList(DnsPacket.ANSECTION); + assertEquals(anRecordList.size(), 1); + assertRecordParses(anRecordList.get(0), "www.google.com", 28, 1, 0x37, new byte[]{ 0x24, 0x04, 0x68, 0x00, 0x40, 0x05, 0x08, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04 }); } diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java index a12b0a0fbcf0..fdba72333f0b 100644 --- a/tests/net/java/com/android/server/connectivity/TetheringTest.java +++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java @@ -68,6 +68,7 @@ import android.hardware.usb.UsbManager; import android.net.INetd; import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; +import android.net.ITetheringEventCallback; import android.net.InterfaceConfiguration; import android.net.IpPrefix; import android.net.LinkAddress; @@ -123,6 +124,7 @@ import org.mockito.MockitoAnnotations; import java.net.Inet4Address; import java.net.Inet6Address; import java.util.ArrayList; +import java.util.Arrays; import java.util.Vector; @RunWith(AndroidJUnit4.class) @@ -918,6 +920,67 @@ public class TetheringTest { expectedInteractionsWithShowNotification); } + private class TestTetheringEventCallback extends ITetheringEventCallback.Stub { + private final ArrayList<Network> mActualUpstreams = new ArrayList<>(); + + public void expectUpstreamChanged(Network... networks) { + final ArrayList<Network> expectedUpstreams = + new ArrayList<Network>(Arrays.asList(networks)); + for (Network upstream : expectedUpstreams) { + // throws OOB if no expectations + assertEquals(mActualUpstreams.remove(0), upstream); + } + assertNoCallback(); + } + + @Override + public void onUpstreamChanged(Network network) { + mActualUpstreams.add(network); + } + + public void assertNoCallback() { + assertTrue(mActualUpstreams.isEmpty()); + } + } + + @Test + public void testRegisterTetheringEventCallback() throws Exception { + TestTetheringEventCallback callback1 = new TestTetheringEventCallback(); + TestTetheringEventCallback callback2 = new TestTetheringEventCallback(); + + // 1. Register one callback and run usb tethering. + mTethering.registerTetheringEventCallback(callback1); + mLooper.dispatchAll(); + callback1.expectUpstreamChanged(new Network[] {null}); + NetworkState upstreamState = buildMobileDualStackUpstreamState(); + runUsbTethering(upstreamState); + callback1.expectUpstreamChanged(upstreamState.network); + // 2. Register second callback. + mTethering.registerTetheringEventCallback(callback2); + mLooper.dispatchAll(); + callback2.expectUpstreamChanged(upstreamState.network); + // 3. Disable usb tethering. + mTethering.stopTethering(TETHERING_USB); + mLooper.dispatchAll(); + sendUsbBroadcast(false, false, false); + mLooper.dispatchAll(); + callback1.expectUpstreamChanged(new Network[] {null}); + callback2.expectUpstreamChanged(new Network[] {null}); + // 4. Unregister first callback and run hotspot. + mTethering.unregisterTetheringEventCallback(callback1); + mLooper.dispatchAll(); + when(mUpstreamNetworkMonitor.getCurrentPreferredUpstream()).thenReturn(upstreamState); + when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any())) + .thenReturn(upstreamState); + when(mWifiManager.startSoftAp(any(WifiConfiguration.class))).thenReturn(true); + mTethering.startTethering(TETHERING_WIFI, null, false); + mLooper.dispatchAll(); + mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true); + sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED); + mLooper.dispatchAll(); + callback1.assertNoCallback(); + callback2.expectUpstreamChanged(upstreamState.network); + } // TODO: Test that a request for hotspot mode doesn't interfere with an // already operating tethering mode interface. diff --git a/tests/notification/Android.bp b/tests/notification/Android.bp new file mode 100644 index 000000000000..f05edafbf8b7 --- /dev/null +++ b/tests/notification/Android.bp @@ -0,0 +1,7 @@ +android_test { + name: "NotificationTests", + // Include all test java files. + srcs: ["src/**/*.java"], + libs: ["android.test.runner.stubs"], + sdk_version: "21", +} diff --git a/tests/notification/Android.mk b/tests/notification/Android.mk deleted file mode 100644 index 255e6e70a921..000000000000 --- a/tests/notification/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -# We only want this apk build for tests. -LOCAL_MODULE_TAGS := tests - -# Include all test java files. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_JAVA_LIBRARIES := android.test.runner.stubs -LOCAL_PACKAGE_NAME := NotificationTests - -LOCAL_SDK_VERSION := 21 - -include $(BUILD_PACKAGE) - diff --git a/tests/permission/Android.bp b/tests/permission/Android.bp new file mode 100644 index 000000000000..bd07009de7b3 --- /dev/null +++ b/tests/permission/Android.bp @@ -0,0 +1,12 @@ +android_test { + name: "FrameworkPermissionTests", + // Include all test java files. + srcs: ["src/**/*.java"], + libs: [ + "android.test.runner", + "telephony-common", + "android.test.base", + ], + static_libs: ["junit"], + platform_apis: true, +} diff --git a/tests/permission/Android.mk b/tests/permission/Android.mk deleted file mode 100644 index dd2f3ec46d26..000000000000 --- a/tests/permission/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -# We only want this apk build for tests. -LOCAL_MODULE_TAGS := tests - -# Include all test java files. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common android.test.base -LOCAL_STATIC_JAVA_LIBRARIES := junit -LOCAL_PACKAGE_NAME := FrameworkPermissionTests -LOCAL_PRIVATE_PLATFORM_APIS := true - -include $(BUILD_PACKAGE) - diff --git a/tests/testables/Android.bp b/tests/testables/Android.bp index 0bad7a46abb4..eb6811cf490e 100644 --- a/tests/testables/Android.bp +++ b/tests/testables/Android.bp @@ -15,18 +15,12 @@ // java_library { - name: "testables", - // ANDROIDMK TRANSLATION ERROR: unsupported assignment to LOCAL_MODULE_TAG - // LOCAL_MODULE_TAG := tests - srcs: ["src/**/*.java"], - libs: [ "android.test.runner", "android.test.mock", "androidx.test.rules", "mockito-target-inline-minus-junit4", ], - } diff --git a/tests/testables/tests/Android.bp b/tests/testables/tests/Android.bp new file mode 100644 index 000000000000..e1a58be7bd68 --- /dev/null +++ b/tests/testables/tests/Android.bp @@ -0,0 +1,41 @@ +// Copyright (C) 2017 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. + +android_test { + name: "TestablesTests", + platform_apis: true, + srcs: [ + "src/**/*.java", + "src/**/I*.aidl", + ], + resource_dirs: ["res"], + static_libs: [ + "androidx.test.rules", + "hamcrest-library", + "mockito-target-inline-minus-junit4", + "testables", + ], + compile_multilib: "both", + jni_libs: [ + "libdexmakerjvmtiagent", + "libmultiplejvmtiagentsinterferenceagent", + ], + libs: [ + "android.test.runner", + "android.test.base", + "android.test.mock", + ], + certificate: "platform", + test_suites: ["device-tests"], +} diff --git a/tests/testables/tests/Android.mk b/tests/testables/tests/Android.mk deleted file mode 100644 index 16fbb18b0eca..000000000000 --- a/tests/testables/tests/Android.mk +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_USE_AAPT2 := true -LOCAL_MODULE_TAGS := tests - -LOCAL_PACKAGE_NAME := TestablesTests -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_SRC_FILES := $(call all-java-files-under, src) \ - $(call all-Iaidl-files-under, src) - -LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res - -LOCAL_STATIC_JAVA_LIBRARIES := \ - androidx.test.rules hamcrest-library \ - mockito-target-inline-minus-junit4 \ - testables - -LOCAL_MULTILIB := both - -LOCAL_JNI_SHARED_LIBRARIES := \ - libdexmakerjvmtiagent \ - libmultiplejvmtiagentsinterferenceagent - -LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base android.test.mock - -LOCAL_CERTIFICATE := platform - -LOCAL_COMPATIBILITY_SUITE := device-tests - -include $(BUILD_PACKAGE) - diff --git a/tests/touchlag/Android.bp b/tests/touchlag/Android.bp index 2610cb386da2..092eea918b1d 100644 --- a/tests/touchlag/Android.bp +++ b/tests/touchlag/Android.bp @@ -1,14 +1,11 @@ cc_test { name: "test-touchlag", gtest: false, - srcs: ["touchlag.cpp"], - shared_libs: [ "libcutils", "libutils", ], - cflags: [ "-Wall", "-Wextra", diff --git a/tests/utils/Android.mk b/tests/utils/Android.mk deleted file mode 100644 index c141484d81d5..000000000000 --- a/tests/utils/Android.mk +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2012 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -include $(call all-subdir-makefiles) diff --git a/tests/utils/DummyIME/Android.bp b/tests/utils/DummyIME/Android.bp new file mode 100644 index 000000000000..4a44b3b27992 --- /dev/null +++ b/tests/utils/DummyIME/Android.bp @@ -0,0 +1,21 @@ +// +// Copyright (C) 2012 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. +// + +android_test { + name: "DummyIME", + srcs: ["src/**/*.java"], + sdk_version: "current", +} diff --git a/tests/utils/DummyIME/Android.mk b/tests/utils/DummyIME/Android.mk deleted file mode 100644 index 0f6c988b5463..000000000000 --- a/tests/utils/DummyIME/Android.mk +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (C) 2012 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := DummyIME -LOCAL_SDK_VERSION := current - -include $(BUILD_PACKAGE) diff --git a/tools/hiddenapi/generate_hiddenapi_lists.py b/tools/hiddenapi/generate_hiddenapi_lists.py index 2a8f69525eb8..6781eba05534 100755 --- a/tools/hiddenapi/generate_hiddenapi_lists.py +++ b/tools/hiddenapi/generate_hiddenapi_lists.py @@ -29,6 +29,9 @@ FLAG_BLACKLIST = "blacklist" FLAG_GREYLIST_MAX_O = "greylist-max-o" FLAG_GREYLIST_MAX_P = "greylist-max-p" FLAG_CORE_PLATFORM_API = "core-platform-api" +FLAG_PUBLIC_API = "public-api" +FLAG_SYSTEM_API = "system-api" +FLAG_TEST_API = "test-api" # List of all known flags. FLAGS_API_LIST = [ @@ -38,7 +41,12 @@ FLAGS_API_LIST = [ FLAG_GREYLIST_MAX_O, FLAG_GREYLIST_MAX_P, ] -ALL_FLAGS = FLAGS_API_LIST + [ FLAG_CORE_PLATFORM_API ] +ALL_FLAGS = FLAGS_API_LIST + [ + FLAG_CORE_PLATFORM_API, + FLAG_PUBLIC_API, + FLAG_SYSTEM_API, + FLAG_TEST_API, + ] FLAGS_API_LIST_SET = set(FLAGS_API_LIST) ALL_FLAGS_SET = set(ALL_FLAGS) @@ -203,14 +211,19 @@ class FlagsDict: # Iterate over all CSV lines, find entry in dict and append flags to it. for csv in csv_values: - self._dict[csv[0]].update(csv[1:]) + flags = csv[1:] + if (FLAG_PUBLIC_API in flags) or (FLAG_SYSTEM_API in flags): + flags.append(FLAG_WHITELIST) + elif FLAG_TEST_API in flags: + flags.append(FLAG_GREYLIST) + self._dict[csv[0]].update(flags) def assign_flag(self, flag, apis, source="<unknown>"): """Assigns a flag to given subset of entries. Args: flag (string): One of ALL_FLAGS. - apis (set): Subset of APIs to recieve the flag. + apis (set): Subset of APIs to receive the flag. source (string): Origin of `entries_subset`. Will be printed in error messages. Throws: diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 6dd838cf4252..4fd00f7e2092 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -3604,7 +3604,7 @@ public class WifiManager { android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK }) - public void connect(WifiConfiguration config, ActionListener listener) { + public void connect(@NonNull WifiConfiguration config, @Nullable ActionListener listener) { if (config == null) throw new IllegalArgumentException("config cannot be null"); // Use INVALID_NETWORK_ID for arg1 when passing a config object // arg1 is used to pass network id when the network already exists @@ -3630,7 +3630,7 @@ public class WifiManager { android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK }) - public void connect(int networkId, ActionListener listener) { + public void connect(int networkId, @Nullable ActionListener listener) { if (networkId < 0) throw new IllegalArgumentException("Network id cannot be negative"); getChannel().sendMessage(CONNECT_NETWORK, networkId, putListener(listener)); } @@ -3661,7 +3661,7 @@ public class WifiManager { android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK }) - public void save(WifiConfiguration config, ActionListener listener) { + public void save(@NonNull WifiConfiguration config, @Nullable ActionListener listener) { if (config == null) throw new IllegalArgumentException("config cannot be null"); getChannel().sendMessage(SAVE_NETWORK, 0, putListener(listener), config); } @@ -3685,7 +3685,7 @@ public class WifiManager { android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK }) - public void forget(int netId, ActionListener listener) { + public void forget(int netId, @Nullable ActionListener listener) { if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); getChannel().sendMessage(FORGET_NETWORK, netId, putListener(listener)); } @@ -3705,7 +3705,7 @@ public class WifiManager { android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK }) - public void disable(int netId, ActionListener listener) { + public void disable(int netId, @Nullable ActionListener listener) { if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); getChannel().sendMessage(DISABLE_NETWORK, netId, putListener(listener)); } diff --git a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java index 358bf31bf3f7..8b56b3f24593 100644 --- a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java +++ b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java @@ -408,7 +408,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc * @return Instance of {@link NetworkSpecifier}. * @throws IllegalStateException on invalid params set. */ - public @NonNull NetworkSpecifier build() { + public @NonNull WifiNetworkSpecifier build() { if (!hasSetAnyPattern()) { throw new IllegalStateException("one of setSsidPattern/setSsid/setBssidPattern/" + "setBssid should be invoked for specifier"); diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java b/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java index 6c1b0738ff4c..c3cfb0266328 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java @@ -227,7 +227,7 @@ public class WifiP2pConfig implements Parcelable { public static final class Builder { private static final MacAddress MAC_ANY_ADDRESS = - MacAddress.fromString("00:00:00:00:00:00"); + MacAddress.fromString("02:00:00:00:00:00"); private MacAddress mDeviceAddress = MAC_ANY_ADDRESS; private String mNetworkName = ""; @@ -240,9 +240,9 @@ public class WifiP2pConfig implements Parcelable { * Specify the peer's MAC address. If not set, the device will * try to find a peer whose SSID matches the network name as * specified by {@link #setNetworkName(String)}. Specifying null will - * reset the peer's MAC address to "00:00:00:00:00:00". + * reset the peer's MAC address to "02:00:00:00:00:00". * <p> - * Optional. "00:00:00:00:00:00" by default. + * Optional. "02:00:00:00:00:00" by default. * * @param deviceAddress the peer's MAC address. * @return The builder to facilitate chaining diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java index 29a18d2edc21..a7793785fb9b 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java @@ -793,7 +793,7 @@ public class WifiP2pManager { * The requested {@link android.net.NetworkInfo} is available * @param networkInfo Wi-Fi p2p {@link android.net.NetworkInfo} */ - void onNetworkInfoAvailable(NetworkInfo networkInfo); + void onNetworkInfoAvailable(@NonNull NetworkInfo networkInfo); } /** |