summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt81
-rw-r--r--api/system-current.txt5
-rw-r--r--api/test-current.txt2
-rw-r--r--core/java/android/app/ActivityThread.java35
-rw-r--r--core/java/android/content/pm/PackageInstaller.java2
-rw-r--r--core/java/android/nfc/NfcAdapter.java11
-rw-r--r--core/java/android/os/PowerManager.java97
-rw-r--r--core/java/android/provider/Settings.java19
-rw-r--r--core/java/android/service/contentcapture/ContentCaptureService.java14
-rw-r--r--core/java/android/view/View.java30
-rw-r--r--core/java/android/view/autofill/AutofillManager.java16
-rw-r--r--core/java/android/view/textclassifier/ConversationActions.java3
-rw-r--r--core/java/android/view/textclassifier/TextClassifier.java4
-rw-r--r--core/java/android/view/textclassifier/TextLinks.java1
-rw-r--r--core/java/android/view/textclassifier/TextSelection.java2
-rw-r--r--core/jni/android_view_CompositionSamplingListener.cpp25
-rw-r--r--core/proto/android/providers/settings/secure.proto4
-rw-r--r--core/proto/android/stats/devicepolicy/device_policy_enums.proto2
-rw-r--r--core/res/res/anim/lock_scanning.xml371
-rwxr-xr-xcore/res/res/anim/lock_to_error.xml587
-rw-r--r--core/res/res/drawable/ic_auth_error.xml23
-rw-r--r--core/res/res/values-af/strings.xml11
-rw-r--r--core/res/res/values-am/strings.xml11
-rw-r--r--core/res/res/values-ar/strings.xml11
-rw-r--r--core/res/res/values-as/strings.xml11
-rw-r--r--core/res/res/values-az/strings.xml11
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml11
-rw-r--r--core/res/res/values-be/strings.xml11
-rw-r--r--core/res/res/values-bg/strings.xml11
-rw-r--r--core/res/res/values-bn/strings.xml11
-rw-r--r--core/res/res/values-bs/strings.xml13
-rw-r--r--core/res/res/values-ca/strings.xml11
-rw-r--r--core/res/res/values-cs/strings.xml11
-rw-r--r--core/res/res/values-da/strings.xml2
-rw-r--r--core/res/res/values-de/strings.xml11
-rw-r--r--core/res/res/values-el/strings.xml11
-rw-r--r--core/res/res/values-en-rAU/strings.xml2
-rw-r--r--core/res/res/values-en-rCA/strings.xml2
-rw-r--r--core/res/res/values-en-rGB/strings.xml2
-rw-r--r--core/res/res/values-en-rIN/strings.xml2
-rw-r--r--core/res/res/values-en-rXC/strings.xml2
-rw-r--r--core/res/res/values-es-rUS/strings.xml11
-rw-r--r--core/res/res/values-es/strings.xml2
-rw-r--r--core/res/res/values-et/strings.xml11
-rw-r--r--core/res/res/values-eu/strings.xml15
-rw-r--r--core/res/res/values-fa/strings.xml11
-rw-r--r--core/res/res/values-fi/strings.xml2
-rw-r--r--core/res/res/values-fr-rCA/strings.xml11
-rw-r--r--core/res/res/values-fr/strings.xml11
-rw-r--r--core/res/res/values-gl/strings.xml11
-rw-r--r--core/res/res/values-gu/strings.xml11
-rw-r--r--core/res/res/values-hi/strings.xml62
-rw-r--r--core/res/res/values-hr/strings.xml11
-rw-r--r--core/res/res/values-hu/strings.xml11
-rw-r--r--core/res/res/values-hy/strings.xml11
-rw-r--r--core/res/res/values-in/strings.xml11
-rw-r--r--core/res/res/values-is/strings.xml11
-rw-r--r--core/res/res/values-it/strings.xml11
-rw-r--r--core/res/res/values-iw/strings.xml11
-rw-r--r--core/res/res/values-ja/strings.xml11
-rw-r--r--core/res/res/values-ka/strings.xml11
-rw-r--r--core/res/res/values-kk/strings.xml11
-rw-r--r--core/res/res/values-km/strings.xml11
-rw-r--r--core/res/res/values-kn/strings.xml11
-rw-r--r--core/res/res/values-ko/strings.xml11
-rw-r--r--core/res/res/values-ky/strings.xml11
-rw-r--r--core/res/res/values-lo/strings.xml11
-rw-r--r--core/res/res/values-lt/strings.xml11
-rw-r--r--core/res/res/values-lv/strings.xml11
-rw-r--r--core/res/res/values-mk/strings.xml11
-rw-r--r--core/res/res/values-ml/strings.xml11
-rw-r--r--core/res/res/values-mn/strings.xml11
-rw-r--r--core/res/res/values-mr/strings.xml11
-rw-r--r--core/res/res/values-ms/strings.xml11
-rw-r--r--core/res/res/values-my/strings.xml11
-rw-r--r--core/res/res/values-nb/strings.xml11
-rw-r--r--core/res/res/values-ne/strings.xml11
-rw-r--r--core/res/res/values-nl/strings.xml11
-rw-r--r--core/res/res/values-or/strings.xml71
-rw-r--r--core/res/res/values-pa/strings.xml11
-rw-r--r--core/res/res/values-pl/strings.xml2
-rw-r--r--core/res/res/values-pt-rBR/strings.xml2
-rw-r--r--core/res/res/values-pt-rPT/strings.xml2
-rw-r--r--core/res/res/values-pt/strings.xml2
-rw-r--r--core/res/res/values-ro/strings.xml11
-rw-r--r--core/res/res/values-ru/strings.xml11
-rw-r--r--core/res/res/values-si/strings.xml11
-rw-r--r--core/res/res/values-sk/strings.xml11
-rw-r--r--core/res/res/values-sl/strings.xml11
-rw-r--r--core/res/res/values-sq/strings.xml11
-rw-r--r--core/res/res/values-sr/strings.xml11
-rw-r--r--core/res/res/values-sv/strings.xml11
-rw-r--r--core/res/res/values-sw/strings.xml11
-rw-r--r--core/res/res/values-ta/strings.xml62
-rw-r--r--core/res/res/values-te/strings.xml11
-rw-r--r--core/res/res/values-th/strings.xml11
-rw-r--r--core/res/res/values-tl/strings.xml11
-rw-r--r--core/res/res/values-tr/strings.xml11
-rw-r--r--core/res/res/values-uk/strings.xml11
-rw-r--r--core/res/res/values-ur/strings.xml11
-rw-r--r--core/res/res/values-uz/strings.xml11
-rw-r--r--core/res/res/values-vi/strings.xml11
-rw-r--r--core/res/res/values-zh-rCN/strings.xml11
-rw-r--r--core/res/res/values-zh-rHK/strings.xml11
-rw-r--r--core/res/res/values-zh-rTW/strings.xml11
-rw-r--r--core/res/res/values-zu/strings.xml11
-rw-r--r--core/res/res/values/config.xml2
-rw-r--r--core/res/res/values/symbols.xml2
-rw-r--r--core/tests/coretests/AndroidManifest.xml3
-rw-r--r--core/tests/coretests/src/android/os/PowerManagerTest.java68
-rw-r--r--core/tests/coretests/src/android/provider/SettingsBackupTest.java1
-rw-r--r--graphics/java/android/graphics/BaseCanvas.java4
-rw-r--r--graphics/java/android/graphics/Canvas.java4
-rw-r--r--graphics/java/android/graphics/HardwareRenderer.java34
-rw-r--r--media/java/android/media/AudioRecord.java43
-rw-r--r--media/java/android/media/AudioTrack.java34
-rw-r--r--media/java/android/media/MediaRecorder.java36
-rw-r--r--media/java/android/media/MicrophoneDirection.java14
-rw-r--r--media/jni/android_media_MediaRecorder.cpp40
-rw-r--r--packages/ExtServices/Android.mk2
-rw-r--r--packages/ExtServices/AndroidManifest.xml4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt24
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java17
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java3
-rw-r--r--packages/SystemUI/docs/dagger.md64
-rw-r--r--packages/SystemUI/res/layout/keyguard_bottom_area.xml2
-rw-r--r--packages/SystemUI/res/layout/mobile_signal_group.xml4
-rw-r--r--packages/SystemUI/res/layout/qs_carrier.xml (renamed from packages/SystemUI/res/layout/qs_footer_carrier.xml)25
-rw-r--r--packages/SystemUI/res/layout/qs_carrier_group.xml58
-rw-r--r--packages/SystemUI/res/layout/qs_footer_impl.xml80
-rw-r--r--packages/SystemUI/res/layout/qs_panel.xml2
-rw-r--r--packages/SystemUI/res/layout/quick_settings_header_info.xml95
-rw-r--r--packages/SystemUI/res/values-land/integers.xml22
-rw-r--r--packages/SystemUI/res/values/dimens.xml20
-rw-r--r--packages/SystemUI/res/values/integers.xml4
-rw-r--r--packages/SystemUI/res/values/styles.xml2
-rw-r--r--packages/SystemUI/src/com/android/systemui/BatteryMeterView.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java49
-rw-r--r--packages/SystemUI/src/com/android/systemui/MultiListLayout.java94
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java138
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java54
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java141
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSCarrierGroup.java224
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java280
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSPanel.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java44
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java65
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSCarrierGroupTest.java177
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java121
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java3
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java65
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java2
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java4
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsService.java3
-rw-r--r--services/core/java/com/android/server/locksettings/PasswordSlotManager.java191
-rw-r--r--services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java9
-rw-r--r--services/core/java/com/android/server/om/IdmapManager.java17
-rw-r--r--services/core/java/com/android/server/om/OverlayManagerService.java2
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java14
-rw-r--r--services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java4
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java190
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java3
-rw-r--r--services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowTracing.java1
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTestable.java61
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java122
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTracingTest.java3
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java2
-rw-r--r--tests/RollbackTest/Android.bp130
-rw-r--r--tests/RollbackTest/Android.mk148
-rw-r--r--tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java2
-rw-r--r--tests/RollbackTest/TestApex/Android.bp56
185 files changed, 3175 insertions, 2419 deletions
diff --git a/api/current.txt b/api/current.txt
index 8147ad58abd9..e0aa52f965a3 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11461,7 +11461,7 @@ package android.content.pm {
method public int getSessionId();
method public long getSize();
method public int getStagedSessionErrorCode();
- method public String getStagedSessionErrorMessage();
+ method @NonNull public String getStagedSessionErrorMessage();
method public android.os.UserHandle getUser();
method public boolean isActive();
method public boolean isMultiPackage();
@@ -13779,7 +13779,7 @@ package android.graphics {
method public void drawColor(@ColorInt int, @NonNull android.graphics.BlendMode);
method public void drawColor(@ColorLong long, @NonNull android.graphics.BlendMode);
method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float, float, @NonNull android.graphics.RectF, float, float, @NonNull android.graphics.Paint);
- method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float[], @NonNull android.graphics.RectF, float[], @NonNull android.graphics.Paint);
+ method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, @NonNull float[], @NonNull android.graphics.RectF, @NonNull float[], @NonNull android.graphics.Paint);
method public void drawLine(float, float, float, float, @NonNull android.graphics.Paint);
method public void drawLines(@Size(multiple=4) @NonNull float[], int, int, @NonNull android.graphics.Paint);
method public void drawLines(@Size(multiple=4) @NonNull float[], @NonNull android.graphics.Paint);
@@ -14127,8 +14127,9 @@ package android.graphics {
method public void setLightSourceGeometry(float, float, float, float);
method public void setName(@NonNull String);
method public void setOpaque(boolean);
- method public void setStopped(boolean);
method public void setSurface(@Nullable android.view.Surface);
+ method public void start();
+ method public void stop();
field public static final int SYNC_CONTEXT_IS_STOPPED = 4; // 0x4
field public static final int SYNC_FRAME_DROPPED = 8; // 0x8
field public static final int SYNC_LOST_SURFACE_REWARD_IF_FOUND = 2; // 0x2
@@ -23492,7 +23493,7 @@ package android.media {
public static final class AudioRecord.MetricsConstants {
field public static final String CHANNELS = "android.media.audiorecord.channels";
field public static final String ENCODING = "android.media.audiorecord.encoding";
- field public static final String LATENCY = "android.media.audiorecord.latency";
+ field @Deprecated public static final String LATENCY = "android.media.audiorecord.latency";
field public static final String SAMPLERATE = "android.media.audiorecord.samplerate";
field public static final String SOURCE = "android.media.audiorecord.source";
}
@@ -23656,9 +23657,9 @@ package android.media {
}
public static final class AudioTrack.MetricsConstants {
- field public static final String CHANNELMASK = "android.media.audiorecord.channelmask";
+ field @Deprecated public static final String CHANNELMASK = "android.media.audiorecord.channelmask";
field public static final String CONTENTTYPE = "android.media.audiotrack.type";
- field public static final String SAMPLERATE = "android.media.audiorecord.samplerate";
+ field @Deprecated public static final String SAMPLERATE = "android.media.audiorecord.samplerate";
field public static final String STREAMTYPE = "android.media.audiotrack.streamtype";
field public static final String USAGE = "android.media.audiotrack.usage";
}
@@ -25731,7 +25732,7 @@ package android.media {
field public static final int MEDIA_TRACK_TYPE_VIDEO = 1; // 0x1
}
- public class MediaRecorder implements android.media.AudioRecordingMonitor android.media.AudioRouting {
+ public class MediaRecorder implements android.media.AudioRecordingMonitor android.media.AudioRouting android.media.MicrophoneDirection {
ctor public MediaRecorder();
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
method protected void finalize();
@@ -25761,6 +25762,8 @@ package android.media {
method public void setLocation(float, float);
method public void setMaxDuration(int) throws java.lang.IllegalArgumentException;
method public void setMaxFileSize(long) throws java.lang.IllegalArgumentException;
+ method public boolean setMicrophoneDirection(int);
+ method public boolean setMicrophoneFieldDimension(@FloatRange(from=-1.0, to=1.0) float);
method public void setNextOutputFile(java.io.FileDescriptor) throws java.io.IOException;
method public void setNextOutputFile(java.io.File) throws java.io.IOException;
method public void setOnErrorListener(android.media.MediaRecorder.OnErrorListener);
@@ -30806,7 +30809,6 @@ package android.nfc {
}
public final class NfcAdapter {
- method public boolean deviceSupportsNfcSecure();
method public void disableForegroundDispatch(android.app.Activity);
method @Deprecated public void disableForegroundNdefPush(android.app.Activity);
method public void disableReaderMode(android.app.Activity);
@@ -30819,7 +30821,8 @@ package android.nfc {
method @Deprecated public boolean invokeBeam(android.app.Activity);
method public boolean isEnabled();
method @Deprecated public boolean isNdefPushEnabled();
- method public boolean isNfcSecureEnabled();
+ method public boolean isSecureNfcEnabled();
+ method public boolean isSecureNfcSupported();
method @Deprecated public void setBeamPushUris(android.net.Uri[], android.app.Activity);
method @Deprecated public void setBeamPushUrisCallback(android.nfc.NfcAdapter.CreateBeamUrisCallback, android.app.Activity);
method @Deprecated public void setNdefPushMessage(android.nfc.NdefMessage, android.app.Activity, android.app.Activity...);
@@ -35118,6 +35121,8 @@ package android.os {
}
public final class PowerManager {
+ method public void addThermalStatusListener(@NonNull android.os.PowerManager.OnThermalStatusChangedListener);
+ method public void addThermalStatusListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.PowerManager.OnThermalStatusChangedListener);
method public int getCurrentThermalStatus();
method public int getLocationPowerSaveMode();
method public boolean isDeviceIdleMode();
@@ -35129,8 +35134,7 @@ package android.os {
method public boolean isWakeLockLevelSupported(int);
method public android.os.PowerManager.WakeLock newWakeLock(int, String);
method public void reboot(String);
- method public void registerThermalStatusCallback(@NonNull android.os.PowerManager.ThermalStatusCallback, @NonNull java.util.concurrent.Executor);
- method public void unregisterThermalStatusCallback(@NonNull android.os.PowerManager.ThermalStatusCallback);
+ method public void removeThermalStatusListener(@NonNull android.os.PowerManager.OnThermalStatusChangedListener);
field public static final int ACQUIRE_CAUSES_WAKEUP = 268435456; // 0x10000000
field public static final String ACTION_DEVICE_IDLE_MODE_CHANGED = "android.os.action.DEVICE_IDLE_MODE_CHANGED";
field public static final String ACTION_POWER_SAVE_MODE_CHANGED = "android.os.action.POWER_SAVE_MODE_CHANGED";
@@ -35155,9 +35159,8 @@ package android.os {
field public static final int THERMAL_STATUS_SHUTDOWN = 6; // 0x6
}
- public abstract static class PowerManager.ThermalStatusCallback {
- ctor public PowerManager.ThermalStatusCallback();
- method public void onStatusChange(int);
+ public static interface PowerManager.OnThermalStatusChangedListener {
+ method public void onThermalStatusChanged(int);
}
public final class PowerManager.WakeLock {
@@ -50324,8 +50327,8 @@ package android.view {
method public int getAccessibilityLiveRegion();
method public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider();
method @Nullable public CharSequence getAccessibilityPaneTitle();
- method public int getAccessibilityTraversalAfter();
- method public int getAccessibilityTraversalBefore();
+ method @IdRes public int getAccessibilityTraversalAfter();
+ method @IdRes public int getAccessibilityTraversalBefore();
method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
@@ -50387,7 +50390,7 @@ package android.view {
method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForContentCapture();
method public boolean getKeepScreenOn();
method public android.view.KeyEvent.DispatcherState getKeyDispatcherState();
- method @android.view.ViewDebug.ExportedProperty(category="accessibility") public int getLabelFor();
+ method @android.view.ViewDebug.ExportedProperty(category="accessibility") @IdRes public int getLabelFor();
method public int getLayerType();
method @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.LAYOUT_DIRECTION_LTR, to="RESOLVED_DIRECTION_LTR"), @android.view.ViewDebug.IntToString(from=android.view.View.LAYOUT_DIRECTION_RTL, to="RESOLVED_DIRECTION_RTL")}) public int getLayoutDirection();
method @android.view.ViewDebug.ExportedProperty(deepExport=true, prefix="layout_") public android.view.ViewGroup.LayoutParams getLayoutParams();
@@ -50405,12 +50408,12 @@ package android.view {
method @android.view.ViewDebug.ExportedProperty(category="measurement", flagMapping={@android.view.ViewDebug.FlagToString(mask=android.view.View.MEASURED_STATE_MASK, equals=android.view.View.MEASURED_STATE_TOO_SMALL, name="MEASURED_STATE_TOO_SMALL")}) public final int getMeasuredWidthAndState();
method public int getMinimumHeight();
method public int getMinimumWidth();
- method public int getNextClusterForwardId();
- method public int getNextFocusDownId();
- method public int getNextFocusForwardId();
- method public int getNextFocusLeftId();
- method public int getNextFocusRightId();
- method public int getNextFocusUpId();
+ method @IdRes public int getNextClusterForwardId();
+ method @IdRes public int getNextFocusDownId();
+ method @IdRes public int getNextFocusForwardId();
+ method @IdRes public int getNextFocusLeftId();
+ method @IdRes public int getNextFocusRightId();
+ method @IdRes public int getNextFocusUpId();
method public android.view.View.OnFocusChangeListener getOnFocusChangeListener();
method @ColorInt public int getOutlineAmbientShadowColor();
method public android.view.ViewOutlineProvider getOutlineProvider();
@@ -50672,8 +50675,8 @@ package android.view {
method public void setAccessibilityHeading(boolean);
method public void setAccessibilityLiveRegion(int);
method public void setAccessibilityPaneTitle(@Nullable CharSequence);
- method public void setAccessibilityTraversalAfter(int);
- method public void setAccessibilityTraversalBefore(int);
+ method public void setAccessibilityTraversalAfter(@IdRes int);
+ method public void setAccessibilityTraversalBefore(@IdRes int);
method public void setActivated(boolean);
method public void setAlpha(@FloatRange(from=0.0, to=1.0) float);
method public void setAnimation(android.view.animation.Animation);
@@ -50738,12 +50741,12 @@ package android.view {
method public void setMinimumHeight(int);
method public void setMinimumWidth(int);
method public void setNestedScrollingEnabled(boolean);
- method public void setNextClusterForwardId(int);
- method public void setNextFocusDownId(int);
- method public void setNextFocusForwardId(int);
- method public void setNextFocusLeftId(int);
- method public void setNextFocusRightId(int);
- method public void setNextFocusUpId(int);
+ method public void setNextClusterForwardId(@IdRes int);
+ method public void setNextFocusDownId(@IdRes int);
+ method public void setNextFocusForwardId(@IdRes int);
+ method public void setNextFocusLeftId(@IdRes int);
+ method public void setNextFocusRightId(@IdRes int);
+ method public void setNextFocusUpId(@IdRes int);
method public void setOnApplyWindowInsetsListener(android.view.View.OnApplyWindowInsetsListener);
method public void setOnCapturedPointerListener(android.view.View.OnCapturedPointerListener);
method public void setOnClickListener(@Nullable android.view.View.OnClickListener);
@@ -53587,8 +53590,8 @@ package android.view.textclassifier {
method @Nullable public CharSequence getText();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.Message> CREATOR;
- field public static final android.app.Person PERSON_USER_OTHERS;
- field public static final android.app.Person PERSON_USER_SELF;
+ field @NonNull public static final android.app.Person PERSON_USER_OTHERS;
+ field @NonNull public static final android.app.Person PERSON_USER_SELF;
}
public static final class ConversationActions.Message.Builder {
@@ -53617,7 +53620,7 @@ package android.view.textclassifier {
ctor public ConversationActions.Request.Builder(@NonNull java.util.List<android.view.textclassifier.ConversationActions.Message>);
method @NonNull public android.view.textclassifier.ConversationActions.Request build();
method @NonNull public android.view.textclassifier.ConversationActions.Request.Builder setConversationId(@Nullable String);
- method public android.view.textclassifier.ConversationActions.Request.Builder setHints(@Nullable java.util.List<java.lang.String>);
+ method @NonNull public android.view.textclassifier.ConversationActions.Request.Builder setHints(@Nullable java.util.List<java.lang.String>);
method @NonNull public android.view.textclassifier.ConversationActions.Request.Builder setMaxSuggestions(@IntRange(from=0xffffffff) int);
method @NonNull public android.view.textclassifier.ConversationActions.Request.Builder setTypeConfig(@Nullable android.view.textclassifier.TextClassifier.EntityConfig);
}
@@ -53764,7 +53767,7 @@ package android.view.textclassifier {
method public default boolean isDestroyed();
method public default void onSelectionEvent(@NonNull android.view.textclassifier.SelectionEvent);
method public default void onTextClassifierEvent(@NonNull android.view.textclassifier.TextClassifierEvent);
- method @WorkerThread public default android.view.textclassifier.ConversationActions suggestConversationActions(@NonNull android.view.textclassifier.ConversationActions.Request);
+ method @WorkerThread @NonNull public default android.view.textclassifier.ConversationActions suggestConversationActions(@NonNull android.view.textclassifier.ConversationActions.Request);
method @WorkerThread @NonNull public default android.view.textclassifier.TextSelection suggestSelection(@NonNull android.view.textclassifier.TextSelection.Request);
method @WorkerThread @NonNull public default android.view.textclassifier.TextSelection suggestSelection(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @Nullable android.os.LocaleList);
field public static final String EXTRA_FROM_TEXT_CLASSIFIER = "android.view.textclassifier.extra.FROM_TEXT_CLASSIFIER";
@@ -53809,7 +53812,7 @@ package android.view.textclassifier {
method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig build();
method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig.Builder includeTypesFromTextClassifier(boolean);
method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig.Builder setExcludedTypes(@Nullable java.util.Collection<java.lang.String>);
- method public android.view.textclassifier.TextClassifier.EntityConfig.Builder setHints(java.util.Collection<java.lang.String>);
+ method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig.Builder setHints(@Nullable java.util.Collection<java.lang.String>);
method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig.Builder setIncludedTypes(@Nullable java.util.Collection<java.lang.String>);
}
@@ -53934,7 +53937,7 @@ package android.view.textclassifier {
method @NonNull public android.view.textclassifier.TextLinks.Builder addLink(int, int, @NonNull java.util.Map<java.lang.String,java.lang.Float>, @NonNull android.os.Bundle);
method @NonNull public android.view.textclassifier.TextLinks build();
method @NonNull public android.view.textclassifier.TextLinks.Builder clearTextLinks();
- method public android.view.textclassifier.TextLinks.Builder setExtras(@Nullable android.os.Bundle);
+ method @NonNull public android.view.textclassifier.TextLinks.Builder setExtras(@Nullable android.os.Bundle);
}
public static final class TextLinks.Request implements android.os.Parcelable {
@@ -53991,7 +53994,7 @@ package android.view.textclassifier {
ctor public TextSelection.Builder(@IntRange(from=0) int, @IntRange(from=0) int);
method @NonNull public android.view.textclassifier.TextSelection build();
method @NonNull public android.view.textclassifier.TextSelection.Builder setEntityType(@NonNull String, @FloatRange(from=0.0, to=1.0) float);
- method public android.view.textclassifier.TextSelection.Builder setExtras(@Nullable android.os.Bundle);
+ method @NonNull public android.view.textclassifier.TextSelection.Builder setExtras(@Nullable android.os.Bundle);
method @NonNull public android.view.textclassifier.TextSelection.Builder setId(@Nullable String);
}
@@ -54011,7 +54014,7 @@ package android.view.textclassifier {
ctor public TextSelection.Request.Builder(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int);
method @NonNull public android.view.textclassifier.TextSelection.Request build();
method @NonNull public android.view.textclassifier.TextSelection.Request.Builder setDefaultLocales(@Nullable android.os.LocaleList);
- method public android.view.textclassifier.TextSelection.Request.Builder setExtras(@Nullable android.os.Bundle);
+ method @NonNull public android.view.textclassifier.TextSelection.Request.Builder setExtras(@Nullable android.os.Bundle);
}
}
diff --git a/api/system-current.txt b/api/system-current.txt
index ff3ce9a75e2f..9d6c27f72b2f 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5084,9 +5084,9 @@ package android.nfc {
method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean disableNdefPush();
method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enable();
method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableNdefPush();
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableSecureNfc(boolean);
method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean removeNfcUnlockHandler(android.nfc.NfcAdapter.NfcUnlockHandler);
method public void setNdefPushMessage(android.nfc.NdefMessage, android.app.Activity, int);
- method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean setNfcSecure(boolean);
field public static final int FLAG_NDEF_PUSH_NO_CONFIRM = 1; // 0x1
}
@@ -6117,6 +6117,7 @@ package android.provider {
field public static final String LAST_SETUP_SHOWN = "last_setup_shown";
field public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis";
field public static final String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis";
+ field public static final String LOCATION_PERMISSIONS_UPGRADE_TO_Q_MODE = "location_permissions_upgrade_to_q_mode";
field public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS = "lock_screen_allow_private_notifications";
field public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications";
field public static final String MANUAL_RINGER_TOGGLE_COUNT = "manual_ringer_toggle_count";
@@ -6457,7 +6458,6 @@ package android.service.contentcapture {
method public void onDestroyContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureSessionId);
method public void onDisconnected();
method public void onUserDataRemovalRequest(@NonNull android.view.contentcapture.UserDataRemovalRequest);
- method @Deprecated public final void setContentCaptureWhitelist(@Nullable java.util.List<java.lang.String>, @Nullable java.util.List<android.content.ComponentName>);
method public final void setContentCaptureWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>);
field public static final String SERVICE_INTERFACE = "android.service.contentcapture.ContentCaptureService";
}
@@ -9511,7 +9511,6 @@ package android.view.accessibility {
package android.view.autofill {
public final class AutofillManager {
- method @Deprecated public void setAugmentedAutofillWhitelist(@Nullable java.util.List<java.lang.String>, @Nullable java.util.List<android.content.ComponentName>);
method public void setAugmentedAutofillWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>);
}
diff --git a/api/test-current.txt b/api/test-current.txt
index 8b04dd000554..166a5acf9dc9 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -2318,7 +2318,6 @@ package android.service.contentcapture {
method public void onDestroyContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureSessionId);
method public void onDisconnected();
method public void onUserDataRemovalRequest(@NonNull android.view.contentcapture.UserDataRemovalRequest);
- method @Deprecated public final void setContentCaptureWhitelist(@Nullable java.util.List<java.lang.String>, @Nullable java.util.List<android.content.ComponentName>);
method public final void setContentCaptureWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>);
field public static final String SERVICE_INTERFACE = "android.service.contentcapture.ContentCaptureService";
}
@@ -2946,7 +2945,6 @@ package android.view.autofill {
}
public final class AutofillManager {
- method @Deprecated public void setAugmentedAutofillWhitelist(@Nullable java.util.List<java.lang.String>, @Nullable java.util.List<android.content.ComponentName>);
method public void setAugmentedAutofillWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>);
field public static final String DEVICE_CONFIG_AUTOFILL_SMART_SUGGESTION_SUPPORTED_MODES = "smart_suggestion_supported_modes";
field public static final int FLAG_SMART_SUGGESTION_OFF = 0; // 0x0
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index c0a702f28b8d..08239a1e7ed9 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -3115,6 +3115,10 @@ public final class ActivityThread extends ClientTransactionHandler {
if (!r.stopped) {
throw new IllegalStateException("Can't start activity that is not stopped.");
}
+ if (r.activity.mFinished) {
+ // TODO(lifecycler): How can this happen?
+ return;
+ }
// Start
activity.performStart("handleStartActivity");
@@ -3237,8 +3241,6 @@ public final class ActivityThread extends ClientTransactionHandler {
if (!r.activity.mFinished && pendingActions != null) {
pendingActions.setOldState(r.state);
pendingActions.setRestoreInstanceState(true);
- }
- if (pendingActions != null) {
pendingActions.setCallOnPostCreate(true);
}
} else {
@@ -3940,7 +3942,7 @@ public final class ActivityThread extends ClientTransactionHandler {
if (localLOGV) {
Slog.v(TAG, "Performing resume of " + r + " finished=" + r.activity.mFinished);
}
- if (r == null) {
+ if (r == null || r.activity.mFinished) {
return null;
}
if (r.getLifecycleState() == ON_RESUME) {
@@ -4210,6 +4212,12 @@ public final class ActivityThread extends ClientTransactionHandler {
private Bundle performPauseActivity(ActivityClientRecord r, boolean finished, String reason,
PendingTransactionActions pendingActions) {
if (r.paused) {
+ if (r.activity.mFinished) {
+ // If we are finishing, we won't call onResume() in certain cases.
+ // So here we likewise don't want to call onPause() if the activity
+ // isn't resumed.
+ return null;
+ }
RuntimeException e = new RuntimeException(
"Performing pause of activity that is not resumed: "
+ r.intent.getComponent().toShortString());
@@ -4329,13 +4337,20 @@ public final class ActivityThread extends ClientTransactionHandler {
boolean saveState, boolean finalStateRequest, String reason) {
if (localLOGV) Slog.v(TAG, "Performing stop of " + r);
if (r != null) {
- if (!keepShown && r.stopped && !finalStateRequest) {
- // Double stop request is possible if activity receives 'sleep' followed by 'stop'.
- final RuntimeException e = new RuntimeException(
- "Performing stop of activity that is already stopped: "
- + r.intent.getComponent().toShortString());
- Slog.e(TAG, e.getMessage(), e);
- Slog.e(TAG, r.getStateString());
+ if (!keepShown && r.stopped) {
+ if (r.activity.mFinished) {
+ // If we are finishing, we won't call onResume() in certain
+ // cases. So here we likewise don't want to call onStop()
+ // if the activity isn't resumed.
+ return;
+ }
+ if (!finalStateRequest) {
+ final RuntimeException e = new RuntimeException(
+ "Performing stop of activity that is already stopped: "
+ + r.intent.getComponent().toShortString());
+ Slog.e(TAG, e.getMessage(), e);
+ Slog.e(TAG, r.getStateString());
+ }
}
// One must first be paused before stopped...
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index b20cce9b7e3e..7de810526d4b 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -2130,7 +2130,7 @@ public class PackageInstaller {
* Text description of the error code returned by {@code getStagedSessionErrorCode}, or
* empty string if no error was encountered.
*/
- public String getStagedSessionErrorMessage() {
+ public @NonNull String getStagedSessionErrorMessage() {
checkSessionIsStaged();
return mStagedSessionErrorMessage;
}
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index a7d2ee98b45c..8970c625caa7 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -1704,11 +1704,12 @@ public final class NfcAdapter {
/**
* Sets Secure NFC feature.
* <p>This API is for the Settings application.
+ * @return True if successful
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
- public boolean setNfcSecure(boolean enable) {
+ public boolean enableSecureNfc(boolean enable) {
if (!sHasNfcFeature) {
throw new UnsupportedOperationException();
}
@@ -1726,7 +1727,7 @@ public final class NfcAdapter {
* @return True if device supports Secure NFC, false otherwise
* @throws UnsupportedOperationException if FEATURE_NFC is unavailable.
*/
- public boolean deviceSupportsNfcSecure() {
+ public boolean isSecureNfcSupported() {
if (!sHasNfcFeature) {
throw new UnsupportedOperationException();
}
@@ -1741,12 +1742,12 @@ public final class NfcAdapter {
/**
* Checks Secure NFC feature is enabled.
*
- * @return True if device supports Secure NFC is enabled, false otherwise
+ * @return True if Secure NFC is enabled, false otherwise
* @throws UnsupportedOperationException if FEATURE_NFC is unavailable.
* @throws UnsupportedOperationException if device doesn't support
- * Secure NFC functionality. {@link #deviceSupportsNfcSecure}
+ * Secure NFC functionality. {@link #isSecureNfcSupported}
*/
- public boolean isNfcSecureEnabled() {
+ public boolean isSecureNfcEnabled() {
if (!sHasNfcFeature) {
throw new UnsupportedOperationException();
}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index c906d33a081e..728b215a75cb 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -809,7 +809,8 @@ public final class PowerManager {
final Handler mHandler;
IThermalService mThermalService;
- private ArrayMap<ThermalStatusCallback, IThermalStatusListener> mCallbackMap = new ArrayMap<>();
+ private final ArrayMap<OnThermalStatusChangedListener, IThermalStatusListener>
+ mListenerMap = new ArrayMap<>();
IDeviceIdleController mIDeviceIdleController;
@@ -1769,51 +1770,73 @@ public final class PowerManager {
}
/**
- * Callback passed to
- * {@link PowerManager#registerThermalStatusCallback} and
- * {@link PowerManager#unregisterThermalStatusCallback}
- * to notify caller of thermal status.
+ * Listener passed to
+ * {@link PowerManager#addThermalStatusListener} and
+ * {@link PowerManager#removeThermalStatusListener}
+ * to notify caller of thermal status has changed.
*/
- public abstract static class ThermalStatusCallback {
+ public interface OnThermalStatusChangedListener {
/**
* Called when overall thermal throttling status changed.
* @param status defined in {@link android.os.Temperature}.
*/
- public void onStatusChange(@ThermalStatus int status) {}
+ void onThermalStatusChanged(@ThermalStatus int status);
}
+
/**
- * This function registers a callback for thermal status change.
+ * This function adds a listener for thermal status change, listen call back will be
+ * enqueued tasks on the main thread
*
- * @param callback callback to be registered.
- * @param executor {@link Executor} to handle the callbacks.
+ * @param listener listener to be added,
*/
- public void registerThermalStatusCallback(
- @NonNull ThermalStatusCallback callback, @NonNull @CallbackExecutor Executor executor) {
- Preconditions.checkNotNull(callback, "callback cannnot be null");
- Preconditions.checkNotNull(executor, "executor cannnot be null");
+ public void addThermalStatusListener(@NonNull OnThermalStatusChangedListener listener) {
+ Preconditions.checkNotNull(listener, "listener cannot be null");
synchronized (this) {
if (mThermalService == null) {
mThermalService = IThermalService.Stub.asInterface(
ServiceManager.getService(Context.THERMAL_SERVICE));
}
- try {
- if (mCallbackMap.containsKey(callback)) {
- throw new IllegalArgumentException("ThermalStatusCallback already registered");
- }
- IThermalStatusListener listener = new IThermalStatusListener.Stub() {
- @Override
- public void onStatusChange(int status) {
+ this.addThermalStatusListener(mContext.getMainExecutor(), listener);
+ }
+ }
+
+ /**
+ * This function adds a listener for thermal status change.
+ *
+ * @param executor {@link Executor} to handle listener callback.
+ * @param listener listener to be added.
+ */
+ public void addThermalStatusListener(@NonNull @CallbackExecutor Executor executor,
+ @NonNull OnThermalStatusChangedListener listener) {
+ Preconditions.checkNotNull(listener, "listener cannot be null");
+ Preconditions.checkNotNull(executor, "executor cannot be null");
+ synchronized (this) {
+ if (mThermalService == null) {
+ mThermalService = IThermalService.Stub.asInterface(
+ ServiceManager.getService(Context.THERMAL_SERVICE));
+ }
+ Preconditions.checkArgument(!mListenerMap.containsKey(listener),
+ "Listener already registered: " + listener);
+ IThermalStatusListener internalListener = new IThermalStatusListener.Stub() {
+ @Override
+ public void onStatusChange(int status) {
+ final long token = Binder.clearCallingIdentity();
+ try {
executor.execute(() -> {
- callback.onStatusChange(status);
+ listener.onThermalStatusChanged(status);
});
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
- };
- if (mThermalService.registerThermalStatusListener(listener)) {
- mCallbackMap.put(callback, listener);
+ }
+ };
+ try {
+ if (mThermalService.registerThermalStatusListener(internalListener)) {
+ mListenerMap.put(listener, internalListener);
} else {
- throw new RuntimeException("ThermalStatusCallback failed to register");
+ throw new RuntimeException("Listener failed to set");
}
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1822,28 +1845,24 @@ public final class PowerManager {
}
/**
- * This function unregisters a callback for thermal status change.
+ * This function removes a listener for thermal status change
*
- * @param callback to be unregistered.
- *
- * see {@link #registerThermalStatusCallback}
+ * @param listener listener to be removed
*/
- public void unregisterThermalStatusCallback(@NonNull ThermalStatusCallback callback) {
- Preconditions.checkNotNull(callback, "callback cannnot be null");
+ public void removeThermalStatusListener(@NonNull OnThermalStatusChangedListener listener) {
+ Preconditions.checkNotNull(listener, "listener cannot be null");
synchronized (this) {
if (mThermalService == null) {
mThermalService = IThermalService.Stub.asInterface(
ServiceManager.getService(Context.THERMAL_SERVICE));
}
+ IThermalStatusListener internalListener = mListenerMap.get(listener);
+ Preconditions.checkArgument(internalListener != null, "Listener was not added");
try {
- IThermalStatusListener listener = mCallbackMap.get(callback);
- if (listener == null) {
- throw new IllegalArgumentException("ThermalStatusCallback not registered");
- }
- if (mThermalService.unregisterThermalStatusListener(listener)) {
- mCallbackMap.remove(callback);
+ if (mThermalService.unregisterThermalStatusListener(internalListener)) {
+ mListenerMap.remove(listener);
} else {
- throw new RuntimeException("ThermalStatusCallback failed to unregister");
+ throw new RuntimeException("Listener failed to remove");
}
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 3a2564ae8d93..ecbd673a0981 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -5758,7 +5758,11 @@ public final class Settings {
"autofill_user_data_min_value_length";
/**
- * Defines whether Content Capture is enabled for the user.
+ * Defines whether Content Capture is enabled for the user.
+ *
+ * <p>Type: {@code int} ({@code 0} for disabled, {@code 1} for enabled).
+ * <p>Default: enabled
+ *
* @hide
*/
@TestApi
@@ -8559,6 +8563,19 @@ public final class Settings {
public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS =
"location_access_check_delay_millis";
+ /**
+ * What should happen to the location permissions when upgraded to Android Q.
+ *
+ * <ul>
+ * <li>0/unset == revoke permissions</li>
+ * <li>anything else == Don't do anything</li>
+ * </ul>
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String LOCATION_PERMISSIONS_UPGRADE_TO_Q_MODE =
+ "location_permissions_upgrade_to_q_mode";
/**
* Comma separated list of enabled overlay packages for all android.theme.customization.*
diff --git a/core/java/android/service/contentcapture/ContentCaptureService.java b/core/java/android/service/contentcapture/ContentCaptureService.java
index ce3210f89f00..192abd5912ab 100644
--- a/core/java/android/service/contentcapture/ContentCaptureService.java
+++ b/core/java/android/service/contentcapture/ContentCaptureService.java
@@ -37,7 +37,6 @@ import android.os.Looper;
import android.os.RemoteException;
import android.service.autofill.AutofillService;
import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.Log;
import android.util.Slog;
import android.view.contentcapture.ContentCaptureContext;
@@ -175,19 +174,6 @@ public abstract class ContentCaptureService extends Service {
}
/**
- * @deprecated use {@link #setContentCaptureWhitelist(Set, Set)} instead
- */
- @Deprecated
- public final void setContentCaptureWhitelist(@Nullable List<String> packages,
- @Nullable List<ComponentName> activities) {
- setContentCaptureWhitelist(toSet(packages), toSet(activities));
- }
-
- private <T> ArraySet<T> toSet(@Nullable List<T> set) {
- return set == null ? null : new ArraySet<T>(set);
- }
-
- /**
* Explicitly limits content capture to the given packages and activities.
*
* <p>To reset the whitelist, call it passing {@code null} to both arguments.
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 287365f70344..fdbbe31b5557 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -5803,6 +5803,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
setImportantForAutofill(a.getInt(attr, IMPORTANT_FOR_AUTOFILL_AUTO));
}
break;
+ case R.styleable.View_importantForContentCapture:
+ if (a.peekValue(attr) != null) {
+ setImportantForContentCapture(a.getInt(attr,
+ IMPORTANT_FOR_CONTENT_CAPTURE_AUTO));
+ }
case R.styleable.View_defaultFocusHighlightEnabled:
if (a.peekValue(attr) != null) {
setDefaultFocusHighlightEnabled(a.getBoolean(attr, true));
@@ -10296,7 +10301,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #setImportantForAccessibility(int)
*/
@RemotableViewMethod
- public void setAccessibilityTraversalBefore(int beforeId) {
+ public void setAccessibilityTraversalBefore(@IdRes int beforeId) {
if (mAccessibilityTraversalBeforeId == beforeId) {
return;
}
@@ -10313,6 +10318,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see #setAccessibilityTraversalBefore(int)
*/
+ @IdRes
@InspectableProperty
public int getAccessibilityTraversalBefore() {
return mAccessibilityTraversalBeforeId;
@@ -10341,7 +10347,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #setImportantForAccessibility(int)
*/
@RemotableViewMethod
- public void setAccessibilityTraversalAfter(int afterId) {
+ public void setAccessibilityTraversalAfter(@IdRes int afterId) {
if (mAccessibilityTraversalAfterId == afterId) {
return;
}
@@ -10358,6 +10364,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see #setAccessibilityTraversalAfter(int)
*/
+ @IdRes
@InspectableProperty
public int getAccessibilityTraversalAfter() {
return mAccessibilityTraversalAfterId;
@@ -10369,6 +10376,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @return The labeled view id.
*/
+ @IdRes
@ViewDebug.ExportedProperty(category = "accessibility")
@InspectableProperty
public int getLabelFor() {
@@ -10590,6 +10598,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextFocusLeft
*/
+ @IdRes
@InspectableProperty(name = "nextFocusLeft")
public int getNextFocusLeftId() {
return mNextFocusLeftId;
@@ -10602,7 +10611,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextFocusLeft
*/
- public void setNextFocusLeftId(int nextFocusLeftId) {
+ public void setNextFocusLeftId(@IdRes int nextFocusLeftId) {
mNextFocusLeftId = nextFocusLeftId;
}
@@ -10612,6 +10621,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextFocusRight
*/
+ @IdRes
@InspectableProperty(name = "nextFocusRight")
public int getNextFocusRightId() {
return mNextFocusRightId;
@@ -10624,7 +10634,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextFocusRight
*/
- public void setNextFocusRightId(int nextFocusRightId) {
+ public void setNextFocusRightId(@IdRes int nextFocusRightId) {
mNextFocusRightId = nextFocusRightId;
}
@@ -10634,6 +10644,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextFocusUp
*/
+ @IdRes
@InspectableProperty(name = "nextFocusUp")
public int getNextFocusUpId() {
return mNextFocusUpId;
@@ -10646,7 +10657,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextFocusUp
*/
- public void setNextFocusUpId(int nextFocusUpId) {
+ public void setNextFocusUpId(@IdRes int nextFocusUpId) {
mNextFocusUpId = nextFocusUpId;
}
@@ -10656,6 +10667,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextFocusDown
*/
+ @IdRes
@InspectableProperty(name = "nextFocusDown")
public int getNextFocusDownId() {
return mNextFocusDownId;
@@ -10668,7 +10680,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextFocusDown
*/
- public void setNextFocusDownId(int nextFocusDownId) {
+ public void setNextFocusDownId(@IdRes int nextFocusDownId) {
mNextFocusDownId = nextFocusDownId;
}
@@ -10678,6 +10690,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextFocusForward
*/
+ @IdRes
@InspectableProperty(name = "nextFocusForward")
public int getNextFocusForwardId() {
return mNextFocusForwardId;
@@ -10690,7 +10703,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextFocusForward
*/
- public void setNextFocusForwardId(int nextFocusForwardId) {
+ public void setNextFocusForwardId(@IdRes int nextFocusForwardId) {
mNextFocusForwardId = nextFocusForwardId;
}
@@ -10701,6 +10714,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextClusterForward
*/
+ @IdRes
@InspectableProperty(name = "nextClusterForward")
public int getNextClusterForwardId() {
return mNextClusterForwardId;
@@ -10713,7 +10727,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @attr ref android.R.styleable#View_nextClusterForward
*/
- public void setNextClusterForwardId(int nextClusterForwardId) {
+ public void setNextClusterForwardId(@IdRes int nextClusterForwardId) {
mNextClusterForwardId = nextClusterForwardId;
}
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 70fe230ce226..0c0a555fd16a 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -1827,22 +1827,6 @@ public final class AutofillManager {
}
/**
- * @deprecated use {@link #setAugmentedAutofillWhitelist(Set, Set)} instead.
- * @hide
- */
- @SystemApi
- @TestApi
- @Deprecated
- public void setAugmentedAutofillWhitelist(@Nullable List<String> packages,
- @Nullable List<ComponentName> activities) {
- setAugmentedAutofillWhitelist(toSet(packages), toSet(activities));
- }
-
- private <T> ArraySet<T> toSet(@Nullable List<T> set) {
- return set == null ? null : new ArraySet<T>(set);
- }
-
- /**
* Explicitly limits augmented autofill to the given packages and activities.
*
* <p>To reset the whitelist, call it passing {@code null} to both arguments.
diff --git a/core/java/android/view/textclassifier/ConversationActions.java b/core/java/android/view/textclassifier/ConversationActions.java
index 9f9e66699d84..78ed9bf1071c 100644
--- a/core/java/android/view/textclassifier/ConversationActions.java
+++ b/core/java/android/view/textclassifier/ConversationActions.java
@@ -109,6 +109,7 @@ public final class ConversationActions implements Parcelable {
*
* @see Builder#Builder(Person)
*/
+ @NonNull
public static final Person PERSON_USER_SELF =
new Person.Builder()
.setKey("text-classifier-conversation-actions-user-self")
@@ -123,6 +124,7 @@ public final class ConversationActions implements Parcelable {
*
* @see Builder#Builder(Person)
*/
+ @NonNull
public static final Person PERSON_USER_OTHERS =
new Person.Builder()
.setKey("text-classifier-conversation-actions-user-others")
@@ -465,6 +467,7 @@ public final class ConversationActions implements Parcelable {
* Sets the hints to help text classifier to generate actions. It could be used to help
* text classifier to infer what types of actions the caller may be interested in.
*/
+ @NonNull
public Builder setHints(@Nullable @Hint List<String> hints) {
mHints = hints;
return this;
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 23ce90e42b0c..a4e550285c97 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -353,6 +353,7 @@ public interface TextClassifier {
* Suggests and returns a list of actions according to the given conversation.
*/
@WorkerThread
+ @NonNull
default ConversationActions suggestConversationActions(
@NonNull ConversationActions.Request request) {
Preconditions.checkNotNull(request);
@@ -609,7 +610,8 @@ public interface TextClassifier {
* These hints will only be used if {@link #includeTypesFromTextClassifier} is
* set to be true.
*/
- public Builder setHints(Collection<String> hints) {
+ @NonNull
+ public Builder setHints(@Nullable Collection<String> hints) {
mHints = hints;
return this;
}
diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java
index d8216efc1ef2..cde27a08fc79 100644
--- a/core/java/android/view/textclassifier/TextLinks.java
+++ b/core/java/android/view/textclassifier/TextLinks.java
@@ -692,6 +692,7 @@ public final class TextLinks implements Parcelable {
*
* @return this builder
*/
+ @NonNull
public Builder setExtras(@Nullable Bundle extras) {
mExtras = extras;
return this;
diff --git a/core/java/android/view/textclassifier/TextSelection.java b/core/java/android/view/textclassifier/TextSelection.java
index 52c532bb91f0..52989397e473 100644
--- a/core/java/android/view/textclassifier/TextSelection.java
+++ b/core/java/android/view/textclassifier/TextSelection.java
@@ -184,6 +184,7 @@ public final class TextSelection implements Parcelable {
*
* @return this builder
*/
+ @NonNull
public Builder setExtras(@Nullable Bundle extras) {
mExtras = extras;
return this;
@@ -368,6 +369,7 @@ public final class TextSelection implements Parcelable {
*
* @return this builder
*/
+ @NonNull
public Builder setExtras(@Nullable Bundle extras) {
mExtras = extras;
return this;
diff --git a/core/jni/android_view_CompositionSamplingListener.cpp b/core/jni/android_view_CompositionSamplingListener.cpp
index 283ba0d057c5..7141e6e14176 100644
--- a/core/jni/android_view_CompositionSamplingListener.cpp
+++ b/core/jni/android_view_CompositionSamplingListener.cpp
@@ -28,6 +28,7 @@
#include <gui/IRegionSamplingListener.h>
#include <gui/ISurfaceComposer.h>
+#include <gui/SurfaceComposerClient.h>
#include <ui/Rect.h>
namespace android {
@@ -83,28 +84,22 @@ void nativeRegister(JNIEnv* env, jclass clazz, jlong ptr, jobject stopLayerToken
sp<CompositionSamplingListener> listener = reinterpret_cast<CompositionSamplingListener*>(ptr);
sp<IBinder> stopLayerHandle = ibinderForJavaObject(env, stopLayerTokenObj);
- // TODO: Use SurfaceComposerClient once it has addRegionSamplingListener.
- sp<ISurfaceComposer> composer;
- if (getService(String16("SurfaceFlinger"), &composer) != NO_ERROR) {
- jniThrowRuntimeException(env, "Couldn't retrieve SurfaceFlinger");
- return;
+ if (SurfaceComposerClient::addRegionSamplingListener(
+ Rect(left, top, right, bottom), stopLayerHandle, listener) != OK) {
+ constexpr auto error_msg = "Couldn't addRegionSamplingListener";
+ ALOGE(error_msg);
+ jniThrowRuntimeException(env, error_msg);
}
-
- composer->addRegionSamplingListener(
- Rect(left, top, right, bottom), stopLayerHandle, listener);
}
void nativeUnregister(JNIEnv* env, jclass clazz, jlong ptr) {
sp<CompositionSamplingListener> listener = reinterpret_cast<CompositionSamplingListener*>(ptr);
- // TODO: Use SurfaceComposerClient once it has addRegionSamplingListener.
- sp<ISurfaceComposer> composer;
- if (getService(String16("SurfaceFlinger"), &composer) != NO_ERROR) {
- jniThrowRuntimeException(env, "Couldn't retrieve SurfaceFlinger");
- return;
+ if (SurfaceComposerClient::removeRegionSamplingListener(listener) != OK) {
+ constexpr auto error_msg = "Couldn't removeRegionSamplingListener";
+ ALOGE(error_msg);
+ jniThrowRuntimeException(env, error_msg);
}
-
- composer->removeRegionSamplingListener(listener);
}
const JNINativeMethod gMethods[] = {
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index 6360a5f91013..08286a1baffb 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -235,6 +235,10 @@ message SecureSettingsProto {
optional SettingProto mode = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
// The App or module that changes the location mode.
optional SettingProto changer = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ // What should happen to the location permissions when upgraded to Android Q.
+ // 0 == revoke permissions. Anything else == do nothing.
+ optional SettingProto permissions_upgrade_to_q_mode = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
}
optional Location location = 31;
diff --git a/core/proto/android/stats/devicepolicy/device_policy_enums.proto b/core/proto/android/stats/devicepolicy/device_policy_enums.proto
index a8e64c6d8324..49221b4c4adf 100644
--- a/core/proto/android/stats/devicepolicy/device_policy_enums.proto
+++ b/core/proto/android/stats/devicepolicy/device_policy_enums.proto
@@ -101,7 +101,7 @@ enum EventId {
PROVISIONING_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE = 77;
PROVISIONING_PERSISTENT_DEVICE_OWNER = 78;
- // existing Tron logs to be migrated to WestWorld
+ // existing Tron logs to be migrated to statsd
PROVISIONING_ENTRY_POINT_NFC = 79;
PROVISIONING_ENTRY_POINT_QR_CODE = 80;
PROVISIONING_ENTRY_POINT_CLOUD_ENROLLMENT = 81;
diff --git a/core/res/res/anim/lock_scanning.xml b/core/res/res/anim/lock_scanning.xml
new file mode 100644
index 000000000000..36d8f88369a4
--- /dev/null
+++ b/core/res/res/anim/lock_scanning.xml
@@ -0,0 +1,371 @@
+<!--
+ 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.
+-->
+<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: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: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"
+ 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_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:scaleX="0.64" android:scaleY="0.64">
+ <group android:name="_R_G_L_0_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"
+ 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>
+ </group>
+ </group>
+ <group android:name="time_group"/>
+ </vector>
+ </aapt:attr>
+ <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">
+ <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="150"
+ 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="117"
+ android:startOffset="150" android:valueFrom="1"
+ android:valueTo="0.6" 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="117"
+ android:startOffset="150" android:valueFrom="1"
+ android:valueTo="0.6" 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="333"
+ android:startOffset="267" android:valueFrom="0.6"
+ 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="333"
+ android:startOffset="267" android:valueFrom="0.6"
+ 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_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_D_0_P_0">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator android:propertyName="pathData" android:duration="83"
+ android:startOffset="0"
+ android:valueFrom="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 "
+ android:valueTo="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 "
+ android:valueType="pathType">
+ <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="pathData" android:duration="150"
+ android:startOffset="83"
+ android:valueFrom="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 "
+ android:valueTo="M-28.02 -43.42 C-28.02,-43.42 -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.76,-43.67 27.76,-43.67 "
+ android:valueType="pathType">
+ <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="pathData" android:duration="117"
+ android:startOffset="233"
+ android:valueFrom="M-28.02 -43.42 C-28.02,-43.42 -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.76,-43.67 27.76,-43.67 "
+ android:valueTo="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 "
+ android:valueType="pathType">
+ <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_T_1">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator android:propertyName="translateY" android:duration="83"
+ android:startOffset="0" android:valueFrom="1.121"
+ android:valueTo="1.121" 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="translateY" android:duration="150"
+ android:startOffset="83" android:valueFrom="1.121"
+ android:valueTo="3.749" 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="translateY" android:duration="117"
+ android:startOffset="233" android:valueFrom="3.749"
+ android:valueTo="1.121" 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_4_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="time_group">
+ <aapt:attr name="android:animation">
+ <set android:ordering="together">
+ <objectAnimator android:propertyName="translateX" android:duration="1000"
+ 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_to_error.xml b/core/res/res/anim/lock_to_error.xml
index 29b496430555..4aad742be915 100755
--- a/core/res/res/anim/lock_to_error.xml
+++ b/core/res/res/anim/lock_to_error.xml
@@ -14,545 +14,174 @@
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_3_G"
- android:pivotY="-32"
- android:scaleX="0.12762"
- android:scaleY="0.12762"
- android:translateX="12"
- android:translateY="39.871">
- <path
- android:name="_R_G_L_3_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"
- android:trimPathEnd="1"
- android:trimPathOffset="0" />
- <path
- android:name="_R_G_L_3_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"
- android:trimPathEnd="1"
- android:trimPathOffset="0" />
- </group>
- <group
- android:name="_R_G_L_2_G_T_1"
- android:rotation="45"
- android:scaleX="1"
- android:scaleY="1"
- android:translateX="12"
- android:translateY="15">
- <group
- android:name="_R_G_L_2_G"
- android:translateX="-2.25"
- android:translateY="-2.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=" 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_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">
+ <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_T_1"
- android:scaleX="0.125"
- android:scaleY="0.125"
- android:translateX="12.023"
- android:translateY="1.281">
- <group
- android:name="_R_G_L_1_G"
- android:translateX="0.317"
- android:translateY="45.25">
- <path
- android:name="_R_G_L_1_G_D_0_P_0"
- android:fillAlpha="0"
- android:fillColor="#EA4335"
- android:fillType="nonZero"
- android:pathData=" M4.21 -42.01 C4.21,-42.01 4.21,-32 4.21,-32 C4.21,-32 -5.25,-32 -5.25,-32 C-5.25,-32 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c " />
+ <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>
</group>
- <group
- android:name="_R_G_L_0_G"
- android:pivotY="21"
- android:scaleX="0.14286"
- android:scaleY="0.14286"
- android:translateX="12"
- android:translateY="-6">
- <path
- android:name="_R_G_L_0_G_D_0_P_0"
- android:fillAlpha="0"
- android:fillColor="#ffffff"
- android:fillType="nonZero"
- android:pathData=" M49.24 -12.32 C49.24,-12.32 49.24,52.91 49.24,52.91 C49.24,58.95 44.34,63.85 38.3,63.85 C38.3,63.85 -37.8,63.85 -37.8,63.85 C-43.84,63.85 -48.74,58.95 -48.74,52.91 C-48.74,52.91 -48.74,-12.32 -48.74,-12.32 C-48.74,-18.37 -43.84,-23.27 -37.8,-23.27 C-37.8,-23.27 38.3,-23.27 38.3,-23.27 C44.34,-23.27 49.24,-18.37 49.24,-12.32c " />
- <path
- android:name="_R_G_L_0_G_D_1_P_0"
- android:pathData=" M49.24 -12.32 C49.24,-12.32 49.24,52.91 49.24,52.91 C49.24,58.95 44.34,63.85 38.3,63.85 C38.3,63.85 -37.8,63.85 -37.8,63.85 C-43.84,63.85 -48.74,58.95 -48.74,52.91 C-48.74,52.91 -48.74,-12.32 -48.74,-12.32 C-48.74,-18.37 -43.84,-23.27 -37.8,-23.27 C-37.8,-23.27 38.3,-23.27 38.3,-23.27 C44.34,-23.27 49.24,-18.37 49.24,-12.32c "
- android:strokeWidth="14"
- android:strokeAlpha="1"
- android:strokeColor="?attr/textColor"
- android:strokeLineCap="round"
- android:strokeLineJoin="round" />
+ <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>
</group>
- <group android:name="time_group" />
+ <group android:name="time_group"/>
</vector>
</aapt:attr>
- <target android:name="_R_G_L_3_G_D_0_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="250"
- android:propertyName="trimPathStart"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="0.5"
- 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" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_3_G_D_0_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="250"
- android:propertyName="trimPathEnd"
- android:startOffset="0"
- android:valueFrom="1"
- android:valueTo="0.5"
- 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" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_3_G_D_1_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="117"
- android:propertyName="strokeColor"
- android:startOffset="0"
- android:valueFrom="#fff"
- android:valueTo="#fff"
- android:valueType="colorType">
- <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" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="17"
- android:propertyName="strokeColor"
- android:startOffset="117"
- android:valueFrom="#fff"
- android:valueTo="#EA4335"
- android:valueType="colorType">
- <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" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_3_G_D_1_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="133"
- android:propertyName="strokeWidth"
- android:startOffset="0"
- android:valueFrom="16"
- android:valueTo="8"
- 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" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_3_G_D_1_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="250"
- android:propertyName="trimPathStart"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="0.5"
- 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" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_3_G_D_1_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="250"
- android:propertyName="trimPathEnd"
- android:startOffset="0"
- android:valueFrom="1"
- android:valueTo="0.5"
- 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" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_3_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleY"
- android:startOffset="183"
- android:valueFrom="0.12762"
- android:valueTo="0"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_2_G_D_0_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="117"
- android:propertyName="fillColor"
- android:startOffset="0"
- android:valueFrom="#fff"
- android:valueTo="#fff"
- android:valueType="colorType">
- <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" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="17"
- android:propertyName="fillColor"
- android:startOffset="117"
- android:valueFrom="#fff"
- android:valueTo="#EA4335"
- android:valueType="colorType">
- <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" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_2_G_D_0_P_0">
+ <target android:name="_R_G_L_2_G">
<aapt:attr name="android:animation">
<set android:ordering="together">
- <objectAnimator
- android:duration="133"
- android:propertyName="pathData"
- android:startOffset="0"
- android:valueFrom="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 "
- android:valueTo="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 "
- android:valueType="pathType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="133"
- android:propertyName="pathData"
- android:startOffset="133"
- android:valueFrom="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 "
- android:valueTo="M2.25 0.25 C2.25,0.25 4.25,2.25 4.25,2.25 C4.25,2.25 2.25,4.25 2.25,4.25 C2.25,4.25 0.25,2.25 0.25,2.25 C0.25,2.25 2.25,0.25 2.25,0.25c "
- 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>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_2_G_T_1">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="17"
- android:pathData="M 12,15C 12,15.171875 12,14.828125 12,15"
- android:propertyName="translateXY"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:startOffset="0">
- <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:duration="333"
- android:pathData="M 12,15C 12,15.171875 12,15.859124999999999 12,16.031"
- android:propertyName="translateXY"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:startOffset="17">
- <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>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_2_G_T_1">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="17"
- android:propertyName="scaleX"
- 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.4,0 0.2,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="17"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="1"
- android:valueTo="1"
- android:valueType="floatType">
+ <objectAnimator android:propertyName="rotation" android:duration="133"
+ android:startOffset="0" android:valueFrom="0" android:valueTo="0"
+ 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.44,0 0.601,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
- <objectAnimator
- android:duration="333"
- android:propertyName="scaleX"
- android:startOffset="17"
- android:valueFrom="1"
- android:valueTo="0.4325"
- android:valueType="floatType">
+ <objectAnimator android:propertyName="rotation" android:duration="120"
+ android:startOffset="133" android:valueFrom="0"
+ android:valueTo="-10" 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.44,0 0.601,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
- <objectAnimator
- android:duration="333"
- android:propertyName="scaleY"
- android:startOffset="17"
- android:valueFrom="1"
- android:valueTo="0.4325"
- android:valueType="floatType">
+ <objectAnimator android:propertyName="rotation" android:duration="97"
+ android:startOffset="253" android:valueFrom="-10"
+ android:valueTo="10" 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.531,0 0.389,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_1_G_D_0_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="150"
- android:propertyName="fillAlpha"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="0"
- android:valueType="floatType">
+ <objectAnimator android:propertyName="rotation" android:duration="100"
+ android:startOffset="350" android:valueFrom="10"
+ android:valueTo="-5" 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.499,0 0.489,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
- <objectAnimator
- android:duration="17"
- android:propertyName="fillAlpha"
- android:startOffset="150"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType">
+ <objectAnimator android:propertyName="rotation" android:duration="167"
+ android:startOffset="450" android:valueFrom="-5" 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.293,0 0.689,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
- <target android:name="_R_G_L_1_G_D_0_P_0">
+ <target android:name="_R_G_L_1_G_N_4_T_0">
<aapt:attr name="android:animation">
<set android:ordering="together">
- <objectAnimator
- android:duration="167"
- android:propertyName="pathData"
- android:startOffset="0"
- android:valueFrom="M4.21 -42.01 C4.21,-42.01 4.21,-32 4.21,-32 C4.21,-32 -5.25,-32 -5.25,-32 C-5.25,-32 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
- android:valueTo="M4.21 -42.01 C4.21,-42.01 4.21,-32 4.21,-32 C4.21,-32 -5.25,-32 -5.25,-32 C-5.25,-32 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
- android:valueType="pathType">
+ <objectAnimator android:propertyName="rotation" android:duration="133"
+ android:startOffset="0" android:valueFrom="0" android:valueTo="0"
+ 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.44,0 0.601,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
- <objectAnimator
- android:duration="183"
- android:propertyName="pathData"
- android:startOffset="167"
- android:valueFrom="M4.21 -42.01 C4.21,-42.01 4.21,-32 4.21,-32 C4.21,-32 -5.25,-32 -5.25,-32 C-5.25,-32 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
- android:valueTo="M4.21 -42.01 C4.21,-42.01 4.16,33 4.16,33 C4.16,33 -5.3,33 -5.3,33 C-5.3,33 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
- android:valueType="pathType">
+ <objectAnimator android:propertyName="rotation" android:duration="120"
+ android:startOffset="133" android:valueFrom="0"
+ android:valueTo="-10" 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.44,0 0.601,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
- <objectAnimator
- android:duration="50"
- android:propertyName="pathData"
- android:startOffset="350"
- android:valueFrom="M4.21 -42.01 C4.21,-42.01 4.16,33 4.16,33 C4.16,33 -5.3,33 -5.3,33 C-5.3,33 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
- android:valueTo="M4.21 -42.01 C4.21,-42.01 4.19,30.81 4.19,30.81 C4.19,30.81 -5.27,30.81 -5.27,30.81 C-5.27,30.81 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
- android:valueType="pathType">
+ <objectAnimator android:propertyName="rotation" android:duration="97"
+ android:startOffset="253" android:valueFrom="-10"
+ android:valueTo="10" 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.531,0 0.389,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_1_G_T_1">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="167"
- android:pathData="M 12.023,1.281C 12.023,1.656 12.023,0.9059999999999999 12.023,1.281"
- android:propertyName="translateXY"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:startOffset="0">
+ <objectAnimator android:propertyName="rotation" android:duration="100"
+ android:startOffset="350" android:valueFrom="10"
+ android:valueTo="-5" 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.499,0 0.489,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
- <objectAnimator
- android:duration="183"
- android:pathData="M 12.023,1.281C 12.023,1.656 12.023,3.156 12.023,3.531"
- android:propertyName="translateXY"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:startOffset="167">
+ <objectAnimator android:propertyName="rotation" android:duration="167"
+ android:startOffset="450" android:valueFrom="-5" android:valueTo="0"
+ 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.293,0 0.689,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
- <target android:name="_R_G_L_1_G_T_1">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleX"
- android:startOffset="167"
- android:valueFrom="0"
- android:valueTo="0.125"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_D_0_P_0">
+ <target android:name="_R_G_L_0_G_N_4_T_0">
<aapt:attr name="android:animation">
<set android:ordering="together">
- <objectAnimator
- android:duration="267"
- android:propertyName="pathData"
- android:startOffset="0"
- android:valueFrom="M49.24 -12.32 C49.24,-12.32 49.24,52.91 49.24,52.91 C49.24,58.95 44.34,63.85 38.3,63.85 C38.3,63.85 -37.8,63.85 -37.8,63.85 C-43.84,63.85 -48.74,58.95 -48.74,52.91 C-48.74,52.91 -48.74,-12.32 -48.74,-12.32 C-48.74,-18.37 -43.84,-23.27 -37.8,-23.27 C-37.8,-23.27 38.3,-23.27 38.3,-23.27 C44.34,-23.27 49.24,-18.37 49.24,-12.32c "
- android:valueTo="M75.1 -1.1 C75.1,19.57 66.72,38.28 53.18,51.83 C39.63,65.37 20.92,73.75 0.25,73.75 C-20.42,73.75 -39.13,65.37 -52.68,51.83 C-66.22,38.28 -74.6,19.57 -74.6,-1.1 C-74.6,-21.77 -66.22,-40.48 -52.68,-54.02 C-39.13,-67.57 -20.42,-75.95 0.25,-75.95 C20.92,-75.95 39.63,-67.57 53.18,-54.02 C66.72,-40.48 75.1,-21.77 75.1,-1.1c "
- android:valueType="pathType">
+ <objectAnimator android:propertyName="rotation" android:duration="133"
+ android:startOffset="0" android:valueFrom="0" android:valueTo="0"
+ 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.44,0 0.601,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:duration="117"
- android:propertyName="strokeColor"
- android:startOffset="0"
- android:valueFrom="#fff"
- android:valueTo="#fff"
- android:valueType="colorType">
+ <objectAnimator android:propertyName="rotation" android:duration="120"
+ android:startOffset="133" android:valueFrom="0"
+ android:valueTo="-10" 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.44,0 0.601,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
- <objectAnimator
- android:duration="17"
- android:propertyName="strokeColor"
- android:startOffset="117"
- android:valueFrom="#fff"
- android:valueTo="#EA4335"
- android:valueType="colorType">
+ <objectAnimator android:propertyName="rotation" android:duration="97"
+ android:startOffset="253" android:valueFrom="-10"
+ android:valueTo="10" 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.531,0 0.389,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:duration="267"
- android:propertyName="strokeWidth"
- android:startOffset="0"
- android:valueFrom="14"
- android:valueTo="12"
- android:valueType="floatType">
+ <objectAnimator android:propertyName="rotation" android:duration="100"
+ android:startOffset="350" android:valueFrom="10"
+ android:valueTo="-5" 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.499,0 0.489,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:duration="267"
- android:propertyName="pathData"
- android:startOffset="0"
- android:valueFrom="M49.24 -12.32 C49.24,-12.32 49.24,52.91 49.24,52.91 C49.24,58.95 44.34,63.85 38.3,63.85 C38.3,63.85 -37.8,63.85 -37.8,63.85 C-43.84,63.85 -48.74,58.95 -48.74,52.91 C-48.74,52.91 -48.74,-12.32 -48.74,-12.32 C-48.74,-18.37 -43.84,-23.27 -37.8,-23.27 C-37.8,-23.27 38.3,-23.27 38.3,-23.27 C44.34,-23.27 49.24,-18.37 49.24,-12.32c "
- android:valueTo="M75.1 -1.1 C75.1,19.57 66.72,38.28 53.18,51.83 C39.63,65.37 20.92,73.75 0.25,73.75 C-20.42,73.75 -39.13,65.37 -52.68,51.83 C-66.22,38.28 -74.6,19.57 -74.6,-1.1 C-74.6,-21.77 -66.22,-40.48 -52.68,-54.02 C-39.13,-67.57 -20.42,-75.95 0.25,-75.95 C20.92,-75.95 39.63,-67.57 53.18,-54.02 C66.72,-40.48 75.1,-21.77 75.1,-1.1c "
- android:valueType="pathType">
+ <objectAnimator android:propertyName="rotation" android:duration="167"
+ android:startOffset="450" android:valueFrom="-5" android:valueTo="0"
+ 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.293,0 0.689,1 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
</set>
@@ -561,13 +190,9 @@
<target android:name="time_group">
<aapt:attr name="android:animation">
<set android:ordering="together">
- <objectAnimator
- android:duration="1017"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
+ <objectAnimator android:propertyName="translateX" android:duration="1000"
+ android:startOffset="0" android:valueFrom="0" android:valueTo="1"
+ android:valueType="floatType"/>
</set>
</aapt:attr>
</target>
diff --git a/core/res/res/drawable/ic_auth_error.xml b/core/res/res/drawable/ic_auth_error.xml
deleted file mode 100644
index ea5f5727b0fe..000000000000
--- a/core/res/res/drawable/ic_auth_error.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
- 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 android:height="24dp" android:viewportHeight="60"
- android:viewportWidth="60" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillColor="?attr/colorError" android:pathData="M28.8,37.5l2.4,0l0,2.5l-2.4,0z"/>
- <path android:fillColor="?attr/colorError" android:pathData="M28.8,17.5l2.4,0l0,15l-2.4,0z"/>
- <path android:fillColor="#00000000"
- android:pathData="M30,6.2c-13.1,0 -23.7,10.6 -23.7,23.8S16.9,53.8 30,53.8c13.1,0 23.8,-10.6 23.8,-23.8S43.1,6.2 30,6.2z"
- android:strokeColor="?android:attr/colorError" android:strokeWidth="2.5"/>
-</vector>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 5125c13ca14b..78c0b801dc62 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Foon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"foonoproepe te maak en te bestuur"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Laat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om foonoproepe te maak en te bestuur?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Liggaamsensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"toegang te verkry tot sensordata oor jou lewenstekens"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot sensordata oor jou lewenstekens?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musiek"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"toegang tot jou musiek"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot jou musiek?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Foto\'s en video\'s"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"toegang tot jou foto\'s en video\'s"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Laat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om by jou foto\'s en video\'s in te gaan, insluitend gemerkte liggings?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Venster-inhoud ophaal"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die inhoud ondersoek van \'n venster waarmee jy interaksie het."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Verken deur raak aanskakel"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> lêers</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> lêer</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 49be2cfe9d92..cabca7f495a5 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ስልክ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"የስልክ ጥሪዎች ያድርጉ እና ያስተዳድሩ"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; የስልክ ጥሪዎችን እንዲያደርግ እና እንዲያቀናብር ይፈቀድለት?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"የሰውነት ዳሳሾች"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ስለአስፈላጊ ምልክቶችዎ ያሉ የዳሳሽ ውሂብ ይድረሱ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; የሰውነትዎ መሠረታዊ ምልክቶች የዳሳሽ ውሂብ እንዲደርስ ይፈቀድለት?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"ሙዚቃ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ሙዚቃዎን መድረስ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ቀን ሙዚቃዎን እንዲደርስ ይፈቀድለት?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ፎቶዎች እና ቪዲዮዎች"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"የእርስዎን ፎቶዎች እና ቪዲዮዎች መድረስ"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"የእርስዎን ፎቶዎች እና ቪዲዮዎች መለያ ስያሜ የተደረገባቸውን መገኛ አካባቢዎች ጨምሮ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; እንዲደርስ ይፈቀድለት?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"የመስኮት ይዘት ሰርስረው ያውጡ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"መስተጋበር የሚፈጥሩት የመስኮት ይዘት ይመርምሩ።"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"በመንካት ያስሱን ያብሩ"</string>
@@ -2023,4 +2020,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ፋይሎች</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ፋይሎች</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index c6653f6ae583..52f6698194e9 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -320,18 +320,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"الهاتف"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"إجراء مكالمات هاتفية وإدارتها"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بإجراء المكالمات الهاتفية وإدارتها؟"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"أجهزة استشعار الجسم"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"الوصول إلى بيانات المستشعر حول علاماتك الحيوية"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالدخول إلى بيانات المستشعر حول علاماتك الحيوية؟"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"الموسيقى"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"الوصول إلى الموسيقى"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالوصول إلى الموسيقى؟"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"الصور والفيديوهات"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"الوصول إلى صورك وفيديوهاتك"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"‏هل تريد السماح للتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالوصول إلى صورك وفيديوهاتك، بما في ذلك المواقع الجغرافية ذات العلامات؟"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"استرداد محتوى النافذة"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"فحص محتوى نافذة يتم التفاعل معها"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"تشغيل الاستكشاف باللمس"</string>
@@ -2167,4 +2164,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> و<xliff:g id="COUNT_3">%d</xliff:g> ملف</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> وملف (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 268921578a16..e7dad2fa407d 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ফ’ন"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ফ\'ন কল কৰিব আৰু পৰিচলনা কৰিব পাৰে"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক ফ\'ন কল কৰিবলৈ আৰু পৰিচালনা কৰিবলৈ অনুমতি দিবনে?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"শৰীৰৰ ছেন্সৰ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"আপোনাৰ দেহৰ গুৰুত্বপূৰ্ণ অংগসমূহৰ অৱস্থাৰ বিষয়ে ছেন্সৰৰ ডেটা লাভ কৰিব পাৰে"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক আপোনাৰ দেহৰ গুৰুত্বপূৰ্ণ অংগসমূহৰ অৱস্থাৰ বিষয়ে ছেন্সৰৰ ডেটা লাভ কৰিবলৈ অনুমতি দিবনে?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"সংগীত"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"আপোনাৰ সংগীত এক্সেছ কৰিবলৈ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক আপোনাৰ সংগীত এক্সেছ কৰিবলৈ দিবনে?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ফট’ আৰু ভিডিঅ’"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"আপোনাৰ ফট’ আৰু ভিডিঅ’সমূহ এক্সেছ কৰিবলৈ"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"টেগ কৰা অৱস্থানসহ আপোনাৰ ফট’ আৰু ভিডিঅ’ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক এক্সেছ কৰিবলৈ দিবনে?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ৱিণ্ড’ সমল বিচাৰি উলিওৱাৰ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"আপুনি চাই থকা ৱিণ্ড’খনৰ সমল পৰীক্ষা কৰাৰ।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পৰ্শৰ দ্বাৰা অন্বেষণ কৰাৰ সুবিধা অন কৰাৰ"</string>
@@ -2024,4 +2021,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g>টা ফাইল</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g>টা ফাইল</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 28ea3771ab9e..7186da9559d4 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefon zəngləri edin və onları idarə edin"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə telefon zəngləri etmək və onları idarə etmək icazəsi verilsin?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Bədən sensorları"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"Həyati əlamətlər haqqında sensor dataya daxil olun"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə həyati əlamətlər haqqında sensor dataya daxil olmaq icazəsi verilsin?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musiqi"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"musiqiyə daxil olun"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinin musiqiyə daxil olmağına icazə verilsin?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Foto və videolar"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"foto və videolara daxil olun"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə işarələnmiş məkanlar daxil olmaqla, foto və videolara girişinə icazə verilsin?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pəncərənin məzmununu əldə edin"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Əlaqədə olduğunuz pəncərənin məzmununu nəzərdən keçirin."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Toxunaraq Kəşf et funksiyasını yandırın"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fayl</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fayl</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index e2cdf87830a4..788b5d61aba4 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -311,18 +311,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"upućuje telefonske pozive i upravlja njima"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Želite li da omogućite da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; upućuje pozive i upravlja njima?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Senzori za telo"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupa podacima senzora o vitalnim funkcijama"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Želite li da omogućite da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;pristupa podacima senzora o vitalnim funkcijama?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"pristup muzici"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Želite li da omogućite da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristupa muzici?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Slike i video snimci"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pristup slikama i video snimcima"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Želite li da dozvolite da „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pristupa slikama i video snimcima, uključujući označene lokacije?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"da preuzima sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Proverava sadržaj prozora sa kojim ostvarujete interakciju."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"da uključi Istraživanja dodirom"</string>
@@ -2059,4 +2056,6 @@
<item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteke</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteka</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 9639967b1e7a..83b268a5f383 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -314,18 +314,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Тэлефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"рабіць тэлефонныя выклікі і кіраваць імі"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Дазволіць праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; рабіць тэлефонныя выклікі і кіраваць імі?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Датчыкі цела"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"атрымліваць з датчыка даныя асноўных фізіялагічных паказчыкаў"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Дазволіць праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ да даных з датчыкаў пра вашы асноўныя фізіялагічныя паказчыкі?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музыка"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"доступ да музыкі"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Дазволіць праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ да музыкі?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Фота і відэа"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"доступ да фота і відэа"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Дазволіць &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ да фота і відэа, у тым ліку з пазначаным месцам?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Атрымліваць змесціва вакна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Аналізаваць змесціва актыўнага вакна."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Уключаць Азнаямленне дотыкам"</string>
@@ -2095,4 +2092,6 @@
<item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файлаў</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файла</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index d0557db1b11e..da29c0eacad1 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"да извършва телефонни обаждания и да ги управлява"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да извършва и управлява телефонни обаждания?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Сензори за тяло"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"достъп до сензорните данни за жизнените ви показатели"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до данните от сензорите за жизнените ви показатели?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музика"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"достъп до музиката ви"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до музиката ви?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Снимки и видеоклипове"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"достъп до снимките и видеоклиповете ви"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; достъп до снимките и видеоклиповете ви, включително маркерите за местоположение?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Извличане на съдържанието от прозореца"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Инспектиране на съдържанието на прозорец, с който взаимодействате."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включване на изследването чрез докосване"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файла</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> файл</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index d1fa2d4af184..e0f866d64aab 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ফোন"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ফোন কলগুলি এবং পরিচালনা"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-কে কল করতে এবং কল পরিচালনা করতে দেবেন?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"বডি সেন্সর"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"আপনার অত্যাবশ্যক লক্ষণগুলির সম্পর্কে সেন্সর ডেটা অ্যাক্সেস করে"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-কে সেন্সর থেকে আপনার ভাইটাল সাইনের ডেটা অ্যাক্সেস করতে দেবেন?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"মিউজিক"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"আপনার মিউজিকে অ্যাক্সেস করুন"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-কে আপনার মিউজিকে অ্যাক্সেস দেবেন?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ফটো ও ভিডিও"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"আপনার ফটো ও ভিডিও অ্যাক্সেস করুন"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-কে ট্যাগ করা লোকেশন সহ ফটো এবং ভিডিও অ্যাক্সেস করার অনুমতি দেবেন?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"উইন্ডোর কন্টেন্ট পুনরুদ্ধার করে"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ব্যবহার করছেন এমন একটি উইন্ডোর কন্টেন্ট নিরীক্ষণ করে৷"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পর্শের মাধ্যমে অন্বেষণ করা চালু করুন"</string>
@@ -2025,4 +2022,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> এবং আরও <xliff:g id="COUNT_3">%d</xliff:g>টি ফাইল</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> এবং আরও <xliff:g id="COUNT_3">%d</xliff:g>টি ফাইল</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index d4c663c6284d..a78796fb2a17 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -311,18 +311,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"poziva i upravlja pozivima"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Dozvoliti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uspostavljanje poziva i njihovo upravljanje?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Tjelesni senzori"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupa podacima senzora o vašim vitalnim funkcijama"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Dozvoliti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristup senzornim podacima o vašim vitalnim znacima?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"pristup muzici"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Dozvoliti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;da pristupi vašoj muzici?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotografije i videozapisi"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pristup fotografijama i videozapisima"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Dozvoliti da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristupa fotografijama i videozapisima, uključujući označene lokacije?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Preuzima sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Pregleda sadržaj prozora koji trenutno koristite."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključi opciju Istraživanje dodirom"</string>
@@ -1881,7 +1878,7 @@
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Suzi"</string>
<string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne ometaj"</string>
- <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Prestanak rada"</string>
+ <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Neaktivnost"</string>
<string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"Radni dan uvečer"</string>
<string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"Vikend"</string>
<string name="zen_mode_default_events_name" msgid="8158334939013085363">"Događaj"</string>
@@ -2061,4 +2058,6 @@
<item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fajla</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fajlova</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 90a2c6d01b06..3e784b9c8ece 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telèfon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"fer i gestionar trucades"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vols permetre que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; faci trucades i les gestioni?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Sensors corporals"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accedir a les dades del sensor sobre els signes vitals"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vols permetre que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi a les dades del sensor de constants vitals?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Música"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"accedir a la teva música"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vols permetre que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi a la teva música?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos i vídeos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"accedir a les teves fotos i als teus vídeos"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vols permetre que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi a les fotos i als vídeos, incloses les ubicacions etiquetades?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contingut de la finestra"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contingut d\'una finestra amb què estàs interaccionant."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar Exploració tàctil"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> i <xliff:g id="COUNT_3">%d</xliff:g> fitxers més</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> i <xliff:g id="COUNT_1">%d</xliff:g> fitxer més</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index dbe582ef1886..be2c0de0de14 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -314,18 +314,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"uskutečňování a spravování telefonních hovorů"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Povolit aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uskutečňovat a spravovat telefonní hovory?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Tělesné senzory"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"přístup k datům ze snímačů vašich životních funkcí"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Povolit aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; přístup k údajům ze snímačů vašich životních funkcí?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Hudba"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"přístup k hudbě"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Povolit aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; přístup k hudbě?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotky a videa"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"přístup k fotkám a videím"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Povolit aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; přístup k fotkám a videím včetně označených míst?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Načítat obsah oken"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Může prozkoumávat obsah oken, se kterými pracujete."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Zapnout funkci Prozkoumání dotykem"</string>
@@ -2095,4 +2092,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> souborů</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> soubor</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index f1ecfc9b307f..4a30a4d58289 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -2020,4 +2020,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fil</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> filer</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index afe5f9da43c8..a790b504eaf2 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"Telefonanrufe tätigen und verwalten"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, Anrufe zu tätigen und zu verwalten?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Körpersensoren"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"auf Sensordaten zu deinen Vitaldaten zugreifen"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, auf Sensordaten zu deinen Vitalfunktionen zuzugreifen?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musik"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"auf Musik zugreifen"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; Zugriff auf deine Musik gewähren?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos &amp; Videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"auf meine Fotos und Videos zugreifen"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; Zugriff auf deine Fotos und Videos gewähren, einschließlich gekennzeichneter Standorte?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Fensterinhalte abrufen"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die Inhalte eines Fensters, mit dem du interagierst, werden abgerufen."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Tippen &amp; Entdecken\" aktivieren"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> und <xliff:g id="COUNT_3">%d</xliff:g> Dateien</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> und <xliff:g id="COUNT_1">%d</xliff:g> Datei</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 4bf698403535..f4f7918a1435 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Τηλέφωνο"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"πραγματοποιεί και να διαχειρίζεται τηλ/κές κλήσεις"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; η πραγματοποίηση και η διαχείριση τηλεφωνικών κλήσεων;"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Αισθητήρες σώματος"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"πρόσβαση στα δεδομένα αισθητήρα σχετικά με τις ζωτικές ενδείξεις σας"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; να έχει πρόσβαση στα δεδομένα αισθητήρα σχετικά με τις ζωτικές ενδείξεις σας;"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Μουσική"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"πρόσβαση στη μουσική σας"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; να έχει πρόσβαση στη μουσική σας;"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Φωτογραφίες και βίντεο"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"πρόσβαση στις φωτογραφίες και στα βίντεό σας"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Να επιτρέπεται η πρόσβαση του &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; σε φωτογραφίες και βίντεο, μεταξύ άλλων σε επισημασμένες τοποθεσίες;"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ανάκτηση του περιεχομένου του παραθύρου"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Έλεγχος του περιεχομένου ενός παραθύρου με το οποίο αλληλεπιδράτε."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ενεργοποίηση της \"Εξερεύνησης με άγγιγμα\""</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> αρχεία</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> αρχείο</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 3de69fe965e8..8ed7bd886380 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -2020,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> file</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 47e8cd9ebcf6..722d1326f39e 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -2020,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> file</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 3de69fe965e8..8ed7bd886380 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -2020,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> file</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 3de69fe965e8..8ed7bd886380 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -2020,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> file</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 4ebc1b22def6..a8173dd486d0 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -2020,4 +2020,6 @@
<item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="FILE_NAME_2">%s</xliff:g>‎‏‎‎‏‏‏‎ + ‎‏‎‎‏‏‎<xliff:g id="COUNT_3">%d</xliff:g>‎‏‎‎‏‏‏‎ files‎‏‎‎‏‎</item>
<item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="FILE_NAME_0">%s</xliff:g>‎‏‎‎‏‏‏‎ + ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ file‎‏‎‎‏‎</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index bdfb9236ddc8..387eea309e78 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"hacer y administrar llamadas telefónicas"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; haga y administre las llamadas telefónicas?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Sensores corporales"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder a los datos del sensor acerca de tus signos vitales"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a los datos del sensor de tus signos vitales?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Música"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"acceder a tu música"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tu música?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos y videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"acceder a tus fotos y videos"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tus fotos y videos, incluidas las ubicaciones etiquetadas?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contenido de las ventanas"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de la ventana con la que estés interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar la Exploración táctil"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> y <xliff:g id="COUNT_3">%d</xliff:g> archivos más</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> y <xliff:g id="COUNT_1">%d</xliff:g> archivo más</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 4eadc4c9489f..017f31bf76c0 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -2020,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> y <xliff:g id="COUNT_3">%d</xliff:g> archivos</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> y <xliff:g id="COUNT_1">%d</xliff:g> archivo</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 9779ae88ed47..f87743aa685d 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"helistamine ja telefonikõnede haldamine"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Kas lubada rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; teha ja hallata telefonikõnesid?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Kehaandurid"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"juurdepääs anduri andmetele teie eluliste näitajate kohta"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs anduri andmetele teie eluliste näitajate kohta?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muusika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"Pääseda juurde teie muusikale"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs teie muusikale?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotod ja videod"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"Pääseda juurde teie fotodele ja videotele"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Kas lubada rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; teie fotodele ja videotele, sh märgistatud asukohtadele, juurde pääseda?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Akna sisu toomine"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kasutatava akna sisu kontrollimine."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Puudutusega sirvimise sisselülitamine"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> faili</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fail</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index d1ee66c990e0..adc4dc465dd7 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -282,7 +282,7 @@
<string name="permgroupdesc_location" msgid="1346617465127855033">"atzitu gailuaren kokapena"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari gailuaren kokapena atzitzea baimendu nahi diozu?"</string>
<string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikazioa erabiltzen ari zarenean soilik atzituko du aplikazioak kokapena."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari gailuaren kokapena beti atzitzea baimendu?"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Gailuaren kokapena beti atzitzeko baimena eman nahi diozu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari?"</string>
<string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikazioak beti atzituko du kokapena, baita aplikazioa erabiltzen ari ez bazara ere."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Egutegia"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"atzitu egutegia"</string>
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefonoa"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"egin eta kudeatu telefono-deiak"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari telefono-deiak egitea eta kudeatzea baimendu nahi diozu?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Gorputz-sentsoreak"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"atzitu bizi-konstanteei buruzko sentsorearen datuak"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Bizi-konstanteei buruzko sentsorearen datuak atzitzea baimendu nahi diozu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"musika atzitu"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari musika atzitzea baimendu nahi diozu?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Argazkiak eta bideoak"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"argazkiak eta bideoak atzitu"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari zure argazkiak eta bideoak (etiketatutako kokapenak barne) atzitzeko baimena eman?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Eskuratu leihoko edukia"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Arakatu irekita daukazun leihoko edukia."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktibatu \"Arakatu ukituta\""</string>
@@ -1321,7 +1318,7 @@
<string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Utzi"</string>
<string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Gogoratu aukera"</string>
<string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"Hori geroago alda dezakezu Ezarpenak &gt; Aplikazioak atalean"</string>
- <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Onartu beti"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Eman baimena beti"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"Ez onartu inoiz"</string>
<string name="sim_removed_title" msgid="6227712319223226185">"SIM txartela kendu da"</string>
<string name="sim_removed_message" msgid="2333164559970958645">"Sare mugikorra ez da erabilgarri egongo baliozko SIM txartel bat sartuta berrabiarazten ez duzun arte."</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fitxategi</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fitxategi</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index e8f55bdad155..7835cfe24812 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"تلفن"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"برقراری و مدیریت تماس‌های تلفنی"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"‏به &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; اجازه داده شود تماس‌های تلفنی برقرار کند و آن‌ها را مدیریت کند؟"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"حسگرهای بدن"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"دسترسی به داده‌های حسگر در رابطه با علائم حیاتی شما"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"‏به &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; اجازه داده شود به داده‌های حسگر مربوط به علائم حیاتی شما دسترسی پیدا کند؟"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"موسیقی"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"دسترسی به موسیقی شما"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"‏به &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; اجازه داده شود به موسیقی شما دسترسی پیدا کند؟"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"عکس و ویدیو"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"دسترسی به عکس‌ها و ویدیوهایتان"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"‏به &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; اجازه می‌دهید به عکس‌ها و ویدیوهاتان، ازجمله مکان‌های برچسب‌گذاری‌شده، دسترسی داشته باشد؟"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"محتوای پنجره را بازیابی کند"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"محتوای پنجره‌ای را که درحال تعامل با آن هستید بررسی می‌کند."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"فعال‌سازی کاوش لمسی"</string>
@@ -2023,4 +2020,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> فایل</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> فایل</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index d1687dbe3f11..6efc8befcc28 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -2020,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> tiedostoa</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> tiedosto</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 86db22448676..9e8b92cbe1ff 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faire et gérer des appels téléphoniques"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à faire et à gérer les appels téléphoniques?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Capteurs corporels"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs sur vos signes vitaux"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder aux données des capteurs pour vos signes vitaux?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musique"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"accéder à votre musique"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à votre musique?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Photos et vidéos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"accéder à vos photos et à vos vidéos"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à vos photos et vos videos, y compris les lieux balisés?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string>
@@ -2023,4 +2020,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index cc6d8f439f0e..17230391a5c5 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"effectuer et gérer des appels téléphoniques"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; de passer et gérer des appels téléphoniques ?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Capteurs corporels"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs relatives à vos signes vitaux"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'accéder aux données des capteurs relatives à vos signes vitaux ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musique"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"accéder à votre musique"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à votre musique ?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Photos et vidéos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"accéder à vos photos et vos vidéos"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à vos photos et vidéos, y compris aux tags de lieu ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecte le contenu d\'une fenêtre avec laquelle vous interagissez."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string>
@@ -2023,4 +2020,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 934c86657ffd..78f6eccdda6d 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"facer e xestionar chamadas telefónicas"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; realice e xestione chamadas telefónicas?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Sensores corporais"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder aos datos dos sensores sobre as túas constantes vitais"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda aos datos dos sensores sobre as túas constantes vitais?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Música"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"acceder á música"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda á túa música?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos e vídeos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"acceder ás fotos e aos vídeos"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Queres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda ás túas fotos e vídeos, incluídas as localizacións etiquetadas?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar contido da ventá"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona o contido dunha ventá coa que estás interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar a exploración táctil"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ficheiros</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ficheiro</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index a8715b70aa5c..8131c0dceee6 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ફોન"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ફોન કૉલ કરો અને સંચાલિત કરો"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને ફોન કૉલ કરવાની અને તેને મેનેજ કરવાની મંજૂરી આપીએ?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"બૉડી સેન્સર"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"તમારા મહત્વપૂર્ણ ચિહ્નો વિશે સેન્સર ડેટા ઍક્સેસ કરો"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને તમારી મહત્વપૂર્ણ સહી વિશેના સેન્સર ડેટાને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"સંગીત"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"તમારા સંગીતને ઍક્સેસ કરો"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને તમારા સંગીતમાં ઍક્સેસ કરવાની મંજૂરી આપવી છે?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ફોટા અને વીડિયો"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"તમારા ફોટો &amp; વિડિઓ ઍક્સેસ કરો"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને તમારા ટૅગ કરેલાં સ્થાનો સહિત ફોટા અને વીડિયો ઍક્સેસ કરવાની મંજૂરી આપવી છે?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"વિંડો કન્ટેન્ટ પુનઃપ્રાપ્ત કરો"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"તમે જેની સાથે ક્રિયા-પ્રતિક્રિયા કરી રહ્યાં છો તે વિંડોનું કન્ટેન્ટ તપાસો."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"સ્પર્શ કરીને શોધખોળ કરવું ચાલુ કરો"</string>
@@ -2024,4 +2021,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ફાઇલ</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ફાઇલ</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 4c4c2e210ff5..2fd884e8c1e2 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1613,10 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ओवरले #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", सुरक्षित"</string>
- <!-- no translation found for activity_starter_block_bg_activity_starts_permissive (5692097903712956720) -->
- <skip />
- <!-- no translation found for activity_starter_block_bg_activity_starts_enforcing (8299522481076404353) -->
- <skip />
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"आने वाले Q बिल्ड में <xliff:g id="PACKAGENAME">%1$s</xliff:g> के बैकग्राउंड में गतिविधि शुरू करने पर रोक लगा दी जाएगी. go/q-bg-block देखें."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> के बैकग्राउंड में गतिविधि शुरू करने पर रोक लगा दी गई है. go/q-bg-block देखें."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"आकार भूल गए"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत पैटर्न डाला गया है"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवर्ड"</string>
@@ -2002,45 +2000,29 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"रूटीन मोड जानकारी की सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"बैटरी आम तौर पर जितने समय चलती है, उससे पहले खत्म हो सकती है"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"बैटरी लाइफ़ बढ़ाने के लिए \'बैटरी सेवर\' चालू हो गया है"</string>
- <!-- no translation found for mime_type_folder (7111951698626315204) -->
- <skip />
- <!-- no translation found for mime_type_apk (5518003630972506900) -->
- <skip />
- <!-- no translation found for mime_type_generic (6833871596845900027) -->
- <skip />
- <!-- no translation found for mime_type_generic_ext (8450275970061657174) -->
- <skip />
- <!-- no translation found for mime_type_audio (6289777657172050926) -->
- <skip />
- <!-- no translation found for mime_type_audio_ext (3270880987725816210) -->
- <skip />
- <!-- no translation found for mime_type_video (4093025777317307426) -->
- <skip />
- <!-- no translation found for mime_type_video_ext (5643771615714173159) -->
- <skip />
- <!-- no translation found for mime_type_image (3144284451605236371) -->
- <skip />
- <!-- no translation found for mime_type_image_ext (1514613218742736590) -->
- <skip />
- <!-- no translation found for mime_type_compressed (1645486037074943257) -->
- <skip />
- <!-- no translation found for mime_type_compressed_ext (4232293058067801528) -->
- <skip />
- <!-- no translation found for mime_type_document (1596838147256375966) -->
- <skip />
- <!-- no translation found for mime_type_document_ext (6327266601345501281) -->
- <skip />
- <!-- no translation found for mime_type_spreadsheet (2639138255207123557) -->
- <skip />
- <!-- no translation found for mime_type_spreadsheet_ext (5508653032786106725) -->
- <skip />
- <!-- no translation found for mime_type_presentation (6145604688774787357) -->
- <skip />
- <!-- no translation found for mime_type_presentation_ext (2982650207774823437) -->
- <skip />
+ <string name="mime_type_folder" msgid="7111951698626315204">"फ़ोल्डर"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android ऐप्लिकेशन"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"फ़ाइल"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> फ़ाइल"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ऑडियो"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> ऑडियो"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"वीडियो"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> वीडियो"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"इमेज"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> इमेज"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"संग्रह"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> संग्रह"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"दस्तावेज़"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> दस्तावेज़"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"स्प्रेडशीट"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> स्प्रेडशीट"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"प्रज़ेंटेशन"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> प्रज़ेंटेशन"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"प्राेफ़ाइल लोड हो रही है"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फ़ाइलें</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फ़ाइलें</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index ffe543634e1e..d50fda6e1df0 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -311,18 +311,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"uspostavljati telefonske pozive i upravljati njima"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Želite li dopustiti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da upućuje telefonske pozive i upravlja njima?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Biometrijski senzori"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupiti podacima senzora o vašim vitalnim znakovima"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Želite li dopustiti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa podacima senzora o vašim vitalnim znakovima?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Glazba"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"pristup glazbi"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Želite li dopustiti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa vašoj glazbi?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotografije i videozapisi"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pristup fotografijama i &amp; videozapisima"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Želite li dopustiti da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristupa vašim fotografijama i videozapisima, uključujući označene lokacije?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dohvaćati sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Pregledat će sadržaj prozora koji upotrebljavate."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključiti značajku Istraži dodirom"</string>
@@ -2059,4 +2056,6 @@
<item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteke</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteka</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index fda1244f5d56..5d0086bc8ecf 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefonhívások kezdeményezése és kezelése"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hívásokat indíthasson és kezelhessen?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Testérzékelők"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"az érzékelők által mért, életjelekkel kapcsolatos adatok elérése"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen az életjelekkel kapcsolatos szenzoradatokhoz?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Zene"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"hozzáférés a zenékhez"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&amp;gt számára, hogy hozzáférjen az Ön zenéihez?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotók és videók"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"hozzáférés a fényképekhez és videókhoz"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára a fotókhoz és videókhoz (köztük a címkézett helyekhez) való hozzáférést?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ablaktartalom lekérdezése"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"A használt ablak tartalmának vizsgálata."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Felfedezés érintéssel bekapcsolása"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fájl</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fájl</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index a8df7209e9c9..7d9f8ac6a57d 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Հեռախոս"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"կատարել զանգեր և կառավարել զանգերը"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Թույլ տա՞լ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածին կատարել հեռախոսազանգեր և կառավարել դրանք:"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Մարմնի տվիչներ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"օգտագործել սենսորների տվյալները ձեր օրգանիզմի վիճակի մասին"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Թույլ տա՞լ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածին սենսորից ստանալ ձեր կենսագործունեության հիմնական տվյալները:"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Երաժշտություն"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"երաժշտության հասանելիություն"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Հասանելի դարձնե՞լ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածին ձեր երաժշտությունը:"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Լուսանկարներ և տեսանյութեր"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"լուսանկարների և տեսանյութերի հասանելիություն"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Հասանելի դարձնե՞լ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածին ձեր լուսանկարները, տեսանյութերը և տեղանշված վայրերը:"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Առբերել պատուհանի բովանդակությունը"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Վերլուծել գործող պատուհանի բովանդակությունը"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Միացնել Հպման միջոցով հետազոտումը"</string>
@@ -2024,4 +2021,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ֆայլ</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ֆայլ</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index aaec2ef39c68..6432e37c9059 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telepon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"melakukan dan mengelola panggilan telepon"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; melakukan dan mengelola panggilan telepon?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Sensor tubuh"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"mengakses data sensor tentang tanda-tanda vital"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses data sensor tentang tanda-tanda vital Anda?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musik"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"mengakses musik Anda"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; untuk mengakses musik?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Foto &amp; video"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"mengakses foto &amp; video Anda"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses foto dan video Anda, termasuk lokasi yang diberi tag?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Mengambil konten jendela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Memeriksa konten jendela tempat Anda berinteraksi."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Mengaktifkan Jelajahi dengan Sentuhan"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> file</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> file</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index c0627c12d68a..d27d8b58e6cf 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Sími"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"hringja og stjórna símtölum"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Viltu leyfa &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; að hringja og stjórna símtölum?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Líkamsskynjarar"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"aðgangur að skynjaragögnum yfir lífsmörk þín"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Viltu veita &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aðgang að skynjaragögnum yfir lífsmörk þín?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Tónlist"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"fá aðgang að tónlistinni þinni"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Viltu veita &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aðgang að tónlistinni þinni?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Myndir og myndskeið"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"fá aðgang að myndunum og myndskeiðunum þínum"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Viltu veita &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aðgang að myndunum þínum og myndskeiðum, þ.m.t. merktum staðsetningum?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Sækja innihald glugga"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kanna innihald glugga sem þú ert að nota."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Kveikja á snertikönnun"</string>
@@ -2024,4 +2021,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skrá</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skrá</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 0d4e0bdd44dd..c5592b6488db 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"eseguire e gestire le telefonate"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di effettuare e gestire telefonate?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Sensori del corpo"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accedere ai dati dei sensori relativi ai tuoi parametri vitali"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai dati dei sensori relativi ai parametri vitali?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musica"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"Accesso alla tua musica"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere alla tua musica?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Foto e video"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"Accesso alle tue foto e ai tuoi video"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vuoi consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere alle tue foto e ai tuoi video, incluse le località taggate?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperare contenuti della finestra"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Esaminare i contenuti di una finestra con cui interagisci."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Attivare Esplora al tocco"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> file</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> file</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 1d27a3f9d487..89813a74934a 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -314,18 +314,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"טלפון"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"התקשרות וניהול של שיחות טלפון"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"‏לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאה להתקשרות ולניהול של שיחות טלפון?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"חיישנים לבישים"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"גישה אל נתוני חיישנים של הסימנים החיוניים שלך"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"‏לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאת גישה לנתוני חיישנים העוקבים אחר הסימנים החיוניים שלך?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"מוזיקה"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"גישה למוזיקה שלך"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"‏האם לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאת גישה למוזיקה שלך?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"תמונות וסרטונים"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"גישה לתמונות ולסרטונים שלך"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"‏האם לאפשר ל-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; לקבל גישה לתמונות ולסרטונים שלך, כולל מיקומים מתויגים?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"אחזור תוכן של חלון"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"בדוק את התוכן של חלון שאיתו אתה מבצע אינטראקציה."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"הפעלה של \'גילוי באמצעות מגע\'"</string>
@@ -2095,4 +2092,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> קבצים</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + קובץ אחד (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index f0291a80990e..79e2f09d51dd 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"電話の発信と管理"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"電話の発信と管理を &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"ボディセンサー"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"バイタルサインに関するセンサーデータへのアクセス"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"バイタルサインに関するセンサーデータへのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"音楽"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"音楽へのアクセス"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"音楽へのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"写真と動画"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"写真と動画へのアクセス"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"タグ付けされた場所を含め、写真と動画へのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ウィンドウコンテンツの取得"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ユーザーがアクセスしているウィンドウのコンテンツを検査します。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"タッチガイドの有効化"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g>、他 <xliff:g id="COUNT_3">%d</xliff:g> ファイル</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g>、他 <xliff:g id="COUNT_1">%d</xliff:g> ファイル</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 8295136167c5..4a3cb8b4f5ff 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ტელეფონი"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"სატელეფონო ზარების განხორციელება და მართვა"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; სატელეფონო ზარების განხორციელების და მართვის ნებართვა?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"სხეულის სენსორები"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"თქვენი სასიცოცხლო ფუნქციების შესახებ სენსორის მონაცემებზე წვდომა"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; თქვენი სასიცოცხლო ფუნქციების შესახებ სენსორის მონაცემებზე წვდომის ნებართვა?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"მუსიკა"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"თქვენს მუსიკაზე წვდომა"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-ს თქვენს მუსიკაზე წვდომა?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ფოტოები და ვიდეოები"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"თქვენს ფოტოებსა და ვიდეოებზე წვდომა"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-ს წვდომა თქვენს ფოტოებსა და ვიდეოებზე, მათ შორის, თეგებით მონიშნულ მდებარეობებზე?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ფანჯრის კონტენტის მოძიება"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"იმ ფანჯრის კონტენტის შემოწმება, რომელშიც მუშაობთ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"„შეხებით აღმოჩენის“ ჩართვა"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ფაილი</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ფაილი</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 5231299be31e..951c4e2afb22 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"қоңырау шалу және телефон қоңырауларын басқару"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына қоңыраулар шалуға және басқаруға рұқсат берілсін бе?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Дене датчиктері"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ағза күйінің көрсеткіштері туралы сенсор деректеріне қатынасу"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына негізгі физиологиялық көрсеткіштерді көрсететін сенсорлық деректерді пайдалануға рұқсат берілсін бе?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музыка"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"музыка мазмұнына кіру"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына музыка мазмұнына кіруге рұқсат етілсін бе?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Суреттер және бейнелер"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"суреттер мен бейнелерге кіру"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына суреттер мен бейнелерді, тэг енгізілген орындарды пайдалануға рұқсат етілсін бе?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезе мазмұнын оқып отыру"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ашық тұрған терезе мазмұнын тексеру."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Explore by Touch функциясын қосу"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> файл</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 60169b6b9dfd..cb38ea13b9ab 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ទូរសព្ទ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ហៅទូរស័ព្ទ និងគ្រប់គ្រងការហៅទូរស័ព្ទ"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"អនុញ្ញាតឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; គ្រប់គ្រង និង​ធ្វើការហៅទូរសព្ទ?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"ឧបករណ៍​ចាប់សញ្ញា​រាងកាយ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ចូលដំណើរការទិន្នន័យឧបករណ៍ចាប់សញ្ញាអំពីស្ថានភាពសុខភាពរបស់អ្នក"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"អនុញ្ញាតឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​ទិន្នន័យឧបករណ៍ចាប់សញ្ញាអំពីស្ថានភាពសុខភាពរបស់អ្នក?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"តន្ត្រី"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ចូលប្រើ​តន្ត្រី​របស់អ្នក"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"អនុញ្ញាត​ឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​តន្រ្តី​របស់​អ្នក?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"​រូបថត និង​វីដេអូ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ចូលប្រើ​រូបថត និង​វីដេអូ​របស់អ្នក"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"អនុញ្ញាត​ឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​រូបថត និង​វីដេអូ​របស់អ្នក រួមទាំង​ទីតាំង​ដែលបានដាក់ស្លាក?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ទាញយក​ខ្លឹមសារ​វិនដូ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ពិនិត្យ​ខ្លឹមសារវិនដូ​ដែល​អ្នក​កំពុង​ទាក់ទង​ជា​មួយ។"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"បើក​ការ​រក​មើល​​ដោយ​ប៉ះ"</string>
@@ -2025,4 +2022,6 @@
<item quantity="other">ឯកសារ <xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item>
<item quantity="one">ឯកសារ​ <xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g></item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index d54f7ca2bb99..c8d43963fe0b 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ಫೋನ್"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ಫೋನ್ ಕರೆ ಮಾಡಲು ಹಾಗೂ ನಿರ್ವಹಿಸಲು"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"ದೇಹದ ಸೆನ್ಸರ್‌ಗಳು"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸಾರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸರ್ ಡೇಟಾವನ್ನು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"ಸಂಗೀತ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ನಿಮ್ಮ ಸಂಗೀತವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"ನಿಮ್ಮ ಸಂಗೀತವನ್ನು ಪ್ರವೇಶಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳು"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ನಿಮ್ಮ ಫೋಟೋಗಳು &amp; ವೀಡಿಯೊಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"ಟ್ಯಾಗ್ ಮಾಡಿದ ಸ್ಥಳಗಳೂ ಸೇರಿದಂತೆ ನಿಮ್ಮ ಫೋಟೋಗಳು ಹಾಗೂ ವೀಡಿಯೊಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿ ನೀಡಬೇಕೇ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ವಿಂಡೋ ವಿಷಯವನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ನೀವು ಬಳಸುತ್ತಿರುವ ವಿಂಡೋದ ವಿಷಯ ಪರೀಕ್ಷಿಸುತ್ತದೆ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ಸ್ಪರ್ಶ-ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಆನ್ ಮಾಡುತ್ತದೆ"</string>
@@ -2025,4 +2022,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ಫೈಲ್‌ಗಳು</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ಫೈಲ್‌ಗಳು</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index b220ecafbfe2..69963ef0548f 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"전화"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"전화 걸기 및 관리"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 전화를 걸고 관리하도록 허용하시겠습니까?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"신체 센서"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"생체 신호에 관한 센서 데이터에 액세스"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 생체 신호에 관한 센서 데이터에 액세스하도록 허용하시겠습니까?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"음악"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"음악에 액세스"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 내 음악에 액세스하도록 허용하시겠습니까?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"사진 및 동영상"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"사진 및 동영상에 액세스"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 태그가 지정된 위치를 포함한 내 사진과 동영상에 액세스하도록 허용하시겠습니까?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"창 콘텐츠 가져오기"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"상호작용 중인 창의 콘텐츠를 검사합니다."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"터치하여 탐색 사용"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> 및 파일 <xliff:g id="COUNT_3">%d</xliff:g>개</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> 및 파일 <xliff:g id="COUNT_1">%d</xliff:g>개</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 1893b39dcf0a..95e85c68d220 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"телефон чалуу жана аларды башкаруу"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна телефон чалууга жана чалууларды башкарууга уруксат берилсинби?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Дене сенсорлору"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"организмдин абалына көз салган сенсордун дайындарына мүмкүнчүлүк алуу"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна организмдин абалына көз салган сенсордун дайындарын пайдаланууга уруксат берилсинби?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музыка"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"музыкага кирүү мүмкүнчүлүгү"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна музыканы пайдаланууга уруксат берилсинби?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Сүрөттөр жана видеолор"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"сүрөттөр менен видеолорго кирүү мүмкүнчүлүгү"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна сүрөттөрүңүздү, видеолоруңузду, анын ичинде тегделген жайгашкан жерлериңизди көрүүгө уруксат бересизби?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезедеги мазмунду алып турат"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Учурда ачылып турган терезедеги маалыматты талдайт."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Сыйпалап изилдөө\" мүмкүнчүлүгүн иштетет"</string>
@@ -2025,4 +2022,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> файл</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 55a5018db163..1e76147ccc0b 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ໂທລະສັບ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ໂທ ແລະ​ຈັດ​ການ​ການ​ໂທ​ລະ​ສັບ"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ໂທ ແລະ ຈັດການການໂທບໍ?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"ເຊັນເຊີຮ່າງກາຍ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ເຂົ້າ​ຫາ​ຂໍ້​ມູນ​ເຊັນ​ເຊີ​ກ່ຽວ​ກັບ​ສັນ​ຍານ​ຊີບ​ຂອງ​ທ່ານ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງຂໍ້ມູນເຊັນເຊີກ່ຽວກັບສັນຍານຊີບຂອງທ່ານບໍ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"ເພງ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ເຂົ້າເຖິງເພງຂອງທ່ານ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງເພງຂອງທ່ານບໍ?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ຮູບພາບ ແລະ ວິດີໂອ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ເຂົ້າເຖິງຮູບພາບ ແລະ ວິດີໂອຂອງທ່ານ"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"ອະນຸຍາດໃຫ້ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ເຂົ້າເຖິງຮູບພາບ ແລະ ວິດີໂອຂອງທ່ານ, ຮວມທັງສະຖານທີ່ທີ່ຖືກແທັກນຳບໍ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ດຶງຂໍ້ມູນເນື້ອຫາໃນໜ້າຈໍ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ກວດກາເນື້ອຫາຂອງໜ້າຈໍທີ່ທ່ານກຳລັງມີປະຕິສຳພັນນຳ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ເປີດໃຊ້ \"ການສຳຫຼວດໂດຍສຳຜັດ\""</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ໄຟລ໌</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ໄຟລ໌</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 2f7673bb5a14..94ab46ce6bc4 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -314,18 +314,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefonas"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"skambinti ir tvarkyti telefonų skambučius"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Leisti &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; skambinti ir tvarkyti telefono skambučius?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Kūno jutikliai"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pasiekti jutiklių duomenis apie gyvybinius ženklus"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Suteikti &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; galimybę pasiekti jutiklių duomenis apie gyvybinius ženklus?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"pasiekti muziką"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Suteikti programai &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prieigą prie muzikos?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Nuotraukos ir vaizdo įrašai"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pasiekti nuotraukas ir vaizdo įrašus"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Leisti programai &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pasiekti nuotraukas ir vaizdo įrašus, įskaitant pažymėtas vietoves?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Gauti lango turinį"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tikrinti lango, su kuriuo sąveikaujate, turinį."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Įjungti „Naršyti paliečiant“"</string>
@@ -2095,4 +2092,6 @@
<item quantity="many">„<xliff:g id="FILE_NAME_2">%s</xliff:g>“ ir <xliff:g id="COUNT_3">%d</xliff:g> failo</item>
<item quantity="other">„<xliff:g id="FILE_NAME_2">%s</xliff:g>“ ir <xliff:g id="COUNT_3">%d</xliff:g> failų</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 1c53ddaea7be..53ab075f8faf 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -311,18 +311,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Tālrunis"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"veikt un pārvaldīt tālruņa zvanus"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vai atļaut lietotnei &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; veikt un pārvaldīt tālruņa zvanus?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Ķermeņa sensori"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"piekļūt sensoru datiem par jūsu veselības rādījumiem"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vai atļaut lietotnei &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; piekļūt sensoru uztvertajiem veselības rādījumiem?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Mūzika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"Piekļūt jūsu mūzikai"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vai atļaut lietotnei &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; piekļūt jūsu mūzikai?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotoattēli un videoklipi"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"Piekļūt jūsu fotoattēliem un videoklipiem"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vai atļaut lietotnei &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; piekļūt jūsu fotoattēliem, videoklipiem, tostarp atzīmētajām atrašanās vietām?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Izgūt loga saturu."</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Skatīt tā loga saturu, ar kuru mijiedarbojaties."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivizēt funkciju “Pārlūkot pieskaroties”."</string>
@@ -2059,4 +2056,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> un <xliff:g id="COUNT_3">%d</xliff:g> fails</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> un <xliff:g id="COUNT_3">%d</xliff:g> faili</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 5447056aa96c..4e0b47a22b92 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"упатува и управува со телефонски повици"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Дали да се дозволи &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да повикува и да управува со телефонските повици?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Телесни сензори"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"пристапува до податоците од сензорите за виталните знаци"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Дали да се дозволи &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до податоците на сензорот за витални знаци?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музика"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"пристапува до музиката"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Дали да се дозволи &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до музиката?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Фотографии и видеа"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"пристапува до фотографиите и видеата"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Дали да се дозволи &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до фотографиите и видеата, вклучувајќи означени локации?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Преземе содржина на прозорец"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ја следи содржината на прозорецот со кој се комуницира."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Вклучи „Истражувај со допир“"</string>
@@ -2026,4 +2023,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> датотека</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> датотеки</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 0e2e7da0572b..13ca19822833 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ഫോണ്‍"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ഫോൺ വിളിക്കുകയും നിയന്ത്രിക്കുകയും ചെയ്യുക"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ഫോൺ കോളുകൾ ചെയ്യാനും അവ നിയന്ത്രിക്കാനും &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"ബോഡി സെൻസറുകൾ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"നിങ്ങളുടെ ജീവാധാര ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ വിവരങ്ങൾ ആക്സസ് ചെയ്യുക"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"നിങ്ങളുടെ ജീവധാരണ ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"സംഗീതം"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"നിങ്ങളുടെ സംഗീതം ആക്‌സസ് ചെയ്യുക"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; എന്നതിനെ നിങ്ങളുടെ സംഗീതം ആക്‌സസ് ചെയ്യാൻ അനുവദിക്കണോ?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ഫോട്ടോകളും വീഡിയോകളും"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"നിങ്ങളുടെ ഫോട്ടോകളും &amp; വീഡിയോകളും"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"ടാഗ് ചെയ്‌ത ലൊക്കേഷനുകൾ ഉൾപ്പെടെ നിങ്ങളുടെ ഫോട്ടോകളും വീഡിയോകളും ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-നെ അനുവദിക്കണോ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"വിൻഡോ ഉള്ളടക്കം വീണ്ടെടുക്കുക"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"നിങ്ങൾ സംവദിക്കുന്ന ഒരു വിൻഡോയുടെ ഉള്ളടക്കം പരിശോധിക്കുക."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"സ്‌പർശനം വഴി പര്യവേക്ഷണം ചെയ്യുക, ഓണാക്കുക"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ഫയലുകൾ</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ഫയൽ</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index cc7272d5b009..101ef3532f34 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Утас"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"утасны дуудлага хийх, дуудлага удирдах"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д утасны дуудлага хийх, дуудлагад хариулахыг зөвшөөрөх үү?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Биеийн мэдрэгч"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"таны биеийн байдлын талаарх мэдрэгч бүхий өгөгдөлд нэвтрэх"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны биеийн ерөнхий байдлын үзүүлэлтүүдийн мэдрэгчийн өгөгдөлд хандахыг зөвшөөрөх үү?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Хөгжим"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"хөгжимдөө хандах"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны хөгжимд хандахыг зөвшөөрөх үү?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Зураг &amp; видео"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"зураг &amp; видеондоо хандах"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны зураг, видео болон шошголсон байршилд хандахыг зөвшөөрөх үү?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Цонхны агуулгыг авах"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Таны харилцан үйлчлэх цонхны контентоос шалгах."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Хүрч танихыг асаах"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> файл</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 7f99d1131695..938c53972fa5 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कॉल आणि व्यवस्थापित"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला फोन कॉल करू आणि ते व्यवस्थापित करू द्यायचे?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"शरीर सेंसर"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"आपल्‍या महत्त्वाच्या मापनांविषयी सेंसर डेटा अॅक्सेस करा"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला तुमच्या महत्त्वाच्या लक्षणांविषयीचा सेन्सर डेटा अॅक्सेस करू द्यायचे?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"संगीत"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"तुमचे संगीत अॅक्सेस करा"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला तुमचे संगीत अॅक्सेस करू द्यायचे का?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"फोटो आणि व्हिडिओ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"तुमचे फोटो आणि व्हिडिओ अॅक्सेस करा"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला टॅग केलेल्या स्थानांसह तुमचे फोटो आणि व्हिडिओ अॅक्सेस करण्याची अनुमती द्यायची का?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विंडोमधील आशय पुन्हा मिळवा"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तुम्ही वापरत असलेल्‍या विंडोमधील आशय तपासा."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"स्पर्श करून अन्वेषण चालू करा"</string>
@@ -2024,4 +2021,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फाइल</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फायली</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index bf8172736feb..98b64e951abf 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"membuat dan mengurus panggilan telefon"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Benarkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; membuat dan mengurus panggilan telefon?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Penderia tubuh"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"akses data penderia tentang tanda vital anda"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Benarkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses data penderia tentang tanda vital anda?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzik"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"akses muzik anda"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Benarkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses muzik anda?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Foto &amp; video"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"akses foto &amp; video anda"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Benarkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses foto dan video anda, termasuk lokasi yang ditandai?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dapatkan kembali kandungan tetingkap"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Periksa kandungan tetingkap yang berinteraksi dengan anda."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Hidupkan Jelajah melalui Sentuhan"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fail</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fail</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index b6b2f47ad682..09e963f8745f 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ဖုန်း"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ရန်နှင့် စီမံရန်"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ခွင့်နှင့် စီမံခွင့်ပေးလိုပါသလား။"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"စက်၏ အာရုံခံစနစ်များ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"သင်၏ အဓိကကျသော လက္ခဏာများအကြောင်း အာရုံခံကိရိယာဒေတာကို ရယူသုံးစွဲရန်"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား သင်၏ အရေးကြီးသောလက္ခဏာ အာရုံခံကိရိယာ ဒေတာများကို သုံးခွင့်ပေးလိုပါသလား။"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"တေးဂီတ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"သင့်တေးဂီတသို့ ဝင်သည်"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား သင့်တေးဂီတကို ဝင်ခွင့်ပေးလိုပါသလား။"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ဓာတ်ပုံများနှင့် ဗီဒီယိုများ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"သင့်ဓာတ်ပုံနှင့် ဗီဒီယိုများသို့ ဝင်သည်"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"တဂ်လုပ်ထားသည့် တည်နေရာများအပါအဝင် သင့်ဓာတ်ပုံနှင့် ဗီဒီယိုများကို &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား ဝင်ကြည့်ခွင့်ပေးလိုပါသလား။"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ဝင်းဒိုးတွင် ပါရှိသည်များကို ပြန်လည်ရယူရန်"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"သင်အသုံးပြုနေသော ဝင်းဒိုးတွင် ပါရှိသည်များကို ကြည့်ရှုစစ်ဆေးသည်။"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"တို့ထိခြင်းဖြင့် ရှာဖွေမှုကို ဖွင့်ရန်"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ဖိုင်</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ဖိုင်</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index add20ef9f47c..1aced28e61a7 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ring og administrer anrop"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vil du la &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ringe og administrere telefonsamtaler?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Kroppssensorer"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få tilgang til sensordata om de vitale tegnene dine"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vil du gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til sensordata om de vitale tegnene dine?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musikk"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"få tilgang til musikken din"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vil du gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til musikken din?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Bilder og videoer"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"få tilgang til bildene og videoene dine"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vil du gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til bildene og videoene dine, inkludert merkede steder?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"hente innhold i vinduer"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Appen analyserer innholdet i vinduer du samhandler med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"slå på berøringsutforsking"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> filer</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fil</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 156a3e587c3e..806e520c844b 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई फोन कलहरू गर्न र तिनीहरूको व्यवस्थापन गर्न दिने हो?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"शारीरिक सेन्सरहरू"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"तपाईंको महत्त्वपूर्ण संकेत बारे सेन्सर डेटा पहुँच गर्नुहोस्"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई आफ्ना महत्त्वपूर्ण लक्षणहरूसम्बन्धी सेन्सर डेटामाथि पहुँच राख्न दिने हो?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"सङ्गीत"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"आफ्नो सङ्गीतमाथि पहुँच राख्नुहोस्‌"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई तपाईंको सङ्गीतमाथि पहुँच राख्न दिने हो?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"तस्बिर तथा भिडियोहरू"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"आफ्नो तस्बिर &amp; भिडियोहरूमाथि पहुँच राख्नुहोस्‌"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई ट्याग गरिएका स्थानहरूलगायत तपाईंका तस्बिर तथा भिडियोहरूमाथि पहुँच गर्न दिने हो?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विन्डो सामग्रीको पुनःबहाली गर्नुहोस्।"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छोएर गरिने खोजलाई सुचारु गर्नुहोस्"</string>
@@ -2029,4 +2026,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फाइलहरू</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> फाइल</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 7d9e90a928c0..f7482bca2e54 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefoon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefoneren en gesprekken beheren"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toestaan om telefoongesprekken te starten en te beheren?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Lichaamssensoren"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"toegang krijgen tot sensorgegevens over je vitale functies"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang geven tot sensorgegevens over je vitale functies?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muziek"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"toegang tot je muziek"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang geven tot je muziek?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Foto\'s en video\'s"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"toegang tot je foto\'s en video\'s"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang geven tot je foto\'s en video\'s, waaronder getagde locaties?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Content van vensters ophalen"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"De content inspecteren van een venster waarmee je interactie hebt."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\'Verkennen via aanraking\' inschakelen"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> bestanden</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> bestand</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 3a29712b0d9a..1607b402d955 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ଫୋନ୍‍"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ଫୋନ୍‍ କଲ୍‍ କରେ ଏବଂ ପରିଚାଳନା କରେ"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;କୁ ଫୋନ୍‍ କଲ୍‍ କରିବାକୁ ତଥା ପରିଚାଳନା କରିବାକୁ ଅନୁମତି ଦେବେ କି?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"ବଡି ସେନ୍ସର୍"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ଆପଣଙ୍କ ଗୁରୁତପୂର୍ଣ୍ଣ ସଂକେତଗୁଡ଼ିକ ବିଷୟରେ ସେନ୍ସର୍‍ ଡାଟା ଆକ୍ସେସ୍‍ କରେ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;କୁ ଆପଣଙ୍କ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ଲକ୍ଷଣଗୁଡ଼ିକ ବିଷୟରେ ସେନ୍ସର୍‍ ଡାଟା ଆକ୍ସେସ୍‍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"ସଙ୍ଗୀତ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ଆପଣଙ୍କ ସଙ୍ଗୀତ ଆକ୍ସେସ୍‍ କରନ୍ତୁ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"ଆପଣଙ୍କ ସଙ୍ଗୀତକୁ ଆକ୍ସେସ୍‍ କରିବାକୁ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;କୁ ଅନୁମତି ଦେବେ କି?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ଫଟୋ ଓ ଭିଡିଓ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ଆପଣଙ୍କ ଫଟୋ ଏବଂ ଭିଡିଓ ଆକ୍ସେସ୍‍ କରନ୍ତୁ"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"ଟ୍ୟାଗ୍ କରାଯାଇଥିବା ଲୋକେସନ୍ ସହିତ ଆପଣଙ୍କ ଫଟୋ ଏବଂ ଭିଡିଓ ଆକ୍ସେସ୍ କରିବାକୁ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; କୁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ୱିଣ୍ଡୋ କଣ୍ଟେଣ୍ଟ ହାସଲ କରନ୍ତୁ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ଆପଣ କାମ କରୁଥିବା ୱିଣ୍ଡୋର କଣ୍ଟେଣ୍ଟକୁ ଯାଞ୍ଚ କରନ୍ତୁ।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ସ୍ପର୍ଶ ଦ୍ୱାରା ଏକ୍ସପ୍ଲୋର୍‍ ଅନ୍‍ କରନ୍ତୁ"</string>
@@ -1614,10 +1611,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ପ୍ରାୟତଃ #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ସୁରକ୍ଷିତ"</string>
- <!-- no translation found for activity_starter_block_bg_activity_starts_permissive (5692097903712956720) -->
- <skip />
- <!-- no translation found for activity_starter_block_bg_activity_starts_enforcing (8299522481076404353) -->
- <skip />
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> ଠାରୁ ଆରମ୍ଭ ହୋଇଥିବା ପୃଷ୍ଠଭୂମି କାର୍ଯ୍ୟକଳାପ ଆଗାମୀ Q ବିଲ୍ଡରେ ବ୍ଲକ୍ କରାଯାଇଛି। go/q-bg-block ଦେଖନ୍ତୁ।"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> ଠାରୁ ଆରମ୍ଭ ହୋଇଥିବା ପୃଷ୍ଠଭୂମି କାର୍ଯ୍ୟକଳାପ ବ୍ଲକ୍ କରାଯାଇଛି। go/q-bg-block ଦେଖନ୍ତୁ।"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ପାଟର୍ନ ଭୁଲି ଯାଇଛନ୍ତି"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ଭୁଲ ପାଟର୍ନ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ଭୁଲ ପାସ୍‌ୱର୍ଡ"</string>
@@ -2003,45 +1998,29 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ନିୟମିତ ମୋଡ୍‍ ସୂଚନା ବିଜ୍ଞପ୍ତି"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ସାଧାରଣ ଭାବରେ ଚାର୍ଜ୍ କରିବା ପୂର୍ବରୁ ବ୍ୟାଟେରୀ ସରିଯାଇପାରେ"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ବ୍ୟାଟେରୀର ସମୟକୁ ବଢ଼ାଇବା ପାଇଁ ବ୍ୟଟେରୀ ସେଭର୍‍କୁ କାର୍ଯ୍ୟକାରୀ କରାଯାଇଛି"</string>
- <!-- no translation found for mime_type_folder (7111951698626315204) -->
- <skip />
- <!-- no translation found for mime_type_apk (5518003630972506900) -->
- <skip />
- <!-- no translation found for mime_type_generic (6833871596845900027) -->
- <skip />
- <!-- no translation found for mime_type_generic_ext (8450275970061657174) -->
- <skip />
- <!-- no translation found for mime_type_audio (6289777657172050926) -->
- <skip />
- <!-- no translation found for mime_type_audio_ext (3270880987725816210) -->
- <skip />
- <!-- no translation found for mime_type_video (4093025777317307426) -->
- <skip />
- <!-- no translation found for mime_type_video_ext (5643771615714173159) -->
- <skip />
- <!-- no translation found for mime_type_image (3144284451605236371) -->
- <skip />
- <!-- no translation found for mime_type_image_ext (1514613218742736590) -->
- <skip />
- <!-- no translation found for mime_type_compressed (1645486037074943257) -->
- <skip />
- <!-- no translation found for mime_type_compressed_ext (4232293058067801528) -->
- <skip />
- <!-- no translation found for mime_type_document (1596838147256375966) -->
- <skip />
- <!-- no translation found for mime_type_document_ext (6327266601345501281) -->
- <skip />
- <!-- no translation found for mime_type_spreadsheet (2639138255207123557) -->
- <skip />
- <!-- no translation found for mime_type_spreadsheet_ext (5508653032786106725) -->
- <skip />
- <!-- no translation found for mime_type_presentation (6145604688774787357) -->
- <skip />
- <!-- no translation found for mime_type_presentation_ext (2982650207774823437) -->
- <skip />
+ <string name="mime_type_folder" msgid="7111951698626315204">"ଫୋଲ୍ଡର୍"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android ଆପ୍ଲିକେସନ୍"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ଫାଇଲ୍"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ଫାଇଲ୍"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ଅଡିଓ"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> ଅଡିଓ"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ଭିଡିଓ"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> ଭିଡିଓ"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"ଛବି"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> ଛବି"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"ଆର୍କାଇଭ୍ କରନ୍ତୁ"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> ଆର୍କାଇଭ୍"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"ଡକ୍ୟୁମେଣ୍ଟ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> ଡକ୍ୟୁମେଣ୍ଟ"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"ସ୍ପ୍ରେଡ୍‍ସିଟ୍"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> ସ୍ପ୍ରେଡ୍‌ସିଟ୍"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"ଉପସ୍ଥାପନା"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> ଉପସ୍ଥାପନା"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ଲୋଡ୍ ହେଉଛି"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g>ଟି ଫାଇଲ୍</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g>ଟି ଫାଇଲ୍</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 6c1837c281cf..421d52f22c10 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ਫ਼ੋਨ ਕਰੋ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ਕੀ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦੇਣਾ ਹੈ?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"ਸਰੀਰ ਸੰਬੰਧੀ ਸੈਂਸਰ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ਆਪਣੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਚਿੰਨ੍ਹਾਂ ਬਾਰੇ ਸੰਵੇਦਕ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"ਕੀ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਤੁਹਾਡੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਲੱਛਣਾਂ ਸੰਬੰਧੀ ਸੈਂਸਰ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"ਸੰਗੀਤ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ਤੁਹਾਡੇ ਸੰਗੀਤ ਤੱਕ ਪਹੁੰਚ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"ਕੀ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਤੁਹਾਡੇ ਸੰਗੀਤ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ਤੁਹਾਡੀਆਂ ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਤੱਕ ਪਹੁੰਚ"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"ਕੀ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਟੈਗ ਕੀਤੇ ਟਿਕਾਣਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀਆਂ ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ਵਿੰਡੋ ਸਮੱਗਰੀ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨਾ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ਉਸ ਵਿੰਡੋ ਸਮੱਗਰੀ ਦੀ ਜਾਂਚ ਕਰੋ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਅੰਤਰਕਿਰਿਆ ਕਰ ਰਹੇ ਹੋ"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\'ਸਪੱਰਸ਼ ਰਾਹੀਂ ਪੜਚੋਲ ਕਰੋ\' ਚਾਲੂ ਕਰਨਾ"</string>
@@ -2024,4 +2021,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ਫ਼ਾਈਲ</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ਫ਼ਾਈਲਾਂ</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index dc4fa9762d08..674ccb0957c4 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -2092,4 +2092,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> pliku</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> plik</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index c8f114d40dff..9a078f8290f2 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -2020,4 +2020,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> arquivo</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> arquivos</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index cafcd8b59926..ecaff4d23ba5 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -2020,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ficheiros</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ficheiro</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index c8f114d40dff..9a078f8290f2 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -2020,4 +2020,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> arquivo</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> arquivos</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 843f00548c02..63b34119e07d 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -311,18 +311,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"inițieze și să gestioneze apeluri telefonice"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să inițieze și să gestioneze apeluri telefonice?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Senzori corporali"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceseze datele de la senzori despre semnele vitale"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze datele de la senzori despre semnele dvs. vitale?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzică"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"accesați muzica"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să vă acceseze muzica?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotografii și videoclipuri"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"accesați fotografiile și videoclipurile"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Permiteți aplicației &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze fotografiile și videoclipurile, inclusiv locațiile etichetate?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Analizează conținutul ferestrei"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspectează conținutul unei ferestre cu care interacționați."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activează funcția Explorați prin atingere"</string>
@@ -2059,4 +2056,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> de fișiere</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fișier</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index e4e75357eb14..0aed6bc8c28e 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -314,18 +314,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"осуществлять вызовы и управлять ими"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Разрешить приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; совершать звонки и управлять ими?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Датчики на теле"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"доступ к данным датчиков о состоянии организма"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Разрешить приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ к данным датчиков о состоянии организма?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музыка"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"доступ к музыке"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Разрешить приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ к музыке?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Фото и видео"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"доступ к фото и видео"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Открыть приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ к вашим фото и видео, а также к данным о местах съемки?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Получать содержимое окна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Анализировать содержимое активного окна."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включать Изучение касанием"</string>
@@ -2096,4 +2093,6 @@
<item quantity="many">\"<xliff:g id="FILE_NAME_2">%s</xliff:g>\" и ещё <xliff:g id="COUNT_3">%d</xliff:g> файлов</item>
<item quantity="other">\"<xliff:g id="FILE_NAME_2">%s</xliff:g>\" и ещё <xliff:g id="COUNT_3">%d</xliff:g> файла</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index ad15ff37fe8e..cc6087ad7217 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"දුරකථනය"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"දුරකථන ඇමතුම් සිදු කිරීම සහ කළමනාකරණය කිරීම"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත දුරකථන ඇමතුම් ලබා ගැනීමට සහ කළමනාකරණය කිරීමට ඉඩ දෙන්නද?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"ශරීර සංවේදක"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ඔබේ ජෛව ලක්ෂණ පිළිබඳ සංවේදක දත්ත වෙත පිවිසෙන්න"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත ඔබගේ ජෛව ලක්ෂණ පිළිබඳ සංවේදක දත්ත වෙත ප්‍රවේශ වීමට ඉඩ දෙන්නද?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"සංගීතය"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ඔබේ සංගීතයට පිවිසෙන්න"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; හට ඔබගේ දින දර්ශනය වෙත පිවිසීමට ඉඩ දෙන්නද?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ඡායාරූප සහ වීඩියෝ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ඔබගේ ඡායාරූප සහ වීඩියෝ වෙත පිවිසෙන්න"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; හට ටැග් කළ ස්ථාන ඇතුළුව, ඔබේ ඡායාරූප සහ වීඩියෝවලට ප්‍රවේශයට ඉඩ දෙන්න ද?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"කවුළු අන්න්තර්ගතය ලබාගන්න"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ඔබ අන්තර්ක්‍රියාකාරී වන කවුළුවේ අන්තර්ගතය පරීක්ෂා කරන්න."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ස්පර්ශයෙන් ගවේෂණය සක්‍රිය කරන්න"</string>
@@ -2025,4 +2022,6 @@
<item quantity="one">ගොනු<xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item>
<item quantity="other">ගොනු<xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 462a9e935be6..31fa1274b063 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -314,18 +314,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefón"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefonovanie a správu hovorov"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uskutočňovať a spravovať telefonické hovory?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Telové senzory"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"prístup k dátam senzorov vašich životných funkcií"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; používať údaje senzorov o vašich životných funkciách?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Hudba"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"prístup k hudbe"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Chcete povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prístup k hudbe?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotky a videá"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"prístup k fotkám a videám"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Chcete povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prístup k vašim fotkám a videám vrátane označených miest?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Načítať obsah okna"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Môžete preskúmať obsah okna, s ktorým pracujete."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Zapnúť funkciu Preskúmanie dotykom"</string>
@@ -2095,4 +2092,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> súborov</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> súbor</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 8157635ff021..067165b35134 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -314,18 +314,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"opravljanje in upravljanje telefonskih klicev"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Želite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; omogočiti opravljanje in upravljanje telefonskih klicev?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Tipala telesnih funkcij"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"dostop do podatkov tipala o vaših vitalnih znakih"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Želite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; omogočiti dostop do podatkov tipala o vitalnih znakih?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Glasba"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"dostop do glasbe"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Želite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; omogočiti dostop do glasbe?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotografije in videoposnetki"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"dostop do fotografij in videoposnetkov"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Želite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; omogočiti dostop do fotografij, videoposnetkov in v njih označenih lokacij?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pridobiti vsebino okna"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Preverjanje vsebine okna, ki ga uporabljate."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Vklopiti raziskovanje z dotikom"</string>
@@ -2095,4 +2092,6 @@
<item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> in še <xliff:g id="COUNT_3">%d</xliff:g> datoteke</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> in še <xliff:g id="COUNT_3">%d</xliff:g> datotek</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 0feeffa1733a..61703f30cd1a 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefoni"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"kryej dhe menaxho telefonata"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Të lejohet që &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; të kryejë dhe të menaxhojë telefonata?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Sensorët e trupit"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"qasu tek të dhënat e sensorëve rreth shenjave të tua jetësore"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Të lejohet që &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; të ketë qasje te të dhënat e sensorëve rreth shenjave të tua jetësore?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"qasu te muzika jote"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Të lejohet që &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; të ketë qasje te muzika jote?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotografitë dhe videot"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"qasu te fotografitë dhe videot e tua"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Të lejohet që &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; të qaset te fotografitë dhe videot e tua, duke përfshirë vendndodhjet e etiketuara?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Nxjerrë përmbajtjen e dritares"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspekton përmbajtjen e dritares me të cilën po ndërvepron."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivizojë funksionin \"Eksploro me prekje\""</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skedarë</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> skedar</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index e7b6b22bb91c..68c272cfa209 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -311,18 +311,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"упућује телефонске позиве и управља њима"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Желите ли да омогућите да &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; упућује позиве и управља њима?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Сензори за тело"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"приступа подацима сензора о виталним функцијама"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Желите ли да омогућите да &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;приступа подацима сензора о виталним функцијама?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музика"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"приступ музици"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Желите ли да омогућите да &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; приступа музици?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Слике и видео снимци"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"приступ сликама и видео снимцима"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Желите ли да дозволите да „<xliff:g id="APP_NAME">%1$s</xliff:g>“ приступа сликама и видео снимцима, укључујући означене локације?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"да преузима садржај прозора"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Проверава садржај прозора са којим остварујете интеракцију."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"да укључи Истраживања додиром"</string>
@@ -2059,4 +2056,6 @@
<item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> и још <xliff:g id="COUNT_3">%d</xliff:g> датотеке</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> и још <xliff:g id="COUNT_3">%d</xliff:g> датотека</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 698b342e45f3..aaf33bb2e390 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ringa och hantera telefonsamtal"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; behörighet att ringa och hantera telefonsamtal?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Kroppssensorer"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få åtkomst till sensordata om dina vitalparametrar"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomst till sensordata om vitalparametrar?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musik"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"åtkomstbehörighet till din musik"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomstbehörighet till din musik?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Foton och videor"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"åtkomstbehörighet till dina foton &amp; videor"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vill du tillåta att &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; får åtkomst till dina foton och videor, inklusive taggade platser?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Hämta fönsterinnehåll"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Granska innehållet i ett fönster som du interagerar med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivera Explore by touch"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> filer</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fil</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index db56058d8ea6..ae7531b04fcf 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Simu"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"piga na udhibiti simu"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ipige na kudhibiti simu?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Vihisi vya mwili"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"fikia data ya kitambuzi kuhusu alama zako muhimu"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie data ya vitambuzi kuhusu viashiria muhimu vya mwili wako?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muziki"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"kufikia muziki wako"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie muziki wako?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Picha na video"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"kufikia picha na video zako"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Ungependa kuruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ufikie picha na video zako, yakiwemo maeneo uliyotambulisha?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Kufikia maudhui ya dirisha"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kuchunguza maudhui ya dirisha unalotumia."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Kuwasha \'Chunguza kwa Kugusa\'"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other">Faili <xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item>
<item quantity="one">Faili <xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g></item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 2c3e5d71c516..16ea0b7c282b 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -1614,10 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"மேலோட்ட #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", பாதுகாப்பானது"</string>
- <!-- no translation found for activity_starter_block_bg_activity_starts_permissive (5692097903712956720) -->
- <skip />
- <!-- no translation found for activity_starter_block_bg_activity_starts_enforcing (8299522481076404353) -->
- <skip />
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> என்பதன் பின்னணிச் செயல்பாடு இனிவரும் Q பதிப்புகளில் தடுக்கப்படும். go/q-bg-block என்பதைப் பார்க்கவும்."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> என்பதன் பின்னணிச் செயல்பாடு தடுக்கப்பட்டுள்ளது. go/q-bg-block என்பதைப் பார்க்கவும்."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"வடிவத்தை மறந்துவிட்டீர்களா"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"தவறான வடிவம்"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"தவறான கடவுச்சொல்"</string>
@@ -2003,45 +2001,29 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"வழக்கமான பேட்டரி சேமிப்பானுக்கான விவர அறிவிப்பு"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"வழக்கமாகச் சார்ஜ் செய்வதற்கு முன்பே பேட்டரி தீர்ந்துபோகக்கூடும்"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"பேட்டரி நிலையை நீட்டிக்க பேட்டரி சேமிப்பான் இயக்கப்பட்டுள்ளது"</string>
- <!-- no translation found for mime_type_folder (7111951698626315204) -->
- <skip />
- <!-- no translation found for mime_type_apk (5518003630972506900) -->
- <skip />
- <!-- no translation found for mime_type_generic (6833871596845900027) -->
- <skip />
- <!-- no translation found for mime_type_generic_ext (8450275970061657174) -->
- <skip />
- <!-- no translation found for mime_type_audio (6289777657172050926) -->
- <skip />
- <!-- no translation found for mime_type_audio_ext (3270880987725816210) -->
- <skip />
- <!-- no translation found for mime_type_video (4093025777317307426) -->
- <skip />
- <!-- no translation found for mime_type_video_ext (5643771615714173159) -->
- <skip />
- <!-- no translation found for mime_type_image (3144284451605236371) -->
- <skip />
- <!-- no translation found for mime_type_image_ext (1514613218742736590) -->
- <skip />
- <!-- no translation found for mime_type_compressed (1645486037074943257) -->
- <skip />
- <!-- no translation found for mime_type_compressed_ext (4232293058067801528) -->
- <skip />
- <!-- no translation found for mime_type_document (1596838147256375966) -->
- <skip />
- <!-- no translation found for mime_type_document_ext (6327266601345501281) -->
- <skip />
- <!-- no translation found for mime_type_spreadsheet (2639138255207123557) -->
- <skip />
- <!-- no translation found for mime_type_spreadsheet_ext (5508653032786106725) -->
- <skip />
- <!-- no translation found for mime_type_presentation (6145604688774787357) -->
- <skip />
- <!-- no translation found for mime_type_presentation_ext (2982650207774823437) -->
- <skip />
+ <string name="mime_type_folder" msgid="7111951698626315204">"கோப்புறை"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android ஆப்ஸ்"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ஃபைல்"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ஃபைல்"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ஆடியோ"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> ஆடியோ"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"வீடியோ"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> வீடியோ"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"படம்"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> படம்"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"காப்பக ஃபைல்"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> காப்பக ஃபைல்"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"ஆவணம்"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> ஆவணம்"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"விரிதாள்"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> விரிதாள்"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"விளக்கக்காட்சி"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> விளக்கக்காட்சி"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ஏற்றுகிறது"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ஃபைல்கள்</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ஃபைல்</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index e113a432399d..ded03cc0b9b2 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ఫోన్"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ఫోన్ కాల్‌లు చేయడం మరియు నిర్వహించడం"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ఫోన్ కాల్‌లు చేయడానికి మరియు నిర్వహించడానికి &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని అనుమతించాలా?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"శరీర సెన్సార్‌లు"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని యాక్సెస్ చేస్తుంది"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని యాక్సెస్ చేయడానికి &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని అనుమతించాలా?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"సంగీతం"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"మీ సంగీతాన్ని యాక్సెస్ చేయండి"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"మీ సంగీతాన్ని యాక్సెస్ చేయడానికి &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని అనుమతించాలా?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"ఫోటోలు &amp; వీడియోలు"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"మీ ఫోటోలను &amp; వీడియోలను యాక్సెస్ చేయండి"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"ట్యాగ్ చేసిన స్థానాలతో సహా, మీ ఫోటోలు, వీడియోలను యాక్సెస్ చేయడానికి &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ను అనుమతించాలా?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"విండో కంటెంట్‍ను తిరిగి పొందుతుంది"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"మీరు పరస్పర చర్య చేస్తున్న విండో కంటెంట్‌‍ను పరిశీలిస్తుంది."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"తాకడం ద్వారా విశ్లేషణను ప్రారంభిస్తుంది"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ఫైల్‌లు</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ఫైల్</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 00c94da8d933..5b2541f1f2f9 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"โทรศัพท์"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"โทรและจัดการการโทร"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; โทรและจัดการการโทรไหม"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"เซ็นเซอร์ร่างกาย"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"เข้าถึงข้อมูลเซ็นเซอร์เกี่ยวกับสัญญาณชีพของคุณ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงข้อมูลเซ็นเซอร์เกี่ยวกับสัญญาณชีพไหม"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"เพลง"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"เข้าถึงเพลง"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงเพลงไหม"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"รูปภาพและวิดีโอ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"เข้าถึงรูปภาพและวิดีโอ"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงรูปภาพและวิดีโอของคุณ รวมถึงตำแหน่งที่ติดแท็กไหม"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"เรียกข้อมูลเนื้อหาของหน้าต่าง"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ตรวจสอบเนื้อหาของหน้าต่างที่คุณกำลังโต้ตอบอยู่"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"เปิด \"แตะเพื่อสำรวจ\""</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> และอีก <xliff:g id="COUNT_3">%d</xliff:g> ไฟล์</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> และอีก <xliff:g id="COUNT_1">%d</xliff:g> ไฟล์</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 036ce2578b77..4d7e7a26d24f 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telepono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"tumawag at mamahala ng mga tawag sa telepono"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Payagan ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na tumawag at mamahala ng mga tawag sa telepono?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Mga sensor ng katawan"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"i-access ang data ng sensor tungkol sa iyong vital signs"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Payagan ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na i-access ang data ng sensor tungkol sa iyong mga vital sign?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"i-access ang iyong musika"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Payagan ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na i-access ang iyong musika?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Mga larawan at video"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"i-access ang iyong mga larawan at video"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Payagan ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na i-access ang iyong mga larawan at video, kasama ang mga naka-tag na lokasyon?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Kunin ang content ng window"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Siyasatin ang nilalaman ng isang window kung saan ka nakikipag-ugnayan."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"I-on ang Explore by Touch"</string>
@@ -2023,4 +2020,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> file</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> na file</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 9e84f5a7e818..3e1bfb890651 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefon çağrıları yapma ve yönetme"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasının telefon etmesine ve çağrıları yönetmesine izin verilsin mi?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Vücut sensörleri"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"hayati belirtilerinizle ilgili sensör verilerine erişme"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasının hayati belirtilerinizle ilgili sensör verilerine erişmesine izin verilsin mi?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Müzik"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"müziğinize erişme"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasının müziğinize erişmesine izin veriyor musunuz?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotoğraflar ve videolar"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"fotoğraflarınıza ve videolarınıza erişme"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasına, etiketlenmiş yerler de dahil fotoğraf ve videolarınıza erişim izni verilsin mi?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pencere içeriğini alma"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Etkileşim kurduğunuz pencerenin içeriğini inceler."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Dokunarak Keşfet\'i açma"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> dosya</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> dosya</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 5f1fb17e855d..9ca44d9e3c95 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -314,18 +314,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"телефонувати та керувати дзвінками"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Дозволити додатку &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; здійснювати телефонні дзвінки та керувати ними?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Датчики на тілі"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"отримувати доступ до інформації датчиків про ваші життєві показники"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Надати додатку &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ до життєвих показників із датчиків?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музика"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"доступ до музики"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Надати додатку &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ до музики?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Фотографії та відео"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"доступ до фото й відео"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Дозволити додатку &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; отримувати доступ до ваших фотографій і відео, зокрема до позначок місцеположення?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Отримувати вміст вікна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Перевіряти вміст вікна, з яким ви взаємодієте."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Увімкнути функцію дослідження дотиком"</string>
@@ -2096,4 +2093,6 @@
<item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> і ще <xliff:g id="COUNT_3">%d</xliff:g> файлів</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> і ще <xliff:g id="COUNT_3">%d</xliff:g> файлу</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 57ff15cec275..22fbd56689d6 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"فون"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"فون کالز کریں اور ان کا نظم کریں"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"‏&lt;/b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو فون کالز کرنے اور ان کا نظم کرنے کی اجازت دیں؟"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"باڈی سینسرز"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"اپنی علامات حیات کے متعلق سنسر ڈیٹا تک رسائی حاصل کریں"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو آپ کے اہم اشاروں کے متعلق سینسر ڈیٹا تک رسائی کی اجازت دیں؟"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"موسیقی"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"اپنی موسیقی تک رسائی حاصل کریں"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو آپ کی موسیقی تک رسائی کی اجازت دیں؟"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"تصاویر اور ویڈیوز"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"اپنی تصاویر اور ویڈیوز تک رسائی حاصل کریں"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو ٹیگ کردہ مقامات سمیت آپ کی تصاویر اور ویڈیوز تک رسائی کی اجازت دیں؟"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ونڈو مواد بازیافت کرنے کی"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"کسی ایسی ونڈو کے مواد کا معائنہ کریں جس کے ساتھ آپ تعامل کر رہے ہیں۔"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ٹچ کے ذریعے دریافت کریں کو آن کرنے کی"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> فائلز</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> فائل</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index d6e2d0265211..eaf81d79ad50 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefon qo‘ng‘iroqlarini amalga oshirish va boshqarish"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun telefon chaqiruvlarini amalga oshirish va boshqarishga ruxsat berilsinmi?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Tana sezgichlari"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"organizm holati haqidagi sezgich ma’lumotlariga kirish"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun organizm holati haqidagi sezgichlar axborotlariga ruxsat berilsinmi?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musiqa"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"musiqaga kirish"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun musiqangizga kirishga ruxsat berilsinmi?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Surat va videolar"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"surat va videolarga kirish"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ilovasi uchun surat va videolaringizga, jumladan, teglangan joylarga ham ruxsat berilsinmi?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Oynadagi kontentni o‘qiydi"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Joriy oynadagi kontent mazmunini aniqlaydi."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Teginib o‘rganish xizmatini yoqadi"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ta fayl</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ta fayl</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 9d4fcc0f2c2e..5f237a7a5a56 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Điện thoại"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"thực hiện và quản lý cuộc gọi điện thoại"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; thực hiện và quản lý cuộc gọi điện thoại?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Cảm biến cơ thể"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"truy cập dữ liệu cảm biến về dấu hiệu sinh tồn của bạn"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào dữ liệu cảm biến về các dấu hiệu sinh tồn của bạn?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Nhạc"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"sử dụng nhạc"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Bạn có muốn cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; sử dụng nhạc không?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Ảnh và video"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"sử dụng ảnh và video"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào ảnh và video của bạn, bao gồm cả vị trí được gắn thẻ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Truy xuất nội dung cửa sổ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kiểm tra nội dung của cửa sổ bạn đang tương tác."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Bật Khám phá bằng cách chạm"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> tệp</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> tệp</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index fca067f12656..d7effc024750 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"电话"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"拨打电话和管理通话"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"允许“&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;”拨打电话和管理通话吗?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"身体传感器"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"访问与您的生命体征相关的传感器数据"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"允许&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;访问与您的生命体征相关的传感器数据吗?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"音乐"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"访问您的音乐"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"允许&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;访问您的音乐吗?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"照片和视频"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"访问您的照片和视频"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"允许&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;访问您的照片和视频(包括标记的位置)吗?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"检索窗口内容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"检测您正访问的窗口的内容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"启用触摸浏览"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> 个文件</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> 个文件</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 1bcb8ee91dce..20231fcee5e2 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"撥打電話及管理通話"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;撥打電話和管理通話嗎?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"人體感應器"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取與您生命體徵相關的感應器資料"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;存取與您身體機能相關的感應器資料嗎?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"音樂"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"存取您的音樂"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"要允許「&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;」存取您的音樂嗎?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"相片和影片"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"存取您的相片和影片"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;存取您的相片和影片 (包括標記的位置資訊) 嗎?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查您使用中的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"開啟「輕觸探索」功能"</string>
@@ -2023,4 +2020,6 @@
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> 個檔案</item>
<item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> 個檔案</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index cdfdd18ce23f..8fa7681e3ea2 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"撥打電話及管理通話"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」撥打電話及管理通話嗎?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"人體感測器"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取與你生命徵象相關的感應器資料"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取與你生命徵象相關的感應器資料嗎?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"音樂"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"存取你的音樂"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;存取你的音樂嗎?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"相片和影片"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"存取你的相片和影片"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;存取你的相片和影片 (包括加上標記的地點) 嗎?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查你存取的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"啟用輕觸探索功能"</string>
@@ -2024,4 +2021,6 @@
<item quantity="other">「<xliff:g id="FILE_NAME_2">%s</xliff:g>」及另外 <xliff:g id="COUNT_3">%d</xliff:g> 個檔案</item>
<item quantity="one">「<xliff:g id="FILE_NAME_0">%s</xliff:g>」及另外 <xliff:g id="COUNT_1">%d</xliff:g> 個檔案</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 7e28530d1602..93280cbc550c 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -308,18 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Ifoni"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"yenza uphinde uphathe amakholi wefoni"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vumela i-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ukuthi yenze iphinde iphathe amakholi efoni?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Izinzwa zomzimba"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"finyelela idatha yesizweli mayelana nezimpawu zakho ezibalulekile"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vumela i-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ukuthi ifinyelele kudatha yenzwa emayelana nezimpawu zakho ezibalulekile?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Umculo"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"finyelela umculo wakho"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vumela i-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ukuthi ifinyelele umculo wakho?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Izithombe Namavidiyo"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"finyelela izithombe zakho namavidiyo"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
- <skip />
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vumela &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ukufinyelela izithombe zakho namavidiyo, kufaka phakathi izindawo ezimakiwe?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Thola okuqukethwe kwewindi"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Hlola okuqukethwe kwewindi ohlanganyela nalo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Vula ukuhlola ngokuthinta"</string>
@@ -2023,4 +2020,6 @@
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> amafayela</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> amafayela</item>
</plurals>
+ <!-- no translation found for chooser_no_direct_share_targets (997970693708458895) -->
+ <skip />
</resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index ccd35cd1b634..b7f594e6924d 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -3933,7 +3933,7 @@
M5,17.5 V12 H3 L7,4.5 V10 h2 L5,17.5 z
</string>
<string name="config_batterymeterPowersavePath" translatable="false">
- M9,10l-2,0l0,-2l-2,0l0,2l-2,0l0,2l2,0l0,2l2,0l0,-2l2,0z
+ M9.75,10l-2.5,0l0,-2.5l-2.5,0l0,2.5l-2.5,0l0,2.5l2.5,0l0,2.5l2.5,0l0,-2.5l2.5,0z
</string>
<!-- A dual tone battery meter draws the perimeter path twice - once to define the shape
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index e01f4215b7f4..13551e71b371 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1380,7 +1380,6 @@
<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_auth_error" />
<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" />
@@ -2248,6 +2247,7 @@
<java-symbol type="anim" name="lock_lock" />
<java-symbol type="anim" name="lock_unlock" />
<java-symbol type="anim" name="lock_in" />
+ <java-symbol type="anim" name="lock_scanning" />
<java-symbol type="bool" name="config_alwaysUseCdmaRssi" />
<java-symbol type="dimen" name="status_bar_icon_size" />
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index 1764249de662..37913056fe8d 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -123,6 +123,9 @@
<uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" />
<uses-permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT" />
+ <!-- color extraction test permissions -->
+ <uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
+
<!-- accessibility test permissions -->
<uses-permission android:name="android.permission.RETRIEVE_WINDOW_CONTENT" />
diff --git a/core/tests/coretests/src/android/os/PowerManagerTest.java b/core/tests/coretests/src/android/os/PowerManagerTest.java
index 1b587dd92db0..576ac73bc183 100644
--- a/core/tests/coretests/src/android/os/PowerManagerTest.java
+++ b/core/tests/coretests/src/android/os/PowerManagerTest.java
@@ -41,7 +41,9 @@ public class PowerManagerTest extends AndroidTestCase {
private UiDevice mUiDevice;
private Executor mExec = Executors.newSingleThreadExecutor();
@Mock
- private PowerManager.ThermalStatusCallback mCallback;
+ private PowerManager.OnThermalStatusChangedListener mListener1;
+ @Mock
+ private PowerManager.OnThermalStatusChangedListener mListener2;
private static final long CALLBACK_TIMEOUT_MILLI_SEC = 5000;
/**
@@ -169,6 +171,11 @@ public class PowerManagerTest extends AndroidTestCase {
// TODO: Threaded test (needs handler) to make sure timed wakelocks work too
}
+ /**
+ * Confirm that we can get thermal status.
+ *
+ * @throws Exception
+ */
@Test
public void testGetThermalStatus() throws Exception {
int status = 0;
@@ -179,24 +186,57 @@ public class PowerManagerTest extends AndroidTestCase {
assertEquals(status, mPm.getCurrentThermalStatus());
}
+ /**
+ * Confirm that we can add/remove thermal status listener.
+ *
+ * @throws Exception
+ */
@Test
public void testThermalStatusCallback() throws Exception {
- mPm.registerThermalStatusCallback(mCallback, mExec);
- verify(mCallback, timeout(CALLBACK_TIMEOUT_MILLI_SEC)
- .times(1)).onStatusChange(0);
- reset(mCallback);
- int status = 3;
+ // Initial override status is THERMAL_STATUS_NONE
+ int status = PowerManager.THERMAL_STATUS_NONE;
+ // Add listener1
+ mPm.addThermalStatusListener(mExec, mListener1);
+ verify(mListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC)
+ .times(1)).onThermalStatusChanged(status);
+ reset(mListener1);
+ status = PowerManager.THERMAL_STATUS_SEVERE;
mUiDevice.executeShellCommand("cmd thermalservice override-status "
+ Integer.toString(status));
- verify(mCallback, timeout(CALLBACK_TIMEOUT_MILLI_SEC)
- .times(1)).onStatusChange(status);
- reset(mCallback);
- mPm.unregisterThermalStatusCallback(mCallback);
- status = 2;
+ verify(mListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC)
+ .times(1)).onThermalStatusChanged(status);
+ reset(mListener1);
+ // Add listener1 again
+ try {
+ mPm.addThermalStatusListener(mListener1);
+ fail("Expected exception not thrown");
+ } catch (IllegalArgumentException expectedException) {
+ }
+ // Add listener2 on main thread.
+ mPm.addThermalStatusListener(mListener2);
+ status = PowerManager.THERMAL_STATUS_MODERATE;
mUiDevice.executeShellCommand("cmd thermalservice override-status "
+ Integer.toString(status));
- verify(mCallback, timeout(CALLBACK_TIMEOUT_MILLI_SEC)
- .times(0)).onStatusChange(status);
-
+ verify(mListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC)
+ .times(1)).onThermalStatusChanged(status);
+ verify(mListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC)
+ .times(1)).onThermalStatusChanged(status);
+ reset(mListener1);
+ reset(mListener2);
+ // Remove listener1
+ mPm.removeThermalStatusListener(mListener1);
+ // Remove listener1 again
+ try {
+ mPm.removeThermalStatusListener(mListener1);
+ fail("Expected exception not thrown");
+ } catch (IllegalArgumentException expectedException) {
+ }
+ status = PowerManager.THERMAL_STATUS_LIGHT;
+ mUiDevice.executeShellCommand("cmd thermalservice override-status "
+ + Integer.toString(status));
+ verify(mListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC)
+ .times(0)).onThermalStatusChanged(status);
+ verify(mListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC)
+ .times(1)).onThermalStatusChanged(status);
}
}
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 67e364ba8032..43f8db1a32e5 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -643,6 +643,7 @@ public class SettingsBackupTest {
Settings.Secure.LAST_SETUP_SHOWN,
Settings.Secure.LOCATION_CHANGER,
Settings.Secure.LOCATION_MODE,
+ Settings.Secure.LOCATION_PERMISSIONS_UPGRADE_TO_Q_MODE,
Settings.Secure.LOCK_SCREEN_ALLOW_REMOTE_INPUT, // Candidate?
Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT,
Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java
index 83c8b01e6ad6..fd3773588299 100644
--- a/graphics/java/android/graphics/BaseCanvas.java
+++ b/graphics/java/android/graphics/BaseCanvas.java
@@ -425,8 +425,8 @@ public abstract class BaseCanvas {
* Make lint happy.
* See {@link Canvas#drawDoubleRoundRect(RectF, float[], RectF, float[], Paint)}
*/
- public void drawDoubleRoundRect(@NonNull RectF outer, float[] outerRadii,
- @NonNull RectF inner, float[] innerRadii, @NonNull Paint paint) {
+ public void drawDoubleRoundRect(@NonNull RectF outer, @NonNull float[] outerRadii,
+ @NonNull RectF inner, @NonNull float[] innerRadii, @NonNull Paint paint) {
throwIfHasHwBitmapInSwMode(paint);
if (innerRadii == null || outerRadii == null
|| innerRadii.length != 8 || outerRadii.length != 8) {
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 034dff09946d..8f46e1acc2ba 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -2018,8 +2018,8 @@ public class Canvas extends BaseCanvas {
* @param paint The paint used to draw the double roundRect
*/
@Override
- public void drawDoubleRoundRect(@NonNull RectF outer, float[] outerRadii,
- @NonNull RectF inner, float[] innerRadii, @NonNull Paint paint) {
+ public void drawDoubleRoundRect(@NonNull RectF outer, @NonNull float[] outerRadii,
+ @NonNull RectF inner, @NonNull float[] innerRadii, @NonNull Paint paint) {
super.drawDoubleRoundRect(outer, outerRadii, inner, innerRadii, paint);
}
diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java
index 7345ea4db43d..bc744cc7af3d 100644
--- a/graphics/java/android/graphics/HardwareRenderer.java
+++ b/graphics/java/android/graphics/HardwareRenderer.java
@@ -170,13 +170,14 @@ public class HardwareRenderer {
/**
* Destroys the rendering context of this HardwareRenderer. This destroys the resources
- * associated with this renderer and releases the currently set {@link Surface}.
+ * associated with this renderer and releases the currently set {@link Surface}. This must
+ * be called when this HardwareRenderer is no longer needed.
*
* <p>The renderer may be restored from this state by setting a new {@link Surface}, setting
* new rendering content with {@link #setContentRoot(RenderNode)}, and resuming
* rendering by issuing a new {@link FrameRenderRequest}.
*
- * <p>It is suggested to call this in response to callbacks such as
+ * <p>It is recommended to call this in response to callbacks such as
* {@link android.view.SurfaceHolder.Callback#surfaceDestroyed(SurfaceHolder)}.
*
* <p>Note that if there are any outstanding frame commit callbacks they may never being
@@ -383,7 +384,7 @@ public class HardwareRenderer {
* The system internally may reuse instances of {@link FrameRenderRequest} to reduce
* allocation churn.
*
- * @return The result of the sync operation. See {@link SyncAndDrawResult}.
+ * @return The result of the sync operation.
*/
@SyncAndDrawResult
public int syncAndDraw() {
@@ -456,12 +457,37 @@ public class HardwareRenderer {
* and {@link Activity#onStart()}.
*
* @param stopped true to stop all rendering, false to resume
+ * @hide
*/
public void setStopped(boolean stopped) {
nSetStopped(mNativeProxy, stopped);
}
/**
+ * Hard stops rendering into the surface. If the renderer is stopped it will
+ * block any attempt to render. Calls to {@link FrameRenderRequest#syncAndDraw()} will
+ * still sync over the latest rendering content, however they will not render and instead
+ * {@link #SYNC_CONTEXT_IS_STOPPED} will be returned.
+ *
+ * <p>This is useful in combination with lifecycle events such as {@link Activity#onStop()}.
+ * See {@link #start()} for resuming rendering.
+ */
+ public void stop() {
+ nSetStopped(mNativeProxy, true);
+ }
+
+ /**
+ * Resumes rendering into the surface. Any pending rendering requests
+ * will produce a new frame at the next vsync signal.
+ *
+ * <p>This is useful in combination with lifecycle events such as {@link Activity#onStart()}.
+ * See {@link #stop()} for stopping rendering.
+ */
+ public void start() {
+ nSetStopped(mNativeProxy, false);
+ }
+
+ /**
* Destroys all the display lists associated with the current rendering content.
* This includes releasing a reference to the current content root RenderNode. It will
* therefore be necessary to call {@link #setContentRoot(RenderNode)} in order to resume
@@ -473,7 +499,7 @@ public class HardwareRenderer {
* {@link android.content.ComponentCallbacks2#onTrimMemory(int)} signals such as
* {@link android.content.ComponentCallbacks2#TRIM_MEMORY_UI_HIDDEN}
*
- * See also {@link #setStopped(boolean)}
+ * See also {@link #stop()}.
*/
public void clearContent() {
nDestroyHardwareResources(mNativeProxy);
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 28937a65ad0d..91d2069c57a7 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -1791,13 +1791,14 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection,
// MicrophoneDirection
//--------------------
/**
- * Specifies the logical microphone (for processing).
+ * Specifies the logical microphone (for processing). Applications can use this to specify
+ * which side of the device to optimize capture from. Typically used in conjunction with
+ * the camera capturing video.
*
- * @param direction Direction constant.
* @return true if sucessful.
*/
- public boolean setMicrophoneDirection(int direction) {
- return native_set_microphone_direction(direction) == 0;
+ public boolean setMicrophoneDirection(@DirectionMode int direction) {
+ return native_set_microphone_direction(direction) == AudioSystem.SUCCESS;
}
/**
@@ -1809,7 +1810,9 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection,
* @return true if sucessful.
*/
public boolean setMicrophoneFieldDimension(@FloatRange(from = -1.0, to = 1.0) float zoom) {
- return native_set_microphone_field_dimension(zoom) == 0;
+ Preconditions.checkArgument(
+ zoom >= -1 && zoom <= 1, "Argument must fall between -1 & 1 (inclusive)");
+ return native_set_microphone_field_dimension(zoom) == AudioSystem.SUCCESS;
}
//---------------------------------------------------------
@@ -1984,41 +1987,45 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection,
{
private MetricsConstants() {}
+ // MM_PREFIX is slightly different than TAG, used to avoid cut-n-paste errors.
+ private static final String MM_PREFIX = "android.media.audiorecord.";
+
/**
- * Key to extract the output format being recorded
+ * Key to extract the audio data encoding for this track
* from the {@link AudioRecord#getMetrics} return value.
- * The value is a String.
+ * The value is a {@code String}.
*/
- public static final String ENCODING = "android.media.audiorecord.encoding";
+ public static final String ENCODING = MM_PREFIX + "encoding";
/**
- * Key to extract the Source Type for this track
+ * Key to extract the source type for this track
* from the {@link AudioRecord#getMetrics} return value.
- * The value is a String.
+ * The value is a {@code String}.
*/
- public static final String SOURCE = "android.media.audiorecord.source";
+ public static final String SOURCE = MM_PREFIX + "source";
/**
* Key to extract the estimated latency through the recording pipeline
* from the {@link AudioRecord#getMetrics} return value.
* This is in units of milliseconds.
- * The value is an integer.
+ * The value is an {@code int}.
+ * @deprecated Not properly supported in the past.
*/
- public static final String LATENCY = "android.media.audiorecord.latency";
+ @Deprecated
+ public static final String LATENCY = MM_PREFIX + "latency";
/**
* Key to extract the sink sample rate for this record track in Hz
* from the {@link AudioRecord#getMetrics} return value.
- * The value is an integer.
+ * The value is an {@code int}.
*/
- public static final String SAMPLERATE = "android.media.audiorecord.samplerate";
+ public static final String SAMPLERATE = MM_PREFIX + "samplerate";
/**
* Key to extract the number of channels being recorded in this record track
* from the {@link AudioRecord#getMetrics} return value.
- * The value is an integer.
+ * The value is an {@code int}.
*/
- public static final String CHANNELS = "android.media.audiorecord.channels";
-
+ public static final String CHANNELS = MM_PREFIX + "channels";
}
}
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 7cfe0dd4b596..a15d322cf8fd 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -3580,41 +3580,49 @@ public class AudioTrack extends PlayerBase
{
private MetricsConstants() {}
+ // MM_PREFIX is slightly different than TAG, used to avoid cut-n-paste errors.
+ private static final String MM_PREFIX = "android.media.audiotrack.";
+
/**
- * Key to extract the Stream Type for this track
+ * Key to extract the stream type for this track
* from the {@link AudioTrack#getMetrics} return value.
- * The value is a String.
+ * This value may not exist in API level {@link android.os.Build.VERSION_CODES#P}.
+ * The value is a {@code String}.
*/
- public static final String STREAMTYPE = "android.media.audiotrack.streamtype";
+ public static final String STREAMTYPE = MM_PREFIX + "streamtype";
/**
- * Key to extract the Content Type for this track
+ * Key to extract the attribute content type for this track
* from the {@link AudioTrack#getMetrics} return value.
- * The value is a String.
+ * The value is a {@code String}.
*/
- public static final String CONTENTTYPE = "android.media.audiotrack.type";
+ public static final String CONTENTTYPE = MM_PREFIX + "type";
/**
- * Key to extract the Content Type for this track
+ * Key to extract the attribute usage for this track
* from the {@link AudioTrack#getMetrics} return value.
- * The value is a String.
+ * The value is a {@code String}.
*/
- public static final String USAGE = "android.media.audiotrack.usage";
+ public static final String USAGE = MM_PREFIX + "usage";
/**
* Key to extract the sample rate for this track in Hz
* from the {@link AudioTrack#getMetrics} return value.
- * The value is an integer.
+ * The value is an {@code int}.
+ * @deprecated This does not work. Use {@link AudioTrack#getSampleRate()} instead.
*/
+ @Deprecated
public static final String SAMPLERATE = "android.media.audiorecord.samplerate";
/**
- * Key to extract the channel mask information for this track
+ * Key to extract the native channel mask information for this track
* from the {@link AudioTrack#getMetrics} return value.
*
- * The value is a Long integer.
+ * The value is a {@code long}.
+ * @deprecated This does not work. Use {@link AudioTrack#getFormat()} and read from
+ * the returned format instead.
*/
+ @Deprecated
public static final String CHANNELMASK = "android.media.audiorecord.channelmask";
-
}
}
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 1304afe3654e..e7b4752701fb 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -17,6 +17,7 @@
package android.media;
import android.annotation.CallbackExecutor;
+import android.annotation.FloatRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -35,6 +36,7 @@ import android.util.Pair;
import android.view.Surface;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.Preconditions;
import java.io.File;
import java.io.FileDescriptor;
@@ -45,7 +47,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
-
/**
* Used to record audio and video. The recording control is based on a
* simple state machine (see below).
@@ -90,7 +91,8 @@ import java.util.concurrent.Executor;
*/
public class MediaRecorder implements AudioRouting,
AudioRecordingMonitor,
- AudioRecordingMonitorClient
+ AudioRecordingMonitorClient,
+ MicrophoneDirection
{
static {
System.loadLibrary("media_jni");
@@ -1527,6 +1529,36 @@ public class MediaRecorder implements AudioRouting,
ArrayList<MicrophoneInfo> activeMicrophones);
//--------------------------------------------------------------------------
+ // MicrophoneDirection
+ //--------------------
+ /**
+ * Specifies the logical microphone (for processing).
+ *
+ * @param direction Direction constant.
+ * @return true if sucessful.
+ */
+ public boolean setMicrophoneDirection(@DirectionMode int direction) {
+ return native_setMicrophoneDirection(direction) == 0;
+ }
+
+ /**
+ * Specifies the zoom factor (i.e. the field dimension) for the selected microphone
+ * (for processing). The selected microphone is determined by the use-case for the stream.
+ *
+ * @param zoom the desired field dimension of microphone capture. Range is from -1 (wide angle),
+ * though 0 (no zoom) to 1 (maximum zoom).
+ * @return true if sucessful.
+ */
+ public boolean setMicrophoneFieldDimension(@FloatRange(from = -1.0, to = 1.0) float zoom) {
+ Preconditions.checkArgument(
+ zoom >= -1 && zoom <= 1, "Argument must fall between -1 & 1 (inclusive)");
+ return native_setMicrophoneFieldDimension(zoom) == 0;
+ }
+
+ private native int native_setMicrophoneDirection(int direction);
+ private native int native_setMicrophoneFieldDimension(float zoom);
+
+ //--------------------------------------------------------------------------
// Implementation of AudioRecordingMonitor interface
//--------------------
diff --git a/media/java/android/media/MicrophoneDirection.java b/media/java/android/media/MicrophoneDirection.java
index 489e2683259e..2382da54801c 100644
--- a/media/java/android/media/MicrophoneDirection.java
+++ b/media/java/android/media/MicrophoneDirection.java
@@ -22,6 +22,10 @@ import android.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+/**
+ * Interface defining mechanism for controlling the directionality and field width of
+ * audio capture.
+ */
public interface MicrophoneDirection {
/**
* Don't do any directionality processing of the activated microphone(s).
@@ -41,21 +45,23 @@ public interface MicrophoneDirection {
int MIC_DIRECTION_EXTERNAL = 3;
/** @hide */
- @IntDef({
+ /*public*/ @IntDef({
MIC_DIRECTION_UNSPECIFIED,
MIC_DIRECTION_FRONT,
MIC_DIRECTION_BACK,
MIC_DIRECTION_EXTERNAL
})
@Retention(RetentionPolicy.SOURCE)
- public @interface Directionmode{};
+ @interface DirectionMode{};
/**
- * Specifies the logical microphone (for processing).
+ * Specifies the logical microphone (for processing). Applications can use this to specify
+ * which side of the device to optimize capture from. Typically used in conjunction with
+ * the camera capturing video.
*
* @param direction Direction constant.
* @return true if sucessful.
*/
- boolean setMicrophoneDirection(@Directionmode int direction);
+ boolean setMicrophoneDirection(@DirectionMode int direction);
/**
* Specifies the zoom factor (i.e. the field dimension) for the selected microphone
diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp
index a7c015932441..3ec0903472bc 100644
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -760,6 +760,44 @@ android_media_MediaRecord_getActiveMicrophones(JNIEnv *env,
return jStatus;
}
+static jint android_media_MediaRecord_setMicrophoneDirection(
+ JNIEnv *env, jobject thiz, jint direction) {
+ ALOGV("setMicrophoneDirection(%d)", direction);
+ sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
+ if (mr == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return (jint)AUDIO_JAVA_NO_INIT;
+ }
+
+ jint jStatus = AUDIO_JAVA_SUCCESS;
+ status_t status =
+ mr->setMicrophoneDirection(static_cast<audio_microphone_direction_t>(direction));
+ if (status != NO_ERROR) {
+ jStatus = nativeToJavaStatus(status);
+ }
+
+ return jStatus;
+}
+
+static jint android_media_MediaRecord_setMicrophoneFieldDimension(
+ JNIEnv *env, jobject thiz, jfloat zoom) {
+ ALOGV("setMicrophoneFieldDimension(%f)", zoom);
+ sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
+ if (mr == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return (jint)AUDIO_JAVA_NO_INIT;
+ }
+
+ jint jStatus = AUDIO_JAVA_SUCCESS;
+ status_t status = mr->setMicrophoneFieldDimension(zoom);
+ if (status != NO_ERROR) {
+ jStatus = nativeToJavaStatus(status);
+ }
+
+ return jStatus;
+
+}
+
static jint android_media_MediaRecord_getPortId(JNIEnv *env, jobject thiz) {
sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
if (mr == NULL) {
@@ -812,6 +850,8 @@ static const JNINativeMethod gMethods[] = {
{"native_getActiveMicrophones", "(Ljava/util/ArrayList;)I", (void *)android_media_MediaRecord_getActiveMicrophones},
{"native_getPortId", "()I", (void *)android_media_MediaRecord_getPortId},
+ {"native_setMicrophoneDirection", "(I)I", (void *)android_media_MediaRecord_setMicrophoneDirection},
+ {"native_setMicrophoneFieldDimension", "(F)I", (void *)android_media_MediaRecord_setMicrophoneFieldDimension},
};
// This function only registers the native methods, and is called from
diff --git a/packages/ExtServices/Android.mk b/packages/ExtServices/Android.mk
index 467d7ed202cd..1133499c87df 100644
--- a/packages/ExtServices/Android.mk
+++ b/packages/ExtServices/Android.mk
@@ -33,6 +33,8 @@ LOCAL_PROGUARD_FLAG_FILES := proguard.proguard
LOCAL_PRIVILEGED_MODULE := true
+LOCAL_MIN_SDK_VERSION := 28
+
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
diff --git a/packages/ExtServices/AndroidManifest.xml b/packages/ExtServices/AndroidManifest.xml
index 48c72ba2c995..e47d53ca7692 100644
--- a/packages/ExtServices/AndroidManifest.xml
+++ b/packages/ExtServices/AndroidManifest.xml
@@ -27,6 +27,10 @@
<uses-permission android:name="android.permission.MONITOR_DEFAULT_SMS_PACKAGE" />
<uses-permission android:name="android.permission.REQUEST_NOTIFICATION_ASSISTANT_SERVICE" />
+ <uses-sdk
+ android:targetSdkVersion="28"
+ />
+
<application android:label="@string/app_name"
android:defaultToDeviceProtectedStorage="true"
android:directBootAware="true">
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt b/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt
index 911cfcd115f4..a62872cd0ffd 100644
--- a/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt
@@ -129,6 +129,14 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
p.style = Paint.Style.FILL_AND_STROKE
}
+ private val errorPaint = Paint(Paint.ANTI_ALIAS_FLAG).also { p ->
+ p.color = Utils.getColorErrorDefaultColor(context)
+ p.alpha = 255
+ p.isDither = true
+ p.strokeWidth = 0f
+ p.style = Paint.Style.FILL_AND_STROKE
+ }
+
// Only used if dualTone is set to true
private val dualToneBackgroundFill = Paint(Paint.ANTI_ALIAS_FLAG).also { p ->
p.color = frameColor
@@ -179,7 +187,7 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
// The perimeter should never change
unifiedPath.addPath(scaledPerimeter)
- // IF drawing dual tone, the level is used only to clip the whole drawable path
+ // If drawing dual tone, the level is used only to clip the whole drawable path
if (!dualTone) {
unifiedPath.op(levelPath, Path.Op.UNION)
}
@@ -196,9 +204,7 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
} else if (powerSaveEnabled) {
// Clip out the plus shape
unifiedPath.op(scaledPlus, Path.Op.DIFFERENCE)
- if (!invertFillIcon) {
- c.drawPath(scaledPlus, fillPaint)
- }
+ c.drawPath(scaledPlus, errorPaint)
}
if (dualTone) {
@@ -235,12 +241,12 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
c.drawPath(scaledBolt, fillColorStrokeProtection)
}
} else if (powerSaveEnabled) {
+ // If power save is enabled draw the perimeter path with colorError
+ c.drawPath(scaledPerimeter, errorPaint)
+
+ // But always put path protection around the plus sign
c.clipOutPath(scaledPlus)
- if (invertFillIcon) {
- c.drawPath(scaledPlus, fillColorStrokePaint)
- } else {
- c.drawPath(scaledPlus, fillColorStrokeProtection)
- }
+ c.drawPath(scaledPlus, fillColorStrokeProtection)
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
index 43c97df24a58..52d7e2cedeb7 100644
--- a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
@@ -195,19 +195,12 @@ public class PowerUtil {
}
private static String getRegularTimeRemainingShortString(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));
- CharSequence timeString = fmt.format(date);
+ // Get the time remaining rounded to the nearest 15 min
+ final long roundedTimeMs = roundTimeToNearestThreshold(drainTimeMs, FIFTEEN_MINUTES_MILLIS);
+ CharSequence timeString = StringUtil.formatElapsedTime(context, roundedTimeMs,
+ false /* withSeconds */);
- return context.getString(R.string.power_discharge_by_only_short, timeString);
+ return context.getString(R.string.power_remaining_duration_only_short, timeString);
}
public static long convertUsToMs(long timeUs) {
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index f7f34f676230..2d5606cf4b97 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -1977,6 +1977,9 @@ class SettingsProtoDumpUtil {
dumpSetting(s, p,
Settings.Secure.LOCATION_CHANGER,
SecureSettingsProto.Location.CHANGER);
+ dumpSetting(s, p,
+ Settings.Secure.LOCATION_PERMISSIONS_UPGRADE_TO_Q_MODE,
+ SecureSettingsProto.Location.PERMISSIONS_UPGRADE_TO_Q_MODE);
p.end(locationToken);
final long locationAccessCheckToken = p.start(SecureSettingsProto.LOCATION_ACCESS_CHECK);
diff --git a/packages/SystemUI/docs/dagger.md b/packages/SystemUI/docs/dagger.md
index cca2d13521ce..c2159df1cee1 100644
--- a/packages/SystemUI/docs/dagger.md
+++ b/packages/SystemUI/docs/dagger.md
@@ -13,39 +13,47 @@ TODO: Add some links.
## State of the world
Dagger 2 has been turned on for SystemUI and a early first pass has been taken
-for converting everything in Dependency.java to use Dagger. Since a lot of
-SystemUI depends on Dependency, stubs have been added to Dependency to proxy
-any gets through to the instances provided by dagger, this will allow migration
-of SystemUI through a number of CLs.
+for converting everything in [Dependency.java](packages/systemui/src/com/android/systemui/Dependency.java)
+to use Dagger. Since a lot of SystemUI depends on Dependency, stubs have been added to Dependency
+to proxy any gets through to the instances provided by dagger, this will allow migration of SystemUI
+through a number of CLs.
### How it works in SystemUI
For the classes that we're using in Dependency and are switching to dagger, the
-equivalent dagger version is using @Singleton and only having one instance.
+equivalent dagger version is using `@Singleton` and therefore only has one instance.
To have the single instance span all of SystemUI and be easily accessible for
-other components, there is a single root Component that exists that generates
-these. The component lives in SystemUIFactory and is called SystemUIRootComponent.
+other components, there is a single root `@Component` that exists that generates
+these. The component lives in [SystemUIFactory](packages/systemui/src/com/android/systemui/SystemUIFactory.java)
+and is called `SystemUIRootComponent`.
```java
+
@Singleton
-@Component(modules = {SystemUIFactory.class, DependencyProvider.class, ContextHolder.class})
+@Component(modules = {SystemUIFactory.class, DependencyProvider.class, DependencyBinder.class,
+ ContextHolder.class})
public interface SystemUIRootComponent {
@Singleton
Dependency.DependencyInjector createDependency();
}
```
-The root modules are what provides the global singleton dependencies across
-SystemUI. ContextHolder is just a wrapper that provides a context.
-SystemUIFactory @Provide dependencies that need to be overridden by SystemUI
-variants (like other form factors). DependencyBinder creates the mapping from
-interfaces to implementation classes. DependencyProvider provides or binds any
-remaining depedencies required.
+The root component is composed of root modules, which in turn provide the global singleton
+dependencies across all of SystemUI.
+
+- `ContextHolder` is just a wrapper that provides a context.
+
+- `SystemUIFactory` `@Provides` dependencies that need to be overridden by SystemUI
+variants (like other form factors e.g. Car).
+
+- `DependencyBinder` creates the mapping from interfaces to implementation classes.
+
+- `DependencyProvider` provides or binds any remaining depedencies required.
### Adding injection to a new SystemUI object
-Anything that depends on any @Singleton provider from SystemUIRootComponent
-should be declared as a Subcomponent of the root component, this requires
+Anything that depends on any `@Singleton` provider from SystemUIRootComponent
+should be declared as an `@Subcomponent` of the root component, this requires
declaring your own interface for generating your own modules or just the
object you need injected. The subcomponent also needs to be added to
SystemUIRootComponent in SystemUIFactory so it can be acquired.
@@ -57,7 +65,7 @@ public interface SystemUIRootComponent {
}
public class Dependency extends SystemUI {
- ...
+ //...
+ @Subcomponent
+ public interface DependencyInjector {
+ Dependency createSystemUI();
@@ -65,9 +73,9 @@ public class Dependency extends SystemUI {
}
```
-For objects that extend SystemUI and require injection, you can define an
+For objects which extend SystemUI and require injection, you can define an
injector that creates the injected object for you. This other class should
-be referenced in @string/config_systemUIServiceComponents.
+be referenced in [@string/config_systemUIServiceComponents](packages/SystemUI/res/values/config.xml).
```java
public static class DependencyCreator implements Injector {
@@ -82,7 +90,7 @@ public static class DependencyCreator implements Injector {
### Adding a new injectable object
-First tag the constructor with @Inject. Also tag it with @Singleton if only one
+First tag the constructor with `@Inject`. Also tag it with `@Singleton` if only one
instance should be created.
```java
@@ -97,14 +105,14 @@ public class SomethingController {
```
If you have an interface class and an implementation class, dagger needs to know
-how to map it. The simplest way to do this is to add a provides method to
-DependencyProvider.
+how to map it. The simplest way to do this is to add an `@Provides` method to
+DependencyProvider. The type of the return value tells dagger which dependency it's providing.
```java
public class DependencyProvider {
- ...
+ //...
@Singleton
- @Provide
+ @Provides
public SomethingController provideSomethingController(Context context,
@Named(MAIN_HANDLER_NAME) Handler mainHandler) {
return new SomethingControllerImpl(context, mainHandler);
@@ -118,11 +126,11 @@ to the following diff.
```java
public class Dependency {
- ...
+ //...
@Inject Lazy<SomethingController> mSomethingController;
- ...
+ //...
public void start() {
- ...
+ //...
mProviders.put(SomethingController.class, mSomethingController::get);
}
}
@@ -192,7 +200,7 @@ the @Named view context.
```java
public CustomView(@Named(VIEW_CONTEXT) Context themedViewContext, AttributeSet attrs,
OtherCustomDependency something) {
- ...
+ //...
}
```
diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml
index 53b3a7e2f34b..d4957c903a49 100644
--- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml
+++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml
@@ -85,7 +85,7 @@
android:layout_marginBottom="@dimen/keyguard_lock_padding"
android:src="@*android:drawable/ic_lock_24dp"
android:contentDescription="@string/accessibility_unlock_button"
- android:scaleType="fitCenter" />
+ android:scaleType="center" />
<FrameLayout
android:id="@+id/overlay_container"
diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml
index 5ecd380c6950..bfd079b59054 100644
--- a/packages/SystemUI/res/layout/mobile_signal_group.xml
+++ b/packages/SystemUI/res/layout/mobile_signal_group.xml
@@ -65,8 +65,8 @@
android:layout_gravity="center_vertical">
<com.android.systemui.statusbar.AnimatedImageView
android:id="@+id/mobile_signal"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
+ android:layout_height="@dimen/qs_header_mobile_icon_size"
+ android:layout_width="@dimen/qs_header_mobile_icon_size"
systemui:hasOverlappingRendering="false"
/>
<ImageView
diff --git a/packages/SystemUI/res/layout/qs_footer_carrier.xml b/packages/SystemUI/res/layout/qs_carrier.xml
index bd492b022e36..6edccbabb823 100644
--- a/packages/SystemUI/res/layout/qs_footer_carrier.xml
+++ b/packages/SystemUI/res/layout/qs_carrier.xml
@@ -14,36 +14,33 @@
~ limitations under the License
-->
-<LinearLayout
+<com.android.systemui.qs.QSCarrier
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/linear_footer_carrier"
- android:layout_width="0dp"
+ android:id="@+id/linear_carrier"
+ android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"
- android:layout_weight="1"
android:gravity="center_vertical|start"
android:background="@android:color/transparent"
android:clickable="false"
android:clipChildren="false"
- android:clipToPadding="false"
- android:paddingStart="16dp" >
+ android:clipToPadding="false" >
<include
layout="@layout/mobile_signal_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginEnd="8dp"
+ android:layout_marginEnd="@dimen/qs_carrier_margin_width"
android:visibility="gone" />
- <view class="com.android.systemui.qs.QSFooterImpl$QSCarrierText"
+ <view class="com.android.systemui.qs.QSCarrier$QSCarrierText"
android:id="@+id/qs_carrier_text"
- android:layout_width="0dp"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:ellipsize="marquee"
- android:textAppearance="@style/TextAppearance.QS.CarrierInfo"
- android:textColor="?android:attr/textColorPrimary"
+ android:textAppearance="@style/TextAppearance.QS.Status"
android:textDirection="locale"
- android:singleLine="true" />
+ android:singleLine="true"
+ android:maxEms="7"/>
-</LinearLayout> \ No newline at end of file
+</com.android.systemui.qs.QSCarrier> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/qs_carrier_group.xml b/packages/SystemUI/res/layout/qs_carrier_group.xml
new file mode 100644
index 000000000000..20190b7fff0d
--- /dev/null
+++ b/packages/SystemUI/res/layout/qs_carrier_group.xml
@@ -0,0 +1,58 @@
+<!--
+ 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
+ -->
+
+<!-- Extends LinearLayout -->
+<com.android.systemui.qs.QSCarrierGroup
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/qs_mobile"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:gravity="end|center_vertical"
+ android:orientation="horizontal">
+
+
+ <include
+ layout="@layout/qs_carrier"
+ android:id="@+id/carrier1"
+ android:layout_weight="1"/>
+
+ <View
+ android:id="@+id/qs_carrier_divider1"
+ android:layout_width="@dimen/qs_header_carrier_separator_width"
+ android:layout_height="match_parent"
+ android:visibility="gone" />
+
+ <include
+ layout="@layout/qs_carrier"
+ android:id="@+id/carrier2"
+ android:layout_weight="1"
+ android:visibility="gone"/>
+
+ <View
+ android:id="@+id/qs_carrier_divider2"
+ android:layout_width="@dimen/qs_header_carrier_separator_width"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:visibility="gone" />
+
+ <include
+ layout="@layout/qs_carrier"
+ android:id="@+id/carrier3"
+ android:layout_weight="1"
+ android:visibility="gone"/>
+
+</com.android.systemui.qs.QSCarrierGroup> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml
index 67e31ac7f9da..669d53bfdc60 100644
--- a/packages/SystemUI/res/layout/qs_footer_impl.xml
+++ b/packages/SystemUI/res/layout/qs_footer_impl.xml
@@ -21,6 +21,8 @@
android:id="@+id/qs_footer"
android:layout_width="match_parent"
android:layout_height="@dimen/qs_footer_height"
+ android:layout_marginStart="@dimen/qs_footer_margin"
+ android:layout_marginEnd="@dimen/qs_footer_margin"
android:elevation="4dp"
android:background="@android:color/transparent"
android:baselineAligned="false"
@@ -41,34 +43,35 @@
android:layout_gravity="center_vertical"
android:gravity="end" >
- <LinearLayout
- android:id="@+id/qs_mobile"
- android:layout_width="0dp"
+ <com.android.keyguard.AlphaOptimizedLinearLayout
+ android:id="@+id/qs_footer_actions_edit_container"
+ android:layout_width="@integer/qs_footer_actions_width"
android:layout_height="match_parent"
- android:layout_weight="1"
- android:gravity="center_vertical|start"
- android:orientation="horizontal"
- android:layout_marginEnd="32dp">
-
- <include
- layout="@layout/qs_footer_carrier"
- android:id="@+id/carrier1" />
+ android:layout_weight="@integer/qs_footer_actions_weight"
+ android:gravity="center_vertical|start" >
+ <com.android.systemui.statusbar.AlphaOptimizedImageView
+ android:id="@android:id/edit"
+ android:layout_width="@dimen/qs_footer_action_button_size"
+ android:layout_height="@dimen/qs_footer_action_button_size"
+ android:background="?android:attr/selectableItemBackgroundBorderless"
+ android:clickable="true"
+ android:clipToPadding="false"
+ android:contentDescription="@string/accessibility_quick_settings_edit"
+ android:focusable="true"
+ android:padding="@dimen/qs_footer_icon_padding"
+ android:src="@*android:drawable/ic_mode_edit"
+ android:tint="?android:attr/colorForeground"/>
- <View
- android:id="@+id/qs_carrier_divider"
- android:layout_width="2dp"
+ <TextView
+ android:id="@+id/build"
+ android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:layout_marginTop="15dp"
- android:layout_marginBottom="15dp"
- android:background="?android:attr/dividerVertical"
- android:visibility="gone" />
-
- <include
- layout="@layout/qs_footer_carrier"
- android:id="@+id/carrier2"
+ android:clickable="true"
+ android:gravity="center_vertical"
+ android:focusable="true"
+ android:textAppearance="@style/TextAppearance.QS.Status"
android:visibility="gone"/>
-
- </LinearLayout>
+ </com.android.keyguard.AlphaOptimizedLinearLayout>
<com.android.systemui.qs.PageIndicator
android:id="@+id/footer_page_indicator"
@@ -85,8 +88,8 @@
android:gravity="center_vertical|end" >
<com.android.systemui.statusbar.phone.MultiUserSwitch
android:id="@+id/multi_user_switch"
- android:layout_width="48dp"
- android:layout_height="48dp"
+ android:layout_width="@dimen/qs_footer_action_button_size"
+ android:layout_height="@dimen/qs_footer_action_button_size"
android:layout_alignParentEnd="true"
android:background="@drawable/ripple_drawable"
android:focusable="true">
@@ -96,26 +99,14 @@
android:layout_width="@dimen/multi_user_avatar_expanded_size"
android:layout_height="@dimen/multi_user_avatar_expanded_size"
android:layout_gravity="center"
+ android:tint="?android:attr/colorAccent"
android:scaleType="centerInside"/>
</com.android.systemui.statusbar.phone.MultiUserSwitch>
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:id="@android:id/edit"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:clickable="true"
- android:clipToPadding="false"
- android:contentDescription="@string/accessibility_quick_settings_edit"
- android:focusable="true"
- android:padding="15dp"
- android:src="@*android:drawable/ic_mode_edit"
- android:tint="?android:attr/colorForeground"/>
-
<com.android.systemui.statusbar.AlphaOptimizedFrameLayout
android:id="@+id/settings_button_container"
- android:layout_width="48dp"
- android:layout_height="48dp"
+ android:layout_width="@dimen/qs_footer_action_button_size"
+ android:layout_height="@dimen/qs_footer_action_button_size"
android:clipChildren="false"
android:clipToPadding="false">
@@ -124,10 +115,12 @@
style="@android:style/Widget.Material.Button.Borderless"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:padding="@dimen/qs_footer_icon_padding"
android:background="@drawable/ripple_drawable"
android:contentDescription="@string/accessibility_quick_settings_settings"
- android:padding="15dp"
- android:src="@drawable/ic_settings_16dp"
+ android:src="@drawable/ic_settings"
+ android:scaleType="centerInside"
android:tint="?android:attr/colorForeground"/>
<com.android.systemui.statusbar.AlphaOptimizedImageView
@@ -143,7 +136,6 @@
</com.android.systemui.statusbar.AlphaOptimizedFrameLayout>
</com.android.keyguard.AlphaOptimizedLinearLayout>
</LinearLayout>
-
<View
android:id="@+id/qs_drag_handle_view"
android:layout_width="24dp"
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index 8c57ae8c8569..01dfeb281e1b 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -58,7 +58,7 @@
android:elevation="4dp"
android:background="@android:color/transparent"
android:focusable="true"
- android:accessibilityTraversalBefore="@id/qs_carrier_text"
+ android:accessibilityTraversalBefore="@android:id/edit"
/>
<include layout="@layout/quick_status_bar_expanded_header" />
diff --git a/packages/SystemUI/res/layout/quick_settings_header_info.xml b/packages/SystemUI/res/layout/quick_settings_header_info.xml
index 967e13f05cfb..075f51d2e17a 100644
--- a/packages/SystemUI/res/layout/quick_settings_header_info.xml
+++ b/packages/SystemUI/res/layout/quick_settings_header_info.xml
@@ -25,7 +25,7 @@
android:id="@+id/long_press_tooltip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal|bottom"
+ android:layout_gravity="start|bottom"
android:alpha="0"
android:text="@string/quick_settings_header_onboarding_text"
android:textAppearance="@style/TextAppearance.QS.TileLabel"
@@ -33,54 +33,69 @@
android:visibility="invisible" />
<LinearLayout
- android:id="@+id/status_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal|bottom"
- android:gravity="center_vertical"
- android:alpha="0">
+ android:layout_gravity="start|bottom"
+ android:gravity="center_vertical">
- <ImageView
- android:id="@+id/next_alarm_icon"
- android:layout_width="@dimen/qs_header_alarm_icon_size"
- android:layout_height="@dimen/qs_header_alarm_icon_size"
- android:src="@drawable/stat_sys_alarm"
- android:tint="?android:attr/textColorPrimary"
- android:visibility="gone"/>
-
- <TextView
- android:id="@+id/next_alarm_text"
+ <LinearLayout
+ android:id="@+id/status_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start"
- android:textAppearance="@style/TextAppearance.QS.TileLabel"
- android:visibility="gone"/>
+ android:layout_gravity="start|center_vertical"
+ android:layout_weight="1"
+ android:gravity="center_vertical"
+ android:alpha="0">
- <View
- android:id="@+id/status_separator"
- android:layout_width="1dp"
- android:layout_height="match_parent"
- android:layout_marginStart="10dp"
- android:layout_marginEnd="10dp"
- android:background="@android:color/white"
- android:backgroundTint="?android:attr/textColorPrimary"
- android:visibility="gone"/>
+ <ImageView
+ android:id="@+id/next_alarm_icon"
+ android:layout_width="@dimen/qs_header_alarm_icon_size"
+ android:layout_height="@dimen/qs_header_alarm_icon_size"
+ android:src="@drawable/stat_sys_alarm"
+ android:tint="?android:attr/textColorPrimary"
+ android:visibility="gone"/>
- <ImageView
- android:id="@+id/ringer_mode_icon"
- android:layout_width="@dimen/qs_header_alarm_icon_size"
- android:layout_height="@dimen/qs_header_alarm_icon_size"
- android:tint="?android:attr/textColorPrimary"
- android:visibility="gone"/>
+ <TextView
+ android:id="@+id/next_alarm_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start"
+ android:textAppearance="@style/TextAppearance.QS.Status"
+ android:visibility="gone"/>
- <TextView
- android:id="@+id/ringer_mode_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start"
- android:textAppearance="@style/TextAppearance.QS.TileLabel"
- android:visibility="gone"/>
+ <View
+ android:id="@+id/status_separator"
+ android:layout_width="@dimen/qs_header_separator_width"
+ android:layout_height="match_parent"
+ android:visibility="gone"/>
+
+ <ImageView
+ android:id="@+id/ringer_mode_icon"
+ android:layout_width="@dimen/qs_header_alarm_icon_size"
+ android:layout_height="@dimen/qs_header_alarm_icon_size"
+ android:tint="?android:attr/textColorPrimary"
+ android:visibility="gone"/>
+
+ <TextView
+ android:id="@+id/ringer_mode_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start"
+ android:textAppearance="@style/TextAppearance.QS.Status"
+ android:visibility="gone"/>
+ </LinearLayout>
+
+ <View
+ android:minWidth="@dimen/qs_status_separator"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"/>
+ <include layout="@layout/qs_carrier_group"
+ android:id="@+id/carrier_group"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android_layout_gravity="center vertical|end"/>
</LinearLayout>
</FrameLayout>
diff --git a/packages/SystemUI/res/values-land/integers.xml b/packages/SystemUI/res/values-land/integers.xml
deleted file mode 100644
index fb226659dae7..000000000000
--- a/packages/SystemUI/res/values-land/integers.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ 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
- -->
-<resources>
- <!-- Action footer width is set to 0 to allow it to stretch (through a weight of 1) and center
- the page indicator in between the footer and the carrier text.-->
- <integer name="qs_footer_actions_width">0</integer>
- <integer name="qs_footer_actions_weight">1</integer>
-</resources> \ No newline at end of file
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index a40a14a47744..9a2eb940bbfe 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -274,7 +274,16 @@
<!-- The height of the quick settings footer that holds the user switcher, settings icon,
etc. -->
- <dimen name="qs_footer_height">56dp</dimen>
+ <dimen name="qs_footer_height">48dp</dimen>
+
+ <!-- The size of each of the icon buttons in the QS footer -->
+ <dimen name="qs_footer_action_button_size">@dimen/qs_footer_height</dimen>
+
+ <!-- Margins on each side of QS Footer -->
+ <dimen name="qs_footer_margin">2dp</dimen>
+
+ <!-- Padding on each QS Footer Icon to make the icons 20dpx20dp -->
+ <dimen name="qs_footer_icon_padding">14dp</dimen>
<!-- The padding between the notifications and the quick settings container -->
<dimen name="qs_notification_padding">@dimen/notification_side_paddings</dimen>
@@ -415,11 +424,16 @@
<dimen name="qs_detail_item_icon_marginEnd">20dp</dimen>
<dimen name="qs_header_tooltip_height">18dp</dimen>
<dimen name="qs_header_alarm_icon_size">18dp</dimen>
+ <dimen name="qs_header_mobile_icon_size">18dp</dimen>
<dimen name="qs_header_alarm_text_margin_start">6dp</dimen>
+ <dimen name="qs_header_separator_width">8dp</dimen>
+ <dimen name="qs_header_carrier_separator_width">6dp</dimen>
+ <dimen name="qs_status_separator">32dp</dimen>
+ <dimen name="qs_carrier_margin_width">4dp</dimen>
<dimen name="qs_footer_padding_start">16dp</dimen>
<dimen name="qs_footer_padding_end">16dp</dimen>
<dimen name="qs_footer_icon_size">16dp</dimen>
- <dimen name="qs_paged_tile_layout_padding_bottom">24dp</dimen>
+ <dimen name="qs_paged_tile_layout_padding_bottom">16dp</dimen>
<dimen name="qs_notif_collapsed_space">64dp</dimen>
@@ -592,7 +606,7 @@
<dimen name="multi_user_avatar_keyguard_size">22dp</dimen>
<!-- The width of user avatar when expanded -->
- <dimen name="multi_user_avatar_expanded_size">18dp</dimen>
+ <dimen name="multi_user_avatar_expanded_size">20dp</dimen>
<!-- The font size of the time when collapsed in QS -->
<dimen name="qs_time_collapsed_size">14sp</dimen>
diff --git a/packages/SystemUI/res/values/integers.xml b/packages/SystemUI/res/values/integers.xml
index e8fabf5a07f1..a6dae45f4b53 100644
--- a/packages/SystemUI/res/values/integers.xml
+++ b/packages/SystemUI/res/values/integers.xml
@@ -19,8 +19,8 @@
<!-- Action footer width used for layout_width to indicate WRAP_CONTENT (along with a weight of
0) as we can allow the carrier text to stretch as far as needed in the QS footer. -->
- <integer name="qs_footer_actions_width">-2</integer>
- <integer name="qs_footer_actions_weight">0</integer>
+ <integer name="qs_footer_actions_width">0</integer>
+ <integer name="qs_footer_actions_weight">1</integer>
<!-- Maximum number of bubbles to render and animate at one time. While the animations used are
lightweight translation animations, this number can be reduced on lower end devices if any
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index fc7a56ff3f18..b985b6b2a5a8 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -227,6 +227,8 @@
<item name="android:textSize">@dimen/qs_carrier_info_text_size</item>
</style>
+ <style name="TextAppearance.QS.Status" parent="TextAppearance.QS.TileLabel.Secondary" />
+
<style name="TextAppearance.AppOpsDialog" />
<style name="TextAppearance.AppOpsDialog.Title">
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index 592b6039d69d..39a584272585 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -355,15 +355,23 @@ public class BatteryMeterView extends LinearLayout implements
if (mBatteryPercentView != null) {
if (mShowPercentMode == MODE_ESTIMATE && !mCharging) {
mBatteryController.getEstimatedTimeRemainingString((String estimate) -> {
- mBatteryPercentView.setText(estimate);
+ if (estimate != null) {
+ mBatteryPercentView.setText(estimate);
+ } else {
+ setPercentTextAtCurrentLevel();
+ }
});
} else {
- mBatteryPercentView.setText(
- NumberFormat.getPercentInstance().format(mLevel / 100f));
+ setPercentTextAtCurrentLevel();
}
}
}
+ private void setPercentTextAtCurrentLevel() {
+ mBatteryPercentView.setText(
+ NumberFormat.getPercentInstance().format(mLevel / 100f));
+ }
+
private void updateShowPercent() {
final boolean showing = mBatteryPercentView != null;
final boolean systemSetting = 0 != Settings.System
diff --git a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
index 26c5ef95981f..5086c997613a 100644
--- a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
@@ -32,10 +32,13 @@ import android.view.ViewOutlineProvider;
import android.view.ViewTreeObserver;
import android.widget.LinearLayout;
+import com.android.systemui.globalactions.GlobalActionsDialog;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
import com.android.systemui.util.leak.RotationUtils;
+import java.util.ArrayList;
+
/**
* Layout for placing two containers at a specific physical position on the device, relative to the
* device's hardware, regardless of screen rotation.
@@ -90,15 +93,6 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable {
}
@Override
- public ViewGroup getParentView(boolean separated, int index, int rotation) {
- if (separated) {
- return getSeparatedView();
- } else {
- return getListView();
- }
- }
-
- @Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
updateSettings();
@@ -221,7 +215,7 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable {
} else {
rotateLeft();
}
- if (mHasSeparatedView) {
+ if (mSeparated) {
if (from == ROTATION_SEASCAPE || to == ROTATION_SEASCAPE) {
// Separated view has top margin, so seascape separated view need special rotation,
// not a full left or right rotation.
@@ -261,6 +255,31 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable {
}
}
+ @Override
+ public void onUpdateList() {
+ removeAllItems();
+ ArrayList<GlobalActionsDialog.Action> separatedActions =
+ mAdapter.getSeparatedItems(mSeparated);
+ ArrayList<GlobalActionsDialog.Action> listActions = mAdapter.getListItems(mSeparated);
+
+ for (int i = 0; i < mAdapter.getCount(); i++) {
+ Object action = mAdapter.getItem(i);
+ int separatedIndex = separatedActions.indexOf(action);
+ ViewGroup parent;
+ if (separatedIndex != -1) {
+ parent = getSeparatedView();
+ } else {
+ int listIndex = listActions.indexOf(action);
+ parent = getListView();
+ }
+ View v = mAdapter.getView(i, null, parent);
+ final int pos = i;
+ v.setOnClickListener(view -> mAdapter.onClickItem(pos));
+ v.setOnLongClickListener(view -> mAdapter.onLongClickItem(pos));
+ parent.addView(v);
+ }
+ }
+
private void rotateRight() {
rotateRight(this);
rotateRight(mList);
@@ -442,8 +461,8 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable {
if (mList == null) return;
// If got separated button, setRotatedBackground to false,
// all items won't get white background.
- mListBackground.setRotatedBackground(mHasSeparatedView);
- mSeparatedViewBackground.setRotatedBackground(mHasSeparatedView);
+ mListBackground.setRotatedBackground(mSeparated);
+ mSeparatedViewBackground.setRotatedBackground(mSeparated);
if (mDivision != null && mDivision.getVisibility() == VISIBLE) {
int index = mRotatedBackground ? 0 : 1;
mDivision.getLocationOnScreen(mTmp2);
@@ -494,21 +513,21 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable {
case RotationUtils.ROTATION_LANDSCAPE:
defaultTopPadding = getPaddingLeft();
viewsTotalHeight = mList.getMeasuredWidth() + mSeparatedView.getMeasuredWidth();
- separatedViewTopMargin = mHasSeparatedView ? params.leftMargin : 0;
+ separatedViewTopMargin = mSeparated ? params.leftMargin : 0;
screenHeight = getMeasuredWidth();
targetGravity = Gravity.CENTER_HORIZONTAL|Gravity.TOP;
break;
case RotationUtils.ROTATION_SEASCAPE:
defaultTopPadding = getPaddingRight();
viewsTotalHeight = mList.getMeasuredWidth() + mSeparatedView.getMeasuredWidth();
- separatedViewTopMargin = mHasSeparatedView ? params.leftMargin : 0;
+ separatedViewTopMargin = mSeparated ? params.leftMargin : 0;
screenHeight = getMeasuredWidth();
targetGravity = Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM;
break;
default: // Portrait
defaultTopPadding = getPaddingTop();
viewsTotalHeight = mList.getMeasuredHeight() + mSeparatedView.getMeasuredHeight();
- separatedViewTopMargin = mHasSeparatedView ? params.topMargin : 0;
+ separatedViewTopMargin = mSeparated ? params.topMargin : 0;
screenHeight = getMeasuredHeight();
targetGravity = Gravity.CENTER_VERTICAL|Gravity.RIGHT;
break;
diff --git a/packages/SystemUI/src/com/android/systemui/MultiListLayout.java b/packages/SystemUI/src/com/android/systemui/MultiListLayout.java
index 8259da6efe2d..2bc472065676 100644
--- a/packages/SystemUI/src/com/android/systemui/MultiListLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/MultiListLayout.java
@@ -21,19 +21,20 @@ import android.content.res.Configuration;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import com.android.systemui.util.leak.RotationUtils;
+import java.util.ArrayList;
+
/**
* Layout class representing the Global Actions menu which appears when the power button is held.
*/
public abstract class MultiListLayout extends LinearLayout {
protected boolean mHasOutsideTouch;
- protected boolean mHasSeparatedView;
-
- protected int mExpectedSeparatedItemCount;
- protected int mExpectedListItemCount;
+ protected boolean mSeparated;
+ protected MultiListAdapter mAdapter;
protected int mRotation;
protected RotationListener mRotationListener;
@@ -53,18 +54,6 @@ public abstract class MultiListLayout extends LinearLayout {
public abstract void removeAllItems();
/**
- * Get the parent view which will be used to contain the item at the specified index.
- * @param separated Whether or not this index refers to a position in the separated or list
- * container.
- * @param index The index of the item within the container.
- * @param rotation Specifies the rotation of the device, which is used in some cases to
- * determine child ordering.
- * @return The parent ViewGroup which will be used to contain the specified item
- * after it has been added to the layout.
- */
- public abstract ViewGroup getParentView(boolean separated, int index, int rotation);
-
- /**
* Sets the divided view, which may have a differently-colored background.
*/
public abstract void setDivisionView(View v);
@@ -81,32 +70,19 @@ public abstract class MultiListLayout extends LinearLayout {
}
/**
- * Sets the number of items expected to be rendered in the separated container. This allows the
- * layout to correctly determine which parent containers will be used for items before they have
- * beenadded to the layout.
- * @param count The number of items expected.
+ * Sets whether the separated view should be shown, and handles updating visibility on
+ * that view.
*/
- public void setExpectedSeparatedItemCount(int count) {
- mExpectedSeparatedItemCount = count;
+ public void setSeparated(boolean separated) {
+ mSeparated = separated;
+ setSeparatedViewVisibility(separated);
}
/**
- * Sets the number of items expected to be rendered in the list container. This allows the
- * layout to correctly determine which parent containers will be used for items before they have
- * beenadded to the layout.
- * @param count The number of items expected.
+ * Sets the adapter used to inflate items.
*/
- public void setExpectedListItemCount(int count) {
- mExpectedListItemCount = count;
- }
-
- /**
- * Sets whether the separated view should be shown, and handles updating visibility on
- * that view.
- */
- public void setHasSeparatedView(boolean hasSeparatedView) {
- mHasSeparatedView = hasSeparatedView;
- setSeparatedViewVisibility(hasSeparatedView);
+ public void setAdapter(MultiListAdapter adapter) {
+ mAdapter = adapter;
}
/**
@@ -136,6 +112,19 @@ public abstract class MultiListLayout extends LinearLayout {
}
}
+ /**
+ * Update the list of items in both the separated and list views.
+ * For this to work, mAdapter must already have been set.
+ */
+ public void updateList() {
+ if (mAdapter == null) {
+ throw new IllegalStateException("mAdapter must be set before calling updateList");
+ }
+ onUpdateList();
+ }
+
+ protected abstract void onUpdateList();
+
public void setRotationListener(RotationListener listener) {
mRotationListener = listener;
}
@@ -157,4 +146,35 @@ public abstract class MultiListLayout extends LinearLayout {
public interface RotationListener {
void onRotate(int from, int to);
}
+
+ /**
+ * Adapter class for converting items into child views for MultiListLayout and handling
+ * callbacks for input events.
+ */
+ public abstract static class MultiListAdapter extends BaseAdapter {
+ /**
+ * Creates an ArrayList of items which should be rendered in the separated view.
+ * @param useSeparatedView is true if the separated view will be used, false otherwise.
+ */
+ public abstract ArrayList getSeparatedItems(boolean useSeparatedView);
+
+ /**
+ * Creates an ArrayList of items which should be rendered in the list view.
+ * @param useSeparatedView True if the separated view will be used, false otherwise.
+ */
+ public abstract ArrayList getListItems(boolean useSeparatedView);
+
+ /**
+ * Callback to run when an individual item is clicked or pressed.
+ * @param position The index of the item which was clicked.
+ */
+ public abstract void onClickItem(int position);
+
+ /**
+ * Callback to run when an individual item is long-clicked or long-pressed.
+ * @param position The index of the item which was long-clicked.
+ * @return True if the long-click was handled, false otherwise.
+ */
+ public abstract boolean onLongClickItem(int position);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
index 603b3b9766d9..4addbb50cd7f 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
@@ -49,6 +49,7 @@ import android.util.AttributeSet;
import android.util.Log;
import android.util.StatsLog;
import android.view.View;
+import android.view.ViewGroup;
import android.view.WindowInsets;
import android.widget.FrameLayout;
import android.widget.ImageButton;
@@ -316,8 +317,25 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
/**
* Lets activity view know it should be shown / populated.
*/
- public void populateActivityView() {
- mActivityView.setCallback(mStateCallback);
+ public void populateExpandedView() {
+ if (usingActivityView()) {
+ mActivityView.setCallback(mStateCallback);
+ } else {
+ // We're using notification template
+ ViewGroup parent = (ViewGroup) mNotifRow.getParent();
+ if (parent == this) {
+ // Already added
+ return;
+ } else if (parent != null) {
+ // Still in the shade... remove it
+ parent.removeView(mNotifRow);
+ }
+ if (mShowOnTop) {
+ addView(mNotifRow);
+ } else {
+ addView(mNotifRow, mUseFooter ? 0 : 1);
+ }
+ }
}
/**
@@ -376,14 +394,8 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
} else {
// Hide activity view if we had it previously
mActivityView.setVisibility(GONE);
-
- // Use notification view
mNotifRow = mEntry.getRow();
- if (mShowOnTop) {
- addView(mNotifRow);
- } else {
- addView(mNotifRow, mUseFooter ? 0 : 1);
- }
+
}
updateView();
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
index 4869485a3336..8f9f1cb95acc 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
@@ -807,7 +807,7 @@ public class BubbleStackView extends FrameLayout {
mExpandedViewContainer.removeAllViews();
if (mExpandedBubble != null && mIsExpanded) {
mExpandedViewContainer.addView(mExpandedBubble.expandedView);
- mExpandedBubble.expandedView.populateActivityView();
+ mExpandedBubble.expandedView.populateExpandedView();
mExpandedViewContainer.setVisibility(mIsExpanded ? VISIBLE : GONE);
}
}
@@ -817,8 +817,12 @@ public class BubbleStackView extends FrameLayout {
mExpandedViewContainer.setVisibility(mIsExpanded ? VISIBLE : GONE);
if (mIsExpanded) {
+ // First update the view so that it calculates a new height (ensuring the y position
+ // calculation is correct)
+ mExpandedBubble.expandedView.updateView();
final float y = getYPositionForExpandedView();
mExpandedViewContainer.setTranslationY(y);
+ // Then update the view so that ActivityView knows we translated
mExpandedBubble.expandedView.updateView();
}
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index 1f3762debc68..327325378e5d 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -65,8 +65,6 @@ import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityEvent;
-import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.BaseAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
@@ -87,6 +85,7 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.MultiListLayout;
+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;
@@ -99,16 +98,14 @@ import com.android.systemui.volume.SystemUIInterpolators.LogAccelerateInterpolat
import java.util.ArrayList;
import java.util.List;
-import java.util.Locale;
/**
* Helper to show the global actions dialog. Each item is an {@link Action} that
* may show depending on whether the keyguard is showing, and whether the device
* is provisioned.
*/
-class GlobalActionsDialog implements DialogInterface.OnDismissListener,
- DialogInterface.OnClickListener, DialogInterface.OnShowListener,
- ConfigurationController.ConfigurationListener {
+public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
+ DialogInterface.OnShowListener, ConfigurationController.ConfigurationListener {
static public final String SYSTEM_DIALOG_REASON_KEY = "reason";
static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
@@ -158,7 +155,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private boolean mHasVibrator;
private boolean mHasLogoutButton;
private boolean mHasLockdownButton;
- private boolean mSeparatedEmergencyButtonEnabled;
+ private boolean mUseSeparatedList;
private final boolean mShowSilentToggle;
private final EmergencyAffordanceManager mEmergencyAffordanceManager;
private final ScreenshotHelper mScreenshotHelper;
@@ -336,7 +333,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
ArraySet<String> addedKeys = new ArraySet<String>();
mHasLogoutButton = false;
mHasLockdownButton = false;
- mSeparatedEmergencyButtonEnabled = true;
+ mUseSeparatedList = true;
for (int i = 0; i < defaultActions.length; i++) {
String actionKey = defaultActions[i];
if (addedKeys.contains(actionKey)) {
@@ -384,7 +381,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mHasLogoutButton = true;
}
} else if (GLOBAL_ACTION_KEY_EMERGENCY.equals(actionKey)) {
- if (mSeparatedEmergencyButtonEnabled
+ if (mUseSeparatedList
&& !mEmergencyAffordanceManager.needsEmergencyAffordance()) {
mItems.add(new EmergencyDialerAction());
}
@@ -401,14 +398,6 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mAdapter = new MyAdapter();
- OnItemLongClickListener onItemLongClickListener = (parent, view, position, id) -> {
- final Action action = mAdapter.getItem(position);
- if (action instanceof LongPressAction) {
- mDialog.dismiss();
- return ((LongPressAction) action).onLongPress();
- }
- return false;
- };
GlobalActionsPanelPlugin.PanelViewController panelViewController =
mPanelExtension.get() != null
? mPanelExtension.get().onPanelShown(() -> {
@@ -417,8 +406,8 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
})
: null;
- ActionsDialog dialog = new ActionsDialog(mContext, this, mAdapter, onItemLongClickListener,
- mSeparatedEmergencyButtonEnabled, panelViewController);
+ ActionsDialog dialog = new ActionsDialog(mContext, mAdapter, mUseSeparatedList,
+ panelViewController);
dialog.setCanceledOnTouchOutside(false); // Handled by the custom class.
dialog.setKeyguardShowing(mKeyguardShowing);
@@ -548,7 +537,6 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
}
-
private class ScreenshotAction extends SinglePressAction implements LongPressAction {
public ScreenshotAction() {
super(R.drawable.ic_screenshot, R.string.global_action_screenshot);
@@ -713,7 +701,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private Action getEmergencyAction() {
Drawable emergencyIcon = mContext.getDrawable(R.drawable.emergency_icon);
- if(!mSeparatedEmergencyButtonEnabled) {
+ if (!mUseSeparatedList) {
// use un-colored legacy treatment
emergencyIcon.setTintList(null);
}
@@ -907,15 +895,6 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
/** {@inheritDoc} */
- public void onClick(DialogInterface dialog, int which) {
- Action item = mAdapter.getItem(which);
- if (!(item instanceof SilentModeTriStateAction)) {
- dialog.dismiss();
- }
- item.onPress();
- }
-
- /** {@inheritDoc} */
public void onShow(DialogInterface dialog) {
MetricsLogger.visible(mContext, MetricsEvent.POWER_MENU);
}
@@ -927,11 +906,10 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
* the device is provisioned
* via {@link com.android.systemui.globalactions.GlobalActionsDialog#mDeviceProvisioned}.
*/
- private class MyAdapter extends BaseAdapter {
-
+ public class MyAdapter extends MultiListAdapter {
+ @Override
public int getCount() {
int count = 0;
-
for (int i = 0; i < mItems.size(); i++) {
final Action action = mItems.get(i);
@@ -951,7 +929,8 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return getItem(position).isEnabled();
}
- public ArrayList<Action> getSeparatedActions(boolean shouldUseSeparatedView) {
+ @Override
+ public ArrayList<Action> getSeparatedItems(boolean shouldUseSeparatedView) {
ArrayList<Action> separatedActions = new ArrayList<Action>();
if (!shouldUseSeparatedView) {
return separatedActions;
@@ -965,7 +944,8 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return separatedActions;
}
- public ArrayList<Action> getListActions(boolean shouldUseSeparatedView) {
+ @Override
+ public ArrayList<Action> getListItems(boolean shouldUseSeparatedView) {
if (!shouldUseSeparatedView) {
return new ArrayList<Action>(mItems);
}
@@ -984,6 +964,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return false;
}
+ @Override
public Action getItem(int position) {
int filteredPos = 0;
@@ -1013,6 +994,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return position;
}
+ @Override
public View getView(int position, View convertView, ViewGroup parent) {
Action action = getItem(position);
View view = action.create(mContext, convertView, parent, LayoutInflater.from(mContext));
@@ -1022,6 +1004,25 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
return view;
}
+
+ @Override
+ public boolean onLongClickItem(int position) {
+ final Action action = mAdapter.getItem(position);
+ if (action instanceof LongPressAction) {
+ mDialog.dismiss();
+ return ((LongPressAction) action).onLongPress();
+ }
+ return false;
+ }
+
+ @Override
+ public void onClickItem(int position) {
+ Action item = mAdapter.getItem(position);
+ if (!(item instanceof SilentModeTriStateAction)) {
+ mDialog.dismiss();
+ }
+ item.onPress();
+ }
}
// note: the scheme below made more sense when we were planning on having
@@ -1033,7 +1034,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
/**
* What each item in the global actions dialog must be able to support.
*/
- private interface Action {
+ public interface Action {
/**
* @return Text that will be announced when dialog is created. null
* for none.
@@ -1052,7 +1053,8 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
/**
* @return whether this action should appear in the dialog before the
- * device is provisioned.
+ * device is provisioned.onlongpress
+ *
*/
boolean showBeforeProvisioning();
@@ -1488,26 +1490,21 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private final Context mContext;
private final MyAdapter mAdapter;
private MultiListLayout mGlobalActionsLayout;
- private final OnClickListener mClickListener;
- private final OnItemLongClickListener mLongClickListener;
private final Drawable mBackgroundDrawable;
private final ColorExtractor mColorExtractor;
private final GlobalActionsPanelPlugin.PanelViewController mPanelController;
private boolean mKeyguardShowing;
- private boolean mShouldDisplaySeparatedButton;
+ private boolean mUseSeparatedList;
private boolean mShowing;
private final float mScrimAlpha;
- public ActionsDialog(Context context, OnClickListener clickListener, MyAdapter adapter,
- OnItemLongClickListener longClickListener, boolean shouldDisplaySeparatedButton,
+ ActionsDialog(Context context, MyAdapter adapter, boolean separated,
GlobalActionsPanelPlugin.PanelViewController plugin) {
super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions);
mContext = context;
mAdapter = adapter;
- mClickListener = clickListener;
- mLongClickListener = longClickListener;
mColorExtractor = Dependency.get(SysuiColorExtractor.class);
- mShouldDisplaySeparatedButton = shouldDisplaySeparatedButton;
+ mUseSeparatedList = separated;
// Window initialization
Window window = getWindow();
@@ -1573,7 +1570,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mGlobalActionsLayout = (MultiListLayout)
findViewById(com.android.systemui.R.id.global_actions_view);
mGlobalActionsLayout.setOutsideTouchListener(view -> dismiss());
- mGlobalActionsLayout.setHasSeparatedView(mShouldDisplaySeparatedButton);
+ mGlobalActionsLayout.setSeparated(mUseSeparatedList);
mGlobalActionsLayout.setListViewAccessibilityDelegate(new View.AccessibilityDelegate() {
@Override
public boolean dispatchPopulateAccessibilityEvent(
@@ -1584,6 +1581,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
});
mGlobalActionsLayout.setRotationListener(this::onRotate);
+ mGlobalActionsLayout.setAdapter(mAdapter);
}
private boolean isPanelEnabled(Context context) {
@@ -1601,55 +1599,11 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return com.android.systemui.R.layout.global_actions_wrapped;
}
- private void updateList() {
- mGlobalActionsLayout.removeAllItems();
- ArrayList<Action> separatedActions =
- mAdapter.getSeparatedActions(mShouldDisplaySeparatedButton);
- ArrayList<Action> listActions = mAdapter.getListActions(mShouldDisplaySeparatedButton);
- mGlobalActionsLayout.setExpectedListItemCount(listActions.size());
- mGlobalActionsLayout.setExpectedSeparatedItemCount(separatedActions.size());
- int rotation = RotationUtils.getRotation(mContext);
-
- boolean reverse = false; // should we add items to parents in the reverse order?
- if (isGridEnabled(mContext)) {
- if (rotation == RotationUtils.ROTATION_NONE
- || rotation == RotationUtils.ROTATION_SEASCAPE) {
- reverse = !reverse; // if we're in portrait or seascape, reverse items
- }
- if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
- == View.LAYOUT_DIRECTION_RTL) {
- reverse = !reverse; // if we're in an RTL language, reverse items (again)
- }
- }
-
- for (int i = 0; i < mAdapter.getCount(); i++) {
- Action action = mAdapter.getItem(i);
- int separatedIndex = separatedActions.indexOf(action);
- ViewGroup parent;
- if (separatedIndex != -1) {
- parent = mGlobalActionsLayout.getParentView(true, separatedIndex, rotation);
- } else {
- int listIndex = listActions.indexOf(action);
- parent = mGlobalActionsLayout.getParentView(false, listIndex, rotation);
- }
- View v = mAdapter.getView(i, null, parent);
- final int pos = i;
- v.setOnClickListener(view -> mClickListener.onClick(this, pos));
- v.setOnLongClickListener(view ->
- mLongClickListener.onItemLongClick(null, v, pos, 0));
- if (reverse) {
- parent.addView(v, 0); // reverse order of items
- } else {
- parent.addView(v);
- }
- }
- }
-
@Override
protected void onStart() {
super.setCanceledOnTouchOutside(true);
super.onStart();
- updateList();
+ mGlobalActionsLayout.updateList();
if (mBackgroundDrawable instanceof GradientDrawable) {
Point displaySize = new Point();
@@ -1767,7 +1721,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
public void onRotate(int from, int to) {
if (mShowing && isGridEnabled(mContext)) {
initializeLayout();
- updateList();
+ mGlobalActionsLayout.updateList();
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java
index 036d8ca3afb6..cda7669a90b6 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java
@@ -17,6 +17,7 @@
package com.android.systemui.globalactions;
import android.content.Context;
+import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
@@ -25,6 +26,9 @@ import com.android.systemui.HardwareBgDrawable;
import com.android.systemui.MultiListLayout;
import com.android.systemui.util.leak.RotationUtils;
+import java.util.ArrayList;
+import java.util.Locale;
+
/**
* Grid-based implementation of the button layout created by the global actions dialog.
*/
@@ -55,13 +59,58 @@ public class GlobalActionsGridLayout extends MultiListLayout {
}
}
- @Override
+ /**
+ * Sets the number of items expected to be rendered in the list container. This allows the
+ * layout to correctly determine which parent containers will be used for items before they have
+ * beenadded to the layout.
+ * @param count The number of items expected.
+ */
public void setExpectedListItemCount(int count) {
- mExpectedListItemCount = count;
getListView().setExpectedCount(count);
}
@Override
+ public void onUpdateList() {
+ removeAllItems();
+ ArrayList<GlobalActionsDialog.Action> separatedActions =
+ mAdapter.getSeparatedItems(mSeparated);
+ ArrayList<GlobalActionsDialog.Action> listActions = mAdapter.getListItems(mSeparated);
+ setExpectedListItemCount(listActions.size());
+ int rotation = RotationUtils.getRotation(mContext);
+
+ boolean reverse = false; // should we add items to parents in the reverse order?
+ if (rotation == RotationUtils.ROTATION_NONE
+ || rotation == RotationUtils.ROTATION_SEASCAPE) {
+ reverse = !reverse; // if we're in portrait or seascape, reverse items
+ }
+ if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
+ == View.LAYOUT_DIRECTION_RTL) {
+ reverse = !reverse; // if we're in an RTL language, reverse items (again)
+ }
+
+ for (int i = 0; i < mAdapter.getCount(); i++) {
+ Object action = mAdapter.getItem(i);
+ int separatedIndex = separatedActions.indexOf(action);
+ ViewGroup parent;
+ if (separatedIndex != -1) {
+ parent = getParentView(true, separatedIndex, rotation);
+ } else {
+ int listIndex = listActions.indexOf(action);
+ parent = getParentView(false, listIndex, rotation);
+ }
+ View v = mAdapter.getView(i, null, parent);
+ final int pos = i;
+ v.setOnClickListener(view -> mAdapter.onClickItem(pos));
+ v.setOnLongClickListener(view -> mAdapter.onLongClickItem(pos));
+ if (reverse) {
+ parent.addView(v, 0); // reverse order of items
+ } else {
+ parent.addView(v);
+ }
+ }
+ }
+
+ @Override
protected ViewGroup getSeparatedView() {
return findViewById(com.android.systemui.R.id.separated_button);
}
@@ -83,7 +132,6 @@ public class GlobalActionsGridLayout extends MultiListLayout {
}
}
- @Override
public ViewGroup getParentView(boolean separated, int index, int rotation) {
if (separated) {
return getSeparatedView();
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java b/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java
index 4df1c5a43a1b..c6b53775a0b3 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java
@@ -18,7 +18,6 @@ package com.android.systemui.globalactions;
import android.content.Context;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
@@ -39,6 +38,7 @@ import android.widget.LinearLayout;
*/
public class ListGridLayout extends LinearLayout {
+ private static final String TAG = "ListGridLayout";
private int mExpectedCount;
private int mRows;
private int mColumns;
@@ -103,12 +103,10 @@ public class ListGridLayout extends LinearLayout {
setSublistVisibility(i, false);
}
}
-
}
private void setSublistVisibility(int index, boolean visible) {
View subList = getChildAt(index);
- Log.d("ListGrid", "index: " + index + ", visibility: " + visible);
if (subList != null) {
subList.setVisibility(visible ? View.VISIBLE : View.GONE);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index f6073671dd60..aa972e3f738c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -261,11 +261,9 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
// Fade in the tiles/labels as we reach the final position.
mFirstPageDelayedAnimator = new TouchAnimator.Builder()
.setStartDelay(EXPANDED_TILE_DELAY)
- .addFloat(mQsPanel.getPageIndicator(), "alpha", 0, 1)
.addFloat(tileLayout, "alpha", 0, 1)
.addFloat(mQsPanel.getDivider(), "alpha", 0, 1)
.addFloat(mQsPanel.getFooter().getView(), "alpha", 0, 1).build();
- mAllViews.add(mQsPanel.getPageIndicator());
mAllViews.add(mQsPanel.getDivider());
mAllViews.add(mQsPanel.getFooter().getView());
float px = 0;
@@ -283,7 +281,6 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
}
mNonfirstPageAnimator = new TouchAnimator.Builder()
.addFloat(mQuickQsPanel, "alpha", 1, 0)
- .addFloat(mQsPanel.getPageIndicator(), "alpha", 0, 1)
.addFloat(mQsPanel.getDivider(), "alpha", 0, 1)
.setListener(mNonFirstPageListener)
.setEndDelay(.5f)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java b/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java
new file mode 100644
index 000000000000..3ff30c527f39
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java
@@ -0,0 +1,141 @@
+/*
+ * 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 com.android.systemui.qs;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.settingslib.Utils;
+import com.android.settingslib.graph.SignalDrawable;
+import com.android.systemui.R;
+
+public class QSCarrier extends LinearLayout {
+
+ private View mMobileGroup;
+ private QSCarrierText mCarrierText;
+ private ImageView mMobileSignal;
+ private ImageView mMobileRoaming;
+ private ColorStateList mColorForegroundStateList;
+ private float mColorForegroundIntensity;
+
+ public QSCarrier(Context context) {
+ super(context);
+ }
+
+ public QSCarrier(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public QSCarrier(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public QSCarrier(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mMobileGroup = findViewById(R.id.mobile_combo);
+ mMobileSignal = findViewById(R.id.mobile_signal);
+ mMobileRoaming = findViewById(R.id.mobile_roaming);
+ mCarrierText = findViewById(R.id.qs_carrier_text);
+
+ int colorForeground = Utils.getColorAttrDefaultColor(mContext,
+ android.R.attr.colorForeground);
+ mColorForegroundStateList = ColorStateList.valueOf(colorForeground);
+ mColorForegroundIntensity = QuickStatusBarHeader.getColorIntensity(colorForeground);
+
+ }
+
+ public void updateState(QSCarrierGroup.CellSignalState state) {
+ mMobileGroup.setVisibility(state.visible ? View.VISIBLE : View.GONE);
+ if (state.visible) {
+ mMobileRoaming.setVisibility(state.roaming ? View.VISIBLE : View.GONE);
+ mMobileRoaming.setImageTintList(mColorForegroundStateList);
+ SignalDrawable d = new SignalDrawable(mContext);
+ d.setDarkIntensity(mColorForegroundIntensity);
+ mMobileSignal.setImageDrawable(d);
+ mMobileSignal.setImageLevel(state.mobileSignalIconId);
+
+ StringBuilder contentDescription = new StringBuilder();
+ if (state.contentDescription != null) {
+ contentDescription.append(state.contentDescription).append(", ");
+ }
+ if (state.roaming) {
+ contentDescription
+ .append(mContext.getString(R.string.data_connection_roaming))
+ .append(", ");
+ }
+ // TODO: show mobile data off/no internet text for 5 seconds before carrier text
+ if (TextUtils.equals(state.typeContentDescription,
+ mContext.getString(R.string.data_connection_no_internet))
+ || TextUtils.equals(state.typeContentDescription,
+ mContext.getString(R.string.cell_data_off_content_description))) {
+ contentDescription.append(state.typeContentDescription);
+ }
+ mMobileSignal.setContentDescription(contentDescription);
+ }
+ }
+
+ public void setCarrierText(CharSequence text) {
+ mCarrierText.setText(text);
+ }
+
+ /**
+ * TextView that changes its ellipsize value with its visibility.
+ */
+ public static class QSCarrierText extends TextView {
+
+ public QSCarrierText(Context context) {
+ super(context);
+ }
+
+ public QSCarrierText(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public QSCarrierText(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public QSCarrierText(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onVisibilityChanged(View changedView, int visibility) {
+ super.onVisibilityChanged(changedView, visibility);
+ // Only show marquee when visible
+ if (visibility == VISIBLE) {
+ setEllipsize(TextUtils.TruncateAt.MARQUEE);
+ setSelected(true);
+ } else {
+ setEllipsize(TextUtils.TruncateAt.END);
+ setSelected(false);
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSCarrierGroup.java b/packages/SystemUI/src/com/android/systemui/qs/QSCarrierGroup.java
new file mode 100644
index 000000000000..0eeaa9b75382
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSCarrierGroup.java
@@ -0,0 +1,224 @@
+/*
+ * 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 com.android.systemui.qs;
+
+import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
+
+import android.content.Context;
+import android.telephony.SubscriptionManager;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.keyguard.CarrierTextController;
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.NetworkController;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+/**
+ * Displays Carrier name and network status in QS
+ */
+public class QSCarrierGroup extends LinearLayout implements
+ CarrierTextController.CarrierTextCallback,
+ NetworkController.SignalCallback {
+
+ private static final String TAG = "QSCarrierGroup";
+ /**
+ * Support up to 3 slots which is what's supported by {@link TelephonyManager#getPhoneCount}
+ */
+ private static final int SIM_SLOTS = 3;
+ private final NetworkController mNetworkController;
+
+ private View[] mCarrierDividers = new View[SIM_SLOTS - 1];
+ private QSCarrier[] mCarrierGroups = new QSCarrier[SIM_SLOTS];
+ private final CellSignalState[] mInfos = new CellSignalState[SIM_SLOTS];
+ private CarrierTextController mCarrierTextController;
+
+ private boolean mListening;
+
+ @Inject
+ public QSCarrierGroup(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
+ NetworkController networkController) {
+ super(context, attrs);
+ mNetworkController = networkController;
+ }
+
+ @VisibleForTesting
+ public QSCarrierGroup(Context context, AttributeSet attrs) {
+ this(context, attrs,
+ Dependency.get(NetworkController.class));
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ mCarrierGroups[0] = findViewById(R.id.carrier1);
+ mCarrierGroups[1] = findViewById(R.id.carrier2);
+ mCarrierGroups[2] = findViewById(R.id.carrier3);
+
+ mCarrierDividers[0] = findViewById(R.id.qs_carrier_divider1);
+ mCarrierDividers[1] = findViewById(R.id.qs_carrier_divider2);
+
+ for (int i = 0; i < SIM_SLOTS; i++) {
+ mInfos[i] = new CellSignalState();
+ }
+
+ CharSequence separator = mContext.getString(
+ com.android.internal.R.string.kg_text_message_separator);
+ mCarrierTextController = new CarrierTextController(mContext, separator, false, false);
+ setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
+ }
+
+ public void setListening(boolean listening) {
+ if (listening == mListening) {
+ return;
+ }
+ mListening = listening;
+ updateListeners();
+ }
+
+ @Override
+ @VisibleForTesting
+ public void onDetachedFromWindow() {
+ setListening(false);
+ super.onDetachedFromWindow();
+ }
+
+ private void updateListeners() {
+ if (mListening) {
+ if (mNetworkController.hasVoiceCallingFeature()) {
+ mNetworkController.addCallback(this);
+ }
+ mCarrierTextController.setListening(this);
+ } else {
+ mNetworkController.removeCallback(this);
+ mCarrierTextController.setListening(null);
+ }
+ }
+
+ private void handleUpdateState() {
+ for (int i = 0; i < SIM_SLOTS; i++) {
+ mCarrierGroups[i].updateState(mInfos[i]);
+ }
+
+ mCarrierDividers[0].setVisibility(
+ mInfos[0].visible && mInfos[1].visible ? View.VISIBLE : View.GONE);
+ // This tackles the case of slots 2 being available as well as at least one other.
+ // In that case we show the second divider. Note that if both dividers are visible, it means
+ // all three slots are in use, and that is correct.
+ mCarrierDividers[1].setVisibility(
+ (mInfos[1].visible && mInfos[2].visible)
+ || (mInfos[0].visible && mInfos[2].visible) ? View.VISIBLE : View.GONE);
+ }
+
+ @VisibleForTesting
+ protected int getSlotIndex(int subscriptionId) {
+ return SubscriptionManager.getSlotIndex(subscriptionId);
+ }
+
+ @Override
+ public void updateCarrierInfo(CarrierTextController.CarrierTextCallbackInfo info) {
+ if (info.anySimReady) {
+ boolean[] slotSeen = new boolean[SIM_SLOTS];
+ if (info.listOfCarriers.length == info.subscriptionIds.length) {
+ for (int i = 0; i < SIM_SLOTS && i < info.listOfCarriers.length; i++) {
+ int slot = getSlotIndex(info.subscriptionIds[i]);
+ if (slot >= SIM_SLOTS) {
+ Log.w(TAG, "updateInfoCarrier - slot: " + slot);
+ continue;
+ }
+ if (slot == SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
+ Log.e(TAG,
+ "Invalid SIM slot index for subscription: "
+ + info.subscriptionIds[i]);
+ continue;
+ }
+ mInfos[slot].visible = true;
+ slotSeen[slot] = true;
+ mCarrierGroups[slot].setCarrierText(info.listOfCarriers[i].toString().trim());
+ mCarrierGroups[slot].setVisibility(View.VISIBLE);
+ }
+ for (int i = 0; i < SIM_SLOTS; i++) {
+ if (!slotSeen[i]) {
+ mInfos[i].visible = false;
+ mCarrierGroups[i].setVisibility(View.GONE);
+ }
+ }
+ } else {
+ Log.e(TAG, "Carrier information arrays not of same length");
+ }
+ } else {
+ mInfos[0].visible = false;
+ mCarrierGroups[0].setCarrierText(info.carrierText);
+ mCarrierGroups[0].setVisibility(View.VISIBLE);
+ for (int i = 1; i < SIM_SLOTS; i++) {
+ mInfos[i].visible = false;
+ mCarrierGroups[i].setCarrierText("");
+ mCarrierGroups[i].setVisibility(View.GONE);
+ }
+ }
+ handleUpdateState();
+ }
+
+ @Override
+ public void setMobileDataIndicators(NetworkController.IconState statusIcon,
+ NetworkController.IconState qsIcon, int statusType,
+ int qsType, boolean activityIn, boolean activityOut,
+ String typeContentDescription,
+ String description, boolean isWide, int subId, boolean roaming) {
+ int slotIndex = getSlotIndex(subId);
+ if (slotIndex >= SIM_SLOTS) {
+ Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex);
+ return;
+ }
+ if (slotIndex == SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
+ Log.e(TAG, "Invalid SIM slot index for subscription: " + subId);
+ return;
+ }
+ mInfos[slotIndex].visible = statusIcon.visible;
+ mInfos[slotIndex].mobileSignalIconId = statusIcon.icon;
+ mInfos[slotIndex].contentDescription = statusIcon.contentDescription;
+ mInfos[slotIndex].typeContentDescription = typeContentDescription;
+ mInfos[slotIndex].roaming = roaming;
+ handleUpdateState();
+ }
+
+ @Override
+ public void setNoSims(boolean hasNoSims, boolean simDetected) {
+ if (hasNoSims) {
+ for (int i = 0; i < SIM_SLOTS; i++) {
+ mInfos[i].visible = false;
+ }
+ }
+ handleUpdateState();
+ }
+
+ static final class CellSignalState {
+ boolean visible;
+ int mobileSignalIconId;
+ String contentDescription;
+ String typeContentDescription;
+ boolean roaming;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index bbd8de333d79..0ae8f6c9de5b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -23,24 +23,24 @@ import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEX
import android.content.Context;
import android.content.Intent;
import android.content.pm.UserInfo;
-import android.content.res.ColorStateList;
import android.content.res.Configuration;
+import android.database.ContentObserver;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.RippleDrawable;
+import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.UserHandle;
import android.os.UserManager;
-import android.telephony.SubscriptionManager;
-import android.text.TextUtils;
+import android.provider.Settings;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
-import android.view.ViewGroup;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.FrameLayout;
import android.widget.ImageView;
-import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
@@ -49,11 +49,10 @@ import androidx.annotation.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
-import com.android.keyguard.CarrierTextController;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.settingslib.Utils;
+import com.android.settingslib.development.DevelopmentSettingsEnabler;
import com.android.settingslib.drawable.UserIconDrawable;
-import com.android.settingslib.graph.SignalDrawable;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.R.dimen;
@@ -62,9 +61,6 @@ import com.android.systemui.qs.TouchAnimator.Builder;
import com.android.systemui.statusbar.phone.MultiUserSwitch;
import com.android.systemui.statusbar.phone.SettingsButton;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
-import com.android.systemui.statusbar.policy.NetworkController;
-import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
-import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
import com.android.systemui.tuner.TunerService;
@@ -73,15 +69,12 @@ import javax.inject.Inject;
import javax.inject.Named;
public class QSFooterImpl extends FrameLayout implements QSFooter,
- OnClickListener, OnUserInfoChangedListener, EmergencyListener, SignalCallback,
- CarrierTextController.CarrierTextCallback {
+ OnClickListener, OnUserInfoChangedListener {
- private static final int SIM_SLOTS = 2;
private static final String TAG = "QSFooterImpl";
private final ActivityStarter mActivityStarter;
private final UserInfoController mUserInfoController;
- private final NetworkController mNetworkController;
private final DeviceProvisionedController mDeviceProvisionedController;
private SettingsButton mSettingsButton;
protected View mSettingsContainer;
@@ -94,7 +87,6 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
private boolean mListening;
- private boolean mShowEmergencyCallsOnly;
private View mDivider;
protected MultiUserSwitch mMultiUserSwitch;
private ImageView mMultiUserAvatar;
@@ -103,35 +95,30 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
private float mExpansionAmount;
protected View mEdit;
+ protected View mEditContainer;
private TouchAnimator mSettingsCogAnimator;
private View mActionsContainer;
private View mDragHandle;
- private View mCarrierDivider;
- private ViewGroup mMobileFooter;
- private View[] mMobileGroups = new View[SIM_SLOTS];
- private ViewGroup[] mCarrierGroups = new ViewGroup[SIM_SLOTS];
- private TextView[] mCarrierTexts = new TextView[SIM_SLOTS];
- private ImageView[] mMobileSignals = new ImageView[SIM_SLOTS];
- private ImageView[] mMobileRoamings = new ImageView[SIM_SLOTS];
- private final CellSignalState[] mInfos =
- new CellSignalState[]{new CellSignalState(), new CellSignalState()};
-
- private final int mColorForeground;
private OnClickListener mExpandClickListener;
- private CarrierTextController mCarrierTextController;
+
+ private final ContentObserver mDeveloperSettingsObserver = new ContentObserver(
+ new Handler(mContext.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ super.onChange(selfChange, uri);
+ setBuildText();
+ }
+ };
@Inject
public QSFooterImpl(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
ActivityStarter activityStarter, UserInfoController userInfoController,
- NetworkController networkController,
DeviceProvisionedController deviceProvisionedController) {
super(context, attrs);
- mColorForeground = Utils.getColorAttrDefaultColor(context, android.R.attr.colorForeground);
mActivityStarter = activityStarter;
mUserInfoController = userInfoController;
- mNetworkController = networkController;
mDeviceProvisionedController = deviceProvisionedController;
}
@@ -140,7 +127,6 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
this(context, attrs,
Dependency.get(ActivityStarter.class),
Dependency.get(UserInfoController.class),
- Dependency.get(NetworkController.class),
Dependency.get(DeviceProvisionedController.class));
}
@@ -159,26 +145,12 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
mSettingsContainer = findViewById(R.id.settings_button_container);
mSettingsButton.setOnClickListener(this);
- mMobileFooter = findViewById(R.id.qs_mobile);
- mCarrierGroups[0] = findViewById(R.id.carrier1);
- mCarrierGroups[1] = findViewById(R.id.carrier2);
-
- for (int i = 0; i < SIM_SLOTS; i++) {
- mMobileGroups[i] = mCarrierGroups[i].findViewById(R.id.mobile_combo);
- mMobileSignals[i] = mCarrierGroups[i].findViewById(R.id.mobile_signal);
- mMobileRoamings[i] = mCarrierGroups[i].findViewById(R.id.mobile_roaming);
- mCarrierTexts[i] = mCarrierGroups[i].findViewById(R.id.qs_carrier_text);
- }
- mCarrierDivider = findViewById(R.id.qs_carrier_divider);
- CharSequence separator = mContext.getString(
- com.android.internal.R.string.kg_text_message_separator);
- mCarrierTextController = new CarrierTextController(mContext, separator, false, false);
-
mMultiUserSwitch = findViewById(R.id.multi_user_switch);
mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar);
mDragHandle = findViewById(R.id.qs_drag_handle_view);
mActionsContainer = findViewById(R.id.qs_footer_actions_container);
+ mEditContainer = findViewById(R.id.qs_footer_actions_edit_container);
// RenderThread is doing more harm than good when touching the header (to expand quick
// settings), so disable it for this view
@@ -190,6 +162,21 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
oldBottom) -> updateAnimator(right - left));
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
updateEverything();
+ setBuildText();
+ }
+
+ private void setBuildText() {
+ TextView v = findViewById(R.id.build);
+ if (v == null) return;
+ if (DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)) {
+ v.setText(mContext.getString(
+ com.android.internal.R.string.bugreport_status,
+ Build.VERSION.RELEASE,
+ Build.ID));
+ v.setVisibility(View.VISIBLE);
+ } else {
+ v.setVisibility(View.GONE);
+ }
}
private void updateAnimator(int width) {
@@ -222,14 +209,6 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
private void updateResources() {
updateFooterAnimator();
-
- // Update the width and weight of the actions container as the page indicator can sometimes
- // show and the layout needs to center it between the carrier text and actions container.
- LinearLayout.LayoutParams params =
- (LinearLayout.LayoutParams) mActionsContainer.getLayoutParams();
- params.width = mContext.getResources().getInteger(R.integer.qs_footer_actions_width);
- params.weight = mContext.getResources().getInteger(R.integer.qs_footer_actions_weight);
- mActionsContainer.setLayoutParams(params);
}
private void updateFooterAnimator() {
@@ -240,9 +219,8 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
private TouchAnimator createFooterAnimator() {
return new TouchAnimator.Builder()
.addFloat(mDivider, "alpha", 0, 1)
- .addFloat(mMobileFooter, "alpha", 0, 0, 1)
- .addFloat(mCarrierDivider, "alpha", 0, 1)
.addFloat(mActionsContainer, "alpha", 0, 1)
+ .addFloat(mEditContainer, "alpha", 0, 1)
.addFloat(mDragHandle, "alpha", 1, 0, 0)
.addFloat(mPageIndicator, "alpha", 0, 1)
.setStartDelay(0.15f)
@@ -277,9 +255,18 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
}
@Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.DEVELOPMENT_SETTINGS_ENABLED), false,
+ mDeveloperSettingsObserver, UserHandle.USER_ALL);
+ }
+
+ @Override
@VisibleForTesting
public void onDetachedFromWindow() {
setListening(false);
+ mContext.getContentResolver().unregisterContentObserver(mDeveloperSettingsObserver);
super.onDetachedFromWindow();
}
@@ -337,7 +324,7 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
TunerService.isTunerEnabled(mContext) ? View.VISIBLE : View.INVISIBLE);
final boolean isDemo = UserManager.isDeviceInDemoMode(mContext);
mMultiUserSwitch.setVisibility(showUserSwitcher(isDemo) ? View.VISIBLE : View.INVISIBLE);
- mEdit.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
+ mEditContainer.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
mSettingsButton.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
}
@@ -364,16 +351,8 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
private void updateListeners() {
if (mListening) {
mUserInfoController.addCallback(this);
- if (mNetworkController.hasVoiceCallingFeature()) {
- mNetworkController.addEmergencyListener(this);
- mNetworkController.addCallback(this);
- }
- mCarrierTextController.setListening(this);
} else {
mUserInfoController.removeCallback(this);
- mNetworkController.removeEmergencyListener(this);
- mNetworkController.removeCallback(this);
- mCarrierTextController.setListening(null);
}
}
@@ -430,17 +409,6 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
}
@Override
- public void setEmergencyCallsOnly(boolean show) {
- boolean changed = show != mShowEmergencyCallsOnly;
- if (changed) {
- mShowEmergencyCallsOnly = show;
- if (mExpanded) {
- updateEverything();
- }
- }
- }
-
- @Override
public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
if (picture != null &&
UserManager.get(mContext).isGuestUser(KeyguardUpdateMonitor.getCurrentUser()) &&
@@ -452,162 +420,4 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
}
mMultiUserAvatar.setImageDrawable(picture);
}
-
- private void handleUpdateState() {
- for (int i = 0; i < SIM_SLOTS; i++) {
- mMobileGroups[i].setVisibility(mInfos[i].visible ? View.VISIBLE : View.GONE);
- if (mInfos[i].visible) {
- mMobileRoamings[i].setVisibility(mInfos[i].roaming ? View.VISIBLE : View.GONE);
- mMobileRoamings[i].setImageTintList(ColorStateList.valueOf(mColorForeground));
- SignalDrawable d = new SignalDrawable(mContext);
- d.setDarkIntensity(QuickStatusBarHeader.getColorIntensity(mColorForeground));
- mMobileSignals[i].setImageDrawable(d);
- mMobileSignals[i].setImageLevel(mInfos[i].mobileSignalIconId);
-
- StringBuilder contentDescription = new StringBuilder();
- if (mInfos[i].contentDescription != null) {
- contentDescription.append(mInfos[i].contentDescription).append(", ");
- }
- if (mInfos[i].roaming) {
- contentDescription
- .append(mContext.getString(R.string.data_connection_roaming))
- .append(", ");
- }
- // TODO: show mobile data off/no internet text for 5 seconds before carrier text
- if (TextUtils.equals(mInfos[i].typeContentDescription,
- mContext.getString(R.string.data_connection_no_internet))
- || TextUtils.equals(mInfos[i].typeContentDescription,
- mContext.getString(R.string.cell_data_off_content_description))) {
- contentDescription.append(mInfos[i].typeContentDescription);
- }
- mMobileSignals[i].setContentDescription(contentDescription);
- }
- }
- mCarrierDivider.setVisibility(
- mInfos[0].visible && mInfos[1].visible ? View.VISIBLE : View.GONE);
- }
-
- @VisibleForTesting
- protected int getSlotIndex(int subscriptionId) {
- return SubscriptionManager.getSlotIndex(subscriptionId);
- }
-
- @Override
- public void updateCarrierInfo(CarrierTextController.CarrierTextCallbackInfo info) {
- if (info.anySimReady) {
- boolean[] slotSeen = new boolean[SIM_SLOTS];
- if (info.listOfCarriers.length == info.subscriptionIds.length) {
- for (int i = 0; i < SIM_SLOTS && i < info.listOfCarriers.length; i++) {
- int slot = getSlotIndex(info.subscriptionIds[i]);
- if (slot >= SIM_SLOTS) {
- Log.w(TAG, "updateInfoCarrier - slot: " + slot);
- continue;
- }
- if (slot == SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
- Log.e(TAG,
- "Invalid SIM slot index for subscription: "
- + info.subscriptionIds[i]);
- continue;
- }
- mInfos[slot].visible = true;
- slotSeen[slot] = true;
- mCarrierTexts[slot].setText(info.listOfCarriers[i].toString().trim());
- mCarrierGroups[slot].setVisibility(View.VISIBLE);
- }
- for (int i = 0; i < SIM_SLOTS; i++) {
- if (!slotSeen[i]) {
- mInfos[i].visible = false;
- mCarrierGroups[i].setVisibility(View.GONE);
- }
- }
- } else {
- Log.e(TAG, "Carrier information arrays not of same length");
- }
- } else {
- mInfos[0].visible = false;
- mCarrierTexts[0].setText(info.carrierText);
- mCarrierGroups[0].setVisibility(View.VISIBLE);
- for (int i = 1; i < SIM_SLOTS; i++) {
- mInfos[i].visible = false;
- mCarrierTexts[i].setText("");
- mCarrierGroups[i].setVisibility(View.GONE);
- }
- }
- handleUpdateState();
- }
-
- @Override
- public void setMobileDataIndicators(NetworkController.IconState statusIcon,
- NetworkController.IconState qsIcon, int statusType,
- int qsType, boolean activityIn, boolean activityOut,
- String typeContentDescription,
- String description, boolean isWide, int subId, boolean roaming) {
- int slotIndex = getSlotIndex(subId);
- if (slotIndex >= SIM_SLOTS) {
- Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex);
- return;
- }
- if (slotIndex == SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
- Log.e(TAG, "Invalid SIM slot index for subscription: " + subId);
- return;
- }
- mInfos[slotIndex].visible = statusIcon.visible;
- mInfos[slotIndex].mobileSignalIconId = statusIcon.icon;
- mInfos[slotIndex].contentDescription = statusIcon.contentDescription;
- mInfos[slotIndex].typeContentDescription = typeContentDescription;
- mInfos[slotIndex].roaming = roaming;
- handleUpdateState();
- }
-
- @Override
- public void setNoSims(boolean hasNoSims, boolean simDetected) {
- if (hasNoSims) {
- mInfos[0].visible = false;
- mInfos[1].visible = false;
- }
- handleUpdateState();
- }
-
- private final class CellSignalState {
- boolean visible;
- int mobileSignalIconId;
- public String contentDescription;
- String typeContentDescription;
- boolean roaming;
- }
-
- /**
- * TextView that changes its ellipsize value with its visibility.
- */
- public static class QSCarrierText extends TextView {
- public QSCarrierText(Context context) {
- super(context);
- }
-
- public QSCarrierText(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public QSCarrierText(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public QSCarrierText(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- @Override
- protected void onVisibilityChanged(View changedView, int visibility) {
- super.onVisibilityChanged(changedView, visibility);
- // Only show marquee when visible
- if (visibility == VISIBLE) {
- setEllipsize(TextUtils.TruncateAt.MARQUEE);
- setSelected(true);
- } else {
- setEllipsize(TextUtils.TruncateAt.END);
- setSelected(false);
- }
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index f1f0f698ab72..3c3dfb138779 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -16,8 +16,6 @@
package com.android.systemui.qs;
-import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
-
import static com.android.systemui.qs.tileimpl.QSTileImpl.getColorForState;
import android.annotation.Nullable;
@@ -79,7 +77,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne
protected QSTileHost mHost;
protected QSSecurityFooter mFooter;
- private PageIndicator mPanelPageIndicator;
private PageIndicator mFooterPageIndicator;
private boolean mGridContentVisible = true;
@@ -110,11 +107,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne
mTileLayout.setListening(mListening);
addView((View) mTileLayout);
- mPanelPageIndicator = (PageIndicator) LayoutInflater.from(context).inflate(
- R.layout.qs_page_indicator, this, false);
- addView(mPanelPageIndicator);
-
- ((PagedTileLayout) mTileLayout).setPageIndicator(mPanelPageIndicator);
mQsTileRevealController = new QSTileRevealController(mContext, this,
(PagedTileLayout) mTileLayout);
@@ -141,10 +133,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne
return mDivider;
}
- public View getPageIndicator() {
- return mPanelPageIndicator;
- }
-
public QSTileRevealController getQsTileRevealController() {
return mQsTileRevealController;
}
@@ -265,21 +253,11 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne
private void updatePageIndicator() {
if (mTileLayout instanceof PagedTileLayout) {
- // If we're in landscape, and we have the footer page indicator (which we should if the
- // footer has been initialized & linked), then we'll show the footer page indicator to
- // save space in the main QS tile area. Otherwise, we'll use the default one under the
- // tiles/above the footer.
- boolean shouldUseFooterPageIndicator =
- getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE
- && mFooterPageIndicator != null;
-
- mPanelPageIndicator.setVisibility(View.GONE);
if (mFooterPageIndicator != null) {
mFooterPageIndicator.setVisibility(View.GONE);
- }
- ((PagedTileLayout) mTileLayout).setPageIndicator(
- shouldUseFooterPageIndicator ? mFooterPageIndicator : mPanelPageIndicator);
+ ((PagedTileLayout) mTileLayout).setPageIndicator(mFooterPageIndicator);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index 6a8c19ad0e77..b502a952471d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -15,7 +15,6 @@
package com.android.systemui.qs;
import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
-import static android.provider.Settings.System.SHOW_BATTERY_PERCENT;
import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
@@ -31,15 +30,12 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.database.ContentObserver;
import android.graphics.Color;
import android.graphics.Rect;
import android.media.AudioManager;
-import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.provider.AlarmClock;
-import android.provider.Settings;
import android.service.notification.ZenModeConfig;
import android.text.format.DateUtils;
import android.util.AttributeSet;
@@ -75,7 +71,6 @@ import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager;
import com.android.systemui.statusbar.phone.StatusIconContainer;
import com.android.systemui.statusbar.phone.SystemUIDialog;
-import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.Clock;
import com.android.systemui.statusbar.policy.DateView;
import com.android.systemui.statusbar.policy.NextAlarmController;
@@ -107,7 +102,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements
public static final int MAX_TOOLTIP_SHOWN_COUNT = 2;
private final Handler mHandler = new Handler();
- private final BatteryController mBatteryController;
private final NextAlarmController mAlarmController;
private final ZenModeController mZenController;
private final StatusBarIconController mStatusBarIconController;
@@ -119,6 +113,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements
private boolean mListening;
private boolean mQsDisabled;
+ private QSCarrierGroup mCarrierGroup;
protected QuickQSPanel mHeaderQsPanel;
protected QSTileHost mHost;
private TintedIconManager mIconManager;
@@ -162,9 +157,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements
};
private boolean mHasTopCutout = false;
- private final PercentSettingObserver mPercentSettingObserver =
- new PercentSettingObserver(new Handler(mContext.getMainLooper()));
-
/**
* Runnable for automatically fading out the long press tooltip (as if it were animating away).
*/
@@ -181,12 +173,11 @@ public class QuickStatusBarHeader extends RelativeLayout implements
@Inject
public QuickStatusBarHeader(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
NextAlarmController nextAlarmController, ZenModeController zenModeController,
- BatteryController batteryController, StatusBarIconController statusBarIconController,
+ StatusBarIconController statusBarIconController,
ActivityStarter activityStarter, PrivacyItemController privacyItemController) {
super(context, attrs);
mAlarmController = nextAlarmController;
mZenController = zenModeController;
- mBatteryController = batteryController;
mStatusBarIconController = statusBarIconController;
mActivityStarter = activityStarter;
mPrivacyItemController = privacyItemController;
@@ -217,6 +208,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements
mRingerModeTextView = findViewById(R.id.ringer_mode_text);
mPrivacyChip = findViewById(R.id.privacy_chip);
mPrivacyChip.setOnClickListener(this);
+ mCarrierGroup = findViewById(R.id.carrier_group);
updateResources();
@@ -241,7 +233,9 @@ public class QuickStatusBarHeader extends RelativeLayout implements
mBatteryRemainingIcon = findViewById(R.id.batteryRemainingIcon);
// Don't need to worry about tuner settings for this icon
mBatteryRemainingIcon.setIgnoreTunerUpdates(true);
- updateShowPercent();
+ // QS will always show the estimate, and BatteryMeterView handles the case where
+ // it's unavailable or charging
+ mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE);
}
private List<String> getIgnoredIconSlots() {
@@ -480,9 +474,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements
super.onAttachedToWindow();
mStatusBarIconController.addIconGroup(mIconManager);
requestApplyInsets();
- mContext.getContentResolver().registerContentObserver(
- Settings.System.getUriFor(SHOW_BATTERY_PERCENT), false, mPercentSettingObserver,
- ActivityManager.getCurrentUser());
}
@Override
@@ -521,7 +512,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements
public void onDetachedFromWindow() {
setListening(false);
mStatusBarIconController.removeIconGroup(mIconManager);
- mContext.getContentResolver().unregisterContentObserver(mPercentSettingObserver);
super.onDetachedFromWindow();
}
@@ -531,6 +521,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements
}
mHeaderQsPanel.setListening(listening);
mListening = listening;
+ mCarrierGroup.setListening(mListening);
if (listening) {
mZenController.addCallback(this);
@@ -743,25 +734,4 @@ public class QuickStatusBarHeader extends RelativeLayout implements
lp.rightMargin = sideMargins;
}
}
-
- private void updateShowPercent() {
- final boolean systemSetting = 0 != Settings.System
- .getIntForUser(getContext().getContentResolver(),
- SHOW_BATTERY_PERCENT, 0, ActivityManager.getCurrentUser());
-
- mBatteryRemainingIcon.setPercentShowMode(systemSetting
- ? BatteryMeterView.MODE_ESTIMATE : BatteryMeterView.MODE_ON);
- }
-
- private final class PercentSettingObserver extends ContentObserver {
- PercentSettingObserver(Handler handler) {
- super(handler);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- super.onChange(selfChange, uri);
- updateShowPercent();
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index a9fe3b251f7b..dfbb32e451d6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -581,13 +581,12 @@ public class KeyguardIndicationController implements StateListener {
if (!updateMonitor.isUnlockingWithBiometricAllowed()) {
return;
}
- ColorStateList errorColorState = Utils.getColorError(mContext);
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
mStatusBarKeyguardViewManager.showBouncerMessage(helpString,
- errorColorState);
+ mInitialTextColorState);
} else if (updateMonitor.isScreenOn()) {
mLockIcon.setTransientBiometricsError(true);
- showTransientIndication(helpString, errorColorState);
+ showTransientIndication(helpString);
hideTransientIndicationDelayed(TRANSIENT_BIOMETRIC_ERROR_TIMEOUT);
mHandler.removeMessages(MSG_CLEAR_BIOMETRIC_MSG);
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CLEAR_BIOMETRIC_MSG),
@@ -605,7 +604,6 @@ public class KeyguardIndicationController implements StateListener {
if (shouldSuppressBiometricError(msgId, biometricSourceType, updateMonitor)) {
return;
}
- ColorStateList errorColorState = Utils.getColorError(mContext);
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
// When swiping up right after receiving a biometric error, the bouncer calls
// authenticate leading to the same message being shown again on the bouncer.
@@ -613,10 +611,10 @@ public class KeyguardIndicationController implements StateListener {
// generic.
if (mLastSuccessiveErrorMessage != msgId) {
mStatusBarKeyguardViewManager.showBouncerMessage(errString,
- errorColorState);
+ mInitialTextColorState);
}
} else if (updateMonitor.isScreenOn()) {
- showTransientIndication(errString, errorColorState);
+ showTransientIndication(errString);
// We want to keep this message around in case the screen was off
hideTransientIndicationDelayed(HIDE_DELAY_MS);
} else {
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 60015efef92a..64e76d39af78 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
@@ -43,18 +43,15 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
private static final int STATE_LOCKED = 0;
private static final int STATE_LOCK_OPEN = 1;
- private static final int STATE_FACE_UNLOCK = 2;
- private static final int STATE_FINGERPRINT = 3;
- private static final int STATE_BIOMETRICS_ERROR = 4;
+ private static final int STATE_SCANNING_FACE = 2;
+ private static final int STATE_BIOMETRICS_ERROR = 3;
private int mLastState = 0;
private boolean mTransientBiometricsError;
private boolean mScreenOn;
private boolean mLastScreenOn;
- private Drawable mUserAvatarIcon;
private final UnlockMethodCache mUnlockMethodCache;
private AccessibilityController mAccessibilityController;
- private boolean mHasFingerPrintState;
private boolean mIsFaceUnlockState;
private int mDensity;
private boolean mPulsing;
@@ -77,7 +74,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
@Override
public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
- mUserAvatarIcon = picture;
update();
}
@@ -110,10 +106,8 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
public void update(boolean force) {
int state = getState();
- boolean anyFingerprintState = state == STATE_FINGERPRINT
- || state == STATE_BIOMETRICS_ERROR;
- mIsFaceUnlockState = state == STATE_FACE_UNLOCK;
- if (state != mLastState || mLastDozing == mDozing || mLastPulsing == mPulsing
+ mIsFaceUnlockState = state == STATE_SCANNING_FACE;
+ if (state != mLastState || mLastDozing != mDozing || mLastPulsing != mPulsing
|| mLastScreenOn != mScreenOn || force) {
int iconAnimRes = getAnimationResForTransition(mLastState, state, mLastPulsing,
mPulsing, mLastDozing, mDozing);
@@ -138,7 +132,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
R.string.accessibility_scanning_face));
}
- mHasFingerPrintState = anyFingerprintState;
if (animation != null && isAnim) {
animation.forceAnimationOnUI();
animation.start();
@@ -178,7 +171,10 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
- if (mHasFingerPrintState) {
+ KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ boolean fingerprintRunning = updateMonitor.isFingerprintDetectionRunning();
+ boolean unlockingAllowed = updateMonitor.isUnlockingWithBiometricAllowed();
+ if (fingerprintRunning && unlockingAllowed) {
AccessibilityNodeInfo.AccessibilityAction unlock
= new AccessibilityNodeInfo.AccessibilityAction(
AccessibilityNodeInfo.ACTION_CLICK,
@@ -201,21 +197,16 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
private Drawable getIconForState(int state) {
int iconRes;
switch (state) {
- case STATE_FINGERPRINT:
case STATE_LOCKED:
- case STATE_FACE_UNLOCK:
+ // Scanning animation is a pulsing padlock. This means that the resting state is
+ // just a padlock.
+ 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;
break;
case STATE_LOCK_OPEN:
- if (mUnlockMethodCache.isTrustManaged() && mUnlockMethodCache.isTrusted()
- && mUserAvatarIcon != null) {
- return mUserAvatarIcon;
- } else {
- iconRes = com.android.internal.R.drawable.ic_lock_open_24dp;
- }
- break;
- case STATE_BIOMETRICS_ERROR:
- iconRes = com.android.internal.R.drawable.ic_auth_error;
+ iconRes = com.android.internal.R.drawable.ic_lock_open_24dp;
break;
default:
throw new IllegalArgumentException();
@@ -224,22 +215,28 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
return mContext.getDrawable(iconRes);
}
- private int getAnimationResForTransition(int oldState, int newState,
+ private static int getAnimationResForTransition(int oldState, int newState,
boolean wasPulsing, boolean pulsing,
boolean wasDozing, boolean dozing) {
- boolean isError = newState == STATE_BIOMETRICS_ERROR;
- boolean isUnlocked = newState == STATE_LOCK_OPEN;
- boolean isLocked = !isUnlocked;
- boolean wasUnlocked = oldState == STATE_LOCK_OPEN;
+ // Never animate when screen is off
+ if (dozing && !pulsing) {
+ return -1;
+ }
+
+ boolean isError = oldState != STATE_BIOMETRICS_ERROR && newState == STATE_BIOMETRICS_ERROR;
+ boolean justUnlocked = oldState != STATE_LOCK_OPEN && newState == STATE_LOCK_OPEN;
+ boolean justLocked = oldState == STATE_LOCK_OPEN && newState == STATE_LOCKED;
if (isError) {
return com.android.internal.R.anim.lock_to_error;
- } else if (isUnlocked) {
+ } else if (justUnlocked) {
return com.android.internal.R.anim.lock_unlock;
- } else if (wasUnlocked && isLocked && mScreenOn) {
+ } else if (justLocked) {
return com.android.internal.R.anim.lock_lock;
- } else if (isLocked && (!wasPulsing && pulsing || wasDozing && !dozing)) {
+ } else if (newState == STATE_SCANNING_FACE) {
+ return com.android.internal.R.anim.lock_scanning;
+ } else if (!wasPulsing && pulsing) {
return com.android.internal.R.anim.lock_in;
}
return -1;
@@ -247,17 +244,13 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
private int getState() {
KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
- boolean fingerprintRunning = updateMonitor.isFingerprintDetectionRunning();
- boolean unlockingAllowed = updateMonitor.isUnlockingWithBiometricAllowed();
if (mTransientBiometricsError) {
return STATE_BIOMETRICS_ERROR;
} else if (mUnlockMethodCache.canSkipBouncer()) {
return STATE_LOCK_OPEN;
} else if (mUnlockMethodCache.isFaceUnlockRunning()
|| updateMonitor.isFaceDetectionRunning()) {
- return STATE_FACE_UNLOCK;
- } else if (fingerprintRunning && unlockingAllowed) {
- return STATE_FINGERPRINT;
+ return STATE_SCANNING_FACE;
} else {
return STATE_LOCKED;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
index 5e94152e7eab..111cdd2cc32a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.policy;
+import android.annotation.Nullable;
+
import com.android.systemui.DemoMode;
import com.android.systemui.Dumpable;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
@@ -78,6 +80,6 @@ public interface BatteryController extends DemoMode, Dumpable,
* The callback
* @param estimate the estimate
*/
- void onBatteryRemainingEstimateRetrieved(String estimate);
+ void onBatteryRemainingEstimateRetrieved(@Nullable String estimate);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
index 3fa3e1a6e6d4..273fa55ee9d8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
@@ -237,10 +237,10 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
mFetchingEstimate = true;
Dependency.get(Dependency.BG_HANDLER).post(() -> {
- mEstimate = mEstimates.getEstimate();
+ // Only fetch the estimate if they are enabled
+ mEstimate = mEstimates.isHybridNotificationEnabled() ? mEstimates.getEstimate() : null;
mLastEstimateTimestamp = System.currentTimeMillis();
mFetchingEstimate = false;
-
Dependency.get(Dependency.MAIN_HANDLER).post(this::notifyEstimateFetchCallbacks);
});
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
index c6636b480bfa..e6b6672d3544 100644
--- a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
+++ b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
@@ -24,6 +24,7 @@ import android.view.LayoutInflater;
import android.view.View;
import com.android.systemui.SystemUIFactory;
+import com.android.systemui.qs.QSCarrierGroup;
import com.android.systemui.qs.QSFooterImpl;
import com.android.systemui.qs.QuickStatusBarHeader;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
@@ -124,6 +125,11 @@ public class InjectionInflationController {
* Creates the NotificationPanelView.
*/
NotificationPanelView createPanelView();
+
+ /**
+ * Creates the QSCarrierGroup
+ */
+ QSCarrierGroup createQSCarrierGroup();
}
/**
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSCarrierGroupTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSCarrierGroupTest.java
new file mode 100644
index 000000000000..f29392b2c5d6
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSCarrierGroupTest.java
@@ -0,0 +1,177 @@
+/*
+ * 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 com.android.systemui.qs;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.telephony.SubscriptionManager;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.LayoutInflater;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.keyguard.CarrierTextController;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.utils.leaks.LeakCheckedTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+@SmallTest
+public class QSCarrierGroupTest extends LeakCheckedTest {
+
+ private QSCarrierGroup mCarrierGroup;
+
+ @Before
+ public void setup() throws Exception {
+ injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
+ TestableLooper.get(this).runWithLooper(
+ () -> mCarrierGroup = (QSCarrierGroup) LayoutInflater.from(mContext).inflate(
+ R.layout.qs_carrier_group, null));
+ }
+
+ @Test // throws no Exception
+ public void testUpdateCarrierText_sameLengths() {
+ QSCarrierGroup spiedCarrierGroup = Mockito.spy(mCarrierGroup);
+ when(spiedCarrierGroup.getSlotIndex(anyInt())).thenAnswer(
+ new Answer<Integer>() {
+ @Override
+ public Integer answer(InvocationOnMock invocationOnMock) throws Throwable {
+ return invocationOnMock.getArgument(0);
+ }
+ });
+
+ // listOfCarriers length 1, subscriptionIds length 1, anySims false
+ CarrierTextController.CarrierTextCallbackInfo
+ c1 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{""},
+ false,
+ new int[]{0});
+ spiedCarrierGroup.updateCarrierInfo(c1);
+
+ // listOfCarriers length 1, subscriptionIds length 1, anySims true
+ CarrierTextController.CarrierTextCallbackInfo
+ c2 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{""},
+ true,
+ new int[]{0});
+ spiedCarrierGroup.updateCarrierInfo(c2);
+
+ // listOfCarriers length 2, subscriptionIds length 2, anySims false
+ CarrierTextController.CarrierTextCallbackInfo
+ c3 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{"", ""},
+ false,
+ new int[]{0, 1});
+ spiedCarrierGroup.updateCarrierInfo(c3);
+
+ // listOfCarriers length 2, subscriptionIds length 2, anySims true
+ CarrierTextController.CarrierTextCallbackInfo
+ c4 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{"", ""},
+ true,
+ new int[]{0, 1});
+ spiedCarrierGroup.updateCarrierInfo(c4);
+ }
+
+ @Test // throws no Exception
+ public void testUpdateCarrierText_differentLength() {
+ QSCarrierGroup spiedCarrierGroup = Mockito.spy(mCarrierGroup);
+ when(spiedCarrierGroup.getSlotIndex(anyInt())).thenAnswer(
+ new Answer<Integer>() {
+ @Override
+ public Integer answer(InvocationOnMock invocationOnMock) throws Throwable {
+ return invocationOnMock.getArgument(0);
+ }
+ });
+
+ // listOfCarriers length 2, subscriptionIds length 1, anySims false
+ CarrierTextController.CarrierTextCallbackInfo
+ c1 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{"", ""},
+ false,
+ new int[]{0});
+ spiedCarrierGroup.updateCarrierInfo(c1);
+
+ // listOfCarriers length 2, subscriptionIds length 1, anySims true
+ CarrierTextController.CarrierTextCallbackInfo
+ c2 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{"", ""},
+ true,
+ new int[]{0});
+ spiedCarrierGroup.updateCarrierInfo(c2);
+
+ // listOfCarriers length 1, subscriptionIds length 2, anySims false
+ CarrierTextController.CarrierTextCallbackInfo
+ c3 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{""},
+ false,
+ new int[]{0, 1});
+ spiedCarrierGroup.updateCarrierInfo(c3);
+
+ // listOfCarriers length 1, subscriptionIds length 2, anySims true
+ CarrierTextController.CarrierTextCallbackInfo
+ c4 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{""},
+ true,
+ new int[]{0, 1});
+ spiedCarrierGroup.updateCarrierInfo(c4);
+ }
+
+ @Test // throws no Exception
+ public void testUpdateCarrierText_invalidSim() {
+ QSCarrierGroup spiedCarrierGroup = Mockito.spy(mCarrierGroup);
+ when(spiedCarrierGroup.getSlotIndex(anyInt())).thenReturn(
+ SubscriptionManager.INVALID_SIM_SLOT_INDEX);
+ CarrierTextController.CarrierTextCallbackInfo
+ c4 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{"", ""},
+ true,
+ new int[]{0, 1});
+ spiedCarrierGroup.updateCarrierInfo(c4);
+ }
+
+ @Test // throws no Exception
+ public void testSetMobileDataIndicators_invalidSim() {
+ QSCarrierGroup spiedCarrierGroup = Mockito.spy(mCarrierGroup);
+ when(spiedCarrierGroup.getSlotIndex(anyInt())).thenReturn(
+ SubscriptionManager.INVALID_SIM_SLOT_INDEX);
+ spiedCarrierGroup.setMobileDataIndicators(
+ mock(NetworkController.IconState.class),
+ mock(NetworkController.IconState.class),
+ 0, 0, true, true, "", "", true, 0, true);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java
index a8b169cc63d2..d4688d77a840 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java
@@ -16,13 +16,10 @@ package com.android.systemui.qs;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.telephony.SubscriptionManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -31,21 +28,16 @@ import android.view.View;
import androidx.test.filters.SmallTest;
-import com.android.keyguard.CarrierTextController.CarrierTextCallbackInfo;
import com.android.systemui.R;
import com.android.systemui.R.id;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
-import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.utils.leaks.LeakCheckedTest;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mockito;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@@ -77,117 +69,4 @@ public class QSFooterImplTest extends LeakCheckedTest {
// Verify Settings wasn't launched.
verify(mActivityStarter, never()).startActivity(any(), anyBoolean());
}
-
- @Test // throws no Exception
- public void testUpdateCarrierText_sameLengts() {
- QSFooterImpl spiedFooter = Mockito.spy(mFooter);
- when(spiedFooter.getSlotIndex(anyInt())).thenAnswer(
- new Answer<Integer>() {
- @Override
- public Integer answer(InvocationOnMock invocationOnMock) throws Throwable {
- return invocationOnMock.getArgument(0);
- }
- });
-
- // listOfCarriers length 1, subscriptionIds length 1, anySims false
- CarrierTextCallbackInfo c1 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{""},
- false,
- new int[]{0});
- spiedFooter.updateCarrierInfo(c1);
-
- // listOfCarriers length 1, subscriptionIds length 1, anySims true
- CarrierTextCallbackInfo c2 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{""},
- true,
- new int[]{0});
- spiedFooter.updateCarrierInfo(c2);
-
- // listOfCarriers length 2, subscriptionIds length 2, anySims false
- CarrierTextCallbackInfo c3 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{"", ""},
- false,
- new int[]{0, 1});
- spiedFooter.updateCarrierInfo(c3);
-
- // listOfCarriers length 2, subscriptionIds length 2, anySims true
- CarrierTextCallbackInfo c4 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{"", ""},
- true,
- new int[]{0, 1});
- spiedFooter.updateCarrierInfo(c4);
- }
-
- @Test // throws no Exception
- public void testUpdateCarrierText_differentLength() {
- QSFooterImpl spiedFooter = Mockito.spy(mFooter);
- when(spiedFooter.getSlotIndex(anyInt())).thenAnswer(
- new Answer<Integer>() {
- @Override
- public Integer answer(InvocationOnMock invocationOnMock) throws Throwable {
- return invocationOnMock.getArgument(0);
- }
- });
-
- // listOfCarriers length 2, subscriptionIds length 1, anySims false
- CarrierTextCallbackInfo c1 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{"", ""},
- false,
- new int[]{0});
- spiedFooter.updateCarrierInfo(c1);
-
- // listOfCarriers length 2, subscriptionIds length 1, anySims true
- CarrierTextCallbackInfo c2 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{"", ""},
- true,
- new int[]{0});
- spiedFooter.updateCarrierInfo(c2);
-
- // listOfCarriers length 1, subscriptionIds length 2, anySims false
- CarrierTextCallbackInfo c3 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{""},
- false,
- new int[]{0, 1});
- spiedFooter.updateCarrierInfo(c3);
-
- // listOfCarriers length 1, subscriptionIds length 2, anySims true
- CarrierTextCallbackInfo c4 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{""},
- true,
- new int[]{0, 1});
- spiedFooter.updateCarrierInfo(c4);
- }
-
- @Test // throws no Exception
- public void testUpdateCarrierText_invalidSim() {
- QSFooterImpl spiedFooter = Mockito.spy(mFooter);
- when(spiedFooter.getSlotIndex(anyInt())).thenReturn(
- SubscriptionManager.INVALID_SIM_SLOT_INDEX);
- CarrierTextCallbackInfo c4 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{"", ""},
- true,
- new int[]{0, 1});
- spiedFooter.updateCarrierInfo(c4);
- }
-
- @Test // throws no Exception
- public void testSetMobileDataIndicators_invalidSim() {
- QSFooterImpl spiedFooter = Mockito.spy(mFooter);
- when(spiedFooter.getSlotIndex(anyInt())).thenReturn(
- SubscriptionManager.INVALID_SIM_SLOT_INDEX);
- spiedFooter.setMobileDataIndicators(
- mock(NetworkController.IconState.class),
- mock(NetworkController.IconState.class),
- 0, 0, true, true, "", "", true, 0, true);
- }
-
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
index 785d5b014862..ff849c3720f3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
@@ -69,6 +69,7 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.util.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -461,6 +462,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
}
@Test
+ @Ignore
public void testSetShouldManageLifetime_setShouldManage() {
NotificationEntry entry = createTestNotificationRow().getEntry();
mGutsManager.setShouldManageLifetime(entry, true /* shouldManage */);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
index ca0e1c64a7a9..043b832730e5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
@@ -35,11 +35,13 @@ import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
@SmallTest
+@Ignore
public class StatusBarWindowViewTest extends SysuiTestCase {
private StatusBarWindowView mView;
@@ -60,6 +62,7 @@ public class StatusBarWindowViewTest extends SysuiTestCase {
}
@Test
+ @Ignore
public void testDragDownHelperCalledWhenDraggingDown() throws Exception {
when(Dependency.get(StatusBarStateController.class).getState())
.thenReturn(StatusBarState.SHADE);
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
index 7112beb686b2..0205ad8751aa 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
@@ -90,11 +90,11 @@ public final class ContentCaptureManagerService extends
private ActivityManagerInternal mAm;
/**
- * Users disabled by {@link android.provider.Settings.Secure#CONTENT_CAPTURE_ENABLED}.
+ * Users disabled by {@link android.provider.Settings.Secure#CONTENT_CAPTURE_ENABLED}
*/
@GuardedBy("mLock")
@Nullable
- private SparseBooleanArray mDisabledUsers;
+ private SparseBooleanArray mDisabledBySettings;
/**
* Global kill-switch based on value defined by
@@ -131,18 +131,18 @@ public final class ContentCaptureManagerService extends
mRequestsHistory = null;
}
- // Sets which services are disabled
+ // Sets which services are disabled by settings
final UserManager um = getContext().getSystemService(UserManager.class);
final List<UserInfo> users = um.getUsers();
for (int i = 0; i < users.size(); i++) {
final int userId = users.get(i).id;
- final boolean disabled = mDisabledByDeviceConfig || isDisabledBySettings(userId);
+ final boolean disabled = !isEnabledBySettings(userId);
if (disabled) {
- Slog.i(mTag, "user " + userId + " disabled by settings or device config");
- if (mDisabledUsers == null) {
- mDisabledUsers = new SparseBooleanArray(1);
+ Slog.i(mTag, "user " + userId + " disabled by settings");
+ if (mDisabledBySettings == null) {
+ mDisabledBySettings = new SparseBooleanArray(1);
}
- mDisabledUsers.put(userId, true);
+ mDisabledBySettings.put(userId, true);
}
}
}
@@ -188,7 +188,8 @@ public final class ContentCaptureManagerService extends
protected void onSettingsChanged(@UserIdInt int userId, @NonNull String property) {
switch (property) {
case Settings.Secure.CONTENT_CAPTURE_ENABLED:
- setContentCaptureFeatureEnabledFromSettings(userId);
+ setContentCaptureFeatureEnabledBySettingsForUser(userId,
+ isEnabledBySettings(userId));
return;
default:
Slog.w(mTag, "Unexpected property (" + property + "); updating cache instead");
@@ -202,31 +203,13 @@ public final class ContentCaptureManagerService extends
}
private boolean isDisabledBySettingsLocked(@UserIdInt int userId) {
- return mDisabledUsers != null && mDisabledUsers.get(userId);
+ return mDisabledBySettings != null && mDisabledBySettings.get(userId);
}
- private void setContentCaptureFeatureEnabledFromSettings(@UserIdInt int userId) {
- setContentCaptureFeatureEnabledForUser(userId, !isDisabledBySettings(userId));
- }
-
- private boolean isDisabledBySettings(@UserIdInt int userId) {
- final String property = Settings.Secure.CONTENT_CAPTURE_ENABLED;
- final String value = Settings.Secure.getStringForUser(getContext().getContentResolver(),
- property, userId);
- if (value == null) {
- if (verbose) {
- Slog.v(mTag, "isDisabledBySettings(): assuming false as '" + property
- + "' is not set");
- }
- return false;
- }
-
- try {
- return !Boolean.valueOf(value);
- } catch (Exception e) {
- Slog.w(mTag, "Invalid value for property " + property + ": " + value);
- }
- return false;
+ private boolean isEnabledBySettings(@UserIdInt int userId) {
+ final boolean enabled = Settings.Secure.getIntForUser(getContext().getContentResolver(),
+ Settings.Secure.CONTENT_CAPTURE_ENABLED, 1, userId) == 1 ? true : false;
+ return enabled;
}
private void onDeviceConfigChange(@NonNull String key, @Nullable String value) {
@@ -332,12 +315,13 @@ public final class ContentCaptureManagerService extends
}
}
- private void setContentCaptureFeatureEnabledForUser(@UserIdInt int userId, boolean enabled) {
+ private void setContentCaptureFeatureEnabledBySettingsForUser(@UserIdInt int userId,
+ boolean enabled) {
synchronized (mLock) {
- if (mDisabledUsers == null) {
- mDisabledUsers = new SparseBooleanArray();
+ if (mDisabledBySettings == null) {
+ mDisabledBySettings = new SparseBooleanArray();
}
- final boolean alreadyEnabled = !mDisabledUsers.get(userId);
+ final boolean alreadyEnabled = !mDisabledBySettings.get(userId);
if (!(enabled ^ alreadyEnabled)) {
if (debug) {
Slog.d(mTag, "setContentCaptureFeatureEnabledForUser(): already " + enabled);
@@ -347,13 +331,14 @@ public final class ContentCaptureManagerService extends
if (enabled) {
Slog.i(mTag, "setContentCaptureFeatureEnabled(): enabling service for user "
+ userId);
- mDisabledUsers.delete(userId);
+ mDisabledBySettings.delete(userId);
} else {
Slog.i(mTag, "setContentCaptureFeatureEnabled(): disabling service for user "
+ userId);
- mDisabledUsers.put(userId, true);
+ mDisabledBySettings.put(userId, true);
}
- updateCachedServiceLocked(userId, !enabled);
+ final boolean disabled = !enabled || mDisabledByDeviceConfig;
+ updateCachedServiceLocked(userId, disabled);
}
}
@@ -473,7 +458,7 @@ public final class ContentCaptureManagerService extends
final String prefix2 = prefix + " ";
- pw.print(prefix); pw.print("Disabled users: "); pw.println(mDisabledUsers);
+ pw.print(prefix); pw.print("Users disabled by Settings: "); pw.println(mDisabledBySettings);
pw.print(prefix); pw.println("DeviceConfig Settings: ");
pw.print(prefix2); pw.print("disabled: "); pw.println(mDisabledByDeviceConfig);
pw.print(prefix2); pw.print("loggingLevel: "); pw.println(mDevCfgLoggingLevel);
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
index 516f7f59e593..06031548f6ef 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
@@ -509,7 +509,7 @@ final class ContentCapturePerUserService
final long token = Binder.clearCallingIdentity();
try {
Settings.Secure.putStringForUser(getContext().getContentResolver(),
- Settings.Secure.CONTENT_CAPTURE_ENABLED, "false", mUserId);
+ Settings.Secure.CONTENT_CAPTURE_ENABLED, "0", mUserId);
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 02d31b80db59..620fb2cd8553 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -1161,11 +1161,11 @@ public final class ProcessList {
*
* @param pid The process identifier to set.
* @param uid The uid of the app
- * @param amt Adjustment value -- lmkd allows -16 to +15.
+ * @param amt Adjustment value -- lmkd allows -1000 to +1000
*
* {@hide}
*/
- public static final void setOomAdj(int pid, int uid, int amt) {
+ public static void setOomAdj(int pid, int uid, int amt) {
// This indicates that the process is not started yet and so no need to proceed further.
if (pid <= 0) {
return;
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 0bc46f190e0b..b6995dbd2c37 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -409,7 +409,8 @@ public class LockSettingsService extends ILockSettings.Stub {
}
public SyntheticPasswordManager getSyntheticPasswordManager(LockSettingsStorage storage) {
- return new SyntheticPasswordManager(getContext(), storage, getUserManager());
+ return new SyntheticPasswordManager(getContext(), storage, getUserManager(),
+ new PasswordSlotManager());
}
public boolean hasBiometrics() {
diff --git a/services/core/java/com/android/server/locksettings/PasswordSlotManager.java b/services/core/java/com/android/server/locksettings/PasswordSlotManager.java
new file mode 100644
index 000000000000..686ae2bbaede
--- /dev/null
+++ b/services/core/java/com/android/server/locksettings/PasswordSlotManager.java
@@ -0,0 +1,191 @@
+/*
+ * 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 com.android.server.locksettings;
+
+import android.os.SystemProperties;
+import android.util.Slog;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Paths;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * A class that maintains a mapping of which password slots are used by alternate OS images when
+ * dual-booting a device. Currently, slots can either be owned by the host OS or a live GSI.
+ * This mapping is stored in /metadata/password_slots/slot_map using Java Properties.
+ *
+ * If a /metadata partition does not exist, GSIs are not supported, and PasswordSlotManager will
+ * simply not persist the slot mapping.
+ */
+public class PasswordSlotManager {
+ private static final String TAG = "PasswordSlotManager";
+
+ private static final String GSI_RUNNING_PROP = "ro.gsid.image_running";
+ private static final String SLOT_MAP_DIR = "/metadata/password_slots";
+
+ // This maps each used password slot to the OS image that created it. Password slots are
+ // integer keys/indices into secure storage. The OS image is recorded as a string. The factory
+ // image is "host" and GSIs are "gsi<N>" where N >= 1.
+ private final Map<Integer, String> mSlotMap;
+
+ public PasswordSlotManager() {
+ mSlotMap = loadSlotMap();
+ }
+
+ @VisibleForTesting
+ protected String getSlotMapDir() {
+ return SLOT_MAP_DIR;
+ }
+
+ @VisibleForTesting
+ protected int getGsiImageNumber() {
+ return SystemProperties.getInt(GSI_RUNNING_PROP, 0);
+ }
+
+ /**
+ * Notify the manager of which slots are definitively in use by the current OS image.
+ *
+ * @throws RuntimeException
+ */
+ public void refreshActiveSlots(Set<Integer> activeSlots) throws RuntimeException {
+ // Update which slots are owned by the current image.
+ final HashSet<Integer> slotsToDelete = new HashSet<Integer>();
+ for (Map.Entry<Integer, String> entry : mSlotMap.entrySet()) {
+ // Delete possibly stale entries for the current image.
+ if (entry.getValue().equals(getMode())) {
+ slotsToDelete.add(entry.getKey());
+ }
+ }
+ for (Integer slot : slotsToDelete) {
+ mSlotMap.remove(slot);
+ }
+
+ // Add slots for the current image.
+ for (Integer slot : activeSlots) {
+ mSlotMap.put(slot, getMode());
+ }
+
+ saveSlotMap();
+ }
+
+ /**
+ * Mark the given slot as in use by the current OS image.
+ *
+ * @throws RuntimeException
+ */
+ public void markSlotInUse(int slot) throws RuntimeException {
+ if (mSlotMap.containsKey(slot) && !mSlotMap.get(slot).equals(getMode())) {
+ throw new RuntimeException("password slot " + slot + " is not available");
+ }
+ mSlotMap.put(slot, getMode());
+ saveSlotMap();
+ }
+
+ /**
+ * Mark the given slot as no longer in use by the current OS image.
+ *
+ * @throws RuntimeException
+ */
+ public void markSlotDeleted(int slot) throws RuntimeException {
+ if (mSlotMap.containsKey(slot) && mSlotMap.get(slot) != getMode()) {
+ throw new RuntimeException("password slot " + slot + " cannot be deleted");
+ }
+ mSlotMap.remove(slot);
+ saveSlotMap();
+ }
+
+ /**
+ * Return the set of slots used across all OS images.
+ *
+ * @return Integer set of all used slots.
+ */
+ public Set<Integer> getUsedSlots() {
+ return Collections.unmodifiableSet(mSlotMap.keySet());
+ }
+
+ private File getSlotMapFile() {
+ return Paths.get(getSlotMapDir(), "slot_map").toFile();
+ }
+
+ private String getMode() {
+ int gsiIndex = getGsiImageNumber();
+ if (gsiIndex > 0) {
+ return "gsi" + gsiIndex;
+ }
+ return "host";
+ }
+
+ @VisibleForTesting
+ protected Map<Integer, String> loadSlotMap(InputStream stream) throws IOException {
+ final HashMap<Integer, String> map = new HashMap<Integer, String>();
+ final Properties props = new Properties();
+ props.load(stream);
+ for (String slotString : props.stringPropertyNames()) {
+ final int slot = Integer.parseInt(slotString);
+ final String owner = props.getProperty(slotString);
+ map.put(slot, owner);
+ }
+ return map;
+ }
+
+ private Map<Integer, String> loadSlotMap() {
+ // It's okay if the file doesn't exist.
+ final File file = getSlotMapFile();
+ if (file.exists()) {
+ try (FileInputStream stream = new FileInputStream(file)) {
+ return loadSlotMap(stream);
+ } catch (Exception e) {
+ Slog.e(TAG, "Could not load slot map file", e);
+ }
+ }
+ return new HashMap<Integer, String>();
+ }
+
+ @VisibleForTesting
+ protected void saveSlotMap(OutputStream stream) throws IOException {
+ final Properties props = new Properties();
+ for (Map.Entry<Integer, String> entry : mSlotMap.entrySet()) {
+ props.setProperty(entry.getKey().toString(), entry.getValue());
+ }
+ props.store(stream, "");
+ }
+
+ private void saveSlotMap() {
+ if (!getSlotMapFile().getParentFile().exists()) {
+ Slog.w(TAG, "Not saving slot map, " + getSlotMapDir() + " does not exist");
+ return;
+ }
+
+ try (FileOutputStream fos = new FileOutputStream(getSlotMapFile())) {
+ saveSlotMap(fos);
+ } catch (IOException e) {
+ Slog.e(TAG, "failed to save password slot map", e);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
index ea39dff1acc9..dbcfbcde9e36 100644
--- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
+++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
@@ -287,14 +287,16 @@ public class SyntheticPasswordManager {
private LockSettingsStorage mStorage;
private IWeaver mWeaver;
private WeaverConfig mWeaverConfig;
+ private PasswordSlotManager mPasswordSlotManager;
private final UserManager mUserManager;
public SyntheticPasswordManager(Context context, LockSettingsStorage storage,
- UserManager userManager) {
+ UserManager userManager, PasswordSlotManager passwordSlotManager) {
mContext = context;
mStorage = storage;
mUserManager = userManager;
+ mPasswordSlotManager = passwordSlotManager;
}
@VisibleForTesting
@@ -324,6 +326,7 @@ public class SyntheticPasswordManager {
mWeaver = null;
}
});
+ mPasswordSlotManager.refreshActiveSlots(getUsedWeaverSlots());
}
} catch (RemoteException e) {
Slog.e(TAG, "Failed to get weaver service", e);
@@ -561,6 +564,7 @@ public class SyntheticPasswordManager {
Log.i(TAG, "Destroy weaver slot " + slot + " for user " + userId);
try {
weaverEnroll(slot, null, null);
+ mPasswordSlotManager.markSlotDeleted(slot);
} catch (RemoteException e) {
Log.w(TAG, "Failed to destroy slot", e);
}
@@ -595,6 +599,7 @@ public class SyntheticPasswordManager {
private int getNextAvailableWeaverSlot() {
Set<Integer> usedSlots = getUsedWeaverSlots();
+ usedSlots.addAll(mPasswordSlotManager.getUsedSlots());
for (int i = 0; i < mWeaverConfig.slots; i++) {
if (!usedSlots.contains(i)) {
return i;
@@ -640,6 +645,7 @@ public class SyntheticPasswordManager {
return DEFAULT_HANDLE;
}
saveWeaverSlot(weaverSlot, handle, userId);
+ mPasswordSlotManager.markSlotInUse(weaverSlot);
synchronizeWeaverFrpPassword(pwd, requestedQuality, userId, weaverSlot);
pwd.passwordHandle = null;
@@ -798,6 +804,7 @@ public class SyntheticPasswordManager {
return false;
}
saveWeaverSlot(slot, handle, userId);
+ mPasswordSlotManager.markSlotInUse(slot);
}
saveSecdiscardable(handle, tokenData.secdiscardableOnDisk, userId);
createSyntheticPasswordBlob(handle, SYNTHETIC_PASSWORD_TOKEN_BASED, authToken,
diff --git a/services/core/java/com/android/server/om/IdmapManager.java b/services/core/java/com/android/server/om/IdmapManager.java
index 74fbea1544bd..9e0cb0fae5e9 100644
--- a/services/core/java/com/android/server/om/IdmapManager.java
+++ b/services/core/java/com/android/server/om/IdmapManager.java
@@ -36,6 +36,7 @@ import android.os.UserHandle;
import android.util.Slog;
import com.android.internal.os.BackgroundThread;
+import com.android.server.om.OverlayManagerServiceImpl.PackageManagerHelper;
import com.android.server.pm.Installer;
import java.io.File;
@@ -52,6 +53,7 @@ class IdmapManager {
private static final boolean FEATURE_FLAG_IDMAP2 = true;
private final Installer mInstaller;
+ private final PackageManagerHelper mPackageManager;
private IIdmap2 mIdmap2Service;
private static final boolean VENDOR_IS_Q_OR_LATER;
@@ -61,8 +63,9 @@ class IdmapManager {
VENDOR_IS_Q_OR_LATER = value.equals("Q") || value.equals("q");
}
- IdmapManager(final Installer installer) {
+ IdmapManager(final Installer installer, final PackageManagerHelper packageManager) {
mInstaller = installer;
+ mPackageManager = packageManager;
if (FEATURE_FLAG_IDMAP2) {
connectToIdmap2d();
}
@@ -79,7 +82,7 @@ class IdmapManager {
final String overlayPath = overlayPackage.applicationInfo.getBaseCodePath();
try {
if (FEATURE_FLAG_IDMAP2) {
- int policies = determineFulfilledPolicies(overlayPackage);
+ int policies = determineFulfilledPolicies(targetPackage, overlayPackage, userId);
boolean enforce = enforceOverlayable(overlayPackage);
if (mIdmap2Service.verifyIdmap(overlayPath, policies, enforce, userId)) {
return true;
@@ -197,14 +200,18 @@ class IdmapManager {
* Retrieves a bitmask for idmap2 that represents the policies the specified overlay fulfills.
* @throws SecurityException if the overlay is not allowed to overlay any resource
*/
- private int determineFulfilledPolicies(@NonNull final PackageInfo overlayPackage)
- throws SecurityException {
+ private int determineFulfilledPolicies(@NonNull final PackageInfo targetPackage,
+ @NonNull final PackageInfo overlayPackage, int userId) throws SecurityException {
final ApplicationInfo ai = overlayPackage.applicationInfo;
final boolean overlayIsQOrLater = ai.targetSdkVersion >= VERSION_CODES.Q;
int fulfilledPolicies = 0;
- // TODO(b/119402606) : Add signature policy
+ // Overlay matches target signature
+ if (mPackageManager.signaturesMatching(targetPackage.packageName,
+ overlayPackage.packageName, userId)) {
+ fulfilledPolicies |= IIdmap2.POLICY_SIGNATURE;
+ }
// Vendor partition (/vendor)
if (ai.isVendor()) {
diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java
index d0c59c1b002e..8905eb947eab 100644
--- a/services/core/java/com/android/server/om/OverlayManagerService.java
+++ b/services/core/java/com/android/server/om/OverlayManagerService.java
@@ -232,7 +232,7 @@ public final class OverlayManagerService extends SystemService {
new File(Environment.getDataSystemDirectory(), "overlays.xml"), "overlays");
mPackageManager = new PackageManagerHelper();
mUserManager = UserManagerService.getInstance();
- IdmapManager im = new IdmapManager(installer);
+ IdmapManager im = new IdmapManager(installer, mPackageManager);
mSettings = new OverlayManagerSettings();
mImpl = new OverlayManagerServiceImpl(mPackageManager, im, mSettings,
getDefaultOverlayPackages(), new OverlayChangeListener());
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index b64b7c64e363..251b34bc3684 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2945,7 +2945,7 @@ public class PackageManagerService extends IPackageManager.Stub
+ mSdkVersion + "; regranting permissions for internal storage");
}
mPermissionManager.updateAllPermissions(
- StorageManager.UUID_PRIVATE_INTERNAL, sdkUpdated, mPackages.values(),
+ StorageManager.UUID_PRIVATE_INTERNAL, sdkUpdated, false, mPackages.values(),
mPermissionCallback);
ver.sdkVersion = mSdkVersion;
@@ -5382,7 +5382,7 @@ public class PackageManagerService extends IPackageManager.Stub
synchronized (mPackages) {
mPermissionManager.updateAllPermissions(
- StorageManager.UUID_PRIVATE_INTERNAL, false, mPackages.values(),
+ StorageManager.UUID_PRIVATE_INTERNAL, false, false, mPackages.values(),
mPermissionCallback);
for (int userId : UserManagerService.getInstance().getUserIds()) {
final int packageCount = mPackages.size();
@@ -20685,8 +20685,8 @@ public class PackageManagerService extends IPackageManager.Stub
// try optimizing this.
synchronized (mPackages) {
mPermissionManager.updateAllPermissions(
- StorageManager.UUID_PRIVATE_INTERNAL, false, mPackages.values(),
- mPermissionCallback);
+ StorageManager.UUID_PRIVATE_INTERNAL, false, mIsPreQUpgrade,
+ mPackages.values(), mPermissionCallback);
}
// Watch for external volumes that come and go over time
@@ -21676,8 +21676,8 @@ public class PackageManagerService extends IPackageManager.Stub
logCriticalInfo(Log.INFO, "Platform changed from " + ver.sdkVersion + " to "
+ mSdkVersion + "; regranting permissions for " + volumeUuid);
}
- mPermissionManager.updateAllPermissions(volumeUuid, sdkUpdated, mPackages.values(),
- mPermissionCallback);
+ mPermissionManager.updateAllPermissions(volumeUuid, sdkUpdated, false,
+ mPackages.values(), mPermissionCallback);
// Yay, everything is now upgraded
ver.forceCurrent();
@@ -22676,7 +22676,7 @@ public class PackageManagerService extends IPackageManager.Stub
synchronized(mPackages) {
// NOTE: This adds UPDATE_PERMISSIONS_REPLACE_PKG
mPermissionManager.updateAllPermissions(
- StorageManager.UUID_PRIVATE_INTERNAL, true, mPackages.values(),
+ StorageManager.UUID_PRIVATE_INTERNAL, true, false, mPackages.values(),
mPermissionCallback);
}
}
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 1d6e5818389b..b877fe7bbd99 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -657,13 +657,13 @@ public final class DefaultPermissionGrantPolicy {
PHONE_PERMISSIONS, SMS_PERMISSIONS, CAMERA_PERMISSIONS,
SENSORS_PERMISSIONS, STORAGE_PERMISSIONS, MEDIA_AURAL_PERMISSIONS);
grantSystemFixedPermissionsToSystemPackage(packageName, userId,
- LOCATION_PERMISSIONS, ACTIVITY_RECOGNITION_PERMISSIONS);
+ ALWAYS_LOCATION_PERMISSIONS, ACTIVITY_RECOGNITION_PERMISSIONS);
}
}
if (locationExtraPackageNames != null) {
// Also grant location permission to location extra packages.
for (String packageName : locationExtraPackageNames) {
- grantPermissionsToSystemPackage(packageName, userId, LOCATION_PERMISSIONS);
+ grantPermissionsToSystemPackage(packageName, userId, ALWAYS_LOCATION_PERMISSIONS);
}
}
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 03da962b6ac6..ac7338e751e3 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -16,14 +16,11 @@
package com.android.server.pm.permission;
-import static android.Manifest.permission.ACCESS_BACKGROUND_LOCATION;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
import static android.app.AppOpsManager.MODE_ALLOWED;
-import static android.app.AppOpsManager.MODE_DEFAULT;
import static android.app.AppOpsManager.MODE_ERRORED;
import static android.app.AppOpsManager.MODE_FOREGROUND;
-import static android.app.AppOpsManager.MODE_IGNORED;
import static android.app.AppOpsManager.OP_NONE;
import static android.app.AppOpsManager.permissionToOp;
import static android.app.AppOpsManager.permissionToOpCode;
@@ -77,6 +74,7 @@ import android.os.storage.StorageManagerInternal;
import android.permission.PermissionControllerManager;
import android.permission.PermissionManager;
import android.permission.PermissionManagerInternal;
+import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -140,6 +138,18 @@ public class PermissionManagerService {
/** Empty array to avoid allocations */
private static final int[] EMPTY_INT_ARRAY = new int[0];
+ /**
+ * When these flags are set, the system should not automatically modify the permission grant
+ * state.
+ */
+ private static final int BLOCKING_PERMISSION_FLAGS = FLAG_PERMISSION_SYSTEM_FIXED
+ | FLAG_PERMISSION_POLICY_FIXED
+ | FLAG_PERMISSION_GRANTED_BY_DEFAULT;
+
+ /** Permission flags set by the user */
+ private static final int USER_PERMISSION_FLAGS = FLAG_PERMISSION_USER_SET
+ | FLAG_PERMISSION_USER_FIXED;
+
/** If the permission of the value is granted, so is the key */
private static final Map<String, String> FULLER_PERMISSION_MAP = new HashMap<>();
@@ -1203,9 +1213,8 @@ public class PermissionManagerService {
int flagsToRemove = FLAG_PERMISSION_REVOKE_WHEN_REQUESTED;
- if ((flags & (FLAG_PERMISSION_GRANTED_BY_DEFAULT
- | FLAG_PERMISSION_POLICY_FIXED | FLAG_PERMISSION_SYSTEM_FIXED))
- == 0 && supportsRuntimePermissions) {
+ if ((flags & BLOCKING_PERMISSION_FLAGS) == 0
+ && supportsRuntimePermissions) {
int revokeResult = ps.revokeRuntimePermission(bp, userId);
if (revokeResult != PERMISSION_OPERATION_FAILURE) {
if (DEBUG_PERMISSIONS) {
@@ -1215,8 +1224,7 @@ public class PermissionManagerService {
}
}
- flagsToRemove |=
- FLAG_PERMISSION_USER_FIXED | FLAG_PERMISSION_USER_SET;
+ flagsToRemove |= USER_PERMISSION_FLAGS;
List<String> fgPerms = mBackgroundPermissions.get(permission);
if (fgPerms != null) {
@@ -1271,6 +1279,7 @@ public class PermissionManagerService {
if (pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) {
if (permissionToOp(newPerm) != null) {
int mostLenientSourceMode = MODE_ERRORED;
+ int flags = 0;
// Find most lenient source permission state.
int numSourcePerms = sourcePerms.size();
@@ -1284,20 +1293,19 @@ public class PermissionManagerService {
int mode = appOpsManager.unsafeCheckOpRaw(sourceOp,
getUid(userId, getAppId(pkg.applicationInfo.uid)), pkgName);
- if (mode == MODE_FOREGROUND) {
- throw new IllegalArgumentException("split permission" + sourcePerm
- + " has app-op state " + AppOpsManager.MODE_NAMES[mode]);
+ if (mode == MODE_FOREGROUND || mode == MODE_ERRORED) {
+ Log.wtf(TAG, "split permission" + sourcePerm + " has app-op state "
+ + AppOpsManager.MODE_NAMES[mode]);
+
+ continue;
}
- // Leniency order: allowed > ignored > default
- if (mode == MODE_ALLOWED) {
- mostLenientSourceMode = MODE_ALLOWED;
- break;
- } else if (mode == MODE_IGNORED) {
- mostLenientSourceMode = MODE_IGNORED;
- } else if (mode == MODE_DEFAULT
- && mostLenientSourceMode != MODE_IGNORED) {
- mostLenientSourceMode = MODE_DEFAULT;
+ // Leniency order: allowed < ignored < default
+ if (mode < mostLenientSourceMode) {
+ mostLenientSourceMode = mode;
+ flags = ps.getPermissionFlags(sourcePerm, userId);
+ } else if (mode == mostLenientSourceMode) {
+ flags |= ps.getPermissionFlags(sourcePerm, userId);
}
}
}
@@ -1310,21 +1318,31 @@ public class PermissionManagerService {
}
setAppOpMode(newPerm, pkg, userId, mostLenientSourceMode);
+
+ // Add permission flags
+ ps.updatePermissionFlags(mSettings.getPermission(newPerm), userId, flags,
+ flags);
}
}
} else {
boolean isGranted = false;
+ int flags = 0;
int numSourcePerm = sourcePerms.size();
for (int i = 0; i < numSourcePerm; i++) {
String sourcePerm = sourcePerms.valueAt(i);
- if (ps.hasRuntimePermission(sourcePerm, userId)
- && ps.getRuntimePermissionState(sourcePerm, userId).isGranted()) {
- isGranted = true;
- break;
- } else if (ps.hasInstallPermission(sourcePerm)) {
+ if ((ps.hasRuntimePermission(sourcePerm, userId))
+ || ps.hasInstallPermission(sourcePerm)) {
+ if (!isGranted) {
+ flags = 0;
+ }
+
isGranted = true;
- break;
+ flags |= ps.getPermissionFlags(sourcePerm, userId);
+ } else {
+ if (!isGranted) {
+ flags |= ps.getPermissionFlags(sourcePerm, userId);
+ }
}
}
@@ -1336,6 +1354,9 @@ public class PermissionManagerService {
ps.grantRuntimePermission(mSettings.getPermissionLocked(newPerm), userId);
}
+
+ // Add permission flags
+ ps.updatePermissionFlags(mSettings.getPermission(newPerm), userId, flags, flags);
}
}
@@ -1353,8 +1374,6 @@ public class PermissionManagerService {
@NonNull PermissionsState origPs,
@NonNull PermissionsState ps, @NonNull PackageParser.Package pkg,
@NonNull int[] updatedUserIds) {
- AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
-
String pkgName = pkg.packageName;
ArraySet<String> newImplicitPermissions = new ArraySet<>();
@@ -1417,48 +1436,28 @@ public class PermissionManagerService {
FLAG_PERMISSION_REVOKE_WHEN_REQUESTED);
updatedUserIds = ArrayUtils.appendInt(updatedUserIds, userId);
- // SPECIAL BEHAVIOR for background location. Foreground only by default.
- if (newPerm.equals(ACCESS_BACKGROUND_LOCATION)) {
- int numSourcePerms = sourcePerms.size();
- for (int sourcePermNum = 0; sourcePermNum < numSourcePerms;
- sourcePermNum++) {
- String sourcePerm = sourcePerms.valueAt(sourcePermNum);
-
- if (ps.hasRuntimePermission(sourcePerm, userId)
- && ps.getRuntimePermissionState(sourcePerm, userId)
- .isGranted()
- && appOpsManager.unsafeCheckOpNoThrow(
- permissionToOp(sourcePerm), getUid(userId,
- getAppId(pkg.applicationInfo.uid)), pkgName)
- == MODE_ALLOWED) {
- setAppOpMode(sourcePerm, pkg, userId, MODE_FOREGROUND);
- }
- }
- } else {
- boolean inheritsFromInstallPerm = false;
- for (int sourcePermNum = 0; sourcePermNum < sourcePerms.size();
- sourcePermNum++) {
- if (ps.hasInstallPermission(sourcePerms.valueAt(sourcePermNum))) {
- inheritsFromInstallPerm = true;
- break;
- }
+ boolean inheritsFromInstallPerm = false;
+ for (int sourcePermNum = 0; sourcePermNum < sourcePerms.size();
+ sourcePermNum++) {
+ if (ps.hasInstallPermission(sourcePerms.valueAt(sourcePermNum))) {
+ inheritsFromInstallPerm = true;
+ break;
}
+ }
- if (!origPs.hasRequestedPermission(sourcePerms)
- && !inheritsFromInstallPerm) {
- // Both permissions are new so nothing to inherit.
- if (DEBUG_PERMISSIONS) {
- Slog.i(TAG, newPerm + " does not inherit from " + sourcePerms
- + " for " + pkgName
- + " as split permission is also new");
- }
-
- break;
- } else {
- // Inherit from new install or existing runtime permissions
- inheritPermissionStateToNewImplicitPermissionLocked(sourcePerms,
- newPerm, ps, pkg, userId);
+ if (!origPs.hasRequestedPermission(sourcePerms)
+ && !inheritsFromInstallPerm) {
+ // Both permissions are new so nothing to inherit.
+ if (DEBUG_PERMISSIONS) {
+ Slog.i(TAG, newPerm + " does not inherit from " + sourcePerms
+ + " for " + pkgName + " as split permission is also new");
}
+
+ break;
+ } else {
+ // Inherit from new install or existing runtime permissions
+ inheritPermissionStateToNewImplicitPermissionLocked(sourcePerms,
+ newPerm, ps, pkg, userId);
}
}
}
@@ -2275,12 +2274,62 @@ public class PermissionManagerService {
}
private void updateAllPermissions(String volumeUuid, boolean sdkUpdated,
- Collection<PackageParser.Package> allPackages, PermissionCallback callback) {
+ boolean updatePermissionsOnPreQUpdate, Collection<PackageParser.Package> allPackages,
+ PermissionCallback callback) {
final int flags = UPDATE_PERMISSIONS_ALL |
(sdkUpdated
? UPDATE_PERMISSIONS_REPLACE_PKG | UPDATE_PERMISSIONS_REPLACE_ALL
: 0);
updatePermissions(null, null, volumeUuid, flags, allPackages, callback);
+
+ if (updatePermissionsOnPreQUpdate) {
+ final int[] userIds = UserManagerService.getInstance().getUserIds();
+
+ for (PackageParser.Package pkg : allPackages) {
+ final PackageSetting ps = (PackageSetting) pkg.mExtras;
+ if (ps == null) {
+ return;
+ }
+
+ final boolean appSupportsRuntimePermissions =
+ pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.M;
+ final PermissionsState permsState = ps.getPermissionsState();
+
+ for (String permName : new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_BACKGROUND_LOCATION}) {
+ final BasePermission bp = mSettings.getPermissionLocked(permName);
+
+ for (int userId : userIds) {
+ if (Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.LOCATION_PERMISSIONS_UPGRADE_TO_Q_MODE, 0, userId)
+ != 0) {
+ continue;
+ }
+
+ final PermissionState permState = permsState.getRuntimePermissionState(
+ permName, userId);
+
+ if (permState != null
+ && (permState.getFlags() & BLOCKING_PERMISSION_FLAGS) == 0) {
+ if (permState.isGranted()) {
+ permsState.updatePermissionFlags(bp, userId,
+ USER_PERMISSION_FLAGS, 0);
+ }
+
+ if (appSupportsRuntimePermissions) {
+ permsState.revokeRuntimePermission(bp, userId);
+ } else {
+ // Force a review even for apps that were already installed
+ permsState.updatePermissionFlags(bp, userId,
+ FLAG_PERMISSION_REVIEW_REQUIRED,
+ FLAG_PERMISSION_REVIEW_REQUIRED);
+ }
+ }
+ }
+ }
+ }
+ }
}
private void updatePermissions(String changingPkgName, PackageParser.Package changingPkg,
@@ -2735,9 +2784,10 @@ public class PermissionManagerService {
}
@Override
public void updateAllPermissions(String volumeUuid, boolean sdkUpdated,
- Collection<PackageParser.Package> allPackages, PermissionCallback callback) {
+ boolean updatePermissionsOnPreQUpdate, Collection<PackageParser.Package> allPackages,
+ PermissionCallback callback) {
PermissionManagerService.this.updateAllPermissions(
- volumeUuid, sdkUpdated, allPackages, callback);
+ volumeUuid, sdkUpdated, updatePermissionsOnPreQUpdate, allPackages, callback);
}
@Override
public String[] getAppOpPermissionPackages(String permName) {
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
index 305f165ae85f..6c09fa0241db 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
@@ -83,7 +83,8 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager
public abstract void updatePermissions(@Nullable String packageName,
@Nullable PackageParser.Package pkg, boolean replaceGrant,
@NonNull Collection<PackageParser.Package> allPacakges, PermissionCallback callback);
- public abstract void updateAllPermissions(@Nullable String volumeUuid, boolean sdkUpdated,
+ public abstract void updateAllPermissions(@Nullable String volumeUuid, boolean sdkUpdate,
+ boolean updatePermissionsOnPreQUpdate,
@NonNull Collection<PackageParser.Package> allPacakges, PermissionCallback callback);
/**
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
index fac95f9af42c..f23b68e28c34 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
@@ -728,8 +728,8 @@ public class BatterySaverPolicy extends ContentObserver {
!defaultPolicy.enableDataSaver);
boolean enableFirewall = !parser.getBoolean(KEY_ACTIVATE_FIREWALL_DISABLED,
!defaultPolicy.enableFirewall);
- boolean enableNightMode = !parser.getBoolean(KEY_ENABLE_NIGHT_MODE,
- !defaultPolicy.enableNightMode);
+ boolean enableNightMode = parser.getBoolean(KEY_ENABLE_NIGHT_MODE,
+ defaultPolicy.enableNightMode);
boolean enableQuickDoze = parser.getBoolean(KEY_QUICK_DOZE_ENABLED,
defaultPolicy.enableQuickDoze);
boolean forceAllAppsStandby = parser.getBoolean(KEY_FORCE_ALL_APPS_STANDBY,
diff --git a/services/core/java/com/android/server/wm/WindowTracing.java b/services/core/java/com/android/server/wm/WindowTracing.java
index 4cf234424acc..765e34788ac8 100644
--- a/services/core/java/com/android/server/wm/WindowTracing.java
+++ b/services/core/java/com/android/server/wm/WindowTracing.java
@@ -98,6 +98,7 @@ class WindowTracing {
mBuffer.resetBuffer();
mEnabled = mEnabledLockFree = true;
}
+ log("trace.enable");
}
/**
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
index aadf92448a52..3d02576c8e7f 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
@@ -88,6 +88,7 @@ public class BaseLockSettingsServiceTests extends AndroidTestCase {
IAuthSecret mAuthSecretService;
WindowManagerInternal mMockWindowManager;
FakeGsiService mGsiService;
+ PasswordSlotManagerTestable mPasswordSlotManager;
protected boolean mHasSecureLockScreen;
@Override
@@ -103,6 +104,7 @@ public class BaseLockSettingsServiceTests extends AndroidTestCase {
mDevicePolicyManagerInternal = mock(DevicePolicyManagerInternal.class);
mMockWindowManager = mock(WindowManagerInternal.class);
mGsiService = new FakeGsiService();
+ mPasswordSlotManager = new PasswordSlotManagerTestable();
LocalServices.removeServiceForTest(LockSettingsInternal.class);
LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class);
@@ -135,7 +137,7 @@ public class BaseLockSettingsServiceTests extends AndroidTestCase {
}
};
mSpManager = new MockSyntheticPasswordManager(mContext, mStorage, mGateKeeperService,
- mUserManager);
+ mUserManager, mPasswordSlotManager);
mAuthSecretService = mock(IAuthSecret.class);
mService = new LockSettingsServiceTestable(mContext, mLockPatternUtils, mStorage,
mGateKeeperService, mKeyStore, setUpStorageManagerMock(), mActivityManager,
@@ -223,6 +225,8 @@ public class BaseLockSettingsServiceTests extends AndroidTestCase {
File storageDir = mStorage.mStorageDir;
assertTrue(FileUtils.deleteContents(storageDir));
+
+ mPasswordSlotManager.cleanup();
}
protected void assertNotEquals(long expected, long actual) {
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java b/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java
index b9cb730caae1..5a3f12c5b4ed 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java
@@ -35,10 +35,12 @@ public class MockSyntheticPasswordManager extends SyntheticPasswordManager {
private FakeGateKeeperService mGateKeeper;
private IWeaver mWeaverService;
+ private PasswordSlotManagerTestable mPasswordSlotManager;
public MockSyntheticPasswordManager(Context context, LockSettingsStorage storage,
- FakeGateKeeperService gatekeeper, UserManager userManager) {
- super(context, storage, userManager);
+ FakeGateKeeperService gatekeeper, UserManager userManager,
+ PasswordSlotManager passwordSlotManager) {
+ super(context, storage, userManager, passwordSlotManager);
mGateKeeper = gatekeeper;
}
@@ -117,5 +119,4 @@ public class MockSyntheticPasswordManager extends SyntheticPasswordManager {
mWeaverService = new MockWeaverService();
initWeaverService();
}
-
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTestable.java b/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTestable.java
new file mode 100644
index 000000000000..1e855a9819ac
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTestable.java
@@ -0,0 +1,61 @@
+/*
+ * 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 com.android.server.locksettings;
+
+import androidx.test.InstrumentationRegistry;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+public class PasswordSlotManagerTestable extends PasswordSlotManager {
+
+ private int mGsiImageNumber;
+ private String mSlotMapDir;
+
+ public PasswordSlotManagerTestable() {
+ mGsiImageNumber = 0;
+ }
+
+ @Override
+ protected int getGsiImageNumber() {
+ return mGsiImageNumber;
+ }
+
+ @Override
+ protected String getSlotMapDir() {
+ if (mSlotMapDir == null) {
+ final File testDir = InstrumentationRegistry.getContext().getFilesDir();
+ if (!testDir.exists()) {
+ testDir.mkdirs();
+ }
+
+ mSlotMapDir = testDir.getPath();
+ }
+ return mSlotMapDir;
+ }
+
+ void setGsiImageNumber(int gsiImageNumber) {
+ mGsiImageNumber = gsiImageNumber;
+ }
+
+ void cleanup() {
+ try {
+ Files.delete(Paths.get(getSlotMapDir(), "slot_map"));
+ } catch (Exception e) {
+ }
+ }
+};
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java b/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java
new file mode 100644
index 000000000000..1d5a99b8af04
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java
@@ -0,0 +1,122 @@
+/*
+ * 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 com.android.server.locksettings;
+
+import android.test.AndroidTestCase;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public class PasswordSlotManagerTests extends AndroidTestCase {
+
+ PasswordSlotManagerTestable mManager;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ mManager = new PasswordSlotManagerTestable();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ mManager.cleanup();
+ }
+
+ public void testBasicSlotUse() throws Exception {
+ mManager.markSlotInUse(0);
+ mManager.markSlotInUse(1);
+
+ Set<Integer> expected = new HashSet<Integer>();
+ expected.add(0);
+ expected.add(1);
+ assertEquals(expected, mManager.getUsedSlots());
+
+ mManager.markSlotDeleted(1);
+
+ expected = new HashSet<Integer>();
+ expected.add(0);
+ assertEquals(expected, mManager.getUsedSlots());
+ }
+
+ public void testMergeSlots() throws Exception {
+ // Add some slots from a different OS image.
+ mManager.setGsiImageNumber(1);
+ mManager.markSlotInUse(4);
+ mManager.markSlotInUse(6);
+
+ // Switch back to the host image.
+ mManager.setGsiImageNumber(0);
+ mManager.markSlotInUse(0);
+ mManager.markSlotInUse(3);
+ mManager.markSlotInUse(5);
+
+ // Correct slot information for the host image.
+ Set<Integer> actual = new HashSet<Integer>();
+ actual.add(1);
+ actual.add(3);
+ mManager.refreshActiveSlots(actual);
+
+ Set<Integer> expected = new HashSet<Integer>();
+ expected.add(1);
+ expected.add(3);
+ expected.add(4);
+ expected.add(6);
+ assertEquals(expected, mManager.getUsedSlots());
+ }
+
+ public void testSerialization() throws Exception {
+ mManager.markSlotInUse(0);
+ mManager.markSlotInUse(1);
+ mManager.setGsiImageNumber(1);
+ mManager.markSlotInUse(4);
+
+ final ByteArrayOutputStream saved = new ByteArrayOutputStream();
+ mManager.saveSlotMap(saved);
+
+ final HashMap<Integer, String> expected = new HashMap<Integer, String>();
+ expected.put(0, "host");
+ expected.put(1, "host");
+ expected.put(4, "gsi1");
+
+ final Map<Integer, String> map = mManager.loadSlotMap(
+ new ByteArrayInputStream(saved.toByteArray()));
+ assertEquals(expected, map);
+ }
+
+ public void testSaving() throws Exception {
+ mManager.markSlotInUse(0);
+ mManager.markSlotInUse(1);
+ mManager.setGsiImageNumber(1);
+ mManager.markSlotInUse(4);
+
+ // Make a new one. It should load the previous map.
+ mManager = new PasswordSlotManagerTestable();
+
+ Set<Integer> expected = new HashSet<Integer>();
+ expected.add(0);
+ expected.add(1);
+ expected.add(4);
+ assertEquals(expected, mManager.getUsedSlots());
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
index e6e020dbdb97..d343ac1a9f7c 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
@@ -68,7 +68,7 @@ public class SyntheticPasswordTests extends BaseLockSettingsServiceTests {
final byte[] password = "user-password".getBytes();
final byte[] badPassword = "bad-password".getBytes();
MockSyntheticPasswordManager manager = new MockSyntheticPasswordManager(mContext, mStorage,
- mGateKeeperService, mUserManager);
+ mGateKeeperService, mUserManager, mPasswordSlotManager);
AuthenticationToken authToken = manager.newSyntheticPasswordAndSid(mGateKeeperService, null,
null, USER_ID);
long handle = manager.createPasswordBasedSyntheticPassword(mGateKeeperService,
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
index 5c0a1c83b1b0..98cfc41ccfa8 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
@@ -58,6 +58,7 @@ public class BatterySaverPolicyTest extends AndroidTestCase {
+ "fullbackup_deferred=true,"
+ "keyvaluebackup_deferred=false,"
+ "gps_mode=0," // LOCATION_MODE_NO_CHANGE
+ + "enable_night_mode=false,"
+ "quick_doze_enabled=true";
private static final String BATTERY_SAVER_INCORRECT_CONSTANTS = "vi*,!=,,true";
@@ -234,6 +235,10 @@ public class BatterySaverPolicyTest extends AndroidTestCase {
final PowerSaveState quickDozeState = mBatterySaverPolicy.getBatterySaverPolicy(
ServiceType.QUICK_DOZE);
assertThat(quickDozeState.batterySaverEnabled).isTrue();
+
+ final PowerSaveState nightModeState = mBatterySaverPolicy.getBatterySaverPolicy(
+ ServiceType.NIGHT_MODE);
+ assertThat(nightModeState.batterySaverEnabled).isFalse();
}
@SmallTest
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTracingTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowTracingTest.java
index 8358fdd18e0e..e3691c653959 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTracingTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTracingTest.java
@@ -20,6 +20,7 @@ import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentat
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyZeroInteractions;
@@ -124,7 +125,7 @@ public class WindowTracingTest {
public void trace_dumpsWindowManagerState_whenTracing() throws Exception {
mWindowTracing.startTrace(mock(PrintWriter.class));
mWindowTracing.logState("where");
- verify(mWmMock).writeToProtoLocked(any(), eq(WindowTraceLogLevel.TRIM));
+ verify(mWmMock, times(2)).writeToProtoLocked(any(), eq(WindowTraceLogLevel.TRIM));
}
@Test
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 04f3c6b395b2..7954d0e391dd 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -9748,7 +9748,7 @@ public class TelephonyManager {
ITelephony telephony = getITelephony();
if (telephony != null) {
return telephony.getNumberOfModemsWithSimultaneousDataConnections(
- getSubId(), mContext.getOpPackageName());
+ getSubId(), getOpPackageName());
}
} catch (RemoteException ex) {
// This could happen if binder process crashes.
diff --git a/tests/RollbackTest/Android.bp b/tests/RollbackTest/Android.bp
new file mode 100644
index 000000000000..8be721a04305
--- /dev/null
+++ b/tests/RollbackTest/Android.bp
@@ -0,0 +1,130 @@
+// 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.
+
+android_test_helper_app {
+ name: "RollbackTestAppAv1",
+ manifest: "TestApp/Av1.xml",
+ sdk_version: "current",
+ srcs: ["TestApp/src/**/*.java"],
+ resource_dirs: ["TestApp/res_v1"],
+}
+
+android_test_helper_app {
+ name: "RollbackTestAppAv2",
+ manifest: "TestApp/Av2.xml",
+ sdk_version: "current",
+ srcs: ["TestApp/src/**/*.java"],
+ resource_dirs: ["TestApp/res_v2"],
+}
+
+android_test_helper_app {
+ name: "RollbackTestAppACrashingV2",
+ manifest: "TestApp/ACrashingV2.xml",
+ sdk_version: "current",
+ srcs: ["TestApp/src/**/*.java"],
+ resource_dirs: ["TestApp/res_v2"],
+}
+
+android_test_helper_app {
+ name: "RollbackTestAppBv1",
+ manifest: "TestApp/Bv1.xml",
+ sdk_version: "current",
+ srcs: ["TestApp/src/**/*.java"],
+ resource_dirs: ["TestApp/res_v1"],
+}
+
+android_test_helper_app {
+ name: "RollbackTestAppBv2",
+ manifest: "TestApp/Bv2.xml",
+ sdk_version: "current",
+ srcs: ["TestApp/src/**/*.java"],
+ resource_dirs: ["TestApp/res_v2"],
+}
+
+android_test_helper_app {
+ name: "RollbackTestAppASplitV1",
+ manifest: "TestApp/Av1.xml",
+ sdk_version: "current",
+ srcs: ["TestApp/src/**/*.java"],
+ resource_dirs: ["TestApp/res_v1"],
+ package_splits: ["anydpi"],
+}
+
+android_test_helper_app {
+ name: "RollbackTestAppASplitV2",
+ manifest: "TestApp/Av2.xml",
+ sdk_version: "current",
+ srcs: ["TestApp/src/**/*.java"],
+ resource_dirs: ["TestApp/res_v2"],
+ package_splits: ["anydpi"],
+}
+
+apex {
+ name: "com.android.tests.rollback.testapex.RollbackTestApexV1",
+ manifest: "TestApex/RollbackTestApexV1.json",
+ file_contexts: "apex.test",
+ prebuilts: ["RollbackTestApex.prebuilt.txt"],
+ key: "RollbackTestApex.key",
+ installable: false,
+}
+
+apex {
+ name: "com.android.tests.rollback.testapex.RollbackTestApexV2",
+ manifest: "TestApex/RollbackTestApexV2.json",
+ file_contexts: "apex.test",
+ prebuilts: ["RollbackTestApex.prebuilt.txt"],
+ key: "RollbackTestApex.key",
+ installable: false,
+}
+
+apex_key {
+ name: "RollbackTestApex.key",
+ public_key: "TestApex/com.android.tests.rollback.testapex.avbpubkey",
+ private_key: "TestApex/com.android.tests.rollback.testapex.pem",
+ installable: false,
+}
+
+prebuilt_etc {
+ name: "RollbackTestApex.prebuilt.txt",
+ src: "TestApex/RollbackTestApex.prebuilt.txt",
+}
+
+android_test {
+ name: "RollbackTest",
+ manifest: "RollbackTest/AndroidManifest.xml",
+ srcs: ["RollbackTest/src/**/*.java"],
+ static_libs: ["androidx.test.rules"],
+ test_suites: ["general-tests"],
+ java_resources: [
+ ":RollbackTestAppAv1",
+ ":RollbackTestAppAv2",
+ ":RollbackTestAppACrashingV2",
+ ":RollbackTestAppBv1",
+ ":RollbackTestAppBv2",
+ ":RollbackTestAppASplitV1",
+ ":RollbackTestAppASplitV2",
+ ":com.android.tests.rollback.testapex.RollbackTestApexV1",
+ ":com.android.tests.rollback.testapex.RollbackTestApexV2",
+ ],
+ test_config: "RollbackTest.xml",
+ sdk_version: "system_current",
+}
+
+java_test_host {
+ name: "StagedRollbackTest",
+ srcs: ["StagedRollbackTest/src/**/*.java"],
+ libs: ["tradefed"],
+ test_suites: ["general-tests"],
+ test_config: "StagedRollbackTest.xml",
+}
diff --git a/tests/RollbackTest/Android.mk b/tests/RollbackTest/Android.mk
deleted file mode 100644
index 206f8671d497..000000000000
--- a/tests/RollbackTest/Android.mk
+++ /dev/null
@@ -1,148 +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)
-
-# RollbackTestAppAv1.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/Av1.xml
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/TestApp/res_v1
-LOCAL_PACKAGE_NAME := RollbackTestAppAv1
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_AV1 := $(LOCAL_INSTALLED_MODULE)
-
-# RollbackTestAppAv2.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/Av2.xml
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/TestApp/res_v2
-LOCAL_PACKAGE_NAME := RollbackTestAppAv2
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_AV2 := $(LOCAL_INSTALLED_MODULE)
-
-# RollbackTestAppACrashingV2.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/ACrashingV2.xml
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/TestApp/res_v2
-LOCAL_PACKAGE_NAME := RollbackTestAppACrashingV2
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_A_CRASHING_V2 := $(LOCAL_INSTALLED_MODULE)
-
-# RollbackTestAppBv1.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/Bv1.xml
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/TestApp/res_v1
-LOCAL_PACKAGE_NAME := RollbackTestAppBv1
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_BV1 := $(LOCAL_INSTALLED_MODULE)
-
-# RollbackTestAppBv2.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/Bv2.xml
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/TestApp/res_v2
-LOCAL_PACKAGE_NAME := RollbackTestAppBv2
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_BV2 := $(LOCAL_INSTALLED_MODULE)
-
-# RollbackTestAppASplitV1.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/Av1.xml
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/TestApp/res_v1
-LOCAL_PACKAGE_NAME := RollbackTestAppASplitV1
-LOCAL_PACKAGE_SPLITS := anydpi
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_A_SPLIT_V1 := $(LOCAL_INSTALLED_MODULE)
-ROLLBACK_TEST_APP_A_SPLIT_V1_SPLIT := $(installed_apk_splits)
-
-# RollbackTestAppASplitV2.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/Av2.xml
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/TestApp/res_v2
-LOCAL_PACKAGE_NAME := RollbackTestAppASplitV2
-LOCAL_PACKAGE_SPLITS := anydpi
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_A_SPLIT_V2 := $(LOCAL_INSTALLED_MODULE)
-ROLLBACK_TEST_APP_A_SPLIT_V2_SPLIT := $(installed_apk_splits)
-
-# RollbackTest
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-java-files-under, RollbackTest/src)
-LOCAL_PACKAGE_NAME := RollbackTest
-LOCAL_MODULE_TAGS := tests
-LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules
-LOCAL_COMPATIBILITY_SUITE := general-tests
-LOCAL_JAVA_RESOURCE_FILES := \
- $(ROLLBACK_TEST_APP_AV1) \
- $(ROLLBACK_TEST_APP_AV2) \
- $(ROLLBACK_TEST_APP_A_CRASHING_V2) \
- $(ROLLBACK_TEST_APP_BV1) \
- $(ROLLBACK_TEST_APP_BV2) \
- $(ROLLBACK_TEST_APP_A_SPLIT_V1) \
- $(ROLLBACK_TEST_APP_A_SPLIT_V1_SPLIT) \
- $(ROLLBACK_TEST_APP_A_SPLIT_V2) \
- $(ROLLBACK_TEST_APP_A_SPLIT_V2_SPLIT) \
- $(ROLLBACK_TEST_APEX_V1) \
- $(ROLLBACK_TEST_APEX_V2)
-LOCAL_MANIFEST_FILE := RollbackTest/AndroidManifest.xml
-LOCAL_SDK_VERSION := system_current
-LOCAL_TEST_CONFIG := RollbackTest.xml
-include $(BUILD_PACKAGE)
-
-# StagedRollbackTest
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-java-files-under, StagedRollbackTest/src)
-LOCAL_MODULE := StagedRollbackTest
-LOCAL_MODULE_TAGS := tests
-LOCAL_JAVA_LIBRARIES := tradefed
-LOCAL_COMPATIBILITY_SUITE := general-tests
-LOCAL_TEST_CONFIG := StagedRollbackTest.xml
-include $(BUILD_HOST_JAVA_LIBRARY)
-
-# Clean up local variables
-ROLLBACK_TEST_APP_AV1 :=
-ROLLBACK_TEST_APP_AV2 :=
-ROLLBACK_TEST_APP_A_CRASHING_V2 :=
-ROLLBACK_TEST_APP_A_SPLIT_V1 :=
-ROLLBACK_TEST_APP_A_SPLIT_V1_SPLIT :=
-ROLLBACK_TEST_APP_A_SPLIT_V2 :=
-ROLLBACK_TEST_APP_A_SPLIT_V2_SPLIT :=
-ROLLBACK_TEST_APP_BV1 :=
-ROLLBACK_TEST_APP_BV2 :=
diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
index 7e183db58fb4..7505230e69c6 100644
--- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
+++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
@@ -40,6 +40,7 @@ import android.util.Log;
import androidx.test.InstrumentationRegistry;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -532,6 +533,7 @@ public class RollbackTest {
/**
* Test rollback of apks involving splits.
*/
+ @Ignore("b/127520966 build issues with splits need to be sorted out")
@Test
public void testRollbackWithSplits() throws Exception {
try {
diff --git a/tests/RollbackTest/TestApex/Android.bp b/tests/RollbackTest/TestApex/Android.bp
deleted file mode 100644
index a2a8e1783f3b..000000000000
--- a/tests/RollbackTest/TestApex/Android.bp
+++ /dev/null
@@ -1,56 +0,0 @@
-// 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.
-
-apex {
- name: "com.android.tests.rollback.testapex.RollbackTestApexV1",
- manifest: "RollbackTestApexV1.json",
- file_contexts: "apex.test",
- prebuilts: ["RollbackTestApex.prebuilt.txt"],
- key: "RollbackTestApex.key",
- installable: false,
-}
-
-apex {
- name: "com.android.tests.rollback.testapex.RollbackTestApexV2",
- manifest: "RollbackTestApexV2.json",
- file_contexts: "apex.test",
- prebuilts: ["RollbackTestApex.prebuilt.txt"],
- key: "RollbackTestApex.key",
- installable: false,
-}
-
-apex_key {
- name: "RollbackTestApex.key",
- public_key: "com.android.tests.rollback.testapex.avbpubkey",
- private_key: "com.android.tests.rollback.testapex.pem",
- installable: false,
-}
-
-prebuilt_etc {
- name: "RollbackTestApex.prebuilt.txt",
- src: "RollbackTestApex.prebuilt.txt",
-}
-
-filegroup {
- name: "RollbackTestApexV1_filegroup",
- srcs: [":com.android.tests.rollback.testapex.RollbackTestApexV1"],
- export_to_make_var: "ROLLBACK_TEST_APEX_V1",
-}
-
-filegroup {
- name: "RollbackTestApexV2_filegroup",
- srcs: [":com.android.tests.rollback.testapex.RollbackTestApexV2"],
- export_to_make_var: "ROLLBACK_TEST_APEX_V2",
-}
-