From e1f864e5448d6906d1c27c3c913ab06c082b6fd4 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Thu, 28 Mar 2019 18:12:18 -0700 Subject: [PATCH 001/473] DO NOT MERGE: Fix a few issues with foreground service location accesses. Location access should be allowed only when the UID state is higher than UID_STATE_FOREGROUND_SERVICE_LOCATION. UID_STATE_FOREGROUND_SERVICE should not have location access. Also fixed an issue where MONITOR_LOCATION is allowed for location access from foreground services. Since UID_STATE_FOREGROUND_SERVICE is considered as background for location, and foreground for other ops, we cannot simply use UID state to check the foreground status of an app. Instead, the uid_state <-> op pair needs to be evaluated together. Bug: 128520624 Test: Manually run GNSS logger app to verify Change-Id: I9413e9c6009e38e3d9db57a02e8f0a275119b063 --- core/java/android/app/AppOpsManager.java | 4 +++- .../com/android/server/appop/AppOpsService.java | 15 ++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 4b0b8cb12d5..2946e5f4ef7 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -333,7 +333,9 @@ public class AppOpsManager { public static int resolveFirstUnrestrictedUidState(int op) { switch (op) { case OP_FINE_LOCATION: - case OP_COARSE_LOCATION: { + case OP_COARSE_LOCATION: + case OP_MONITOR_LOCATION: + case OP_MONITOR_HIGH_POWER_LOCATION: { return UID_STATE_FOREGROUND_SERVICE_LOCATION; } } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index c9e7cfa7325..c7bb8f103fc 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -341,7 +341,7 @@ public class AppOpsService extends IAppOpsService.Stub { int evalMode(int op, int mode) { if (mode == AppOpsManager.MODE_FOREGROUND) { - return state <= AppOpsManager.resolveLastRestrictedUidState(op) + return state <= AppOpsManager.resolveFirstUnrestrictedUidState(op) ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED; } return mode; @@ -915,9 +915,12 @@ public class AppOpsService extends IAppOpsService.Stub { if (uidState != null && uidState.pendingState != newState) { final int oldPendingState = uidState.pendingState; uidState.pendingState = newState; - if (newState < uidState.state || newState <= UID_STATE_MAX_LAST_NON_RESTRICTED) { - // We are moving to a more important state, or the new state is in the - // foreground, then always do it immediately. + if (newState < uidState.state + || (newState <= UID_STATE_MAX_LAST_NON_RESTRICTED + && uidState.state > UID_STATE_MAX_LAST_NON_RESTRICTED)) { + // We are moving to a more important state, or the new state may be in the + // foreground and the old state is in the background, then always do it + // immediately. commitUidPendingStateLocked(uidState); } else if (uidState.pendingStateCommitTime == 0) { // We are moving to a less important state for the first time, @@ -2414,9 +2417,7 @@ public class AppOpsService extends IAppOpsService.Stub { } private void commitUidPendingStateLocked(UidState uidState) { - final boolean lastForeground = uidState.state <= UID_STATE_MAX_LAST_NON_RESTRICTED; - final boolean nowForeground = uidState.pendingState <= UID_STATE_MAX_LAST_NON_RESTRICTED; - if (uidState.hasForegroundWatchers && lastForeground != nowForeground) { + if (uidState.hasForegroundWatchers) { for (int fgi = uidState.foregroundOps.size() - 1; fgi >= 0; fgi--) { if (!uidState.foregroundOps.valueAt(fgi)) { continue; -- GitLab From ced6f8512904c318ca1adf35d7e35f644ed703ad Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 8 Apr 2019 16:58:49 -0700 Subject: [PATCH 002/473] SurfaceControl#setGeometry: Pass invalid rect instead of empty rect Native code expects an invalid rect instead of an empty rect. Bug: 123720507 Test: android.wm.cts.SurfaceControlTest Change-Id: Idbfb128a1266aaf1af51802fe6164ad31d15d2fe --- core/jni/android_view_SurfaceControl.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index c254266961c..1f010240d1b 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -378,9 +378,13 @@ static void nativeSetGeometry(JNIEnv* env, jclass clazz, jlong transactionObj, j Rect source, dst; if (sourceObj != NULL) { source = rectFromObj(env, sourceObj); + } else { + source.makeInvalid(); } if (dstObj != NULL) { dst = rectFromObj(env, dstObj); + } else { + dst.makeInvalid(); } transaction->setGeometry(ctrl, source, dst, orientation); } -- GitLab From eb8a5c0b915683d9df54112a7345106b1eb762fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Kongstad?= Date: Mon, 25 Feb 2019 14:18:17 +0100 Subject: [PATCH 003/473] Add support for /oem/overlay Add support for runtime resource overlay (RRO) APKs in /oem/overlay. Bug: 121033532 Test: manual (adb push apk to /oem/overlay, reboot, cmd overlay list) Change-Id: I70b23b11831d57b3241e6057c745aa4ce9f795ef --- core/jni/android_util_AssetManager.cpp | 10 +++++++++- core/jni/fd_utils.cpp | 6 +++++- libs/androidfw/AssetManager.cpp | 1 + libs/androidfw/include/androidfw/AssetManager.h | 1 + .../com/android/server/pm/PackageManagerService.java | 9 +++++++++ 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index d3f9196ce76..2b471fec9c8 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -163,7 +163,7 @@ static void NativeVerifySystemIdmaps(JNIEnv* /*env*/, jclass /*clazz*/) { } // Generic idmap parameters - const char* argv[9]; + const char* argv[10]; int argc = 0; struct stat st; @@ -203,6 +203,10 @@ static void NativeVerifySystemIdmaps(JNIEnv* /*env*/, jclass /*clazz*/) { argv[argc++] = AssetManager::ODM_OVERLAY_DIR; } + if (stat(AssetManager::OEM_OVERLAY_DIR, &st) == 0) { + argv[argc++] = AssetManager::OEM_OVERLAY_DIR; + } + // Finally, invoke idmap (if any overlay directory exists) if (argc > 5) { execv(AssetManager::IDMAP_BIN, (char* const*)argv); @@ -241,6 +245,10 @@ static jobjectArray NativeCreateIdmapsForStaticOverlaysTargetingAndroid(JNIEnv* input_dirs.push_back(AssetManager::ODM_OVERLAY_DIR); } + if (stat(AssetManager::OEM_OVERLAY_DIR, &st) == 0) { + input_dirs.push_back(AssetManager::OEM_OVERLAY_DIR); + } + if (input_dirs.empty()) { LOG(WARNING) << "no directories for idmap2 to scan"; return env->NewObjectArray(0, g_stringClass, nullptr); diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp index 099635246f0..59732d71778 100644 --- a/core/jni/fd_utils.cpp +++ b/core/jni/fd_utils.cpp @@ -104,6 +104,8 @@ bool FileDescriptorWhitelist::IsAllowed(const std::string& path) const { static const char* kProductServicesOverlayDir = "/product_services/overlay"; static const char* kSystemOdmOverlayDir = "/system/odm/overlay"; static const char* kOdmOverlayDir = "/odm/overlay"; + static const char* kSystemOemOverlayDir = "/system/oem/overlay"; + static const char* kOemOverlayDir = "/oem/overlay"; static const char* kApkSuffix = ".apk"; if ((android::base::StartsWith(path, kOverlayDir) @@ -114,7 +116,9 @@ bool FileDescriptorWhitelist::IsAllowed(const std::string& path) const { || android::base::StartsWith(path, kSystemProductServicesOverlayDir) || android::base::StartsWith(path, kProductServicesOverlayDir) || android::base::StartsWith(path, kSystemOdmOverlayDir) - || android::base::StartsWith(path, kOdmOverlayDir)) + || android::base::StartsWith(path, kOdmOverlayDir) + || android::base::StartsWith(path, kSystemOemOverlayDir) + || android::base::StartsWith(path, kOemOverlayDir)) && android::base::EndsWith(path, kApkSuffix) && path.find("/../") == std::string::npos) { return true; diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp index 21609d30e92..4755cb86631 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -76,6 +76,7 @@ const char* AssetManager::VENDOR_OVERLAY_DIR = "/vendor/overlay"; const char* AssetManager::PRODUCT_OVERLAY_DIR = "/product/overlay"; const char* AssetManager::PRODUCT_SERVICES_OVERLAY_DIR = "/product_services/overlay"; const char* AssetManager::ODM_OVERLAY_DIR = "/odm/overlay"; +const char* AssetManager::OEM_OVERLAY_DIR = "/oem/overlay"; const char* AssetManager::OVERLAY_THEME_DIR_PROPERTY = "ro.boot.vendor.overlay.theme"; const char* AssetManager::TARGET_PACKAGE_NAME = "android"; const char* AssetManager::TARGET_APK_PATH = "/system/framework/framework-res.apk"; diff --git a/libs/androidfw/include/androidfw/AssetManager.h b/libs/androidfw/include/androidfw/AssetManager.h index a015eabc200..66fba26b728 100644 --- a/libs/androidfw/include/androidfw/AssetManager.h +++ b/libs/androidfw/include/androidfw/AssetManager.h @@ -63,6 +63,7 @@ public: static const char* PRODUCT_OVERLAY_DIR; static const char* PRODUCT_SERVICES_OVERLAY_DIR; static const char* ODM_OVERLAY_DIR; + static const char* OEM_OVERLAY_DIR; /* * If OVERLAY_THEME_DIR_PROPERTY is set, search for runtime resource overlay * APKs in VENDOR_OVERLAY_DIR/ in diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 78aa5a0b66d..251a4287932 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -597,6 +597,8 @@ public class PackageManagerService extends IPackageManager.Stub private static final String ODM_OVERLAY_DIR = "/odm/overlay"; + private static final String OEM_OVERLAY_DIR = "/oem/overlay"; + /** Canonical intent used to identify what counts as a "web browser" app */ private static final Intent sBrowserIntent; static { @@ -2533,6 +2535,13 @@ public class PackageManagerService extends IPackageManager.Stub | SCAN_AS_SYSTEM | SCAN_AS_ODM, 0); + scanDirTracedLI(new File(OEM_OVERLAY_DIR), + mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags + | SCAN_AS_SYSTEM + | SCAN_AS_OEM, + 0); mParallelPackageParserCallback.findStaticOverlayPackages(); -- GitLab From a2112a309536f7f4d03510776ca847389c46b534 Mon Sep 17 00:00:00 2001 From: Alexey Kuzmin Date: Thu, 4 Apr 2019 18:39:38 +0100 Subject: [PATCH 004/473] Add fallback for TEXTURE_TICK TEXTURE_TICK vibration effect should fallback to TICK effect if not supported by HAL (and, if necessary, fallback further to TICK effect fallback) Bug: 129275029 Test: atest VibrationEffectTest Test: adb cmd vibrator prebaked 21 on a phone which does not support TEXTURE_TICK - you should feel the device vibrates Change-Id: I788b0835312e2b2ab590c26ef2f9961fe542cf77 (cherry picked from commit bebf04aaaf9ba3ceef2695d2c8e5d0bfcc30703b) --- api/test-current.txt | 1 + core/java/android/os/VibrationEffect.java | 1 + services/core/java/com/android/server/VibratorService.java | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/api/test-current.txt b/api/test-current.txt index 7121a549176..3be902e454c 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1895,6 +1895,7 @@ package android.os { field public static final int EFFECT_STRENGTH_LIGHT = 0; // 0x0 field public static final int EFFECT_STRENGTH_MEDIUM = 1; // 0x1 field public static final int EFFECT_STRENGTH_STRONG = 2; // 0x2 + field public static final int EFFECT_TEXTURE_TICK = 21; // 0x15 field public static final int EFFECT_THUD = 3; // 0x3 field public static final int[] RINGTONES; } diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java index 7958ddd29c7..035061b614f 100644 --- a/core/java/android/os/VibrationEffect.java +++ b/core/java/android/os/VibrationEffect.java @@ -104,6 +104,7 @@ public abstract class VibrationEffect implements Parcelable { * @see #get(int) * @hide */ + @TestApi public static final int EFFECT_TEXTURE_TICK = Effect.TEXTURE_TICK; /** {@hide} */ diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 5d0fa26f640..ba562610c7b 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -236,6 +236,7 @@ public class VibratorService extends IVibratorService.Stub case VibrationEffect.EFFECT_CLICK: case VibrationEffect.EFFECT_DOUBLE_CLICK: case VibrationEffect.EFFECT_HEAVY_CLICK: + case VibrationEffect.EFFECT_TEXTURE_TICK: case VibrationEffect.EFFECT_TICK: case VibrationEffect.EFFECT_POP: case VibrationEffect.EFFECT_THUD: @@ -379,6 +380,9 @@ public class VibratorService extends IVibratorService.Stub mFallbackEffects.put(VibrationEffect.EFFECT_TICK, tickEffect); mFallbackEffects.put(VibrationEffect.EFFECT_HEAVY_CLICK, heavyClickEffect); + mFallbackEffects.put(VibrationEffect.EFFECT_TEXTURE_TICK, + VibrationEffect.get(VibrationEffect.EFFECT_TICK, false)); + mScaleLevels = new SparseArray<>(); mScaleLevels.put(SCALE_VERY_LOW, new ScaleLevel(SCALE_VERY_LOW_GAMMA, SCALE_VERY_LOW_MAX_AMPLITUDE)); -- GitLab From be2a1885d33d11c4cc74b263f2bb2ea11341dc5c Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Wed, 10 Apr 2019 13:48:02 -0400 Subject: [PATCH 005/473] Add tests for user changes. These are regression tests for b/128607948. Bug: 130236375 Test: New test points added to ClockManagerTest Change-Id: Ic9b7d73174b99beb43b518235e89d29c54a7375b --- .../android/keyguard/clock/ClockManager.java | 35 ++++++----- .../settings/CurrentUserObservable.java | 63 +++++++++++++++++++ .../keyguard/clock/ClockManagerTest.java | 59 ++++++++++++++--- 3 files changed, 134 insertions(+), 23 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java index bc00b5cf9a4..677a3b286d7 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java @@ -30,6 +30,7 @@ import android.util.DisplayMetrics; import android.view.LayoutInflater; import androidx.annotation.VisibleForTesting; +import androidx.lifecycle.Observer; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.colorextraction.SysuiColorExtractor; @@ -37,13 +38,14 @@ import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManager.DockEventListener; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.settings.CurrentUserTracker; +import com.android.systemui.settings.CurrentUserObservable; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.util.InjectionInflationController; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Supplier; import javax.inject.Inject; @@ -64,7 +66,7 @@ public final class ClockManager { private final ContentResolver mContentResolver; private final SettingsWrapper mSettingsWrapper; private final Handler mMainHandler = new Handler(Looper.getMainLooper()); - private final CurrentUserTracker mCurrentUserTracker; + private final CurrentUserObservable mCurrentUserObservable; /** * Observe settings changes to know when to switch the clock face. @@ -74,12 +76,18 @@ public final class ClockManager { @Override public void onChange(boolean selfChange, Uri uri, int userId) { super.onChange(selfChange, uri, userId); - if (userId == mCurrentUserTracker.getCurrentUserId()) { + if (Objects.equals(userId, + mCurrentUserObservable.getCurrentUser().getValue())) { reload(); } } }; + /** + * Observe user changes and react by potentially loading the custom clock for the new user. + */ + private final Observer mCurrentUserObserver = (newUserId) -> reload(); + private final PluginManager mPluginManager; /** @@ -119,22 +127,19 @@ public final class ClockManager { public ClockManager(Context context, InjectionInflationController injectionInflater, PluginManager pluginManager, SysuiColorExtractor colorExtractor) { this(context, injectionInflater, pluginManager, colorExtractor, - context.getContentResolver(), new SettingsWrapper(context.getContentResolver())); + context.getContentResolver(), new CurrentUserObservable(context), + new SettingsWrapper(context.getContentResolver())); } ClockManager(Context context, InjectionInflationController injectionInflater, PluginManager pluginManager, SysuiColorExtractor colorExtractor, - ContentResolver contentResolver, SettingsWrapper settingsWrapper) { + ContentResolver contentResolver, CurrentUserObservable currentUserObservable, + SettingsWrapper settingsWrapper) { mContext = context; mPluginManager = pluginManager; mContentResolver = contentResolver; mSettingsWrapper = settingsWrapper; - mCurrentUserTracker = new CurrentUserTracker(context) { - @Override - public void onUserSwitched(int newUserId) { - reload(); - } - }; + mCurrentUserObservable = currentUserObservable; mPreviewClocks = new AvailableClocks(); Resources res = context.getResources(); @@ -219,7 +224,7 @@ public final class ClockManager { mContentResolver.registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.DOCKED_CLOCK_FACE), false, mContentObserver, UserHandle.USER_ALL); - mCurrentUserTracker.startTracking(); + mCurrentUserObservable.getCurrentUser().observeForever(mCurrentUserObserver); if (mDockManager == null) { mDockManager = SysUiServiceProvider.getComponent(mContext, DockManager.class); } @@ -231,7 +236,7 @@ public final class ClockManager { private void unregister() { mPluginManager.removePluginListener(mPreviewClocks); mContentResolver.unregisterContentObserver(mContentObserver); - mCurrentUserTracker.stopTracking(); + mCurrentUserObservable.getCurrentUser().removeObserver(mCurrentUserObserver); if (mDockManager != null) { mDockManager.removeListener(mDockEventListener); } @@ -349,7 +354,7 @@ public final class ClockManager { ClockPlugin plugin = null; if (ClockManager.this.isDocked()) { final String name = mSettingsWrapper.getDockedClockFace( - mCurrentUserTracker.getCurrentUserId()); + mCurrentUserObservable.getCurrentUser().getValue()); if (name != null) { plugin = mClocks.get(name); if (plugin != null) { @@ -358,7 +363,7 @@ public final class ClockManager { } } final String name = mSettingsWrapper.getLockScreenCustomClockFace( - mCurrentUserTracker.getCurrentUserId()); + mCurrentUserObservable.getCurrentUser().getValue()); if (name != null) { plugin = mClocks.get(name); } diff --git a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java new file mode 100644 index 00000000000..3cf08b4b866 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java @@ -0,0 +1,63 @@ +/* + * 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.settings; + +import android.content.Context; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; + +/** + * A class that has an observable for the current user. + */ +public class CurrentUserObservable { + + private final CurrentUserTracker mTracker; + + private final MutableLiveData mCurrentUser = new MutableLiveData() { + @Override + protected void onActive() { + super.onActive(); + mTracker.startTracking(); + } + + @Override + protected void onInactive() { + super.onInactive(); + mTracker.startTracking(); + } + }; + + public CurrentUserObservable(Context context) { + mTracker = new CurrentUserTracker(context) { + @Override + public void onUserSwitched(int newUserId) { + mCurrentUser.setValue(newUserId); + } + }; + } + + /** + * Returns the current user that can be observed. + */ + public LiveData getCurrentUser() { + if (mCurrentUser.getValue() == null) { + mCurrentUser.setValue(mTracker.getCurrentUserId()); + } + return mCurrentUser; + } +} diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java index 17fbe09e07b..76f1684aae7 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java @@ -31,11 +31,14 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; import android.view.LayoutInflater; +import androidx.lifecycle.MutableLiveData; + import com.android.systemui.SysuiTestCase; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerFake; import com.android.systemui.plugins.ClockPlugin; +import com.android.systemui.settings.CurrentUserObservable; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.util.InjectionInflationController; @@ -49,21 +52,26 @@ import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidTestingRunner.class) -@RunWithLooper +// Need to run tests on main looper because LiveData operations such as setData, observe, +// removeObserver cannot be invoked on a background thread. +@RunWithLooper(setAsMainLooper = true) public final class ClockManagerTest extends SysuiTestCase { private static final String BUBBLE_CLOCK = BubbleClockController.class.getName(); private static final Class BUBBLE_CLOCK_CLASS = BubbleClockController.class; - private static final int USER_ID = 0; + private static final int MAIN_USER_ID = 0; + private static final int SECONDARY_USER_ID = 11; private static final Uri SETTINGS_URI = null; private ClockManager mClockManager; private ContentObserver mContentObserver; private DockManagerFake mFakeDockManager; + private MutableLiveData mCurrentUser; @Mock InjectionInflationController mMockInjectionInflationController; @Mock PluginManager mMockPluginManager; @Mock SysuiColorExtractor mMockColorExtractor; @Mock ContentResolver mMockContentResolver; + @Mock CurrentUserObservable mMockCurrentUserObserable; @Mock SettingsWrapper mMockSettingsWrapper; @Mock ClockManager.ClockChangedListener mMockListener1; @Mock ClockManager.ClockChangedListener mMockListener2; @@ -78,9 +86,13 @@ public final class ClockManagerTest extends SysuiTestCase { mFakeDockManager = new DockManagerFake(); getContext().putComponent(DockManager.class, mFakeDockManager); + mCurrentUser = new MutableLiveData<>(); + mCurrentUser.setValue(MAIN_USER_ID); + when(mMockCurrentUserObserable.getCurrentUser()).thenReturn(mCurrentUser); + mClockManager = new ClockManager(getContext(), mMockInjectionInflationController, mMockPluginManager, mMockColorExtractor, mMockContentResolver, - mMockSettingsWrapper); + mMockCurrentUserObserable, mMockSettingsWrapper); mClockManager.addOnClockChangedListener(mMockListener1); mClockManager.addOnClockChangedListener(mMockListener2); @@ -113,7 +125,7 @@ public final class ClockManagerTest extends SysuiTestCase { when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(null); when(mMockSettingsWrapper.getDockedClockFace(anyInt())).thenReturn(null); // WHEN settings change event is fired - mContentObserver.onChange(false, SETTINGS_URI, USER_ID); + mContentObserver.onChange(false, SETTINGS_URI, MAIN_USER_ID); // THEN the result is null, indicated the default clock face should be used. assertThat(mClockManager.getCurrentClock()).isNull(); } @@ -123,7 +135,7 @@ public final class ClockManagerTest extends SysuiTestCase { // GIVEN that settings is set to the bubble clock face when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(BUBBLE_CLOCK); // WHEN settings change event is fired - mContentObserver.onChange(false, SETTINGS_URI, USER_ID); + mContentObserver.onChange(false, SETTINGS_URI, MAIN_USER_ID); // THEN the plugin is the bubble clock face. assertThat(mClockManager.getCurrentClock()).isInstanceOf(BUBBLE_CLOCK_CLASS); } @@ -133,7 +145,7 @@ public final class ClockManagerTest extends SysuiTestCase { // GIVEN that settings is set to the bubble clock face when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(BUBBLE_CLOCK); // WHEN settings change event is fired - mContentObserver.onChange(false, SETTINGS_URI, USER_ID); + mContentObserver.onChange(false, SETTINGS_URI, MAIN_USER_ID); // THEN the plugin is the bubble clock face. ArgumentCaptor captor = ArgumentCaptor.forClass(ClockPlugin.class); verify(mMockListener1).onClockChanged(captor.capture()); @@ -145,7 +157,7 @@ public final class ClockManagerTest extends SysuiTestCase { // GIVEN that settings is set to the bubble clock face when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(BUBBLE_CLOCK); // WHEN settings change event is fired - mContentObserver.onChange(false, SETTINGS_URI, USER_ID); + mContentObserver.onChange(false, SETTINGS_URI, MAIN_USER_ID); // THEN the listeners receive separate instances of the Bubble clock plugin. ArgumentCaptor captor1 = ArgumentCaptor.forClass(ClockPlugin.class); ArgumentCaptor captor2 = ArgumentCaptor.forClass(ClockPlugin.class); @@ -162,7 +174,7 @@ public final class ClockManagerTest extends SysuiTestCase { // custom clock face. when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn("bad value"); // WHEN settings change event is fired - mContentObserver.onChange(false, SETTINGS_URI, USER_ID); + mContentObserver.onChange(false, SETTINGS_URI, MAIN_USER_ID); // THEN the result is null. assertThat(mClockManager.getCurrentClock()).isNull(); } @@ -206,4 +218,35 @@ public final class ClockManagerTest extends SysuiTestCase { // THEN the plugin is the bubble clock face. assertThat(mClockManager.getCurrentClock()).isInstanceOf(BUBBLE_CLOCK_CLASS); } + + @Test + public void onUserChanged_defaultClock() { + // WHEN the user changes + mCurrentUser.setValue(SECONDARY_USER_ID); + // THEN the plugin is null for the default clock face + assertThat(mClockManager.getCurrentClock()).isNull(); + } + + @Test + public void onUserChanged_customClock() { + // GIVEN that a second user has selected the bubble clock face + when(mMockSettingsWrapper.getLockScreenCustomClockFace(SECONDARY_USER_ID)).thenReturn( + BUBBLE_CLOCK); + // WHEN the user changes + mCurrentUser.setValue(SECONDARY_USER_ID); + // THEN the plugin is the bubble clock face. + assertThat(mClockManager.getCurrentClock()).isInstanceOf(BUBBLE_CLOCK_CLASS); + } + + @Test + public void onUserChanged_docked() { + // GIVEN device is docked + mFakeDockManager.setDockEvent(DockManager.STATE_DOCKED); + // AND the second user as selected the bubble clock for the dock + when(mMockSettingsWrapper.getDockedClockFace(SECONDARY_USER_ID)).thenReturn(BUBBLE_CLOCK); + // WHEN the user changes + mCurrentUser.setValue(SECONDARY_USER_ID); + // THEN the plugin is the bubble clock face. + assertThat(mClockManager.getCurrentClock()).isInstanceOf(BUBBLE_CLOCK_CLASS); + } } -- GitLab From 1f8e5289c865e346ea8c24bac2162be4bdf1c968 Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Thu, 11 Apr 2019 12:26:54 +0900 Subject: [PATCH 006/473] Add overlayable tag for NetworkStackConfig This allows OEMs to customize the added resources with an overlay APK installed in the product, system or vendor partition. Bug: 111819230 Test: Installed test APK, verified resources changed. Resources not mentioned in overlayable file were not changed. Change-Id: I24670005ea940d2ac29b8a0ff93e1559604fd3a8 --- .../NetworkStack/res/values/overlayable.xml | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 packages/NetworkStack/res/values/overlayable.xml diff --git a/packages/NetworkStack/res/values/overlayable.xml b/packages/NetworkStack/res/values/overlayable.xml new file mode 100644 index 00000000000..7eeeefcf87f --- /dev/null +++ b/packages/NetworkStack/res/values/overlayable.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + -- GitLab From 7949028ca16de367384f5b905711de727cd6441e Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Thu, 11 Apr 2019 11:33:37 +0800 Subject: [PATCH 007/473] Remove car mode dialer and call companion roles. Bug: 128861807 Test: presubmit Change-Id: I198f38a59a1320c72c21522a191bf5c684f7b968 --- core/java/android/app/role/RoleManager.java | 32 --------------------- 1 file changed, 32 deletions(-) diff --git a/core/java/android/app/role/RoleManager.java b/core/java/android/app/role/RoleManager.java index 87597a7bf5f..4b1796a8d0f 100644 --- a/core/java/android/app/role/RoleManager.java +++ b/core/java/android/app/role/RoleManager.java @@ -112,22 +112,6 @@ public final class RoleManager { */ public static final String ROLE_HOME = "android.app.role.HOME"; - /** - * The name of the car mode dialer app role. - *

- * Similar to the {@link #ROLE_DIALER dialer} role, this role determines which app is - * responsible for showing the user interface for ongoing calls on the device. It is only used - * when the device is in car mode. - * - * @see #ROLE_DIALER - * @see android.app.UiModeManager#ACTION_ENTER_CAR_MODE - * @see android.telecom.InCallService - * - * TODO: STOPSHIP: Make name of required roles public API - * @hide - */ - public static final String ROLE_CAR_MODE_DIALER = "android.app.role.CAR_MODE_DIALER"; - /** * The name of the call redirection role. *

@@ -145,22 +129,6 @@ public final class RoleManager { */ public static final String ROLE_CALL_SCREENING = "android.app.role.CALL_SCREENING"; - /** - * The name of the call companion app role. - *

- * A call companion app provides no user interface for calls, but will be bound to by Telecom - * when there are active calls on the device. Companion apps for wearable devices are an - * acceptable use-case. - *

- * Multiple apps may hold this role at the same time. - * - * @see android.telecom.InCallService - * - * TODO: STOPSHIP: Make name of required roles public API - * @hide - */ - public static final String ROLE_CALL_COMPANION = "android.app.role.CALL_COMPANION"; - /** * @hide */ -- GitLab From 98694fbed1fbeb21817dca60fcc48a9200e650ef Mon Sep 17 00:00:00 2001 From: Varun Shah Date: Thu, 11 Apr 2019 09:28:27 -0700 Subject: [PATCH 008/473] Add logs to identify screen state change callback in ATMS. Bug: 130163921 Test: builds and logs visible Change-Id: I01570e31b2342706372999a9b558d141cfa4705a --- .../java/com/android/server/wm/ActivityTaskManagerService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 10ae78297a4..a326843ccb0 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -5458,6 +5458,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { StatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED__STATE__AWAKE); startTimeTrackingFocusedActivityLocked(); mTopProcessState = ActivityManager.PROCESS_STATE_TOP; + Slog.d(TAG, "Top Process State changed to PROCESS_STATE_TOP"); mStackSupervisor.comeOutOfSleepIfNeededLocked(); } mRootActivityContainer.applySleepTokens(true /* applyToStacks */); @@ -5472,6 +5473,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mCurAppTimeTracker.stop(); } mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING; + Slog.d(TAG, "Top Process State changed to PROCESS_STATE_TOP_SLEEPING"); mStackSupervisor.goingToSleepLocked(); updateResumedAppTrace(null /* resumed */); updateOomAdj = true; -- GitLab From feb79784faf8bf2ba2279e6463913652f93c7eb1 Mon Sep 17 00:00:00 2001 From: yuemingw Date: Tue, 5 Mar 2019 21:46:17 +0000 Subject: [PATCH 009/473] Remove restricted uitls methods for cross-profile calendar. Remove since we don't show policy transparency UI for cross-profile setting anymore. Test: atest CrossProfileCalendarPreferenceControllerTest Bug: 123930863 Change-Id: I2cd23fffa206cf3aa5189dd0f0edf3ca658b7443 --- .../RestrictedLockUtilsInternal.java | 39 ------------------- 1 file changed, 39 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java index 93f6a94dcf4..9a41f1d6a2b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java @@ -38,7 +38,6 @@ import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ForegroundColorSpan; import android.text.style.ImageSpan; -import android.util.Log; import android.view.MenuItem; import android.widget.TextView; @@ -47,7 +46,6 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.widget.LockPatternUtils; import java.util.List; -import java.util.Set; /** * Utility class to host methods usable in adding a restricted padlock icon and showing admin @@ -310,43 +308,6 @@ public class RestrictedLockUtilsInternal extends RestrictedLockUtils { return null; } - /** - * @param userId user id of a managed profile. - * @return profile owner admin if cross profile calendar is disallowed. - */ - public static EnforcedAdmin getCrossProfileCalendarEnforcingAdmin(Context context, int userId) { - final Context managedProfileContext = createPackageContextAsUser( - context, userId); - final DevicePolicyManager dpm = managedProfileContext.getSystemService( - DevicePolicyManager.class); - if (dpm == null) { - return null; - } - final EnforcedAdmin admin = getProfileOwner(context, userId); - if (admin == null) { - return null; - } - final Set packages = dpm.getCrossProfileCalendarPackages(); - if (packages != null && packages.isEmpty()) { - return admin; - } - return null; - } - - /** - * @param userId user id of a managed profile. - * @return a context created from the given context for the given user, or null if it fails. - */ - private static Context createPackageContextAsUser(Context context, int userId) { - try { - return context.createPackageContextAsUser( - context.getPackageName(), 0 /* flags */, UserHandle.of(userId)); - } catch (PackageManager.NameNotFoundException e) { - Log.e(LOG_TAG, "Failed to create user context", e); - } - return null; - } - public static EnforcedAdmin checkIfAccessibilityServiceDisallowed(Context context, String packageName, int userId) { DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService( -- GitLab From ba2519caeb63acb93fb05eb68d108e7b7f235993 Mon Sep 17 00:00:00 2001 From: Yunfan Chen Date: Wed, 10 Apr 2019 15:25:33 +0900 Subject: [PATCH 010/473] Clean-up PersisterQueue tests Previously, the code will get the latch count down in onPreProcessItem, and use the latch to count process waiting time. Move the latch countdown to actual process to reflect the waiting time. However, the timeout time needs to increase a little, as there are more steps before process the queue items. When it tests the process time, use the moved latch, which is in the mFactory to reflect the actual item processing. When the test is about callback, use the old latch, which is moved into mListener. Another improvement is to avoid let the whole test class implement the listener. Additionally, make the two test item class as static class, to make the interaction between the outer class and the test item class cleaner. Introduced a factory class to deal with processed latch and the test items. Test: atest PersisterQueueTests Bug: 128526085 Change-Id: I3d1fa2d44abdcdfe7d91d3ebab9b3196269f6e58 --- .../server/wm/PersisterQueueTests.java | 286 +++++++++++------- 1 file changed, 179 insertions(+), 107 deletions(-) diff --git a/services/tests/wmtests/src/com/android/server/wm/PersisterQueueTests.java b/services/tests/wmtests/src/com/android/server/wm/PersisterQueueTests.java index 4e906bc9b6c..4673992f64e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/PersisterQueueTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/PersisterQueueTests.java @@ -39,7 +39,6 @@ import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Predicate; /** * Build/Install/Run: @@ -47,208 +46,222 @@ import java.util.function.Predicate; */ @MediumTest @Presubmit -public class PersisterQueueTests implements PersisterQueue.Listener { +public class PersisterQueueTests { private static final long INTER_WRITE_DELAY_MS = 50; private static final long PRE_TASK_DELAY_MS = 300; - // We allow at most 1s more than the expected timeout. - private static final long TIMEOUT_ALLOWANCE = 100; - - private static final Predicate TEST_ITEM_PREDICATE = item -> item.mMatching; - - private AtomicInteger mItemCount; - private CountDownLatch mSetUpLatch; - private volatile CountDownLatch mLatch; - private List mProbablyDoneResults; + // We allow at most 0.2s more than the expected timeout. + private static final long TIMEOUT_ALLOWANCE = 200; private final PersisterQueue mTarget = new PersisterQueue(INTER_WRITE_DELAY_MS, PRE_TASK_DELAY_MS); + private TestPersisterQueueListener mListener; + private TestWriteQueueItemFactory mFactory; + @Before public void setUp() throws Exception { - mItemCount = new AtomicInteger(0); - mProbablyDoneResults = new ArrayList<>(); - mSetUpLatch = new CountDownLatch(1); + mListener = new TestPersisterQueueListener(); + mListener.setExpectedOnPreProcessItemCallbackTimes(1); + mTarget.addListener(mListener); + + mFactory = new TestWriteQueueItemFactory(); - mTarget.addListener(this); mTarget.startPersisting(); assertTrue("Target didn't call callback on start up.", - mSetUpLatch.await(TIMEOUT_ALLOWANCE, TimeUnit.MILLISECONDS)); + mListener.waitForAllExpectedCallbackDone(TIMEOUT_ALLOWANCE)); } @After public void tearDown() throws Exception { mTarget.stopPersisting(); - mTarget.removeListener(this); + mTarget.removeListener(mListener); } @Test public void testCallCallbackOnStartUp() { // The onPreProcessItem() must be called on start up. - assertEquals(1, mProbablyDoneResults.size()); + assertEquals(1, mListener.mProbablyDoneResults.size()); // The last one must be called with probably done being true. - assertTrue("The last probablyDone must be true.", mProbablyDoneResults.get(0)); + assertTrue("The last probablyDone must be true.", mListener.mProbablyDoneResults.get(0)); } @Test public void testProcessOneItem() throws Exception { - mLatch = new CountDownLatch(1); + mFactory.setExpectedProcessedItemNumber(1); + mListener.setExpectedOnPreProcessItemCallbackTimes(1); final long dispatchTime = SystemClock.uptimeMillis(); - mTarget.addItem(new TestItem(), false); - assertTrue("Target didn't call callback enough times.", - mLatch.await(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE, TimeUnit.MILLISECONDS)); - assertEquals("Target didn't process item.", 1, mItemCount.get()); + mTarget.addItem(mFactory.createItem(), false); + assertTrue("Target didn't process item enough times.", + mFactory.waitForAllExpectedItemsProcessed(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE)); + assertEquals("Target didn't process item.", 1, mFactory.getTotalProcessedItemCount()); final long processDuration = SystemClock.uptimeMillis() - dispatchTime; assertTrue("Target didn't wait enough time before processing item. duration: " + processDuration + "ms pretask delay: " + PRE_TASK_DELAY_MS + "ms", processDuration >= PRE_TASK_DELAY_MS); + assertTrue("Target didn't call callback enough times.", + mListener.waitForAllExpectedCallbackDone(TIMEOUT_ALLOWANCE)); // Once before processing this item, once after that. - assertEquals(2, mProbablyDoneResults.size()); + assertEquals(2, mListener.mProbablyDoneResults.size()); // The last one must be called with probably done being true. - assertTrue("The last probablyDone must be true.", mProbablyDoneResults.get(1)); + assertTrue("The last probablyDone must be true.", mListener.mProbablyDoneResults.get(1)); } @Test public void testProcessOneItem_Flush() throws Exception { - mLatch = new CountDownLatch(1); + mFactory.setExpectedProcessedItemNumber(1); + mListener.setExpectedOnPreProcessItemCallbackTimes(1); final long dispatchTime = SystemClock.uptimeMillis(); - mTarget.addItem(new TestItem(), true); - assertTrue("Target didn't call callback enough times.", - mLatch.await(TIMEOUT_ALLOWANCE, TimeUnit.MILLISECONDS)); - assertEquals("Target didn't process item.", 1, mItemCount.get()); + mTarget.addItem(mFactory.createItem(), true); + assertTrue("Target didn't process item enough times.", + mFactory.waitForAllExpectedItemsProcessed(TIMEOUT_ALLOWANCE)); + assertEquals("Target didn't process item.", 1, mFactory.getTotalProcessedItemCount()); final long processDuration = SystemClock.uptimeMillis() - dispatchTime; assertTrue("Target didn't process item immediately when flushing. duration: " + processDuration + "ms pretask delay: " + PRE_TASK_DELAY_MS + "ms", processDuration < PRE_TASK_DELAY_MS); + assertTrue("Target didn't call callback enough times.", + mFactory.waitForAllExpectedItemsProcessed(TIMEOUT_ALLOWANCE)); // Once before processing this item, once after that. - assertEquals(2, mProbablyDoneResults.size()); + assertEquals(2, mListener.mProbablyDoneResults.size()); // The last one must be called with probably done being true. - assertTrue("The last probablyDone must be true.", mProbablyDoneResults.get(1)); + assertTrue("The last probablyDone must be true.", mListener.mProbablyDoneResults.get(1)); } @Test public void testProcessTwoItems() throws Exception { - mLatch = new CountDownLatch(2); + mFactory.setExpectedProcessedItemNumber(2); + mListener.setExpectedOnPreProcessItemCallbackTimes(2); final long dispatchTime = SystemClock.uptimeMillis(); - mTarget.addItem(new TestItem(), false); - mTarget.addItem(new TestItem(), false); + mTarget.addItem(mFactory.createItem(), false); + mTarget.addItem(mFactory.createItem(), false); assertTrue("Target didn't call callback enough times.", - mLatch.await(PRE_TASK_DELAY_MS + INTER_WRITE_DELAY_MS + TIMEOUT_ALLOWANCE, - TimeUnit.MILLISECONDS)); - assertEquals("Target didn't process all items.", 2, mItemCount.get()); + mFactory.waitForAllExpectedItemsProcessed(PRE_TASK_DELAY_MS + INTER_WRITE_DELAY_MS + + TIMEOUT_ALLOWANCE)); + assertEquals("Target didn't process all items.", 2, mFactory.getTotalProcessedItemCount()); final long processDuration = SystemClock.uptimeMillis() - dispatchTime; assertTrue("Target didn't wait enough time before processing item. duration: " + processDuration + "ms pretask delay: " + PRE_TASK_DELAY_MS + "ms inter write delay: " + INTER_WRITE_DELAY_MS + "ms", processDuration >= PRE_TASK_DELAY_MS + INTER_WRITE_DELAY_MS); - + assertTrue("Target didn't call the onPreProcess callback enough times", + mListener.waitForAllExpectedCallbackDone(TIMEOUT_ALLOWANCE)); // Once before processing this item, once after that. - assertEquals(3, mProbablyDoneResults.size()); + assertEquals(3, mListener.mProbablyDoneResults.size()); // The first one must be called with probably done being false. - assertFalse("The first probablyDone must be false.", mProbablyDoneResults.get(1)); + assertFalse("The first probablyDone must be false.", mListener.mProbablyDoneResults.get(1)); // The last one must be called with probably done being true. - assertTrue("The last probablyDone must be true.", mProbablyDoneResults.get(2)); + assertTrue("The last probablyDone must be true.", mListener.mProbablyDoneResults.get(2)); } @Test @FlakyTest(bugId = 128526085) public void testProcessTwoItems_OneAfterAnother() throws Exception { // First item - mLatch = new CountDownLatch(1); + mFactory.setExpectedProcessedItemNumber(1); + mListener.setExpectedOnPreProcessItemCallbackTimes(1); long dispatchTime = SystemClock.uptimeMillis(); - mTarget.addItem(new TestItem(), false); - assertTrue("Target didn't call callback enough times.", - mLatch.await(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE, TimeUnit.MILLISECONDS)); + mTarget.addItem(mFactory.createItem(), false); + assertTrue("Target didn't process item enough times.", + mFactory.waitForAllExpectedItemsProcessed(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE)); long processDuration = SystemClock.uptimeMillis() - dispatchTime; assertTrue("Target didn't wait enough time before processing item." + processDuration + "ms pretask delay: " + PRE_TASK_DELAY_MS + "ms", processDuration >= PRE_TASK_DELAY_MS); - assertEquals("Target didn't process item.", 1, mItemCount.get()); + assertEquals("Target didn't process item.", 1, mFactory.getTotalProcessedItemCount()); + assertTrue("Target didn't call callback enough times.", + mListener.waitForAllExpectedCallbackDone(TIMEOUT_ALLOWANCE)); // Second item - mLatch = new CountDownLatch(1); + mFactory.setExpectedProcessedItemNumber(1); + mListener.setExpectedOnPreProcessItemCallbackTimes(1); dispatchTime = SystemClock.uptimeMillis(); // Synchronize on the instance to make sure we schedule the item after it starts to wait for // task indefinitely. synchronized (mTarget) { - mTarget.addItem(new TestItem(), false); + mTarget.addItem(mFactory.createItem(), false); } - assertTrue("Target didn't call callback enough times.", - mLatch.await(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE, TimeUnit.MILLISECONDS)); - assertEquals("Target didn't process all items.", 2, mItemCount.get()); + assertTrue("Target didn't process item enough times.", + mFactory.waitForAllExpectedItemsProcessed(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE)); + assertEquals("Target didn't process all items.", 2, mFactory.getTotalProcessedItemCount()); processDuration = SystemClock.uptimeMillis() - dispatchTime; assertTrue("Target didn't wait enough time before processing item. Process time: " + processDuration + "ms pre task delay: " + PRE_TASK_DELAY_MS + "ms", processDuration >= PRE_TASK_DELAY_MS); + assertTrue("Target didn't call callback enough times.", + mListener.waitForAllExpectedCallbackDone(TIMEOUT_ALLOWANCE)); // Once before processing this item, once after that. - assertEquals(3, mProbablyDoneResults.size()); + assertEquals(3, mListener.mProbablyDoneResults.size()); // The last one must be called with probably done being true. - assertTrue("The last probablyDone must be true.", mProbablyDoneResults.get(2)); + assertTrue("The last probablyDone must be true.", mListener.mProbablyDoneResults.get(2)); } @Test public void testFindLastItemNotReturnDifferentType() { synchronized (mTarget) { - mTarget.addItem(new TestItem(), false); - assertNull(mTarget.findLastItem(TEST_ITEM_PREDICATE, MatchingTestItem.class)); + mTarget.addItem(mFactory.createItem(), false); + assertNull(mTarget.findLastItem(TestItem::shouldKeepOnFilter, + FilterableTestItem.class)); } } @Test public void testFindLastItemNotReturnMismatchItem() { synchronized (mTarget) { - mTarget.addItem(new MatchingTestItem(false), false); - assertNull(mTarget.findLastItem(TEST_ITEM_PREDICATE, MatchingTestItem.class)); + mTarget.addItem(mFactory.createFilterableItem(false), false); + assertNull(mTarget.findLastItem(TestItem::shouldKeepOnFilter, + FilterableTestItem.class)); } } @Test public void testFindLastItemReturnMatchedItem() { synchronized (mTarget) { - final MatchingTestItem item = new MatchingTestItem(true); + final FilterableTestItem item = mFactory.createFilterableItem(true); mTarget.addItem(item, false); - assertSame(item, mTarget.findLastItem(TEST_ITEM_PREDICATE, MatchingTestItem.class)); + assertSame(item, mTarget.findLastItem(TestItem::shouldKeepOnFilter, + FilterableTestItem.class)); } } @Test public void testRemoveItemsNotRemoveDifferentType() throws Exception { - mLatch = new CountDownLatch(1); + mListener.setExpectedOnPreProcessItemCallbackTimes(1); synchronized (mTarget) { - mTarget.addItem(new TestItem(), false); - mTarget.removeItems(TEST_ITEM_PREDICATE, MatchingTestItem.class); + mTarget.addItem(mFactory.createItem(), false); + mTarget.removeItems(TestItem::shouldKeepOnFilter, FilterableTestItem.class); } assertTrue("Target didn't call callback enough times.", - mLatch.await(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE, TimeUnit.MILLISECONDS)); - assertEquals("Target didn't process item.", 1, mItemCount.get()); + mListener.waitForAllExpectedCallbackDone(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE)); + assertEquals("Target didn't process item.", 1, mFactory.getTotalProcessedItemCount()); } @Test public void testRemoveItemsNotRemoveMismatchedItem() throws Exception { - mLatch = new CountDownLatch(1); + mListener.setExpectedOnPreProcessItemCallbackTimes(1); synchronized (mTarget) { - mTarget.addItem(new MatchingTestItem(false), false); - mTarget.removeItems(TEST_ITEM_PREDICATE, MatchingTestItem.class); + mTarget.addItem(mFactory.createFilterableItem(false), false); + mTarget.removeItems(TestItem::shouldKeepOnFilter, FilterableTestItem.class); } assertTrue("Target didn't call callback enough times.", - mLatch.await(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE, TimeUnit.MILLISECONDS)); - assertEquals("Target didn't process item.", 1, mItemCount.get()); + mListener.waitForAllExpectedCallbackDone(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE)); + assertEquals("Target didn't process item.", 1, mFactory.getTotalProcessedItemCount()); } @Test public void testUpdateLastOrAddItemUpdatesMatchedItem() throws Exception { - mLatch = new CountDownLatch(1); - final MatchingTestItem scheduledItem = new MatchingTestItem(true); - final MatchingTestItem expected = new MatchingTestItem(true); + mListener.setExpectedOnPreProcessItemCallbackTimes(1); + final FilterableTestItem scheduledItem = mFactory.createFilterableItem(true); + final FilterableTestItem expected = mFactory.createFilterableItem(true); synchronized (mTarget) { mTarget.addItem(scheduledItem, false); mTarget.updateLastOrAddItem(expected, false); @@ -256,15 +269,15 @@ public class PersisterQueueTests implements PersisterQueue.Listener { assertSame(expected, scheduledItem.mUpdateFromItem); assertTrue("Target didn't call callback enough times.", - mLatch.await(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE, TimeUnit.MILLISECONDS)); - assertEquals("Target didn't process item.", 1, mItemCount.get()); + mListener.waitForAllExpectedCallbackDone(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE)); + assertEquals("Target didn't process item.", 1, mFactory.getTotalProcessedItemCount()); } @Test public void testUpdateLastOrAddItemUpdatesAddItemWhenNoMatch() throws Exception { - mLatch = new CountDownLatch(2); - final MatchingTestItem scheduledItem = new MatchingTestItem(false); - final MatchingTestItem expected = new MatchingTestItem(true); + mListener.setExpectedOnPreProcessItemCallbackTimes(2); + final FilterableTestItem scheduledItem = mFactory.createFilterableItem(false); + final FilterableTestItem expected = mFactory.createFilterableItem(true); synchronized (mTarget) { mTarget.addItem(scheduledItem, false); mTarget.updateLastOrAddItem(expected, false); @@ -272,73 +285,132 @@ public class PersisterQueueTests implements PersisterQueue.Listener { assertNull(scheduledItem.mUpdateFromItem); assertTrue("Target didn't call callback enough times.", - mLatch.await(PRE_TASK_DELAY_MS + INTER_WRITE_DELAY_MS + TIMEOUT_ALLOWANCE, - TimeUnit.MILLISECONDS)); - assertEquals("Target didn't process item.", 2, mItemCount.get()); + mListener.waitForAllExpectedCallbackDone(PRE_TASK_DELAY_MS + INTER_WRITE_DELAY_MS + + TIMEOUT_ALLOWANCE)); + assertEquals("Target didn't process item.", 2, mFactory.getTotalProcessedItemCount()); } @Test public void testRemoveItemsRemoveMatchedItem() throws Exception { - mLatch = new CountDownLatch(1); + mListener.setExpectedOnPreProcessItemCallbackTimes(1); synchronized (mTarget) { - mTarget.addItem(new TestItem(), false); - mTarget.addItem(new MatchingTestItem(true), false); - mTarget.removeItems(TEST_ITEM_PREDICATE, MatchingTestItem.class); + mTarget.addItem(mFactory.createItem(), false); + mTarget.addItem(mFactory.createFilterableItem(true), false); + mTarget.removeItems(TestItem::shouldKeepOnFilter, FilterableTestItem.class); } assertTrue("Target didn't call callback enough times.", - mLatch.await(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE, TimeUnit.MILLISECONDS)); - assertEquals("Target didn't process item.", 1, mItemCount.get()); + mListener.waitForAllExpectedCallbackDone(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE)); + assertEquals("Target didn't process item.", 1, mFactory.getTotalProcessedItemCount()); } @Test public void testFlushWaitSynchronously() { final long dispatchTime = SystemClock.uptimeMillis(); - mTarget.addItem(new TestItem(), false); - mTarget.addItem(new TestItem(), false); + mTarget.addItem(mFactory.createItem(), false); + mTarget.addItem(mFactory.createItem(), false); mTarget.flush(); assertEquals("Flush should wait until all items are processed before return.", - 2, mItemCount.get()); + 2, mFactory.getTotalProcessedItemCount()); final long processTime = SystemClock.uptimeMillis() - dispatchTime; assertWithMessage("Flush should trigger immediate flush without delays. processTime: " + processTime).that(processTime).isLessThan(TIMEOUT_ALLOWANCE); } - @Override - public void onPreProcessItem(boolean queueEmpty) { - mProbablyDoneResults.add(queueEmpty); + private static class TestWriteQueueItemFactory { + private final AtomicInteger mItemCount = new AtomicInteger(0);; + private CountDownLatch mLatch; + + int getTotalProcessedItemCount() { + return mItemCount.get(); + } + + void setExpectedProcessedItemNumber(int countDown) { + mLatch = new CountDownLatch(countDown); + } + + boolean waitForAllExpectedItemsProcessed(long timeoutInMilliseconds) + throws InterruptedException { + return mLatch.await(timeoutInMilliseconds, TimeUnit.MILLISECONDS); + } - final CountDownLatch latch = mLatch; - if (latch != null) { - latch.countDown(); + TestItem createItem() { + return new TestItem(mItemCount, mLatch); } - mSetUpLatch.countDown(); + FilterableTestItem createFilterableItem(boolean shouldKeepOnFilter) { + return new FilterableTestItem(shouldKeepOnFilter, mItemCount, mLatch); + } } - private class TestItem> implements PersisterQueue.WriteQueueItem { + private static class TestItem> + implements PersisterQueue.WriteQueueItem { + private AtomicInteger mItemCount; + private CountDownLatch mLatch; + + TestItem(AtomicInteger itemCount, CountDownLatch latch) { + mItemCount = itemCount; + mLatch = latch; + } + @Override public void process() { mItemCount.getAndIncrement(); + if (mLatch != null) { + // Count down the latch at the last step is necessary, as it's a kind of lock to the + // next assert in many test cases. + mLatch.countDown(); + } + } + + boolean shouldKeepOnFilter() { + return true; } } - private class MatchingTestItem extends TestItem { - private boolean mMatching; + private static class FilterableTestItem extends TestItem { + private boolean mShouldKeepOnFilter; - private MatchingTestItem mUpdateFromItem; + private FilterableTestItem mUpdateFromItem; - private MatchingTestItem(boolean matching) { - mMatching = matching; + private FilterableTestItem(boolean shouldKeepOnFilter, AtomicInteger mItemCount, + CountDownLatch mLatch) { + super(mItemCount, mLatch); + mShouldKeepOnFilter = shouldKeepOnFilter; } @Override - public boolean matches(MatchingTestItem item) { - return item.mMatching; + public boolean matches(FilterableTestItem item) { + return item.mShouldKeepOnFilter; } @Override - public void updateFrom(MatchingTestItem item) { + public void updateFrom(FilterableTestItem item) { mUpdateFromItem = item; } + + @Override + boolean shouldKeepOnFilter() { + return mShouldKeepOnFilter; + } + } + + private class TestPersisterQueueListener implements PersisterQueue.Listener { + CountDownLatch mCallbackLatch; + final List mProbablyDoneResults = new ArrayList<>(); + + @Override + public void onPreProcessItem(boolean queueEmpty) { + mProbablyDoneResults.add(queueEmpty); + mCallbackLatch.countDown(); + } + + void setExpectedOnPreProcessItemCallbackTimes(int countDown) { + mCallbackLatch = new CountDownLatch(countDown); + } + + boolean waitForAllExpectedCallbackDone(long timeoutInMilliseconds) + throws InterruptedException { + return mCallbackLatch.await(timeoutInMilliseconds, TimeUnit.MILLISECONDS); + } } } -- GitLab From 3741fdc5b983fc92aaf6ff3c469b0c0a599f9fb4 Mon Sep 17 00:00:00 2001 From: Xiao Ma Date: Thu, 11 Apr 2019 12:50:04 -0700 Subject: [PATCH 011/473] provide a resource overlay to configure customized DNS Server. Bug: 122621524 Test: atest FrameworksNetTests NetworkStackTests Merged-In: I123b3d4516cc6ba6d17629eb74daf448ba7121eb Merged-In: Iba867a3b7bda1f5db9dfa1b7521d4a4badbf88e0 (cherry picked from commit ac7eb77b90d830179358242fd6e594cc28c0cc31) Change-Id: Iab8b57ae1bc81c12ce07f849c7820977a9061d55 --- packages/NetworkStack/res/values/config.xml | 6 +++++- .../src/android/net/dhcp/DhcpClient.java | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/NetworkStack/res/values/config.xml b/packages/NetworkStack/res/values/config.xml index 90f96e0f7a1..704788d7d7e 100644 --- a/packages/NetworkStack/res/values/config.xml +++ b/packages/NetworkStack/res/values/config.xml @@ -35,4 +35,8 @@ - \ No newline at end of file + + + + + diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java b/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java index 64adc0d4830..be445199e1e 100644 --- a/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java +++ b/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java @@ -45,6 +45,7 @@ import static com.android.server.util.NetworkStackConstants.IPV4_ADDR_ANY; import android.content.Context; import android.net.DhcpResults; +import android.net.InetAddresses; import android.net.TrafficStats; import android.net.ip.IpClient; import android.net.metrics.DhcpClientEvent; @@ -66,6 +67,7 @@ import com.android.internal.util.MessageUtils; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.internal.util.WakeupMessage; +import com.android.networkstack.R; import java.io.FileDescriptor; import java.io.IOException; @@ -498,6 +500,18 @@ public class DhcpClient extends StateMachine { private void acceptDhcpResults(DhcpResults results, String msg) { mDhcpLease = results; + if (mDhcpLease.dnsServers.isEmpty()) { + // supplement customized dns servers + String[] dnsServersList = + mContext.getResources().getStringArray(R.array.config_default_dns_servers); + for (final String dnsServer : dnsServersList) { + try { + mDhcpLease.dnsServers.add(InetAddresses.parseNumericAddress(dnsServer)); + } catch (IllegalArgumentException e) { + Log.e(TAG, "Invalid default DNS server: " + dnsServer, e); + } + } + } mOffer = null; Log.d(TAG, msg + " lease: " + mDhcpLease); notifySuccess(); -- GitLab From d98ceddda10f4bee77b3e0a7902c7d630626ce17 Mon Sep 17 00:00:00 2001 From: Qasid Ahmad Sadiq Date: Fri, 12 Apr 2019 21:56:24 +0800 Subject: [PATCH 012/473] Make sure focused window is tracked by accessibility even if it is obscured. Although, I don't think the an obscured focused window should be reported, Talkback treats untracked/obscured windows or "invisible windows" as IMEs. When it WINDOW_STATE_CHANGED events from these windows, it will always announce it. So without this fix, the serioes of window events that are sent from a now obscured window, that are sent in transition, are all announced. Ideally, we can get rid of that hack, because it was initially made to address a race condition that is already fixed. But gBoard, and probably a few other keyboards, would regress because they send WINDOW_STATE_CHANGE events to announce to the user the keyboard is hidden. In our next release, we should probably get rid of the Talkback hack, get keyboards to use the correct accessibility semantics, and also make sure obscured windows aren't spamming services with Events. Change-Id: I70b8a2ed3c37ca2613f453254ec33980580409c8 Fix: 123958978 Test: The bug no longer reproduces. IME announcements are made as expected, CTSAccessibility* all pass. --- .../com/android/server/wm/AccessibilityController.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index 0ebd092aff4..6ce42ec4cb4 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -1132,7 +1132,7 @@ final class AccessibilityController { HashSet skipRemainingWindowsForTasks = new HashSet<>(); // Iterate until we figure out what is touchable for the entire screen. - for (int i = visibleWindowCount - 1; i >= 0 && !unaccountedSpace.isEmpty(); i--) { + for (int i = visibleWindowCount - 1; i >= 0; i--) { final WindowState windowState = visibleWindows.valueAt(i); final Rect boundsInScreen = mTempRect; @@ -1143,6 +1143,11 @@ final class AccessibilityController { addPopulatedWindowInfo(windowState, boundsInScreen, windows, addedWindows); updateUnaccountedSpace(windowState, boundsInScreen, unaccountedSpace, skipRemainingWindowsForTasks); + focusedWindowAdded |= windowState.isFocused(); + } + + if (unaccountedSpace.isEmpty() && focusedWindowAdded) { + break; } } -- GitLab From 06f0519a01b2c43fcd599168e5d112a3afcecf05 Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Wed, 10 Apr 2019 16:16:26 -0700 Subject: [PATCH 013/473] Make RemoteService propagate Context#bindService failure to PendingRequests ...and fix the attached bug which was caused by infinite wait due to lack of said signal Fixes: 129549258 Bug: 126266412 Test: - atest CtsContentCaptureServiceTestCases - Ensure b/129549258#comment5 no longer reproduces Change-Id: Id434ce268ca4ae6aa09140a3e17b6d8f476f3d9f --- .../android/app/role/RoleControllerManager.java | 5 +++++ ...stractMultiplePendingRequestsRemoteService.java | 14 ++++++++++++++ .../internal/infra/AbstractRemoteService.java | 13 +++++++++++++ .../AbstractSinglePendingRequestRemoteService.java | 9 +++++++++ 4 files changed, 41 insertions(+) diff --git a/core/java/android/app/role/RoleControllerManager.java b/core/java/android/app/role/RoleControllerManager.java index bd981179e2f..76b219981c5 100644 --- a/core/java/android/app/role/RoleControllerManager.java +++ b/core/java/android/app/role/RoleControllerManager.java @@ -252,6 +252,11 @@ public class RoleControllerManager { Log.e(LOG_TAG, "Error calling grantDefaultRoles()", e); } } + + @Override + protected void onFailed() { + mRemoteCallback.sendResult(null); + } } /** diff --git a/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java b/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java index 206efa94b7f..5efa94a09cd 100644 --- a/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java +++ b/core/java/com/android/internal/infra/AbstractMultiplePendingRequestsRemoteService.java @@ -75,6 +75,20 @@ public abstract class AbstractMultiplePendingRequestsRemoteService request = mPendingRequests.get(i); + request.onFailed(); + request.finish(); + } + mPendingRequests = null; + } + } + @Override // from AbstractRemoteService public void dump(@NonNull String prefix, @NonNull PrintWriter pw) { super.dump(prefix, pw); diff --git a/core/java/com/android/internal/infra/AbstractRemoteService.java b/core/java/com/android/internal/infra/AbstractRemoteService.java index 1155854efd5..a09013ce816 100644 --- a/core/java/com/android/internal/infra/AbstractRemoteService.java +++ b/core/java/com/android/internal/infra/AbstractRemoteService.java @@ -397,6 +397,11 @@ public abstract class AbstractRemoteService pendingRequest); + /** + * Called if {@link Context#bindServiceAsUser} returns {@code false}. + */ + abstract void handleBindFailure(); + private boolean handleIsBound() { return mService != null; } @@ -418,6 +423,8 @@ public abstract class AbstractRemoteService Date: Thu, 11 Apr 2019 13:50:50 -0700 Subject: [PATCH 014/473] Add DeviceConfig namespace for settings ui Fixes: 130302238 Test: RunSettingsRoboTests Change-Id: Idb20718165a598bfe73734fc06ef12d4f8d8d8e5 --- core/java/android/provider/DeviceConfig.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index 166de3fde74..e9fd63955f7 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -266,6 +266,13 @@ public final class DeviceConfig { */ public static final String NAMESPACE_CONTACTS_PROVIDER = "contacts_provider"; + /** + * Namespace for settings ui related features + * + * @hide + */ + public static final String NAMESPACE_SETTINGS_UI = "settings_ui"; + /** * List of namespaces which can be read without READ_DEVICE_CONFIG permission * -- GitLab From 17510161ac71e7492c3bb2e979fcfca36ade5696 Mon Sep 17 00:00:00 2001 From: hsuvictor Date: Wed, 27 Mar 2019 15:13:03 +0800 Subject: [PATCH 015/473] WifiMetrics: add histogram of passpoint provisioning Added histograms tracking the number of passpoint provisioning. Histograms are dimensioned on: Bug: 122542221 Test: atest WifiMetricsTest PasspointProvisionerTest PasspointManagerTest Change-Id: If71ed11c1898e210e08f694d85a931c811598c17 --- proto/src/wifi.proto | 108 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 107 insertions(+), 1 deletion(-) diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto index fdbc2ac9709..15d30e463cc 100644 --- a/proto/src/wifi.proto +++ b/proto/src/wifi.proto @@ -545,6 +545,9 @@ message WifiLog { // Number of times WifiManager#enableNetwork is called. optional int32 num_enable_network_calls = 146; + + // Passpoint provison metrics + optional PasspointProvisionStats passpoint_provision_stats = 147; } // Information that gets logged for every WiFi connection. @@ -2533,4 +2536,107 @@ message WifiToggleStats { // Number of time Wi-Fi is turned off by normal apps optional int32 num_toggle_off_normal = 4; -} \ No newline at end of file +} + +// Information about the Passpoint provision metrics. +message PasspointProvisionStats { + enum ProvisionFailureCode { + // provisioning failure for unknown reason. + OSU_FAILURE_UNKNOWN = 0; + + // The reason code for Provisioning Failure due to connection failure to OSU AP. + OSU_FAILURE_AP_CONNECTION = 1; + + // The reason code for invalid server URL address. + OSU_FAILURE_SERVER_URL_INVALID = 2; + + // The reason code for provisioning failure due to connection failure to the server. + OSU_FAILURE_SERVER_CONNECTION = 3; + + // The reason code for provisioning failure due to invalid server certificate. + OSU_FAILURE_SERVER_VALIDATION = 4; + + // The reason code for provisioning failure due to invalid service provider. + OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION = 5; + + // The reason code for provisioning failure when a provisioning flow is aborted. + OSU_FAILURE_PROVISIONING_ABORTED = 6; + + // The reason code for provisioning failure when a provisioning flow is not possible. + OSU_FAILURE_PROVISIONING_NOT_AVAILABLE = 7; + + // The reason code for provisioning failure due to invalid web url format for an OSU web page. + OSU_FAILURE_INVALID_URL_FORMAT_FOR_OSU = 8; + + // The reason code for provisioning failure when a command received is not the expected command + // type. + OSU_FAILURE_UNEXPECTED_COMMAND_TYPE = 9; + + // The reason code for provisioning failure when a SOAP message is not the expected message + // type. + OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE = 10; + + // The reason code for provisioning failure when a SOAP message exchange fails. + OSU_FAILURE_SOAP_MESSAGE_EXCHANGE = 11; + + // The reason code for provisioning failure when a redirect listener fails to start. + OSU_FAILURE_START_REDIRECT_LISTENER = 12; + + // The reason code for provisioning failure when a redirect listener timed out to receive a HTTP + // redirect response. + OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER = 13; + + // The reason code for provisioning failure when there is no OSU activity to listen to intent. + OSU_FAILURE_NO_OSU_ACTIVITY_FOUND = 14; + + // The reason code for provisioning failure when the status of a SOAP message is not the + // expected message status. + OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS = 15; + + // The reason code for provisioning failure when there is no PPS MO. + OSU_FAILURE_NO_PPS_MO = 16; + + // The reason code for provisioning failure when there is no AAAServerTrustRoot node in a PPS + // MO. + OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE = 17; + + // The reason code for provisioning failure when there is no TrustRoot node for remediation + // server in a PPS MO. + OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE = 18; + + // The reason code for provisioning failure when there is no TrustRoot node for policy server in + // a PPS MO. + OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE = 19; + + // The reason code for provisioning failure when failing to retrieve trust root certificates + // used for validating server certificate for AAA, Remediation and Policy server. + OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES = 20; + + // The reason code for provisioning failure when there is no trust root certificate for AAA + // server. + OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE = 21; + + // The reason code for provisioning failure when a {@link PasspointConfiguration} is failed to + // install. + OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION = 22; + + // The reason code for provisioning failure when an {@link OsuProvider} is not found for + // provisioning. + OSU_FAILURE_OSU_PROVIDER_NOT_FOUND = 23; + } + + // Number of passpoint provisioning success + optional int32 num_provision_success = 1; + + // Count for passpoint provisioning failure + repeated ProvisionFailureCount provision_failure_count = 2; + + // Number of occurrences of a specific passpoint provision failure code + message ProvisionFailureCount { + // Failure code + optional ProvisionFailureCode failure_code = 1; + + // Number of failure for the failure_code. + optional int32 count = 2; + } +} -- GitLab From e3f2ee7bc1286496763298ce6b2a845aa0d7fdde Mon Sep 17 00:00:00 2001 From: shafik Date: Mon, 15 Apr 2019 12:31:38 +0100 Subject: [PATCH 016/473] Make Watchdog request timeout flag configurable Leverage DeviceConfig to configure the following variable: * watchdog_request_timeout_millis Bug: 120598832 Test: Manual testing Change-Id: I4b2f2f20c387b891a88dd68a0d2368685e675b15 --- .../ExplicitHealthCheckServiceImpl.java | 19 +++++++++++++++++-- .../watchdog/ExplicitHealthChecker.java | 6 ++---- .../ext/services/watchdog/NetworkChecker.java | 7 ++----- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/packages/ExtServices/src/android/ext/services/watchdog/ExplicitHealthCheckServiceImpl.java b/packages/ExtServices/src/android/ext/services/watchdog/ExplicitHealthCheckServiceImpl.java index 52e54f965cc..69e91d1b857 100644 --- a/packages/ExtServices/src/android/ext/services/watchdog/ExplicitHealthCheckServiceImpl.java +++ b/packages/ExtServices/src/android/ext/services/watchdog/ExplicitHealthCheckServiceImpl.java @@ -18,6 +18,7 @@ package android.ext.services.watchdog; import android.content.ComponentName; import android.content.Intent; +import android.provider.DeviceConfig; import android.service.watchdog.ExplicitHealthCheckService; import android.service.watchdog.PackageInfo; import android.util.Log; @@ -27,6 +28,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; /** * Routes explicit health check requests to the appropriate {@link ExplicitHealthChecker}. @@ -36,6 +38,10 @@ public final class ExplicitHealthCheckServiceImpl extends ExplicitHealthCheckSer // TODO: Add build dependency on NetworkStack stable AIDL so we can stop hard coding class name private static final String NETWORK_STACK_CONNECTOR_CLASS = "android.net.INetworkStackConnector"; + private static final String PROPERTY_WATCHDOG_REQUEST_TIMEOUT_MILLIS = + "watchdog_request_timeout_millis"; + private static final long DEFAULT_REQUEST_TIMEOUT_MILLIS = + TimeUnit.HOURS.toMillis(1); // Modified only #onCreate, using concurrent collection to ensure thread visibility private final Map mSupportedCheckers = new ConcurrentHashMap<>(); @@ -70,8 +76,17 @@ public final class ExplicitHealthCheckServiceImpl extends ExplicitHealthCheckSer @Override public List onGetSupportedPackages() { List packages = new ArrayList<>(); + long requestTimeoutMillis = DeviceConfig.getLong( + DeviceConfig.NAMESPACE_ROLLBACK, + PROPERTY_WATCHDOG_REQUEST_TIMEOUT_MILLIS, + DEFAULT_REQUEST_TIMEOUT_MILLIS); + if (requestTimeoutMillis <= 0) { + requestTimeoutMillis = DEFAULT_REQUEST_TIMEOUT_MILLIS; + } for (ExplicitHealthChecker checker : mSupportedCheckers.values()) { - packages.add(checker.getSupportedPackage()); + PackageInfo pkg = new PackageInfo(checker.getSupportedPackageName(), + requestTimeoutMillis); + packages.add(pkg); } return packages; } @@ -87,7 +102,7 @@ public final class ExplicitHealthCheckServiceImpl extends ExplicitHealthCheckSer while (it.hasNext()) { ExplicitHealthChecker checker = it.next(); if (checker.isPending()) { - packages.add(checker.getSupportedPackage().getPackageName()); + packages.add(checker.getSupportedPackageName()); } } return packages; diff --git a/packages/ExtServices/src/android/ext/services/watchdog/ExplicitHealthChecker.java b/packages/ExtServices/src/android/ext/services/watchdog/ExplicitHealthChecker.java index c51be8863d9..a982d52e59a 100644 --- a/packages/ExtServices/src/android/ext/services/watchdog/ExplicitHealthChecker.java +++ b/packages/ExtServices/src/android/ext/services/watchdog/ExplicitHealthChecker.java @@ -16,8 +16,6 @@ package android.ext.services.watchdog; -import android.service.watchdog.PackageInfo; - /** * A type of explicit health check that can be performed on a device, e.g network health check */ @@ -40,7 +38,7 @@ interface ExplicitHealthChecker { boolean isPending(); /** - * Returns the {@link PackageInfo} object this checker can make requests for. + * Returns the name of the package this checker can make requests for. */ - PackageInfo getSupportedPackage(); + String getSupportedPackageName(); } diff --git a/packages/ExtServices/src/android/ext/services/watchdog/NetworkChecker.java b/packages/ExtServices/src/android/ext/services/watchdog/NetworkChecker.java index 09b319e8193..5722e096dff 100644 --- a/packages/ExtServices/src/android/ext/services/watchdog/NetworkChecker.java +++ b/packages/ExtServices/src/android/ext/services/watchdog/NetworkChecker.java @@ -21,7 +21,6 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkRequest; import android.service.watchdog.ExplicitHealthCheckService; -import android.service.watchdog.PackageInfo; import com.android.internal.annotations.GuardedBy; @@ -35,8 +34,6 @@ final class NetworkChecker extends ConnectivityManager.NetworkCallback private final Object mLock = new Object(); private final ExplicitHealthCheckService mService; private final String mPackageName; - // TODO: Receive from DeviceConfig flag - private final long mRequestDurationMillis = 0; @GuardedBy("mLock") private boolean mIsPending; @@ -76,8 +73,8 @@ final class NetworkChecker extends ConnectivityManager.NetworkCallback } @Override - public PackageInfo getSupportedPackage() { - return new PackageInfo(mPackageName, mRequestDurationMillis); + public String getSupportedPackageName() { + return mPackageName; } // TODO(b/120598832): Also monitor NetworkCallback#onAvailable to see if we have any -- GitLab From 064e02ab0d95be4c23fbb08b672571b8e5c76c6a Mon Sep 17 00:00:00 2001 From: Mathew Inwood Date: Tue, 12 Feb 2019 15:59:51 +0000 Subject: [PATCH 017/473] Move some telephony methods to max-sdk-p list. They were added to the max-sdk-o in commit f23153f (in Q), but should have been added to max-sdk-p as they were on the light greylist in P. This is a cherry-pick of 092a0a2 from aosp-master. Test: m Bug: 124354830 Change-Id: I856b975b88bdc5eacc5e061ba196bd584ca78c73 --- .../java/android/telephony/CellSignalStrengthLte.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/telephony/java/android/telephony/CellSignalStrengthLte.java b/telephony/java/android/telephony/CellSignalStrengthLte.java index 5687adaabed..7d7cd8c98a4 100644 --- a/telephony/java/android/telephony/CellSignalStrengthLte.java +++ b/telephony/java/android/telephony/CellSignalStrengthLte.java @@ -57,15 +57,15 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.P) private int mSignalStrength; // To be removed private int mRssi; - @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.O) + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.P) private int mRsrp; - @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.O) + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.P) private int mRsrq; - @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.O) + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.P) private int mRssnr; - @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.O) + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.P) private int mCqi; - @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.O) + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.P) private int mTimingAdvance; private int mLevel; -- GitLab From 082a59a1cc916b76b7c1f61ffdeb3bf8f5a23923 Mon Sep 17 00:00:00 2001 From: Alexey Kuzmin Date: Thu, 4 Apr 2019 12:01:48 +0100 Subject: [PATCH 018/473] Don't ban background vibration with USAGE_ALARM Test: manual, schedule a vibration-only alarm and see it vibrates Bug: 129297051 Change-Id: I3e0b8551b47196964168731061630362b5b17558 --- .../com/android/server/VibratorService.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 5d0fa26f640..a1e388a7555 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -113,6 +113,7 @@ public class VibratorService extends IVibratorService.Stub private final SparseArray mScaleLevels; private final LinkedList mPreviousRingVibrations; private final LinkedList mPreviousNotificationVibrations; + private final LinkedList mPreviousAlarmVibrations; private final LinkedList mPreviousVibrations; private final int mPreviousVibrationsLimit; private final boolean mAllowPriorityVibrationsInLowPowerMode; @@ -258,6 +259,10 @@ public class VibratorService extends IVibratorService.Stub return VibratorService.this.isRingtone(usageHint); } + public boolean isAlarm() { + return VibratorService.this.isAlarm(usageHint); + } + public boolean isFromSystem() { return uid == Process.SYSTEM_UID || uid == 0 || SYSTEM_UI_PACKAGE.equals(opPkg); } @@ -358,6 +363,7 @@ public class VibratorService extends IVibratorService.Stub mPreviousRingVibrations = new LinkedList<>(); mPreviousNotificationVibrations = new LinkedList<>(); + mPreviousAlarmVibrations = new LinkedList<>(); mPreviousVibrations = new LinkedList<>(); IntentFilter filter = new IntentFilter(); @@ -597,7 +603,7 @@ public class VibratorService extends IVibratorService.Stub Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg, reason); if (mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND - && !vib.isNotification() && !vib.isRingtone()) { + && !vib.isNotification() && !vib.isRingtone() && !vib.isAlarm()) { Slog.e(TAG, "Ignoring incoming vibration as process with" + " uid = " + uid + " is background," + " usage = " + AudioAttributes.usageToString(vib.usageHint)); @@ -629,6 +635,8 @@ public class VibratorService extends IVibratorService.Stub previousVibrations = mPreviousRingVibrations; } else if (vib.isNotification()) { previousVibrations = mPreviousNotificationVibrations; + } else if (vib.isAlarm()) { + previousVibrations = mPreviousAlarmVibrations; } else { previousVibrations = mPreviousVibrations; } @@ -793,6 +801,8 @@ public class VibratorService extends IVibratorService.Stub return mNotificationIntensity; } else if (vib.isHapticFeedback()) { return mHapticFeedbackIntensity; + } else if (vib.isAlarm()) { + return Vibrator.VIBRATION_INTENSITY_HIGH; } else { return Vibrator.VIBRATION_INTENSITY_MEDIUM; } @@ -817,6 +827,8 @@ public class VibratorService extends IVibratorService.Stub defaultIntensity = mVibrator.getDefaultNotificationVibrationIntensity(); } else if (vib.isHapticFeedback()) { defaultIntensity = mVibrator.getDefaultHapticFeedbackIntensity(); + } else if (vib.isAlarm()) { + defaultIntensity = Vibrator.VIBRATION_INTENSITY_HIGH; } else { // If we don't know what kind of vibration we're playing then just skip scaling for // now. @@ -1149,6 +1161,10 @@ public class VibratorService extends IVibratorService.Stub return usageHint == AudioAttributes.USAGE_ASSISTANCE_SONIFICATION; } + private static boolean isAlarm(int usageHint) { + return usageHint == AudioAttributes.USAGE_ALARM; + } + private void noteVibratorOnLocked(int uid, long millis) { try { mBatteryStatsService.noteVibratorOn(uid, millis); @@ -1380,6 +1396,12 @@ public class VibratorService extends IVibratorService.Stub pw.println(info.toString()); } + pw.println(" Previous alarm vibrations:"); + for (VibrationInfo info : mPreviousAlarmVibrations) { + pw.print(" "); + pw.println(info.toString()); + } + pw.println(" Previous vibrations:"); for (VibrationInfo info : mPreviousVibrations) { pw.print(" "); @@ -1445,6 +1467,9 @@ public class VibratorService extends IVibratorService.Stub } else if (isHapticFeedback(usage)) { defaultIntensity = mVibrator.getDefaultHapticFeedbackIntensity(); currentIntensity = mHapticFeedbackIntensity; + } else if (isAlarm(usage)) { + defaultIntensity = Vibrator.VIBRATION_INTENSITY_HIGH; + currentIntensity = Vibrator.VIBRATION_INTENSITY_HIGH; } else { defaultIntensity = 0; currentIntensity = 0; -- GitLab From 206077ad855c5c6b1d6b12d5e0484de6ce43ed87 Mon Sep 17 00:00:00 2001 From: Chenbo Feng Date: Fri, 5 Apr 2019 14:14:55 -0700 Subject: [PATCH 019/473] Add smoke test for jni library Since the Framework net test require jni library libnetworkstatsfactorytestjni, but the test fails to load that library unless *all* the dependencies of that library are explicitly listed in jni_libs, whenever any of the dependencies changes the framework net test will start failing and it might not be catched since the change might not related to frameworks/base. And this smoke test is aimed to spot those native library changes and it should be stable enough to put in global presubmit. Bug: 124764595 Test: FrameworksNetSmokeTests Change-Id: Id24e7f0558b5643e4ad7393e85f1f0a2bd875615 Merged-In: Id24e7f0558b5643e4ad7393e85f1f0a2bd875615 (cherry picked from commit 5f8a630da7d5b308c0824a25f6fc1dd4c7552c9f) --- tests/net/Android.bp | 1 - tests/net/smoketest/Android.bp | 17 +++++++++++++ tests/net/smoketest/AndroidManifest.xml | 27 ++++++++++++++++++++ tests/net/smoketest/AndroidTest.xml | 28 +++++++++++++++++++++ tests/net/smoketest/java/SmokeTest.java | 33 +++++++++++++++++++++++++ 5 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 tests/net/smoketest/Android.bp create mode 100644 tests/net/smoketest/AndroidManifest.xml create mode 100644 tests/net/smoketest/AndroidTest.xml create mode 100644 tests/net/smoketest/java/SmokeTest.java diff --git a/tests/net/Android.bp b/tests/net/Android.bp index c8ef82ec9ac..9098f90fd77 100644 --- a/tests/net/Android.bp +++ b/tests/net/Android.bp @@ -49,7 +49,6 @@ java_defaults { "libselinux", "libui", "libutils", - "libvintf", "libvndksupport", "libtinyxml2", "libunwindstack", diff --git a/tests/net/smoketest/Android.bp b/tests/net/smoketest/Android.bp new file mode 100644 index 00000000000..ef1ad2cba80 --- /dev/null +++ b/tests/net/smoketest/Android.bp @@ -0,0 +1,17 @@ +// This test exists only because the jni_libs list for these tests is difficult to +// maintain: the test itself only depends on libnetworkstatsfactorytestjni, but the test +// fails to load that library unless *all* the dependencies of that library are explicitly +// listed in jni_libs. This means that whenever any of the dependencies changes the test +// starts failing and breaking presubmits in frameworks/base. We cannot easily put +// FrameworksNetTests into global presubmit because they are at times flaky, but this +// test is effectively empty beyond validating that the libraries load correctly, and +// thus should be stable enough to put in global presubmit. +// +// TODO: remove this hack when there is a better solution for jni_libs that includes +// dependent libraries. +android_test { + name: "FrameworksNetSmokeTests", + defaults: ["FrameworksNetTests-jni-defaults"], + srcs: ["java/SmokeTest.java"], + test_suites: ["device-tests"], +} diff --git a/tests/net/smoketest/AndroidManifest.xml b/tests/net/smoketest/AndroidManifest.xml new file mode 100644 index 00000000000..f1b9febb9f5 --- /dev/null +++ b/tests/net/smoketest/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/tests/net/smoketest/AndroidTest.xml b/tests/net/smoketest/AndroidTest.xml new file mode 100644 index 00000000000..ac366e4ac54 --- /dev/null +++ b/tests/net/smoketest/AndroidTest.xml @@ -0,0 +1,28 @@ + + + + + + + diff --git a/tests/net/smoketest/java/SmokeTest.java b/tests/net/smoketest/java/SmokeTest.java new file mode 100644 index 00000000000..7d6655fde15 --- /dev/null +++ b/tests/net/smoketest/java/SmokeTest.java @@ -0,0 +1,33 @@ +/* + * 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.net; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public final class SmokeTest { + + @Test + public void testLoadJni() { + System.loadLibrary("networkstatsfactorytestjni"); + assertEquals(0, 0x00); + } +} -- GitLab From ca9a14b84f210ba0b71b7412ed22bffd1ae3c582 Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Tue, 9 Apr 2019 15:46:21 +0900 Subject: [PATCH 020/473] Restrict access to dangerous methods to <= P Test: make Fixes: 130143562 Change-Id: I1a6a472f83cf00a1ab174a9c5e67d3e9357a0c45 Merged-In: I95107f7b628eecb54e9f4411785186b668e9f3d8 Merged-In: I890030580fdad45c3f8589bf6adbe5798d578cfe (cherry picked from commit 0bb53dbb64bbc937a23e1dc7641c8988a6d11d64) --- core/java/android/net/ConnectivityManager.java | 18 +++++++++--------- core/java/android/net/TrafficStats.java | 5 +++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 2906710b065..0e10de8c4e3 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -510,7 +510,7 @@ public class ConnectivityManager { * The absence of a connection type. * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) public static final int TYPE_NONE = -1; /** @@ -627,7 +627,7 @@ public class ConnectivityManager { * {@hide} */ @Deprecated - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) public static final int TYPE_MOBILE_FOTA = 10; /** @@ -645,7 +645,7 @@ public class ConnectivityManager { * {@hide} */ @Deprecated - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) public static final int TYPE_MOBILE_CBS = 12; /** @@ -655,7 +655,7 @@ public class ConnectivityManager { * {@hide} */ @Deprecated - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) public static final int TYPE_WIFI_P2P = 13; /** @@ -674,7 +674,7 @@ public class ConnectivityManager { * {@hide} */ @Deprecated - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) public static final int TYPE_MOBILE_EMERGENCY = 15; /** @@ -775,7 +775,7 @@ public class ConnectivityManager { */ public static final String PRIVATE_DNS_DEFAULT_MODE_FALLBACK = PRIVATE_DNS_MODE_OPPORTUNISTIC; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) private final IConnectivityManager mService; /** * A kludge to facilitate static access where a Context pointer isn't available, like in the @@ -867,7 +867,7 @@ public class ConnectivityManager { * {@hide} */ @Deprecated - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) public static boolean isNetworkTypeMobile(int networkType) { switch (networkType) { case TYPE_MOBILE: @@ -1304,7 +1304,7 @@ public class ConnectivityManager { */ @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) public LinkProperties getLinkProperties(int networkType) { try { return mService.getLinkPropertiesForType(networkType); @@ -3042,7 +3042,7 @@ public class ConnectivityManager { */ @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) public boolean isNetworkSupported(int networkType) { try { return mService.isNetworkSupported(networkType); diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java index 49c6f74b1a3..5a22747cb49 100644 --- a/core/java/android/net/TrafficStats.java +++ b/core/java/android/net/TrafficStats.java @@ -25,6 +25,7 @@ import android.app.backup.BackupManager; import android.app.usage.NetworkStatsManager; import android.content.Context; import android.media.MediaPlayer; +import android.os.Build; import android.os.RemoteException; import android.os.ServiceManager; import android.util.DataUnit; @@ -150,7 +151,7 @@ public class TrafficStats { private static INetworkStatsService sStatsService; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) private synchronized static INetworkStatsService getStatsService() { if (sStatsService == null) { sStatsService = INetworkStatsService.Stub.asInterface( @@ -960,7 +961,7 @@ public class TrafficStats { * Interfaces are never removed from this list, so counters should always be * monotonic. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) private static String[] getMobileIfaces() { try { return getStatsService().getMobileIfaces(); -- GitLab From 7991b85da5bb51e560371c25ef27772463c68836 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 15 Apr 2019 23:34:42 -0700 Subject: [PATCH 021/473] Allow caller holding BIND_CONTENT_SUGGESTIONS_SERVICE to make suggestion calls Bug: 130437358 Test: Manual Change-Id: I77b7d56cbce429406a04c81c316bb0821fbf44cb --- .../ContentSuggestionsManagerService.java | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java index 55a062187bb..ecea251cc1a 100644 --- a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java +++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsManagerService.java @@ -16,7 +16,9 @@ package com.android.server.contentsuggestions; +import static android.Manifest.permission.BIND_CONTENT_SUGGESTIONS_SERVICE; import static android.Manifest.permission.MANAGE_CONTENT_SUGGESTIONS; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; import android.annotation.NonNull; import android.annotation.Nullable; @@ -92,16 +94,11 @@ public class ContentSuggestionsManagerService extends return MAX_TEMP_SERVICE_DURATION_MS; } - private boolean isCallerRecents(int userId) { - if (mServiceNameResolver.isTemporary(userId)) { - // If a temporary service is set then skip the recents check - return true; - } - return mActivityTaskManagerInternal.isCallerRecents(Binder.getCallingUid()); - } - - private void enforceCallerIsRecents(int userId, String func) { - if (isCallerRecents(userId)) { + private void enforceCaller(int userId, String func) { + Context ctx = getContext(); + if (ctx.checkCallingPermission(BIND_CONTENT_SUGGESTIONS_SERVICE) == PERMISSION_GRANTED + || mServiceNameResolver.isTemporary(userId) + || mActivityTaskManagerInternal.isCallerRecents(Binder.getCallingUid())) { return; } @@ -122,7 +119,7 @@ public class ContentSuggestionsManagerService extends if (imageContextRequestExtras == null) { throw new IllegalArgumentException("Expected non-null imageContextRequestExtras"); } - enforceCallerIsRecents(UserHandle.getCallingUserId(), "provideContextImage"); + enforceCaller(UserHandle.getCallingUserId(), "provideContextImage"); synchronized (mLock) { final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId); @@ -141,7 +138,7 @@ public class ContentSuggestionsManagerService extends int userId, @NonNull SelectionsRequest selectionsRequest, @NonNull ISelectionsCallback selectionsCallback) { - enforceCallerIsRecents(UserHandle.getCallingUserId(), "suggestContentSelections"); + enforceCaller(UserHandle.getCallingUserId(), "suggestContentSelections"); synchronized (mLock) { final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId); @@ -160,7 +157,7 @@ public class ContentSuggestionsManagerService extends int userId, @NonNull ClassificationsRequest classificationsRequest, @NonNull IClassificationsCallback callback) { - enforceCallerIsRecents(UserHandle.getCallingUserId(), "classifyContentSelections"); + enforceCaller(UserHandle.getCallingUserId(), "classifyContentSelections"); synchronized (mLock) { final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId); @@ -177,7 +174,7 @@ public class ContentSuggestionsManagerService extends @Override public void notifyInteraction( int userId, @NonNull String requestId, @NonNull Bundle bundle) { - enforceCallerIsRecents(UserHandle.getCallingUserId(), "notifyInteraction"); + enforceCaller(UserHandle.getCallingUserId(), "notifyInteraction"); synchronized (mLock) { final ContentSuggestionsPerUserService service = getServiceForUserLocked(userId); @@ -194,7 +191,7 @@ public class ContentSuggestionsManagerService extends @Override public void isEnabled(int userId, @NonNull IResultReceiver receiver) throws RemoteException { - enforceCallerIsRecents(UserHandle.getCallingUserId(), "isEnabled"); + enforceCaller(UserHandle.getCallingUserId(), "isEnabled"); boolean isDisabled; synchronized (mLock) { -- GitLab From a041114b38321fb217dc642c4bb113433a150f20 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Fri, 12 Apr 2019 13:04:41 -0700 Subject: [PATCH 022/473] Check and configure pixel format when locking canvas When locking the canvas we assume that the surface always uses the default RGB pixel format. In some cases like the MediaRecorder input surface, the format could be entirely different which can cause issues when trying to generate SKIA content. To avoid this, check the surface format first and configure the default RGB in case the value is unexpected. Bug: 130385299 Test: Verified the output of: atest cts/tests/tests/media/src/android/media/cts/MediaRecorderTest.java#testSurfaceRecording test cts/tests/tests/media/src/android/media/cts/MediaRecorderTest.java#testPersistentSurfaceRecording atest cts/tests/tests/media/src/android/media/cts/MediaRecorderTest.java#testSurfaceRecordingTimeLapse atest cts/tests/tests/media/src/android/media/cts/MediaRecorderTest.java#testPersistentSurfaceRecordingTimeLapse atest cts/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SurfaceViewTests.java atest cts/tests/tests/uirendering/src/android/uirendering/cts/testclasses/TextureViewTests.java atest cts/tests/tests/view/src/android/view/cts/SurfaceViewSyncTest.java atest cts/tests/tests/view/src/android/view/cts/ASurfaceControlTest.java Change-Id: I5459c52067725b0131010f362de5eb268fe7f9d9 --- core/jni/android_view_Surface.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index a9002945ff9..ccadc7d7c22 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -212,6 +212,10 @@ static jlong nativeLockCanvas(JNIEnv* env, jclass clazz, return 0; } + if (convertPixelFormat(ANativeWindow_getFormat(surface.get())) == kUnknown_SkColorType) { + native_window_set_buffers_format(surface.get(), PIXEL_FORMAT_RGBA_8888); + } + Rect dirtyRect(Rect::EMPTY_RECT); Rect* dirtyRectPtr = NULL; -- GitLab From 3a247363c42018fa6121a8a02bce07c6b418d0cb Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Thu, 4 Apr 2019 14:30:21 -0700 Subject: [PATCH 023/473] Enable am profiling for apps profileable by shell This change allows apps that are marked as profileable by shell to be profiled with am profile. Note that debuggable forces isProfileableByShell to true. Fixes: 118835065 Test: atest cts/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerAmProfileTests.java Note, tested on user build Change-Id: I174115dd9a3635ca4df3600eec994d06739d6ff8 --- .../java/com/android/server/am/ActivityManagerService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 3b6b404170c..e0550f535ab 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -7892,8 +7892,9 @@ public class ActivityManagerService extends IActivityManager.Stub synchronized (this) { boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0")); if (!isDebuggable) { - if ((app.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0) { - throw new SecurityException("Process not debuggable: " + app.packageName); + if (!app.isProfileableByShell()) { + throw new SecurityException("Process not debuggable, " + + "and not profileable by shell: " + app.packageName); } } mProfileData.setProfileApp(processName); -- GitLab From 390bff474c04661a791bfdd01b77d20168ab7dc3 Mon Sep 17 00:00:00 2001 From: Mady Mellor Date: Fri, 5 Apr 2019 15:09:01 -0700 Subject: [PATCH 024/473] Fix back presses dismissing bubbles when IME is up If bubbles is expanded & shade is not use the virtual display id of the expanded activity view (if it's valid, otherwise do whats normal). Test: manual 1) have expanded bubble with IME up 2) hit back button => note that the IME goes away but the bubble remains 1) have expanded bubble up 2) pull down shade 3) hit back button => shade goes away Do above with gesture nav turned on & do back gesture Test: atest KeyButtonViewTest Fixes: 122535136 Change-Id: Iabaace66cfb4d3d80b1a3a3c7b0773deb48fbcaa --- api/test-current.txt | 1 + core/java/android/app/ActivityView.java | 11 +++++ .../systemui/bubbles/BubbleController.java | 17 ++++++++ .../systemui/bubbles/BubbleExpandedView.java | 11 +++++ .../phone/EdgeBackGestureHandler.java | 11 +++++ .../phone/StatusBarWindowController.java | 9 ++++- .../statusbar/policy/KeyButtonView.java | 32 +++++++++++---- .../statusbar/policy/KeyButtonViewTest.java | 40 +++++++++++++++++-- 8 files changed, 119 insertions(+), 13 deletions(-) diff --git a/api/test-current.txt b/api/test-current.txt index fcad996a67f..6ed0e185999 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -107,6 +107,7 @@ package android.app { ctor public ActivityView(android.content.Context, android.util.AttributeSet); ctor public ActivityView(android.content.Context, android.util.AttributeSet, int); ctor public ActivityView(android.content.Context, android.util.AttributeSet, int, boolean); + method public int getVirtualDisplayId(); method public void onLayout(boolean, int, int, int, int); method public void onLocationChanged(); method public void performBackPress(); diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index 8ec5e3a4321..0ccaf62d45b 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -19,6 +19,7 @@ package android.app; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; +import static android.view.Display.INVALID_DISPLAY; import android.annotation.NonNull; import android.annotation.TestApi; @@ -376,6 +377,16 @@ public class ActivityView extends ViewGroup { mSurfaceView.setVisibility(visibility); } + /** + * @return the display id of the virtual display. + */ + public int getVirtualDisplayId() { + if (mVirtualDisplay != null) { + return mVirtualDisplay.getDisplay().getDisplayId(); + } + return INVALID_DISPLAY; + } + /** * Injects a pair of down/up key events with keycode {@link KeyEvent#KEYCODE_BACK} to the * virtual display. diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index 93effed5958..13bdb99e717 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -16,6 +16,8 @@ package com.android.systemui.bubbles; +import static android.view.Display.DEFAULT_DISPLAY; +import static android.view.Display.INVALID_DISPLAY; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; @@ -530,6 +532,21 @@ public class BubbleController implements BubbleExpandedView.OnBubbleBlockedListe return mTempRect; } + /** + * The display id of the expanded view, if the stack is expanded and not occluded by the + * status bar, otherwise returns {@link Display#INVALID_DISPLAY}. + */ + public int getExpandedDisplayId(Context context) { + boolean defaultDisplay = context.getDisplay() != null + && context.getDisplay().getDisplayId() == DEFAULT_DISPLAY; + Bubble b = mStackView.getExpandedBubble(); + if (defaultDisplay && b != null && isStackExpanded() + && !mStatusBarWindowController.getPanelExpanded()) { + return b.expandedView.getVirtualDisplayId(); + } + return INVALID_DISPLAY; + } + @VisibleForTesting BubbleStackView getStackView() { return mStackView; diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index 285d4aab4f6..990331417c6 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -20,6 +20,7 @@ import static android.content.pm.ActivityInfo.DOCUMENT_LAUNCH_ALWAYS; import static android.util.StatsLogInternal.BUBBLE_DEVELOPER_ERROR_REPORTED__ERROR__ACTIVITY_INFO_MISSING; import static android.util.StatsLogInternal.BUBBLE_DEVELOPER_ERROR_REPORTED__ERROR__ACTIVITY_INFO_NOT_RESIZABLE; import static android.util.StatsLogInternal.BUBBLE_DEVELOPER_ERROR_REPORTED__ERROR__DOCUMENT_LAUNCH_NOT_ALWAYS; +import static android.view.Display.INVALID_DISPLAY; import android.animation.LayoutTransition; import android.animation.ObjectAnimator; @@ -598,6 +599,16 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList return mBubbleIntent != null && mActivityView != null; } + /** + * @return the display id of the virtual display. + */ + public int getVirtualDisplayId() { + if (usingActivityView()) { + return mActivityView.getVirtualDisplayId(); + } + return INVALID_DISPLAY; + } + private void applyRowState(ExpandableNotificationRow view) { view.reset(); view.setHeadsUp(false); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java index 79bf6b3e49f..8aa50a7a31e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -15,6 +15,8 @@ */ package com.android.systemui.statusbar.phone; +import static android.view.Display.INVALID_DISPLAY; + import android.content.Context; import android.content.pm.ParceledListSlice; import android.content.res.Resources; @@ -46,7 +48,9 @@ import android.view.ViewConfiguration; import android.view.WindowManager; import android.view.WindowManagerGlobal; +import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.bubbles.BubbleController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver; import com.android.systemui.shared.system.QuickStepContract; @@ -358,6 +362,13 @@ public class EdgeBackGestureHandler implements DisplayListener { 0 /* metaState */, KeyCharacterMap.VIRTUAL_KEYBOARD, 0 /* scancode */, KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY, InputDevice.SOURCE_KEYBOARD); + + // Bubble controller will give us a valid display id if it should get the back event + BubbleController bubbleController = Dependency.get(BubbleController.class); + int bubbleDisplayId = bubbleController.getExpandedDisplayId(mContext); + if (code == KeyEvent.KEYCODE_BACK && bubbleDisplayId != INVALID_DISPLAY) { + ev.setDisplayId(bubbleDisplayId); + } InputManager.getInstance().injectInputEvent(ev, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java index 8d71ab81071..984ab0563fe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java @@ -523,12 +523,19 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat } /** - * The bubble is shown in expanded state for the status bar. + * Whether the bubble is shown in expanded state for the status bar. */ public boolean getBubbleExpanded() { return mCurrentState.bubbleExpanded; } + /** + * Whether the status bar panel is expanded or not. + */ + public boolean getPanelExpanded() { + return mCurrentState.panelExpanded; + } + public void setStateListener(OtherwisedCollapsedListener listener) { mListener = listener; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index 06fc745b083..9923ec9d8a7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -48,10 +48,12 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.ImageView; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.bubbles.BubbleController; import com.android.systemui.plugins.statusbar.phone.NavBarButtonProvider.ButtonInterface; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.system.NavigationBarCompat; @@ -73,6 +75,7 @@ public class KeyButtonView extends ImageView implements ButtonInterface { private final KeyButtonRipple mRipple; private final OverviewProxyService mOverviewProxyService; private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); + private final InputManager mInputManager; private final Runnable mCheckLongPress = new Runnable() { public void run() { @@ -96,6 +99,11 @@ public class KeyButtonView extends ImageView implements ButtonInterface { } public KeyButtonView(Context context, AttributeSet attrs, int defStyle) { + this(context, attrs, defStyle, InputManager.getInstance()); + } + + @VisibleForTesting + public KeyButtonView(Context context, AttributeSet attrs, int defStyle, InputManager manager) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.KeyButtonView, @@ -117,6 +125,7 @@ public class KeyButtonView extends ImageView implements ButtonInterface { mRipple = new KeyButtonRipple(context, this); mOverviewProxyService = Dependency.get(OverviewProxyService.class); + mInputManager = manager; setBackground(mRipple); forceHasOverlappingRendering(false); } @@ -318,16 +327,23 @@ public class KeyButtonView extends ImageView implements ButtonInterface { 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, flags | KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY, InputDevice.SOURCE_KEYBOARD); - //Make KeyEvent work on multi-display environment - if (getDisplay() != null) { - final int displayId = getDisplay().getDisplayId(); - if (displayId != INVALID_DISPLAY) { - ev.setDisplayId(displayId); - } + int displayId = INVALID_DISPLAY; + + // Make KeyEvent work on multi-display environment + if (getDisplay() != null) { + displayId = getDisplay().getDisplayId(); + } + // Bubble controller will give us a valid display id if it should get the back event + BubbleController bubbleController = Dependency.get(BubbleController.class); + int bubbleDisplayId = bubbleController.getExpandedDisplayId(mContext); + if (mCode == KeyEvent.KEYCODE_BACK && bubbleDisplayId != INVALID_DISPLAY) { + displayId = bubbleDisplayId; + } + if (displayId != INVALID_DISPLAY) { + ev.setDisplayId(displayId); } - InputManager.getInstance().injectInputEvent(ev, - InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); + mInputManager.injectInputEvent(ev, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java index 39bdf204cd6..d16dc168d74 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java @@ -18,8 +18,16 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_FLAGS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_NAV_ACTION; +import static junit.framework.Assert.assertEquals; + +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import android.hardware.input.InputManager; import android.metrics.LogMaker; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -31,12 +39,15 @@ import androidx.test.filters.SmallTest; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.SysuiTestCase; +import com.android.systemui.bubbles.BubbleController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatcher; -import org.mockito.Mockito; +import org.mockito.Captor; +import org.mockito.MockitoAnnotations; import java.util.Objects; @@ -47,12 +58,19 @@ public class KeyButtonViewTest extends SysuiTestCase { private KeyButtonView mKeyButtonView; private MetricsLogger mMetricsLogger; + private BubbleController mBubbleController; + private InputManager mInputManager = mock(InputManager.class); + @Captor + private ArgumentCaptor mInputEventCaptor; @Before public void setup() throws Exception { + MockitoAnnotations.initMocks(this); mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class); - TestableLooper.get(this).runWithLooper(() -> - mKeyButtonView = new KeyButtonView(mContext, null)); + mBubbleController = mDependency.injectMockDependency(BubbleController.class); + TestableLooper.get(this).runWithLooper(() -> { + mKeyButtonView = new KeyButtonView(mContext, null, 0, mInputManager); + }); } @Test @@ -63,7 +81,7 @@ public class KeyButtonViewTest extends SysuiTestCase { mKeyButtonView.setCode(code); mKeyButtonView.sendEvent(action, flags); - Mockito.verify(mMetricsLogger).write(argThat(new ArgumentMatcher() { + verify(mMetricsLogger).write(argThat(new ArgumentMatcher() { public String mReason; @Override @@ -91,4 +109,18 @@ public class KeyButtonViewTest extends SysuiTestCase { })); } + @Test + public void testBubbleEvents_bubbleExpanded() { + when(mBubbleController.getExpandedDisplayId(mContext)).thenReturn(3); + + int action = KeyEvent.ACTION_DOWN; + int flags = 0; + int code = KeyEvent.KEYCODE_BACK; + mKeyButtonView.setCode(code); + mKeyButtonView.sendEvent(action, flags); + + verify(mInputManager, times(1)).injectInputEvent(mInputEventCaptor.capture(), + anyInt()); + assertEquals(3, mInputEventCaptor.getValue().getDisplayId()); + } } \ No newline at end of file -- GitLab From 12d320a5018e81e67a41df00188516b693a26585 Mon Sep 17 00:00:00 2001 From: Cody Northrop Date: Tue, 9 Apr 2019 20:39:20 -0600 Subject: [PATCH 025/473] GraphicsEnvironment: Expose query to determine ANGLE use Move the early logic that decides whether ANGLE should be used to a static public function that can be queried elsewhere without setting up the environment further. Bug: 130029351 Test: atest CtsAngleIntegrationHostTestCases Change-Id: I908233d46631ec91dca714bff3f8fd9341160c9e --- core/java/android/os/GraphicsEnvironment.java | 87 +++++++++++-------- .../com/android/server/am/ProcessList.java | 5 +- 2 files changed, 55 insertions(+), 37 deletions(-) diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index 779790c09dc..a51a871e778 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -163,6 +163,43 @@ public class GraphicsEnvironment { return true; } + /** + * Query to determine if ANGLE should be used + */ + public static boolean shouldUseAngle(Context context, Bundle coreSettings, + String packageName) { + if (packageName.isEmpty()) { + Log.v(TAG, "No package name available yet, ANGLE should not be used"); + return false; + } + + final String devOptIn = getDriverForPkg(context, coreSettings, packageName); + if (DEBUG) { + Log.v(TAG, "ANGLE Developer option for '" + packageName + "' " + + "set to: '" + devOptIn + "'"); + } + + // We only want to use ANGLE if the app is whitelisted or the developer has + // explicitly chosen something other than default driver. + // The whitelist will be generated by the ANGLE APK at both boot time and + // ANGLE update time. It will only include apps mentioned in the rules file. + final boolean whitelisted = checkAngleWhitelist(context, coreSettings, packageName); + final boolean requested = devOptIn.equals(sDriverMap.get(OpenGlDriverChoice.ANGLE)); + final boolean useAngle = (whitelisted || requested); + if (!useAngle) { + return false; + } + + if (whitelisted) { + Log.v(TAG, "ANGLE whitelist includes " + packageName); + } + if (requested) { + Log.v(TAG, "ANGLE developer option for " + packageName + ": " + devOptIn); + } + + return true; + } + /** * Check whether application is debuggable */ @@ -535,6 +572,8 @@ public class GraphicsEnvironment { getGlobalSettingsString(contentResolver, bundle, Settings.Global.GLOBAL_SETTINGS_ANGLE_WHITELIST); + if (DEBUG) Log.v(TAG, "ANGLE whitelist: " + angleWhitelist); + return angleWhitelist.contains(packageName); } @@ -549,43 +588,11 @@ public class GraphicsEnvironment { */ public boolean setupAngle(Context context, Bundle bundle, PackageManager pm, String packageName) { - if (packageName.isEmpty()) { - Log.v(TAG, "No package name available yet, skipping ANGLE setup"); - return false; - } - - final String devOptIn = getDriverForPkg(context, bundle, packageName); - if (DEBUG) { - Log.v(TAG, "ANGLE Developer option for '" + packageName + "' " - + "set to: '" + devOptIn + "'"); - } - // We only need to check rules if the app is whitelisted or the developer has - // explicitly chosen something other than default driver. - // - // The whitelist will be generated by the ANGLE APK at both boot time and - // ANGLE update time. It will only include apps mentioned in the rules file. - // - // If the user has set the developer option to something other than default, - // we need to call setupAngleRulesApk() with the package name and the developer - // option value (native/angle/other). Then later when we are actually trying to - // load a driver, GraphicsEnv::shouldUseAngle() has seen the package name before - // and can confidently answer yes/no based on the previously set developer - // option value. - final boolean whitelisted = checkAngleWhitelist(context, bundle, packageName); - final boolean defaulted = devOptIn.equals(sDriverMap.get(OpenGlDriverChoice.DEFAULT)); - final boolean rulesCheck = (whitelisted || !defaulted); - if (!rulesCheck) { + if (!shouldUseAngle(context, bundle, packageName)) { return false; } - if (whitelisted) { - Log.v(TAG, "ANGLE whitelist includes " + packageName); - } - if (!defaulted) { - Log.v(TAG, "ANGLE developer option for " + packageName + ": " + devOptIn); - } - final String anglePkgName = getAnglePackageName(pm); if (anglePkgName.isEmpty()) { Log.e(TAG, "Failed to find ANGLE package."); @@ -623,6 +630,14 @@ public class GraphicsEnvironment { if (DEBUG) Log.v(TAG, "ANGLE package libs: " + paths); + // If the user has set the developer option to something other than default, + // we need to call setupAngleRulesApk() with the package name and the developer + // option value (native/angle/other). Then later when we are actually trying to + // load a driver, GraphicsEnv::getShouldUseAngle() has seen the package name before + // and can confidently answer yes/no based on the previously set developer + // option value. + final String devOptIn = getDriverForPkg(context, bundle, packageName); + if (setupAngleWithTempRulesFile(context, packageName, paths, devOptIn)) { // We setup ANGLE with a temp rules file, so we're done here. return true; @@ -655,9 +670,9 @@ public class GraphicsEnvironment { } /** - * Determine if ANGLE should be used. + * Determine if ANGLE will be used and setup the environment */ - private boolean shouldUseAngle(Context context, String packageName) { + private boolean setupAndUseAngle(Context context, String packageName) { // Need to make sure we are evaluating ANGLE usage for the correct circumstances if (!setupAngle(context, null, context.getPackageManager(), packageName)) { Log.v(TAG, "Package '" + packageName + "' should use not ANGLE"); @@ -677,7 +692,7 @@ public class GraphicsEnvironment { public void showAngleInUseDialogBox(Context context) { final String packageName = context.getPackageName(); - if (shouldShowAngleInUseDialogBox(context) && shouldUseAngle(context, packageName)) { + if (shouldShowAngleInUseDialogBox(context) && setupAndUseAngle(context, packageName)) { final Intent intent = new Intent(ACTION_ANGLE_FOR_ANDROID_TOAST_MESSAGE); String anglePkg = getAnglePackageName(context.getPackageManager()); intent.setPackage(anglePkg); diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 9780a7f7197..b3d611364b5 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -708,7 +708,10 @@ public final class ProcessList { ApplicationInfo applicationInfo) { final boolean shouldUseGameDriver = GraphicsEnvironment.shouldUseGameDriver(context, coreSettings, applicationInfo); - return !shouldUseGameDriver; + final boolean shouldUseAngle = + GraphicsEnvironment.shouldUseAngle(context, coreSettings, + applicationInfo.packageName); + return !shouldUseGameDriver && !shouldUseAngle; } public static String makeOomAdjString(int setAdj, boolean compact) { -- GitLab From 763a5d5d52bc87d8cbd35a77df08ba7317511ef2 Mon Sep 17 00:00:00 2001 From: Ben Blount Date: Wed, 10 Apr 2019 11:48:58 -0700 Subject: [PATCH 026/473] Organize intelligence counters together Intelligence is a mainline module with several counter usecases. Rather than create a very similar atom for each we'll use an event enum for these simple counters. Test: compile proto Bug: 129491708 Change-Id: Ic30c0d6e15f6afbef90d89d1b53a20f8af38902e --- cmds/statsd/src/atoms.proto | 21 ++++++++-- .../android/stats/intelligence/enums.proto | 40 +++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 core/proto/android/stats/intelligence/enums.proto diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 5778fa9f690..a5dc2527279 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -22,8 +22,8 @@ option java_outer_classname = "AtomsProto"; import "frameworks/base/cmds/statsd/src/atom_field_options.proto"; import "frameworks/base/core/proto/android/app/enums.proto"; -import "frameworks/base/core/proto/android/app/settings_enums.proto"; import "frameworks/base/core/proto/android/app/job/enums.proto"; +import "frameworks/base/core/proto/android/app/settings_enums.proto"; import "frameworks/base/core/proto/android/bluetooth/a2dp/enums.proto"; import "frameworks/base/core/proto/android/bluetooth/enums.proto"; import "frameworks/base/core/proto/android/bluetooth/hci/enums.proto"; @@ -42,10 +42,11 @@ import "frameworks/base/core/proto/android/service/procstats_enum.proto"; import "frameworks/base/core/proto/android/service/usb.proto"; import "frameworks/base/core/proto/android/stats/connectivity/network_stack.proto"; import "frameworks/base/core/proto/android/stats/connectivity/resolv_stats.proto"; -import "frameworks/base/core/proto/android/stats/enums.proto"; -import "frameworks/base/core/proto/android/stats/docsui/docsui_enums.proto"; import "frameworks/base/core/proto/android/stats/devicepolicy/device_policy.proto"; import "frameworks/base/core/proto/android/stats/devicepolicy/device_policy_enums.proto"; +import "frameworks/base/core/proto/android/stats/docsui/docsui_enums.proto"; +import "frameworks/base/core/proto/android/stats/enums.proto"; +import "frameworks/base/core/proto/android/stats/intelligence/enums.proto"; import "frameworks/base/core/proto/android/stats/launcher/launcher.proto"; import "frameworks/base/core/proto/android/stats/storage/storage_enums.proto"; import "frameworks/base/core/proto/android/stats/style/style_enums.proto"; @@ -276,6 +277,8 @@ message Atom { SystemServerWatchdogOccurred system_server_watchdog_occurred = 185; TombStoneOccurred tomb_stone_occurred = 186; BluetoothClassOfDeviceReported bluetooth_class_of_device_reported = 187; + IntelligenceEventReported intelligence_event_reported = + 188 [(log_from_module) = "intelligence"]; } // Pulled events will start at field 10000. @@ -5974,3 +5977,15 @@ message CoolingDevice { // not in throttling, higher value means deeper throttling. optional int32 state = 3; } + +/** + * Intelligence has several counter-type events that don't warrant a + * full separate atom. These are primarily API call counters but also include + * counters for feature usage and specific failure modes. + * + * Logged from the Intelligence mainline module. + */ +message IntelligenceEventReported { + optional android.stats.intelligence.EventType event_id = 1; + optional android.stats.intelligence.Status status = 2; +} diff --git a/core/proto/android/stats/intelligence/enums.proto b/core/proto/android/stats/intelligence/enums.proto new file mode 100644 index 00000000000..0c210e3fd08 --- /dev/null +++ b/core/proto/android/stats/intelligence/enums.proto @@ -0,0 +1,40 @@ +/* + * 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. + */ + +syntax = "proto2"; + +package android.stats.intelligence; +option java_outer_classname = "IntelligenceStatsEnums"; + +enum Status { + // The value wasn't set. + // protoc requires enum values to be unique by package rather than enum type. + // This forces us to prefix the enum values. + STATUS_UNKNOWN = 0; + // The event succeeded. + STATUS_SUCCEEDED = 1; + // The event had an error. + STATUS_FAILED = 2; +} + +enum EventType { + // The value wasn't set. + EVENT_UNKNOWN = 0; + // ContentSuggestionsService classifyContentSelections call. + EVENT_CONTENT_SUGGESTIONS_CLASSIFY_CONTENT_CALL = 1; + // ContentSuggestionsService suggestContentSelections call. + EVENT_CONTENT_SUGGESTIONS_SUGGEST_CONTENT_CALL = 2; +} -- GitLab From 4077065daac829633f04ed21d111263f06be7417 Mon Sep 17 00:00:00 2001 From: Beverly Date: Fri, 15 Feb 2019 15:49:49 -0500 Subject: [PATCH 027/473] Add ability to center a notification icon Test: manual, atest CollapsedStatusBarFragmentTest Test: atest HeadsUpAppearanceControllerTest Bug: 124937207 Change-Id: Ie6b44fad2490ddede53116ebc1293876165695f8 --- .../systemui/plugins/SensorManagerPlugin.java | 1 + .../SystemUI/res/layout/center_icon_area.xml | 30 +++++ packages/SystemUI/res/layout/status_bar.xml | 8 ++ .../collection/NotificationEntry.java | 27 +++++ .../phone/CollapsedStatusBarFragment.java | 12 ++ .../phone/HeadsUpAppearanceController.java | 14 ++- .../phone/NotificationIconAreaController.java | 109 +++++++++++++++--- .../statusbar/phone/PhoneStatusBarView.java | 5 + .../phone/CollapsedStatusBarFragmentTest.java | 5 + .../HeadsUpAppearanceControllerTest.java | 4 +- 10 files changed, 197 insertions(+), 18 deletions(-) create mode 100644 packages/SystemUI/res/layout/center_icon_area.xml diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java index bc6547f6898..2cbd788d0a3 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java @@ -58,6 +58,7 @@ public interface SensorManagerPlugin extends Plugin { public static final int TYPE_WAKE_LOCK_SCREEN = 1; public static final int TYPE_WAKE_DISPLAY = 2; public static final int TYPE_SWIPE = 3; + public static final int TYPE_STATUS = 4; private int mType; diff --git a/packages/SystemUI/res/layout/center_icon_area.xml b/packages/SystemUI/res/layout/center_icon_area.xml new file mode 100644 index 00000000000..21279e12fb4 --- /dev/null +++ b/packages/SystemUI/res/layout/center_icon_area.xml @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index 7a43c6d2051..4fae3c500a4 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -102,6 +102,14 @@ android:gravity="center_horizontal|center_vertical" /> + + updateIsolatedIconLocation(true /* requireUpdate */)); mStackScroller = stackScroller; @@ -238,11 +242,17 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, mHeadsUpStatusBarView.setVisibility(View.VISIBLE); show(mHeadsUpStatusBarView); hide(mClockView, View.INVISIBLE); + if (mCenteredIconView.getVisibility() != View.GONE) { + hide(mCenteredIconView, View.INVISIBLE); + } if (mOperatorNameView != null) { hide(mOperatorNameView, View.INVISIBLE); } } else { show(mClockView); + if (mCenteredIconView.getVisibility() != View.GONE) { + show(mCenteredIconView); + } if (mOperatorNameView != null) { show(mOperatorNameView); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index 02ee2433d25..bb490f52b04 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -33,6 +33,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import java.util.ArrayList; +import java.util.Objects; import java.util.function.Function; /** @@ -66,11 +67,15 @@ public class NotificationIconAreaController implements DarkReceiver, private int mIconSize; private int mIconHPadding; private int mIconTint = Color.WHITE; + private int mCenteredIconTint = Color.WHITE; private StatusBar mStatusBar; protected View mNotificationIconArea; private NotificationIconContainer mNotificationIcons; private NotificationIconContainer mShelfIcons; + protected View mCenteredIconArea; + private NotificationIconContainer mCenteredIcon; + private StatusBarIconView mCenteredIconView; private final Rect mTintArea = new Rect(); private ViewGroup mNotificationScrollLayout; private Context mContext; @@ -124,6 +129,9 @@ public class NotificationIconAreaController implements DarkReceiver, mNotificationIcons = mNotificationIconArea.findViewById(R.id.notificationIcons); mNotificationScrollLayout = mStatusBar.getNotificationScrollLayout(); + + mCenteredIconArea = layoutInflater.inflate(R.layout.center_icon_area, null); + mCenteredIcon = mCenteredIconArea.findViewById(R.id.centeredIcon); } public void setupShelf(NotificationShelf shelf) { @@ -142,6 +150,10 @@ public class NotificationIconAreaController implements DarkReceiver, View child = mShelfIcons.getChildAt(i); child.setLayoutParams(params); } + for (int i = 0; i < mCenteredIcon.getChildCount(); i++) { + View child = mCenteredIcon.getChildAt(i); + child.setLayoutParams(params); + } } @NonNull @@ -166,6 +178,13 @@ public class NotificationIconAreaController implements DarkReceiver, return mNotificationIconArea; } + /** + * Returns the view that represents the centered notification area. + */ + public View getCenteredNotificationAreaView() { + return mCenteredIconArea; + } + /** * See {@link com.android.systemui.statusbar.policy.DarkIconDispatcher#setIconsDarkArea}. * Sets the color that should be used to tint any icons in the notification area. @@ -179,6 +198,7 @@ public class NotificationIconAreaController implements DarkReceiver, } else { mTintArea.set(tintArea); } + if (mNotificationIconArea != null) { if (DarkIconDispatcher.isInArea(tintArea, mNotificationIconArea)) { mIconTint = iconTint; @@ -187,6 +207,14 @@ public class NotificationIconAreaController implements DarkReceiver, mIconTint = iconTint; } + if (mCenteredIconArea != null) { + if (DarkIconDispatcher.isInArea(tintArea, mCenteredIconArea)) { + mCenteredIconTint = iconTint; + } + } else { + mCenteredIconTint = iconTint; + } + applyNotificationIconsTint(); } @@ -196,7 +224,13 @@ public class NotificationIconAreaController implements DarkReceiver, protected boolean shouldShowNotificationIcon(NotificationEntry entry, boolean showAmbient, boolean showLowPriority, boolean hideDismissed, - boolean hideRepliedMessages, boolean hideCurrentMedia) { + boolean hideRepliedMessages, boolean hideCurrentMedia, boolean hideCenteredIcon) { + + final boolean isCenteredNotificationIcon = entry.centeredIcon != null + && Objects.equals(entry.centeredIcon, mCenteredIconView); + if (hideCenteredIcon == isCenteredNotificationIcon) { + return false; + } if (mEntryManager.getNotificationData().isAmbient(entry.key) && !showAmbient) { return false; } @@ -229,26 +263,41 @@ public class NotificationIconAreaController implements DarkReceiver, * Updates the notifications with the given list of notifications to display. */ public void updateNotificationIcons() { - updateStatusBarIcons(); updateShelfIcons(); + updateCenterIcon(); applyNotificationIconsTint(); } private void updateShelfIcons() { updateIconsForLayout(entry -> entry.expandedIcon, mShelfIcons, - true /* showAmbient */, !mFullyDark /* showLowPriority */, - false /* hideDismissed */, mFullyDark /* hideRepliedMessages */, - mFullyDark /* hideCurrentMedia */); + true /* showAmbient */, + !mFullyDark /* showLowPriority */, + false /* hideDismissed */, + mFullyDark /* hideRepliedMessages */, + mFullyDark /* hideCurrentMedia */, + true /* hide centered icon */); } public void updateStatusBarIcons() { updateIconsForLayout(entry -> entry.icon, mNotificationIcons, - false /* showAmbient */, mShowLowPriority /* showLowPriority */, + false /* showAmbient */, + mShowLowPriority /* showLowPriority */, true /* hideDismissed */, true /* hideRepliedMessages */, - false /* hideCurrentMedia */); + false /* hideCurrentMedia */, + true /* hide centered icon */); + } + + private void updateCenterIcon() { + updateIconsForLayout(entry -> entry.centeredIcon, mCenteredIcon, + false /* showAmbient */, + !mFullyDark /* showLowPriority */, + false /* hideDismissed */, + false /* hideRepliedMessages */, + mFullyDark /* hideCurrentMedia */, + false /* hide centered icon */); } @VisibleForTesting @@ -267,7 +316,8 @@ public class NotificationIconAreaController implements DarkReceiver, */ private void updateIconsForLayout(Function function, NotificationIconContainer hostLayout, boolean showAmbient, boolean showLowPriority, - boolean hideDismissed, boolean hideRepliedMessages, boolean hideCurrentMedia) { + boolean hideDismissed, boolean hideRepliedMessages, boolean hideCurrentMedia, + boolean hideCenteredIcon) { ArrayList toShow = new ArrayList<>( mNotificationScrollLayout.getChildCount()); @@ -277,8 +327,11 @@ public class NotificationIconAreaController implements DarkReceiver, if (view instanceof ExpandableNotificationRow) { NotificationEntry ent = ((ExpandableNotificationRow) view).getEntry(); if (shouldShowNotificationIcon(ent, showAmbient, showLowPriority, hideDismissed, - hideRepliedMessages, hideCurrentMedia)) { - toShow.add(function.apply(ent)); + hideRepliedMessages, hideCurrentMedia, hideCenteredIcon)) { + StatusBarIconView iconView = function.apply(ent); + if (iconView != null) { + toShow.add(iconView); + } } } } @@ -368,32 +421,54 @@ public class NotificationIconAreaController implements DarkReceiver, /** * Applies {@link #mIconTint} to the notification icons. + * Applies {@link #mCenteredIconTint} to the center notification icon. */ private void applyNotificationIconsTint() { for (int i = 0; i < mNotificationIcons.getChildCount(); i++) { final StatusBarIconView iv = (StatusBarIconView) mNotificationIcons.getChildAt(i); if (iv.getWidth() != 0) { - updateTintForIcon(iv); + updateTintForIcon(iv, mIconTint); + } else { + iv.executeOnLayout(() -> updateTintForIcon(iv, mIconTint)); + } + } + + for (int i = 0; i < mCenteredIcon.getChildCount(); i++) { + final StatusBarIconView iv = (StatusBarIconView) mCenteredIcon.getChildAt(i); + if (iv.getWidth() != 0) { + updateTintForIcon(iv, mCenteredIconTint); } else { - iv.executeOnLayout(() -> updateTintForIcon(iv)); + iv.executeOnLayout(() -> updateTintForIcon(iv, mCenteredIconTint)); } } } - private void updateTintForIcon(StatusBarIconView v) { + private void updateTintForIcon(StatusBarIconView v, int tint) { boolean isPreL = Boolean.TRUE.equals(v.getTag(R.id.icon_is_pre_L)); int color = StatusBarIconView.NO_COLOR; boolean colorize = !isPreL || NotificationUtils.isGrayscale(v, mContrastColorUtil); if (colorize) { - color = DarkIconDispatcher.getTint(mTintArea, v, mIconTint); + color = DarkIconDispatcher.getTint(mTintArea, v, tint); } v.setStaticDrawableColor(color); - v.setDecorColor(mIconTint); + v.setDecorColor(tint); } public void setDark(boolean dark) { mNotificationIcons.setDark(dark, false, 0); mShelfIcons.setDark(dark, false, 0); + mCenteredIcon.setDark(dark, false, 0); + } + + /** + * Shows the icon view given in the center. + */ + public void showIconCentered(NotificationEntry entry) { + StatusBarIconView icon = entry == null ? null : entry.centeredIcon; + if (!Objects.equals(mCenteredIconView, icon)) { + mCenteredIconView = icon; + updateNotificationIcons(); + } } public void showIconIsolated(StatusBarIconView icon, boolean animated) { @@ -415,6 +490,8 @@ public class NotificationIconAreaController implements DarkReceiver, if (mDarkAmount == 0 && !mStatusBarStateController.isDozing()) { mNotificationIcons.setTranslationX(0); mNotificationIcons.setTranslationY(0); + mCenteredIcon.setTranslationX(0); + mCenteredIcon.setTranslationY(0); return; } @@ -423,6 +500,8 @@ public class NotificationIconAreaController implements DarkReceiver, int translationY = getBurnInOffset(mBurnInOffset, false /* xAxis */) + yOffset; mNotificationIcons.setTranslationX(translationX); mNotificationIcons.setTranslationY(translationY); + mCenteredIcon.setTranslationX(translationX); + mCenteredIcon.setTranslationY(translationY); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 7a3d03fec02..ce1d6384b7c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -73,6 +73,8 @@ public class PhoneStatusBarView extends PanelBar { private DarkReceiver mBattery; private int mLastOrientation; @Nullable + private View mCenterIconSpace; + @Nullable private View mCutoutSpace; @Nullable private DisplayCutout mDisplayCutout; @@ -105,6 +107,7 @@ public class PhoneStatusBarView extends PanelBar { mBarTransitions.init(); mBattery = findViewById(R.id.battery); mCutoutSpace = findViewById(R.id.cutout_space_view); + mCenterIconSpace = findViewById(R.id.centered_icon_area); updateResources(); } @@ -312,10 +315,12 @@ public class PhoneStatusBarView extends PanelBar { if (mDisplayCutout == null || mDisplayCutout.isEmpty() || mLastOrientation != ORIENTATION_PORTRAIT || cornerCutoutMargins != null) { + mCenterIconSpace.setVisibility(View.VISIBLE); mCutoutSpace.setVisibility(View.GONE); return; } + mCenterIconSpace.setVisibility(View.GONE); mCutoutSpace.setVisibility(View.VISIBLE); LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mCutoutSpace.getLayoutParams(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java index 33af96f1f13..88ed80ae65c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java @@ -49,6 +49,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { private NotificationIconAreaController mMockNotificiationAreaController; private View mNotificationAreaInner; + private View mCenteredNotificationAreaView; private StatusBarStateController mStatusBarStateController; public CollapsedStatusBarFragmentTest() { @@ -66,10 +67,14 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES); mMockNotificiationAreaController = mock(NotificationIconAreaController.class); mNotificationAreaInner = mock(View.class); + mCenteredNotificationAreaView = mock(View.class); when(statusBar.getPanel()).thenReturn(mock(NotificationPanelView.class)); when(mNotificationAreaInner.animate()).thenReturn(mock(ViewPropertyAnimator.class)); when(mMockNotificiationAreaController.getNotificationInnerAreaView()).thenReturn( mNotificationAreaInner); + when(mCenteredNotificationAreaView.animate()).thenReturn(mock(ViewPropertyAnimator.class)); + when(mMockNotificiationAreaController.getCenteredNotificationAreaView()).thenReturn( + mCenteredNotificationAreaView); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java index 44df237d70c..0479b4a01dc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java @@ -74,7 +74,8 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { mStackScroller, mPanelView, new View(mContext), - mOperatorNameView); + mOperatorNameView, + new View(mContext)); mHeadsUpAppearanceController.setExpandedHeight(0.0f, 0.0f); } @@ -147,6 +148,7 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { mStackScroller, mPanelView, new View(mContext), + new View(mContext), new View(mContext)); newController.readFrom(mHeadsUpAppearanceController); -- GitLab From c3267f98be5f0250fd5f0d2e237ff526e79ea168 Mon Sep 17 00:00:00 2001 From: William Hester Date: Wed, 3 Apr 2019 16:01:58 -0700 Subject: [PATCH 028/473] Disable lock screen and enable location in THM In Test Harness Mode, the lock screen will be disabled so that tests can start immediately, and location will be enabled (for use with CTS). Bug: 80137798 Test: make, adb shell cmd testharness enable Change-Id: I08f4c06865013d2cbdf7e95cf12fdf469c30b9e7 (cherry picked from commit fd0230bffc37482f85e6ed80a421eca1e91a0978) --- .../testharness/TestHarnessModeService.java | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/testharness/TestHarnessModeService.java b/services/core/java/com/android/server/testharness/TestHarnessModeService.java index 4f118872eb0..0b0ff660cc0 100644 --- a/services/core/java/com/android/server/testharness/TestHarnessModeService.java +++ b/services/core/java/com/android/server/testharness/TestHarnessModeService.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.UserInfo; import android.debug.AdbManagerInternal; +import android.location.LocationManager; import android.os.BatteryManager; import android.os.Binder; import android.os.IBinder; @@ -39,6 +40,7 @@ import android.util.Slog; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.internal.notification.SystemNotificationChannels; +import com.android.internal.widget.LockPatternUtils; import com.android.server.LocalServices; import com.android.server.PersistentDataBlockManagerInternal; import com.android.server.SystemService; @@ -95,6 +97,12 @@ public class TestHarnessModeService extends SystemService { super.onBootPhase(phase); } + /** + * Begin the setup for Test Harness Mode. + * + *

Note: This is just the things that need to be done before the device finishes + * booting for the first time. Everything else should be done after the system is done booting. + */ private void setUpTestHarnessMode() { Slog.d(TAG, "Setting up test harness mode"); byte[] testHarnessModeData = getPersistentDataBlock().getTestHarnessModeData(); @@ -105,9 +113,16 @@ public class TestHarnessModeService extends SystemService { // If there is data, we should set the device as provisioned, so that we skip the setup // wizard. setDeviceProvisioned(); + disableLockScreen(); SystemProperties.set(TEST_HARNESS_MODE_PROPERTY, "1"); } + private void disableLockScreen() { + UserInfo userInfo = getPrimaryUser(); + LockPatternUtils utils = new LockPatternUtils(getContext()); + utils.setLockScreenDisabled(true, userInfo.id); + } + private void completeTestHarnessModeSetup() { Slog.d(TAG, "Completing Test Harness Mode setup."); byte[] testHarnessModeData = getPersistentDataBlock().getTestHarnessModeData(); @@ -117,8 +132,8 @@ public class TestHarnessModeService extends SystemService { } try { setUpAdbFiles(PersistentData.fromBytes(testHarnessModeData)); - disableAutoSync(); configureSettings(); + configureUser(); } catch (SetUpTestHarnessModeException e) { Slog.e(TAG, "Failed to set up Test Harness Mode. Bad data.", e); } finally { @@ -130,12 +145,6 @@ public class TestHarnessModeService extends SystemService { } } - private void disableAutoSync() { - UserInfo primaryUser = UserManager.get(getContext()).getPrimaryUser(); - ContentResolver - .setMasterSyncAutomaticallyAsUser(false, primaryUser.getUserHandle().getIdentifier()); - } - private void configureSettings() { ContentResolver cr = getContext().getContentResolver(); @@ -158,6 +167,20 @@ public class TestHarnessModeService extends SystemService { writeBytesToFile(persistentData.mAdbTempKeys, adbManager.getAdbTempKeysFile().toPath()); } + private void configureUser() { + UserInfo primaryUser = getPrimaryUser(); + + ContentResolver.setMasterSyncAutomaticallyAsUser(false, primaryUser.id); + + LocationManager locationManager = getContext().getSystemService(LocationManager.class); + locationManager.setLocationEnabledForUser(true, primaryUser.getUserHandle()); + } + + private UserInfo getPrimaryUser() { + UserManager userManager = UserManager.get(getContext()); + return userManager.getPrimaryUser(); + } + private void writeBytesToFile(byte[] keys, Path adbKeys) { try { OutputStream fileOutputStream = Files.newOutputStream(adbKeys); @@ -266,9 +289,8 @@ public class TestHarnessModeService extends SystemService { } private boolean isDeviceSecure() { - UserInfo primaryUser = UserManager.get(getContext()).getPrimaryUser(); KeyguardManager keyguardManager = getContext().getSystemService(KeyguardManager.class); - return keyguardManager.isDeviceSecure(primaryUser.id); + return keyguardManager.isDeviceSecure(getPrimaryUser().id); } private int handleEnable() { -- GitLab From 52f378834db985b308677e783933d92d5d0658ca Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Tue, 16 Apr 2019 13:30:38 -0700 Subject: [PATCH 029/473] Make LocaleList.isPseudoLocale a public API Test: CTS Bug: 130636934 Change-Id: I6a9abd8a7de358cb077d9648c62fe9c0ec482720 --- api/current.txt | 1 + api/system-current.txt | 4 ---- core/java/android/os/LocaleList.java | 3 --- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/api/current.txt b/api/current.txt index 8ec7594773a..700d41fb119 100644 --- a/api/current.txt +++ b/api/current.txt @@ -34594,6 +34594,7 @@ package android.os { method @Nullable public java.util.Locale getFirstMatch(String[]); method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale); method public boolean isEmpty(); + method public static boolean isPseudoLocale(@Nullable android.icu.util.ULocale); method public static void setDefault(@NonNull @Size(min=1) android.os.LocaleList); method @IntRange(from=0) public int size(); method @NonNull public String toLanguageTags(); diff --git a/api/system-current.txt b/api/system-current.txt index 209fca77a8b..217cc9d577e 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5370,10 +5370,6 @@ package android.os { field @NonNull public static final android.os.Parcelable.Creator CREATOR; } - public final class LocaleList implements android.os.Parcelable { - method public static boolean isPseudoLocale(@Nullable android.icu.util.ULocale); - } - public final class NativeHandle implements java.io.Closeable { ctor public NativeHandle(); ctor public NativeHandle(@NonNull java.io.FileDescriptor, boolean); diff --git a/core/java/android/os/LocaleList.java b/core/java/android/os/LocaleList.java index 351df1bf23e..011810b6de4 100644 --- a/core/java/android/os/LocaleList.java +++ b/core/java/android/os/LocaleList.java @@ -20,7 +20,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Size; -import android.annotation.SystemApi; import android.annotation.UnsupportedAppUsage; import android.content.LocaleProto; import android.icu.util.ULocale; @@ -328,9 +327,7 @@ public final class LocaleList implements Parcelable { /** * Returns true if locale is a pseudo-locale, false otherwise. - * {@hide} */ - @SystemApi public static boolean isPseudoLocale(@Nullable ULocale locale) { return isPseudoLocale(locale != null ? locale.toLocale() : null); } -- GitLab From c529d6d49fd138fb92b7e73ffd3af625defb64d9 Mon Sep 17 00:00:00 2001 From: Mady Mellor Date: Tue, 16 Apr 2019 14:22:52 -0700 Subject: [PATCH 030/473] API feedback: getSuppressNotification -> isNotificationSuppressed Test: it's a rename / there is a cts CL with renaming Bug: 130635782 Change-Id: If56d48feae54c928dca48df876bb8fcd41b3d699 --- api/current.txt | 3 ++- core/java/android/app/Notification.java | 16 +++++++++++++--- .../systemui/bubbles/BubbleController.java | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/api/current.txt b/api/current.txt index 8ec7594773a..9621acfdd57 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5485,7 +5485,8 @@ package android.app { method @NonNull public android.graphics.drawable.Icon getIcon(); method @NonNull public android.app.PendingIntent getIntent(); method @Deprecated public boolean getSuppressInitialNotification(); - method public boolean getSuppressNotification(); + method @Deprecated public boolean getSuppressNotification(); + method public boolean isNotificationSuppressed(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 52483297186..0c6c77f8e36 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -8645,19 +8645,29 @@ public class Notification implements Parcelable * @return whether this bubble should suppress the initial notification when it is posted. * * @see BubbleMetadata.Builder#setSuppressInitialNotification(boolean) - * @deprecated TO BE REMOVED, use {@link #getSuppressNotification()} instead. + * @deprecated TO BE REMOVED, use {@link #isNotificationSuppressed()} instead. */ @Deprecated public boolean getSuppressInitialNotification() { - return (mFlags & FLAG_SUPPRESS_NOTIFICATION) != 0; + return isNotificationSuppressed(); } /** * @return whether this bubble should suppress the notification when it is posted. * - * @see BubbleMetadata.Builder#setSuppressInitialNotification(boolean) + * @see BubbleMetadata.Builder#setSuppressNotification(boolean) + * @deprecated TO BE REMOVED, use {@link #isNotificationSuppressed()} instead. */ public boolean getSuppressNotification() { + return isNotificationSuppressed(); + } + + /** + * @return whether this bubble should suppress the notification when it is posted. + * + * @see BubbleMetadata.Builder#setSuppressNotification(boolean) + */ + public boolean isNotificationSuppressed() { return (mFlags & FLAG_SUPPRESS_NOTIFICATION) != 0; } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index acdcfb2ea68..5b31b5cffb2 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -583,7 +583,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi private void updateShowInShadeForSuppressNotification(NotificationEntry entry) { boolean suppressNotification = entry.getBubbleMetadata() != null - && entry.getBubbleMetadata().getSuppressNotification() + && entry.getBubbleMetadata().isNotificationSuppressed() && isForegroundApp(mContext, entry.notification.getPackageName()); entry.setShowInShadeWhenBubble(!suppressNotification); } -- GitLab From c48f223018ccdb1ed63bff1c410cbf41a6fcb322 Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Tue, 26 Mar 2019 21:56:28 +0800 Subject: [PATCH 031/473] Update Multi-OffHost related API definition Test: build pass Bug: 128831640 Change-Id: Ia0a8ec38b0c4e60df18f727b0f5a7fdba84fe9e1 --- api/current.txt | 5 ++-- core/java/android/nfc/NfcAdapter.java | 1 + .../nfc/cardemulation/ApduServiceInfo.java | 16 +++++++++---- .../nfc/cardemulation/CardEmulation.java | 23 +++++++++++++++++-- core/res/res/values/attrs.xml | 2 +- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/api/current.txt b/api/current.txt index 8ec7594773a..45755bf6ad7 100644 --- a/api/current.txt +++ b/api/current.txt @@ -30622,7 +30622,6 @@ package android.nfc { method @Deprecated public void enableForegroundNdefPush(android.app.Activity, android.nfc.NdefMessage); method public void enableReaderMode(android.app.Activity, android.nfc.NfcAdapter.ReaderCallback, int, android.os.Bundle); method public static android.nfc.NfcAdapter getDefaultAdapter(android.content.Context); - method @NonNull public java.util.List getSupportedOffHostSecureElements(); method public boolean ignore(android.nfc.Tag, int, android.nfc.NfcAdapter.OnTagRemovedListener, android.os.Handler); method @Deprecated public boolean invokeBeam(android.app.Activity); method public boolean isEnabled(); @@ -30716,10 +30715,10 @@ package android.nfc.cardemulation { method public boolean isDefaultServiceForCategory(android.content.ComponentName, String); method public boolean registerAidsForService(android.content.ComponentName, String, java.util.List); method public boolean removeAidsForService(android.content.ComponentName, String); - method public boolean setOffHostForService(@NonNull android.content.ComponentName, @NonNull String); + method @RequiresPermission(android.Manifest.permission.NFC) @NonNull public boolean setOffHostForService(@NonNull android.content.ComponentName, @NonNull String); method public boolean setPreferredService(android.app.Activity, android.content.ComponentName); method public boolean supportsAidPrefixRegistration(); - method public boolean unsetOffHostForService(@NonNull android.content.ComponentName); + method @RequiresPermission(android.Manifest.permission.NFC) @NonNull public boolean unsetOffHostForService(@NonNull android.content.ComponentName); method public boolean unsetPreferredService(android.app.Activity); field public static final String ACTION_CHANGE_DEFAULT = "android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT"; field public static final String CATEGORY_OTHER = "other"; diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index 1be6c4bce36..bc698f97738 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -526,6 +526,7 @@ public final class NfcAdapter { * @return List containing secure elements on the device which supports * off host card emulation. eSE for Embedded secure element, * SIM for UICC and so on. + * @hide */ public @NonNull List getSupportedOffHostSecureElements() { List offHostSE = new ArrayList(); diff --git a/core/java/android/nfc/cardemulation/ApduServiceInfo.java b/core/java/android/nfc/cardemulation/ApduServiceInfo.java index 6f9858ced34..4675600fe1d 100644 --- a/core/java/android/nfc/cardemulation/ApduServiceInfo.java +++ b/core/java/android/nfc/cardemulation/ApduServiceInfo.java @@ -432,7 +432,15 @@ public final class ApduServiceInfo implements Parcelable { mDynamicAidGroups.put(aidGroup.getCategory(), aidGroup); } - @UnsupportedAppUsage + /** + * Sets the off host Secure Element. + * @param offHost Secure Element to set. Only accept strings with prefix SIM or prefix eSE. + * Ref: GSMA TS.26 - NFC Handset Requirements + * TS26_NFC_REQ_069: For UICC, Secure Element Name SHALL be SIM[smartcard slot] + * (e.g. SIM/SIM1, SIM2… SIMn). + * TS26_NFC_REQ_070: For embedded SE, Secure Element Name SHALL be eSE[number] + * (e.g. eSE/eSE1, eSE2, etc.). + */ public void setOffHostSecureElement(String offHost) { mOffHostName = offHost; } @@ -441,7 +449,6 @@ public final class ApduServiceInfo implements Parcelable { * Resets the off host Secure Element to statically defined * by the service in the manifest file. */ - @UnsupportedAppUsage public void unsetOffHostSecureElement() { mOffHostName = mStaticOffHostName; } @@ -581,10 +588,9 @@ public final class ApduServiceInfo implements Parcelable { pw.println(" On Host Service"); } else { pw.println(" Off-host Service"); - pw.println(" " + "Current off-host SE" + mOffHostName - + " static off-host: " + mOffHostName); + pw.println(" " + "Current off-host SE:" + mOffHostName + + " static off-host SE:" + mStaticOffHostName); } - pw.println(" Static off-host Secure Element:"); pw.println(" Static AID groups:"); for (AidGroup group : mStaticAidGroups.values()) { pw.println(" Category: " + group.category); diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java index c13f64e833c..aa93611062f 100644 --- a/core/java/android/nfc/cardemulation/CardEmulation.java +++ b/core/java/android/nfc/cardemulation/CardEmulation.java @@ -17,6 +17,7 @@ package android.nfc.cardemulation; import android.annotation.NonNull; +import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.app.Activity; @@ -362,6 +363,8 @@ public final class CardEmulation { * @param service The component name of the service * @return whether the registration was successful. */ + @RequiresPermission(android.Manifest.permission.NFC) + @NonNull public boolean unsetOffHostForService(@NonNull ComponentName service) { NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext); if (adapter == null) { @@ -393,7 +396,9 @@ public final class CardEmulation { * through the manifest, or dynamically by using this API), * it will be replaced with this one. All AIDs registered by * this service will be re-routed to this Secure Element if - * successful. + * successful. AIDs that was statically assigned using manifest + * will re-route to off-host SE that stated in manifest after NFC + * toggle. * *

Note that you can only set off-host SE for a service that * is running under the same UID as the caller of this API. Typically @@ -405,9 +410,19 @@ public final class CardEmulation { * exists on the device. * * @param service The component name of the service - * @param offHostSecureElement Secure Element to register the AID to + * @param offHostSecureElement Secure Element to register the AID to. Only accept strings with + * prefix SIM or prefix eSE. + * Ref: GSMA TS.26 - NFC Handset Requirements + * TS26_NFC_REQ_069: For UICC, Secure Element Name SHALL be + * SIM[smartcard slot] + * (e.g. SIM/SIM1, SIM2… SIMn). + * TS26_NFC_REQ_070: For embedded SE, Secure Element Name SHALL be + * eSE[number] + * (e.g. eSE/eSE1, eSE2, etc.). * @return whether the registration was successful. */ + @RequiresPermission(android.Manifest.permission.NFC) + @NonNull public boolean setOffHostForService(@NonNull ComponentName service, @NonNull String offHostSecureElement) { boolean validSecureElement = false; @@ -423,6 +438,10 @@ public final class CardEmulation { return false; } + if (!offHostSecureElement.startsWith("eSE") && !offHostSecureElement.startsWith("SIM")) { + return false; + } + if (offHostSecureElement.equals("eSE")) { offHostSecureElement = "eSE1"; } else if (offHostSecureElement.equals("SIM")) { diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index ab9a298f306..fa207f14a4f 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3778,7 +3778,7 @@ the settings for this service. --> - + + + false + false diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 94b5da6baa0..da2f89083fe 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1910,6 +1910,7 @@ + diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 7f1b25ca3ca..b6e09632717 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -455,6 +455,7 @@ public class NotificationManagerService extends SystemService { private int mAutoGroupAtCount; private boolean mIsTelevision; private boolean mIsAutomotive; + private boolean mNotificationEffectsEnabledForAutomotive; private MetricsLogger mMetricsLogger; private TriPredicate mAllowedManagedServicePackages; @@ -1525,6 +1526,11 @@ public class NotificationManagerService extends SystemService { mIsAutomotive = isAutomotive; } + @VisibleForTesting + void setNotificationEffectsEnabledForAutomotive(boolean isEnabled) { + mNotificationEffectsEnabledForAutomotive = isEnabled; + } + @VisibleForTesting void setIsTelevision(boolean isTelevision) { mIsTelevision = isTelevision; @@ -1686,6 +1692,8 @@ public class NotificationManagerService extends SystemService { mIsAutomotive = mPackageManagerClient.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0); + mNotificationEffectsEnabledForAutomotive = + resources.getBoolean(R.bool.config_enableServerNotificationEffectsForAutomotive); mPreferencesHelper.lockChannelsForOEM(getContext().getResources().getStringArray( com.android.internal.R.array.config_nonBlockableNotificationPackages)); @@ -5560,6 +5568,9 @@ public class NotificationManagerService extends SystemService { @VisibleForTesting @GuardedBy("mNotificationLock") void buzzBeepBlinkLocked(NotificationRecord record) { + if (mIsAutomotive && !mNotificationEffectsEnabledForAutomotive) { + return; + } boolean buzz = false; boolean beep = false; boolean blink = false; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java index 6be2c2e8c59..6061d51f3d7 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java @@ -455,8 +455,23 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { } @Test - public void testNoBeepForImportanceDefaultInAutomotive() throws Exception { + public void testNoBeepForAutomotiveIfEffectsDisabled() throws Exception { mService.setIsAutomotive(true); + mService.setNotificationEffectsEnabledForAutomotive(false); + + NotificationRecord r = getBeepyNotification(); + r.setSystemImportance(NotificationManager.IMPORTANCE_HIGH); + + mService.buzzBeepBlinkLocked(r); + + verifyNeverBeep(); + assertFalse(r.isInterruptive()); + } + + @Test + public void testNoBeepForImportanceDefaultInAutomotiveIfEffectsEnabled() throws Exception { + mService.setIsAutomotive(true); + mService.setNotificationEffectsEnabledForAutomotive(true); NotificationRecord r = getBeepyNotification(); r.setSystemImportance(NotificationManager.IMPORTANCE_DEFAULT); @@ -468,10 +483,12 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { } @Test - public void testBeepForImportanceHighInAutomotive() throws Exception { + public void testBeepForImportanceHighInAutomotiveIfEffectsEnabled() throws Exception { mService.setIsAutomotive(true); + mService.setNotificationEffectsEnabledForAutomotive(true); NotificationRecord r = getBeepyNotification(); + r.setSystemImportance(NotificationManager.IMPORTANCE_HIGH); mService.buzzBeepBlinkLocked(r); -- GitLab From 37538594e68dea9a1965ffb8307b259d8cf3717b Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Tue, 16 Apr 2019 08:20:18 -0700 Subject: [PATCH 035/473] Return copies for get methods NetworkRegistrationInfo and ServiceState are not immutable class. Their get methods should return a new copy of object so the caller won't modify its state. Bug: 130538118 Test: Unit tests + manual Change-Id: I51662a92b0b6189a8c8aa017085affedac417190 --- .../DataSpecificRegistrationInfo.java | 15 ++++ .../telephony/NetworkRegistrationInfo.java | 33 +++++++++ .../java/android/telephony/ServiceState.java | 70 ++++++++++--------- .../VoiceSpecificRegistrationInfo.java | 13 ++++ 4 files changed, 98 insertions(+), 33 deletions(-) diff --git a/telephony/java/android/telephony/DataSpecificRegistrationInfo.java b/telephony/java/android/telephony/DataSpecificRegistrationInfo.java index 2cb369d2802..3dd931898c1 100644 --- a/telephony/java/android/telephony/DataSpecificRegistrationInfo.java +++ b/telephony/java/android/telephony/DataSpecificRegistrationInfo.java @@ -95,6 +95,21 @@ public final class DataSpecificRegistrationInfo implements Parcelable { this.mIsUsingCarrierAggregation = isUsingCarrierAggregation; } + /** + * Constructor from another data specific registration info + * + * @param dsri another data specific registration info + * @hide + */ + DataSpecificRegistrationInfo(DataSpecificRegistrationInfo dsri) { + maxDataCalls = dsri.maxDataCalls; + isDcNrRestricted = dsri.isDcNrRestricted; + isNrAvailable = dsri.isNrAvailable; + isEnDcAvailable = dsri.isEnDcAvailable; + mLteVopsSupportInfo = dsri.mLteVopsSupportInfo; + mIsUsingCarrierAggregation = dsri.mIsUsingCarrierAggregation; + } + private DataSpecificRegistrationInfo(Parcel source) { maxDataCalls = source.readInt(); isDcNrRestricted = source.readBoolean(); diff --git a/telephony/java/android/telephony/NetworkRegistrationInfo.java b/telephony/java/android/telephony/NetworkRegistrationInfo.java index 7b9f6d5eb8a..2fae949cacb 100644 --- a/telephony/java/android/telephony/NetworkRegistrationInfo.java +++ b/telephony/java/android/telephony/NetworkRegistrationInfo.java @@ -279,6 +279,39 @@ public final class NetworkRegistrationInfo implements Parcelable { mNrState = source.readInt(); } + /** + * Constructor from another network registration info + * + * @param nri Another network registration info + * @hide + */ + public NetworkRegistrationInfo(NetworkRegistrationInfo nri) { + mDomain = nri.mDomain; + mTransportType = nri.mTransportType; + mRegistrationState = nri.mRegistrationState; + mRoamingType = nri.mRoamingType; + mAccessNetworkTechnology = nri.mAccessNetworkTechnology; + mRejectCause = nri.mRejectCause; + mEmergencyOnly = nri.mEmergencyOnly; + mAvailableServices = new ArrayList<>(nri.mAvailableServices); + if (nri.mCellIdentity != null) { + Parcel p = Parcel.obtain(); + nri.mCellIdentity.writeToParcel(p, 0); + p.setDataPosition(0); + // TODO: Instead of doing this, we should create a formal way for cloning cell identity. + // Cell identity is not an immutable object so we have to deep copy it. + mCellIdentity = CellIdentity.CREATOR.createFromParcel(p); + } + + if (nri.mVoiceSpecificInfo != null) { + mVoiceSpecificInfo = new VoiceSpecificRegistrationInfo(nri.mVoiceSpecificInfo); + } + if (nri.mDataSpecificInfo != null) { + mDataSpecificInfo = new DataSpecificRegistrationInfo(nri.mDataSpecificInfo); + } + mNrState = nri.mNrState; + } + /** * @return The transport type. */ diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 1a160f4f57a..1551ce35d2c 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -421,7 +421,7 @@ public class ServiceState implements Parcelable { Arrays.copyOf(s.mCellBandwidths, s.mCellBandwidths.length); mLteEarfcnRsrpBoost = s.mLteEarfcnRsrpBoost; mNetworkRegistrationInfos = s.mNetworkRegistrationInfos == null ? null : - new ArrayList<>(s.mNetworkRegistrationInfos); + s.getNetworkRegistrationInfoList(); mNrFrequencyRange = s.mNrFrequencyRange; mOperatorAlphaLongRaw = s.mOperatorAlphaLongRaw; mOperatorAlphaShortRaw = s.mOperatorAlphaShortRaw; @@ -1130,16 +1130,16 @@ public class ServiceState implements Parcelable { /** @hide */ @TestApi public void setVoiceRoamingType(@RoamingType int type) { - NetworkRegistrationInfo regState = getNetworkRegistrationInfo( + NetworkRegistrationInfo regInfo = getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); - if (regState == null) { - regState = new NetworkRegistrationInfo.Builder() + if (regInfo == null) { + regInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_CS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .build(); - addNetworkRegistrationInfo(regState); } - regState.setRoamingType(type); + regInfo.setRoamingType(type); + addNetworkRegistrationInfo(regInfo); } /** @hide */ @@ -1151,16 +1151,16 @@ public class ServiceState implements Parcelable { /** @hide */ @TestApi public void setDataRoamingType(@RoamingType int type) { - NetworkRegistrationInfo regState = getNetworkRegistrationInfo( + NetworkRegistrationInfo regInfo = getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); - if (regState == null) { - regState = new NetworkRegistrationInfo.Builder() + if (regInfo == null) { + regInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .build(); - addNetworkRegistrationInfo(regState); } - regState.setRoamingType(type); + regInfo.setRoamingType(type); + addNetworkRegistrationInfo(regInfo); } /** @@ -1324,16 +1324,16 @@ public class ServiceState implements Parcelable { Rlog.e(LOG_TAG, "ServiceState.setRilVoiceRadioTechnology() called. It's encouraged to " + "use addNetworkRegistrationInfo() instead *******"); // Sync to network registration state - NetworkRegistrationInfo regState = getNetworkRegistrationInfo( + NetworkRegistrationInfo regInfo = getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); - if (regState == null) { - regState = new NetworkRegistrationInfo.Builder() + if (regInfo == null) { + regInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_CS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .build(); - addNetworkRegistrationInfo(regState); } - regState.setAccessNetworkTechnology(rilRadioTechnologyToNetworkType(rt)); + regInfo.setAccessNetworkTechnology(rilRadioTechnologyToNetworkType(rt)); + addNetworkRegistrationInfo(regInfo); } @@ -1345,17 +1345,17 @@ public class ServiceState implements Parcelable { // Sync to network registration state. Always write down the WWAN transport. For AP-assisted // mode device, use addNetworkRegistrationInfo() to set the correct transport if RAT // is IWLAN. - NetworkRegistrationInfo regState = getNetworkRegistrationInfo( + NetworkRegistrationInfo regInfo = getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); - if (regState == null) { - regState = new NetworkRegistrationInfo.Builder() + if (regInfo == null) { + regInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .build(); - addNetworkRegistrationInfo(regState); } - regState.setAccessNetworkTechnology(rilRadioTechnologyToNetworkType(rt)); + regInfo.setAccessNetworkTechnology(rilRadioTechnologyToNetworkType(rt)); + addNetworkRegistrationInfo(regInfo); } /** @hide */ @@ -1397,10 +1397,10 @@ public class ServiceState implements Parcelable { * @hide */ public @NRState int getNrState() { - final NetworkRegistrationInfo regState = getNetworkRegistrationInfo( + final NetworkRegistrationInfo regInfo = getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); - if (regState == null) return NetworkRegistrationInfo.NR_STATE_NONE; - return regState.getNrState(); + if (regInfo == null) return NetworkRegistrationInfo.NR_STATE_NONE; + return regInfo.getNrState(); } /** @@ -1794,7 +1794,11 @@ public class ServiceState implements Parcelable { @SystemApi public List getNetworkRegistrationInfoList() { synchronized (mNetworkRegistrationInfos) { - return new ArrayList<>(mNetworkRegistrationInfos); + List newList = new ArrayList<>(); + for (NetworkRegistrationInfo nri : mNetworkRegistrationInfos) { + newList.add(new NetworkRegistrationInfo(nri)); + } + return newList; } } @@ -1814,7 +1818,7 @@ public class ServiceState implements Parcelable { synchronized (mNetworkRegistrationInfos) { for (NetworkRegistrationInfo networkRegistrationInfo : mNetworkRegistrationInfos) { if (networkRegistrationInfo.getTransportType() == transportType) { - list.add(networkRegistrationInfo); + list.add(new NetworkRegistrationInfo(networkRegistrationInfo)); } } } @@ -1838,7 +1842,7 @@ public class ServiceState implements Parcelable { synchronized (mNetworkRegistrationInfos) { for (NetworkRegistrationInfo networkRegistrationInfo : mNetworkRegistrationInfos) { if (networkRegistrationInfo.getDomain() == domain) { - list.add(networkRegistrationInfo); + list.add(new NetworkRegistrationInfo(networkRegistrationInfo)); } } } @@ -1863,7 +1867,7 @@ public class ServiceState implements Parcelable { for (NetworkRegistrationInfo networkRegistrationInfo : mNetworkRegistrationInfos) { if (networkRegistrationInfo.getTransportType() == transportType && networkRegistrationInfo.getDomain() == domain) { - return networkRegistrationInfo; + return new NetworkRegistrationInfo(networkRegistrationInfo); } } } @@ -1875,20 +1879,20 @@ public class ServiceState implements Parcelable { * @hide */ @TestApi - public void addNetworkRegistrationInfo(NetworkRegistrationInfo regState) { - if (regState == null) return; + public void addNetworkRegistrationInfo(NetworkRegistrationInfo nri) { + if (nri == null) return; synchronized (mNetworkRegistrationInfos) { for (int i = 0; i < mNetworkRegistrationInfos.size(); i++) { NetworkRegistrationInfo curRegState = mNetworkRegistrationInfos.get(i); - if (curRegState.getTransportType() == regState.getTransportType() - && curRegState.getDomain() == regState.getDomain()) { + if (curRegState.getTransportType() == nri.getTransportType() + && curRegState.getDomain() == nri.getDomain()) { mNetworkRegistrationInfos.remove(i); break; } } - mNetworkRegistrationInfos.add(regState); + mNetworkRegistrationInfos.add(new NetworkRegistrationInfo(nri)); } } diff --git a/telephony/java/android/telephony/VoiceSpecificRegistrationInfo.java b/telephony/java/android/telephony/VoiceSpecificRegistrationInfo.java index 18a533a4627..d43181e68c2 100644 --- a/telephony/java/android/telephony/VoiceSpecificRegistrationInfo.java +++ b/telephony/java/android/telephony/VoiceSpecificRegistrationInfo.java @@ -65,6 +65,19 @@ public class VoiceSpecificRegistrationInfo implements Parcelable{ this.defaultRoamingIndicator = defaultRoamingIndicator; } + /** + * Constructor from another voice specific registration info + * + * @param vsri another voice specific registration info + * @hide + */ + VoiceSpecificRegistrationInfo(VoiceSpecificRegistrationInfo vsri) { + cssSupported = vsri.cssSupported; + roamingIndicator = vsri.roamingIndicator; + systemIsInPrl = vsri.systemIsInPrl; + defaultRoamingIndicator = vsri.defaultRoamingIndicator; + } + private VoiceSpecificRegistrationInfo(Parcel source) { this.cssSupported = source.readBoolean(); this.roamingIndicator = source.readInt(); -- GitLab From 63683a8fe2b9900ad9cbd6cb37ad05bbd135741d Mon Sep 17 00:00:00 2001 From: Isaac Chiou Date: Fri, 12 Apr 2019 12:01:06 +0800 Subject: [PATCH 036/473] Define config for wifi fatal firmware alert error code list Bug: 114766171 Test: Manual test Test: atest FrameworksWifiTests (Passed: 3690) Change-Id: I52fed90713cd5996bba7a0b87fa4e491ae2c48d5 --- core/res/res/values/config.xml | 9 +++++++++ core/res/res/values/symbols.xml | 1 + 2 files changed, 10 insertions(+) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 58afe33b2d3..d110ff43b89 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -572,6 +572,15 @@ 1024 + + + + + false diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index e9ce6ac9397..09ae296138f 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -381,6 +381,7 @@ + -- GitLab From 62abb5a4ebc2a6f351f4a6ddcd76150ec4cbe4a1 Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Tue, 16 Apr 2019 13:30:20 +0800 Subject: [PATCH 037/473] Add more documentation for isEmergencyAssistanceEnabled(). Bug: 130351486 Test: build Change-Id: I9dfc0939e12b6e7349c2a1222ff5e7999003a39f --- telephony/java/android/telephony/TelephonyManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 0d3bc1db831..42ab7ab07e8 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -10342,11 +10342,12 @@ public class TelephonyManager { } /** - * Determine whether the emergency assistance feature is available on the device. + * Returns whether {@link TelephonyManager#ACTION_EMERGENCY_ASSISTANCE emergency assistance} is + * available on the device. *

* Requires permission: {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE} * - * @return whether the emergency assistance feature is available on the device + * @return {@code true} if emergency assistance is available, {@code false} otherwise * * @hide */ -- GitLab From cf58b33a7acccd6fa08d4229b85b17eceb850c5b Mon Sep 17 00:00:00 2001 From: Arthur Hung Date: Wed, 17 Apr 2019 16:07:10 +0800 Subject: [PATCH 038/473] Fix PIP window is showing on the lockscreen (1/2) The acivity in pip mode should not be shown in keyguard even it contains dismiss keyguard window or set shown when locked. Bug: 130296591 Test: atest KeyguardLockedTests Change-Id: I72b7d1cb1fc4e4d7d0626e91692ee96d2b6261ec --- .../core/java/com/android/server/wm/KeyguardController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index 363db5439f2..df36b09d56e 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -264,7 +264,8 @@ class KeyguardController { // Keyguard. return dismissKeyguard && canDismissKeyguard() && !mAodShowing && (mDismissalRequested - || getDisplay(r.getDisplayId()).mDismissingKeyguardActivity != r); + || (r.canShowWhenLocked() + && getDisplay(r.getDisplayId()).mDismissingKeyguardActivity != r)); } /** -- GitLab From 664c45bad5d91d25ceb54d6d01ca7a37a55b2269 Mon Sep 17 00:00:00 2001 From: Hyundo Moon Date: Wed, 17 Apr 2019 18:21:33 +0900 Subject: [PATCH 039/473] MediaSession2Service: Log ControllerInfo in connection process Since printing a binder in a log doesn't help debugging, this CL makes the code print ControllerInfo instead of the binder. Bug: 130706459 Test: N/A Change-Id: I225f2854d15f5b9e7e6a9dca113f9050bbc8dd43 --- .../apex/java/android/media/MediaSession2Service.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/media/apex/java/android/media/MediaSession2Service.java b/media/apex/java/android/media/MediaSession2Service.java index 28ead99357b..3f392d28fa1 100644 --- a/media/apex/java/android/media/MediaSession2Service.java +++ b/media/apex/java/android/media/MediaSession2Service.java @@ -370,10 +370,6 @@ public abstract class MediaSession2Service extends Service { } return; } - if (DEBUG) { - Log.d(TAG, "Handling incoming connection request from the" - + " controller, controller=" + caller + ", uid=" + uid); - } String callingPkg = connectionRequest.getString(KEY_PACKAGE_NAME); // The Binder.getCallingPid() can be 0 for an oneway call from the @@ -389,13 +385,18 @@ public abstract class MediaSession2Service extends Service { caller, connectionRequest.getBundle(KEY_CONNECTION_HINTS)); + if (DEBUG) { + Log.d(TAG, "Handling incoming connection request from the" + + " controller=" + controllerInfo); + } + final MediaSession2 session; session = service.onGetSession(controllerInfo); if (session == null) { if (DEBUG) { Log.d(TAG, "Rejecting incoming connection request from the" - + " controller, controller=" + caller + ", uid=" + uid); + + " controller=" + controllerInfo); } // Note: Trusted controllers also can be rejected according to the // service implementation. -- GitLab From 27716724ce37b95e6fb741feeaeb526a6f5c55e7 Mon Sep 17 00:00:00 2001 From: shawnlin Date: Wed, 17 Apr 2019 20:09:45 +0800 Subject: [PATCH 040/473] Fixed notification background shifted in landscape Using getLocationInWindow() will cause an extra distance(from 0 to the left of the NotificationStackScrollLayout) to the left bound of the background. Remove getLocationInWindow() to fix it. Fixes: 130502182 Test: manual - swipe an notification in landscape Change-Id: I8f12a71a6820df1a1e26d954d5af95eededfb685 --- .../notification/stack/NotificationStackScrollLayout.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 562e535eb42..13ff81f7c1b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -2479,9 +2479,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd */ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private void updateBackgroundBounds() { - getLocationInWindow(mTempInt2); - int left = mTempInt2[0] + mSidePaddings; - int right = mTempInt2[0] + getWidth() - mSidePaddings; + int left = mSidePaddings; + int right = getWidth() - mSidePaddings; for (NotificationSection section : mSections) { section.getBounds().left = left; section.getBounds().right = right; -- GitLab From 27aa92b68a1a46ce40777f0e0f9e303bd558eb57 Mon Sep 17 00:00:00 2001 From: Govinda Wasserman Date: Tue, 16 Apr 2019 14:45:54 -0400 Subject: [PATCH 041/473] Adds timestamp to Assistant invocation bundles. Also adds constants for invocations to add their invocation type to the bundle. Test: Verified that timestamp is added to bundle. BUG:128982146 Change-Id: Ib0b5e8ac29eada67d2cd8f04af503881cb085744 --- .../src/com/android/systemui/assist/AssistManager.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index 97a277b5236..94bb1f3e329 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -20,6 +20,7 @@ import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; +import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; import android.service.voice.VoiceInteractionSession; @@ -54,6 +55,14 @@ public class AssistManager implements ConfigurationChangedReceiver { private static final String ASSIST_ICON_METADATA_NAME = "com.android.systemui.action_assist_icon"; + private static final String INVOCATION_TIME_MS_KEY = "invocation_time_ms"; + public static final String INVOCATION_TYPE_KEY = "invocation_type"; + + public static final int INVOCATION_TYPE_GESTURE = 1; + public static final int INVOCATION_TYPE_ACTIVE_EDGE = 2; + public static final int INVOCATION_TYPE_VOICE = 3; + public static final int INVOCATION_TYPE_QUICK_SEARCH_BAR = 4; + public static final int INVOCATION_HOME_BUTTON_LONG_PRESS = 5; private static final long TIMEOUT_SERVICE = 2500; private static final long TIMEOUT_ACTIVITY = 1000; @@ -171,6 +180,7 @@ public class AssistManager implements ConfigurationChangedReceiver { ? TIMEOUT_SERVICE : TIMEOUT_ACTIVITY); } + args.putLong(INVOCATION_TIME_MS_KEY, SystemClock.uptimeMillis()); startAssistInternal(args, assistComponent, isService); } -- GitLab From 699568050da6694c0610de67bf3713cf330df922 Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Tue, 16 Apr 2019 16:55:21 -0400 Subject: [PATCH 042/473] Add smart space to custom clock faces. This changes adds a hook to the ClockPlugin to allow the custom clock to control the position of the smart space. Still todo: - move out of the way for the lock icon - don't slide smart space down on lock screen when no notifs are showing Bug: 129348218 Test: Manually checked custom clock faces. Change-Id: I2472f6b2bb54f94e2e673f01c78170c0e7f87627 --- .../android/systemui/plugins/ClockPlugin.java | 10 +++++- .../res-keyguard/layout/analog_clock.xml | 16 --------- .../res-keyguard/layout/bubble_clock.xml | 16 --------- .../android/keyguard/KeyguardClockSwitch.java | 14 ++++++++ .../android/keyguard/KeyguardStatusView.java | 10 ++++++ .../keyguard/clock/AnalogClockController.java | 33 +++++++------------ .../keyguard/clock/BubbleClockController.java | 33 +++++++------------ .../android/keyguard/clock/ClockLayout.java | 12 +------ .../clock/DefaultClockController.java | 5 +++ .../stack/NotificationStackScrollLayout.java | 4 +-- .../phone/CollapsedStatusBarFragment.java | 1 - .../phone/KeyguardClockPositionAlgorithm.java | 17 +++++++--- .../phone/NotificationPanelView.java | 8 +++-- .../clock/AnalogClockControllerTest.java | 12 +++---- .../clock/BubbleClockControllerTest.java | 8 ++--- .../KeyguardClockPositionAlgorithmTest.java | 5 +-- .../phone/NotificationPanelViewTest.java | 8 ++--- 17 files changed, 100 insertions(+), 112 deletions(-) diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java index 58d50ead72c..6c6c9270bc8 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java @@ -28,7 +28,7 @@ import java.util.TimeZone; public interface ClockPlugin extends Plugin { String ACTION = "com.android.systemui.action.PLUGIN_CLOCK"; - int VERSION = 4; + int VERSION = 5; /** * Get the name of the clock face. @@ -71,6 +71,14 @@ public interface ClockPlugin extends Plugin { return null; } + /** + * Returns the preferred Y position of the clock. + * + * @param totalHeight Height of the parent container. + * @return preferred Y position. + */ + int getPreferredY(int totalHeight); + /** * Allows the plugin to clean up resources when no longer needed. * diff --git a/packages/SystemUI/res-keyguard/layout/analog_clock.xml b/packages/SystemUI/res-keyguard/layout/analog_clock.xml index cf6d35ee27a..ee0df48f4f5 100644 --- a/packages/SystemUI/res-keyguard/layout/analog_clock.xml +++ b/packages/SystemUI/res-keyguard/layout/analog_clock.xml @@ -19,22 +19,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" > - - Date: Wed, 17 Apr 2019 16:01:10 +0100 Subject: [PATCH 043/473] Make sure Notification#deleteIntent cannot be used to start activities from background Remove whitelisting privilege from deleteIntent before it's sent in cancelNotificationLocked(). Bug: 130619912 Test: manual (with a custom built app that provides PendingIntent.getActivity() to Notification.Builder.setDeleteIntent()) Change-Id: I8a85b4c32717f958c4ee2fe040b73bceb96d7feb --- core/java/android/app/ActivityManagerInternal.java | 7 +++++++ .../android/server/am/ActivityManagerService.java | 13 +++++++++++++ .../com/android/server/am/PendingIntentRecord.java | 7 +++++++ .../notification/NotificationManagerService.java | 9 +++++++-- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index e8d32932503..500a04fc7be 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -79,6 +79,13 @@ public abstract class ActivityManagerInternal { public abstract void setPendingIntentAllowBgActivityStarts( IIntentSender target, IBinder whitelistToken, int flags); + /** + * Voids {@link PendingIntent}'s privilege to be whitelisted to start activities from + * background. + */ + public abstract void clearPendingIntentAllowBgActivityStarts(IIntentSender target, + IBinder whitelistToken); + /** * Allow DeviceIdleController to tell us about what apps are whitelisted. */ diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 3b6b404170c..d759a495fa8 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -17577,6 +17577,19 @@ public class ActivityManagerService extends IActivityManager.Stub } } + @Override + public void clearPendingIntentAllowBgActivityStarts(IIntentSender target, + IBinder whitelistToken) { + if (!(target instanceof PendingIntentRecord)) { + Slog.w(TAG, "clearPendingIntentAllowBgActivityStarts():" + + " not a PendingIntentRecord: " + target); + return; + } + synchronized (ActivityManagerService.this) { + ((PendingIntentRecord) target).clearAllowBgActivityStarts(whitelistToken); + } + } + @Override public void setDeviceIdleWhitelist(int[] allAppids, int[] exceptIdleAppids) { synchronized (ActivityManagerService.this) { diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java index 588e05d7a06..acddb4772f8 100644 --- a/services/core/java/com/android/server/am/PendingIntentRecord.java +++ b/services/core/java/com/android/server/am/PendingIntentRecord.java @@ -236,6 +236,13 @@ public final class PendingIntentRecord extends IIntentSender.Stub { } } + void clearAllowBgActivityStarts(IBinder token) { + if (token == null) return; + mAllowBgActivityStartsForActivitySender.remove(token); + mAllowBgActivityStartsForBroadcastSender.remove(token); + mAllowBgActivityStartsForServiceSender.remove(token); + } + public void registerCancelListenerLocked(IResultReceiver receiver) { if (mCancelCallbacks == null) { mCancelCallbacks = new RemoteCallbackList<>(); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 042ac8c5760..24f513ed0b8 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -6335,9 +6335,14 @@ public class NotificationManagerService extends SystemService { // tell the app if (sendDelete) { - if (r.getNotification().deleteIntent != null) { + final PendingIntent deleteIntent = r.getNotification().deleteIntent; + if (deleteIntent != null) { try { - r.getNotification().deleteIntent.send(); + // make sure deleteIntent cannot be used to start activities from background + LocalServices.getService(ActivityManagerInternal.class) + .clearPendingIntentAllowBgActivityStarts(deleteIntent.getTarget(), + WHITELIST_TOKEN); + deleteIntent.send(); } catch (PendingIntent.CanceledException ex) { // do nothing - there's no relevant way to recover, and // no reason to let this propagate -- GitLab From 34039b26f554500450dd566d5710b9b17f155d6f Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Mon, 18 Mar 2019 08:57:47 -0700 Subject: [PATCH 044/473] Add build number to aapt2 version This changes adds the build id to the version printed by "aapt2 version". This change also adds a field to the ResourceTable proto that specifies the fingerprints of tools used to build the table. Bug: 123663089 Test: manual Change-Id: Ifaf33c1e506b68e9f1d921fdbeddf36485e65790 --- tools/aapt2/Android.bp | 1 + tools/aapt2/Main.cpp | 9 +-------- tools/aapt2/Resources.proto | 9 +++++++++ tools/aapt2/format/proto/ProtoSerialize.cpp | 3 +++ tools/aapt2/util/Util.cpp | 22 ++++++++++++++++++++- tools/aapt2/util/Util.h | 6 ++++++ 6 files changed, 41 insertions(+), 9 deletions(-) diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp index aca2be1da33..326c88d4706 100644 --- a/tools/aapt2/Android.bp +++ b/tools/aapt2/Android.bp @@ -57,6 +57,7 @@ cc_defaults { "libbase", "libprotobuf-cpp-lite", "libz", + "libbuildversion", ], stl: "libc++_static", group_static_libs: true, diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp index 39eb9879f86..213bdd2372e 100644 --- a/tools/aapt2/Main.cpp +++ b/tools/aapt2/Main.cpp @@ -46,12 +46,6 @@ using ::android::base::StringPrintf; namespace aapt { -// DO NOT UPDATE, this is more of a marketing version. -static const char* sMajorVersion = "2"; - -// Update minor version whenever a feature or flag is added. -static const char* sMinorVersion = "19"; - /** Prints the version information of AAPT2. */ class VersionCommand : public Command { public: @@ -60,8 +54,7 @@ class VersionCommand : public Command { } int Action(const std::vector& /* args */) override { - std::cerr << StringPrintf("Android Asset Packaging Tool (aapt) %s:%s", sMajorVersion, - sMinorVersion) + std::cerr << StringPrintf("%s %s", util::GetToolName(), util::GetToolFingerprint().c_str()) << std::endl; return 0; } diff --git a/tools/aapt2/Resources.proto b/tools/aapt2/Resources.proto index a2fd7c664b0..ad068e3e0c4 100644 --- a/tools/aapt2/Resources.proto +++ b/tools/aapt2/Resources.proto @@ -41,6 +41,12 @@ message Source { SourcePosition position = 2; } +// The name and version fingerprint of a build tool. +message ToolFingerprint { + string tool = 1; + string version = 2; +} + // Top level message representing a resource table. message ResourceTable { // The string pool containing source paths referenced throughout the resource table. This does @@ -52,6 +58,9 @@ message ResourceTable { // The declarations within the resource table. repeated Overlayable overlayable = 3; + + // The version fingerprints of the tools that built the resource table. + repeated ToolFingerprint tool_fingerprint = 4; } // A package ID in the range [0x00, 0xff]. diff --git a/tools/aapt2/format/proto/ProtoSerialize.cpp b/tools/aapt2/format/proto/ProtoSerialize.cpp index eb2b1a2f35d..6564e0b0564 100644 --- a/tools/aapt2/format/proto/ProtoSerialize.cpp +++ b/tools/aapt2/format/proto/ProtoSerialize.cpp @@ -321,6 +321,9 @@ static void SerializeOverlayableItemToPb(const OverlayableItem& overlayable_item void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table, IDiagnostics* diag) { StringPool source_pool; + pb::ToolFingerprint* pb_fingerprint = out_table->add_tool_fingerprint(); + pb_fingerprint->set_tool(util::GetToolName()); + pb_fingerprint->set_version(util::GetToolFingerprint()); std::vector overlayables; for (const std::unique_ptr& package : table.packages) { diff --git a/tools/aapt2/util/Util.cpp b/tools/aapt2/util/Util.cpp index 59b7fff0f9e..37ce65e4fe5 100644 --- a/tools/aapt2/util/Util.cpp +++ b/tools/aapt2/util/Util.cpp @@ -21,13 +21,15 @@ #include #include +#include "android-base/stringprintf.h" #include "androidfw/StringPiece.h" -#include "utils/Unicode.h" +#include "build/version.h" #include "text/Unicode.h" #include "text/Utf8Iterator.h" #include "util/BigBuffer.h" #include "util/Maybe.h" +#include "utils/Unicode.h" using ::aapt::text::Utf8Iterator; using ::android::StringPiece; @@ -200,6 +202,24 @@ Maybe GetFullyQualifiedClassName(const StringPiece& package, return result; } +const char* GetToolName() { + static const char* const sToolName = "Android Asset Packaging Tool (aapt)"; + return sToolName; +} + +std::string GetToolFingerprint() { + // DO NOT UPDATE, this is more of a marketing version. + static const char* const sMajorVersion = "2"; + + // Update minor version whenever a feature or flag is added. + static const char* const sMinorVersion = "19"; + + // The build id of aapt2 binary. + static const std::string sBuildId = android::build::GetBuildNumber(); + + return android::base::StringPrintf("%s.%s-%s", sMajorVersion, sMinorVersion, sBuildId.c_str()); +} + static size_t ConsumeDigits(const char* start, const char* end) { const char* c = start; for (; c != end && *c >= '0' && *c <= '9'; c++) { diff --git a/tools/aapt2/util/Util.h b/tools/aapt2/util/Util.h index c6e8e6ef761..a956957eace 100644 --- a/tools/aapt2/util/Util.h +++ b/tools/aapt2/util/Util.h @@ -98,6 +98,12 @@ bool IsAndroidSplitName(const android::StringPiece& str); Maybe GetFullyQualifiedClassName(const android::StringPiece& package, const android::StringPiece& class_name); +// Retrieves the formatted name of aapt2. +const char* GetToolName(); + +// Retrieves the build fingerprint of aapt2. +std::string GetToolFingerprint(); + template typename std::enable_if::value, int>::type compare(const T& a, const T& b) { if (a < b) { -- GitLab From 5e1ca0e889ea3edcbd3e302e7a148f5d79fdea14 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 17 Apr 2019 13:34:44 -0600 Subject: [PATCH 045/473] Remove GROUP_ID; not actively being used by apps. Bug: 130744218 Test: none Change-Id: I2917b84ffcc698d3cbffe7dfbd49c76b21c46515 --- api/current.txt | 1 - api/removed.txt | 1 + core/java/android/provider/MediaStore.java | 3 +++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/api/current.txt b/api/current.txt index f602c9ad113..b28be34ae27 100644 --- a/api/current.txt +++ b/api/current.txt @@ -38513,7 +38513,6 @@ package android.provider { field public static final String DISPLAY_NAME = "_display_name"; field public static final String DOCUMENT_ID = "document_id"; field public static final String DURATION = "duration"; - field public static final String GROUP_ID = "group_id"; field public static final String HEIGHT = "height"; field public static final String INSTANCE_ID = "instance_id"; field public static final String IS_PENDING = "is_pending"; diff --git a/api/removed.txt b/api/removed.txt index 883632623a8..ab5e7e5deea 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -539,6 +539,7 @@ package android.provider { } public static interface MediaStore.MediaColumns extends android.provider.BaseColumns { + field @Deprecated public static final String GROUP_ID = "group_id"; field @Deprecated public static final String HASH = "_hash"; field @Deprecated public static final String IS_TRASHED = "is_trashed"; field @Deprecated public static final String PRIMARY_DIRECTORY = "primary_directory"; diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index bff8328defa..c50d003afcc 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -1150,8 +1150,11 @@ public final class MediaStore { * {@code IMG1024.BURST001.JPG} and {@code IMG1024.BURST002.JPG} * will have the same {@link #GROUP_ID} because the first portion of * their filenames is identical. + * + * @removed */ @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + @Deprecated public static final String GROUP_ID = "group_id"; /** -- GitLab From 8c7ca4f5c2eefe2f7059a8b49890351d54840a7b Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Wed, 17 Apr 2019 11:35:22 +0200 Subject: [PATCH 046/473] Ensure Contrast: Address API feedback Fixes: 130647853 Test: make checkapi Test: atest EnsureBarContrastTest NavigationBarColorTest Change-Id: Iafbdce8476134df56ea5d15155391b10afc9ce94 --- api/current.txt | 12 +++++----- core/java/android/app/Activity.java | 4 ++-- core/java/android/view/Window.java | 24 +++++++++---------- .../android/internal/policy/PhoneWindow.java | 14 +++++------ core/res/res/values/attrs.xml | 16 ++++++------- core/res/res/values/public.xml | 4 ++-- 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/api/current.txt b/api/current.txt index f9db63d68bd..bc877f80a36 100644 --- a/api/current.txt +++ b/api/current.txt @@ -571,8 +571,8 @@ package android { field public static final int endX = 16844050; // 0x1010512 field public static final int endY = 16844051; // 0x1010513 field @Deprecated public static final int endYear = 16843133; // 0x101017d - field public static final int ensuringNavigationBarContrastWhenTransparent = 16844203; // 0x10105ab - field public static final int ensuringStatusBarContrastWhenTransparent = 16844202; // 0x10105aa + field public static final int enforceNavigationBarContrast = 16844203; // 0x10105ab + field public static final int enforceStatusBarContrast = 16844202; // 0x10105aa field public static final int enterFadeDuration = 16843532; // 0x101030c field public static final int entries = 16842930; // 0x10100b2 field public static final int entryValues = 16843256; // 0x10101f8 @@ -51522,10 +51522,10 @@ package android.view { method public void injectInputEvent(android.view.InputEvent); method public abstract void invalidatePanelMenu(int); method public final boolean isActive(); - method public boolean isEnsuringNavigationBarContrastWhenTransparent(); - method public boolean isEnsuringStatusBarContrastWhenTransparent(); method public abstract boolean isFloating(); + method public boolean isNavigationBarContrastEnforced(); method public abstract boolean isShortcutKey(int, android.view.KeyEvent); + method public boolean isStatusBarContrastEnforced(); method public boolean isWideColorGamut(); method public final void makeActive(); method protected abstract void onActive(); @@ -51558,8 +51558,6 @@ package android.view { method protected void setDefaultWindowFormat(int); method public void setDimAmount(float); method public void setElevation(float); - method public void setEnsuringNavigationBarContrastWhenTransparent(boolean); - method public void setEnsuringStatusBarContrastWhenTransparent(boolean); method public void setEnterTransition(android.transition.Transition); method public void setExitTransition(android.transition.Transition); method public abstract void setFeatureDrawable(int, android.graphics.drawable.Drawable); @@ -51576,6 +51574,7 @@ package android.view { method public void setLogo(@DrawableRes int); method public void setMediaController(android.media.session.MediaController); method public abstract void setNavigationBarColor(@ColorInt int); + method public void setNavigationBarContrastEnforced(boolean); method public void setNavigationBarDividerColor(@ColorInt int); method public void setReenterTransition(android.transition.Transition); method public abstract void setResizingCaptionDrawable(android.graphics.drawable.Drawable); @@ -51588,6 +51587,7 @@ package android.view { method public void setSharedElementsUseOverlay(boolean); method public void setSoftInputMode(int); method public abstract void setStatusBarColor(@ColorInt int); + method public void setStatusBarContrastEnforced(boolean); method public void setSustainedPerformanceMode(boolean); method public void setSystemGestureExclusionRects(@NonNull java.util.List); method public abstract void setTitle(CharSequence); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 6e935e1e56c..86b10b90fa7 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -4902,11 +4902,11 @@ public class Activity extends ContextThemeWrapper final boolean targetPreQ = targetSdk < Build.VERSION_CODES.Q; if (!targetPreQ) { mTaskDescription.setEnsureStatusBarContrastWhenTransparent(a.getBoolean( - R.styleable.ActivityTaskDescription_ensuringStatusBarContrastWhenTransparent, + R.styleable.ActivityTaskDescription_enforceStatusBarContrast, false)); mTaskDescription.setEnsureNavigationBarContrastWhenTransparent(a.getBoolean( R.styleable - .ActivityTaskDescription_ensuringNavigationBarContrastWhenTransparent, + .ActivityTaskDescription_enforceNavigationBarContrast, true)); } diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index b0ec6210d82..cbcc057811f 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -2341,11 +2341,11 @@ public abstract class Window { *

When the status bar color has a non-zero alpha value, the value of this * property has no effect. * - * @see android.R.attr#ensuringStatusBarContrastWhenTransparent - * @see #isEnsuringStatusBarContrastWhenTransparent + * @see android.R.attr#enforceStatusBarContrast + * @see #isStatusBarContrastEnforced * @see #setStatusBarColor */ - public void setEnsuringStatusBarContrastWhenTransparent(boolean ensureContrast) { + public void setStatusBarContrastEnforced(boolean ensureContrast) { } /** @@ -2356,11 +2356,11 @@ public abstract class Window { * property has no effect. * * @return true, if the system is ensuring contrast, false otherwise. - * @see android.R.attr#ensuringStatusBarContrastWhenTransparent - * @see #setEnsuringStatusBarContrastWhenTransparent + * @see android.R.attr#enforceStatusBarContrast + * @see #setStatusBarContrastEnforced * @see #setStatusBarColor */ - public boolean isEnsuringStatusBarContrastWhenTransparent() { + public boolean isStatusBarContrastEnforced() { return false; } @@ -2375,11 +2375,11 @@ public abstract class Window { *

When the navigation bar color has a non-zero alpha value, the value of this * property has no effect. * - * @see android.R.attr#ensuringNavigationBarContrastWhenTransparent - * @see #isEnsuringNavigationBarContrastWhenTransparent + * @see android.R.attr#enforceNavigationBarContrast + * @see #isNavigationBarContrastEnforced * @see #setNavigationBarColor */ - public void setEnsuringNavigationBarContrastWhenTransparent(boolean ensureContrast) { + public void setNavigationBarContrastEnforced(boolean enforceContrast) { } /** @@ -2390,11 +2390,11 @@ public abstract class Window { * property has no effect. * * @return true, if the system is ensuring contrast, false otherwise. - * @see android.R.attr#ensuringNavigationBarContrastWhenTransparent - * @see #setEnsuringNavigationBarContrastWhenTransparent + * @see android.R.attr#enforceNavigationBarContrast + * @see #setNavigationBarContrastEnforced * @see #setNavigationBarColor */ - public boolean isEnsuringNavigationBarContrastWhenTransparent() { + public boolean isNavigationBarContrastEnforced() { return false; } diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 21f8d87e7e8..daa57e05aef 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -2466,9 +2466,9 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } if (!targetPreQ) { mEnsureStatusBarContrastWhenTransparent = a.getBoolean( - R.styleable.Window_ensuringStatusBarContrastWhenTransparent, false); + R.styleable.Window_enforceStatusBarContrast, false); mEnsureNavigationBarContrastWhenTransparent = a.getBoolean( - R.styleable.Window_ensuringNavigationBarContrastWhenTransparent, true); + R.styleable.Window_enforceNavigationBarContrast, true); } WindowManager.LayoutParams params = getAttributes(); @@ -3859,7 +3859,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } @Override - public void setEnsuringStatusBarContrastWhenTransparent(boolean ensureContrast) { + public void setStatusBarContrastEnforced(boolean ensureContrast) { mEnsureStatusBarContrastWhenTransparent = ensureContrast; if (mDecor != null) { mDecor.updateColorViews(null, false /* animate */); @@ -3867,20 +3867,20 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } @Override - public boolean isEnsuringStatusBarContrastWhenTransparent() { + public boolean isStatusBarContrastEnforced() { return mEnsureStatusBarContrastWhenTransparent; } @Override - public void setEnsuringNavigationBarContrastWhenTransparent(boolean ensureContrast) { - mEnsureNavigationBarContrastWhenTransparent = ensureContrast; + public void setNavigationBarContrastEnforced(boolean enforceContrast) { + mEnsureNavigationBarContrastWhenTransparent = enforceContrast; if (mDecor != null) { mDecor.updateColorViews(null, false /* animate */); } } @Override - public boolean isEnsuringNavigationBarContrastWhenTransparent() { + public boolean isNavigationBarContrastEnforced() { return mEnsureNavigationBarContrastWhenTransparent; } diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index ab9a298f306..ce1e5c3cf79 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -2104,8 +2104,8 @@

If the app does not target at least {@link android.os.Build.VERSION_CODES#Q Q}, this attribute is ignored. - @see android.view.Window#setEnsuringStatusBarContrastWhenTransparent --> - + @see android.view.Window#setStatusBarContrastEnforced --> + - + @see android.view.Window#setNavigationBarContrastEnforced --> + - - - - + + + + diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index a7af144ab9e..33bc3419785 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2943,8 +2943,8 @@ - - + + -- GitLab From baf0fdfecc96170a13528cbf0f38a7e52f62dbf8 Mon Sep 17 00:00:00 2001 From: Nick Chalko Date: Tue, 16 Apr 2019 14:48:11 -0700 Subject: [PATCH 047/473] Don't start an observer without an extcon device This prevents needless logspam at startup. Bug: 123906489 Change-Id: Ib97b2a6a9aed3a681f48943c57bae4b5953fb54c Test: m services.core (cherry picked from commit 4ea6290b11d91a9110e63dc3f00041029c118e07) --- .../java/com/android/server/ExtconUEventObserver.java | 8 +++++++- .../com/android/server/policy/PhoneWindowManager.java | 9 +++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/ExtconUEventObserver.java b/services/core/java/com/android/server/ExtconUEventObserver.java index 6b42b3d06d4..5bd27c4dd48 100644 --- a/services/core/java/com/android/server/ExtconUEventObserver.java +++ b/services/core/java/com/android/server/ExtconUEventObserver.java @@ -159,7 +159,13 @@ public abstract class ExtconUEventObserver extends UEventObserver { } } - /** Does the {@link /sys/class/extcon} directory exist */ + /** Does the {@code /sys/class/extcon/} directory exist */ + public static boolean namedExtconDirExists(String name) { + File extconDir = new File("/sys/class/extcon/" + name); + return extconDir.exists() && extconDir.isDirectory(); + } + + /** Does the {@code /sys/class/extcon} directory exist */ public static boolean extconExists() { File extconDir = new File("/sys/class/extcon"); return extconDir.exists() && extconDir.isDirectory(); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index d0ca861d8d3..03d0e236b61 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3556,11 +3556,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } } - } else if (ExtconUEventObserver.extconExists()) { + } else if (ExtconUEventObserver.extconExists() + && ExtconUEventObserver.namedExtconDirExists(HdmiVideoExtconUEventObserver.NAME)) { HdmiVideoExtconUEventObserver observer = new HdmiVideoExtconUEventObserver(); plugged = observer.init(); mHDMIObserver = observer; + } else if (localLOGV) { + Slog.v(TAG, "Not observing HDMI plug state because HDMI was not found."); } + // This dance forces the code in setHdmiPlugged to run. // Always do this so the sticky intent is stuck (to false) if there is no hdmi. mDefaultDisplayPolicy.setHdmiPlugged(plugged, true /* force */); @@ -5616,7 +5620,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { private class HdmiVideoExtconUEventObserver extends ExtconStateObserver { private static final String HDMI_EXIST = "HDMI=1"; - private final ExtconInfo mHdmi = new ExtconInfo("hdmi"); + private static final String NAME = "hdmi"; + private final ExtconInfo mHdmi = new ExtconInfo(NAME); private boolean init() { boolean plugged = false; -- GitLab From 418ba8f03ec644d0ae381357656fc8d73003f8ed Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Wed, 17 Apr 2019 15:55:21 -0400 Subject: [PATCH 048/473] Add @TestApi to StatusBarManager @SystemApi methods Enables CTS testing Test: APIs are in api/test-current Bug: 130178313 Change-Id: Ie408bc4399cf64018903ef122b8db1e6a9fa9fb1 --- api/test-current.txt | 15 +++++++++++++++ core/java/android/app/StatusBarManager.java | 10 ++++++++++ core/java/android/content/Context.java | 1 + 3 files changed, 26 insertions(+) diff --git a/api/test-current.txt b/api/test-current.txt index 811ad43b5a9..30444c58aec 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -345,6 +345,20 @@ package android.app { method public android.graphics.Rect getSourceRectHint(); } + public class StatusBarManager { + method @NonNull @RequiresPermission(android.Manifest.permission.STATUS_BAR) public android.app.StatusBarManager.DisableInfo getDisableInfo(); + method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean); + } + + public static final class StatusBarManager.DisableInfo { + method public boolean areAllComponentsEnabled(); + method public boolean isNavigateToHomeDisabled(); + method public boolean isNotificationPeekingDisabled(); + method public boolean isRecentsDisabled(); + method public boolean isSearchDisabled(); + method public boolean isStatusBarExpansionDisabled(); + } + public class TimePickerDialog extends android.app.AlertDialog implements android.content.DialogInterface.OnClickListener android.widget.TimePicker.OnTimeChangedListener { method public android.widget.TimePicker getTimePicker(); } @@ -629,6 +643,7 @@ package android.content { method public void setContentCaptureOptions(@Nullable android.content.ContentCaptureOptions); field public static final String BUGREPORT_SERVICE = "bugreport"; field public static final String ROLLBACK_SERVICE = "rollback"; + field public static final String STATUS_BAR_SERVICE = "statusbar"; field public static final String TEST_NETWORK_SERVICE = "test_network"; } diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index 9ff363dddc3..af2d774508c 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -22,6 +22,7 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; +import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.os.Binder; @@ -366,6 +367,7 @@ public class StatusBarManager { * @hide */ @SystemApi + @TestApi @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean disabled) { try { @@ -390,6 +392,7 @@ public class StatusBarManager { * @hide */ @SystemApi + @TestApi @RequiresPermission(android.Manifest.permission.STATUS_BAR) @NonNull public DisableInfo getDisableInfo() { @@ -422,6 +425,7 @@ public class StatusBarManager { * @hide */ @SystemApi + @TestApi public static final class DisableInfo { private boolean mStatusBarExpansion; @@ -448,6 +452,7 @@ public class StatusBarManager { * @hide */ @SystemApi + @TestApi public boolean isStatusBarExpansionDisabled() { return mStatusBarExpansion; } @@ -463,6 +468,7 @@ public class StatusBarManager { * @hide */ @SystemApi + @TestApi public boolean isNavigateToHomeDisabled() { return mNavigateHome; } @@ -478,6 +484,7 @@ public class StatusBarManager { * @hide */ @SystemApi + @TestApi public boolean isNotificationPeekingDisabled() { return mNotificationPeeking; } @@ -493,6 +500,7 @@ public class StatusBarManager { * @hide */ @SystemApi + @TestApi public boolean isRecentsDisabled() { return mRecents; } @@ -508,6 +516,7 @@ public class StatusBarManager { * @hide */ @SystemApi + @TestApi public boolean isSearchDisabled() { return mSearch; } @@ -523,6 +532,7 @@ public class StatusBarManager { * @hide */ @SystemApi + @TestApi public boolean areAllComponentsEnabled() { return !mStatusBarExpansion && !mNavigateHome && !mNotificationPeeking && !mRecents && !mSearch; diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 5a844aab02f..00238bfe0ee 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -3679,6 +3679,7 @@ public abstract class Context { * @hide */ @SystemApi + @TestApi public static final String STATUS_BAR_SERVICE = "statusbar"; /** -- GitLab From 6fb038ccc3385b50f2f9713b353531a168c2dbcb Mon Sep 17 00:00:00 2001 From: Dmitry Dementyev Date: Mon, 15 Apr 2019 11:44:00 -0700 Subject: [PATCH 049/473] Use checkOp instead of noteOp in AccountManagerService. Keep using noteOp for GET_PASSWORD permission check. Bug: 130567204 Test: manual Change-Id: I49a6b6ac13ff791e05dd354e681a35a39198410d --- .../accounts/AccountManagerService.java | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index c826df06c92..1432f57b446 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -693,7 +693,7 @@ public class AccountManagerService return visibility; } - boolean isPrivileged = isPermittedForPackage(packageName, uid, accounts.userId, + boolean isPrivileged = isPermittedForPackage(packageName, accounts.userId, Manifest.permission.GET_ACCOUNTS_PRIVILEGED); // Device/Profile owner gets visibility by default. @@ -703,8 +703,8 @@ public class AccountManagerService boolean preO = isPreOApplication(packageName); if ((signatureCheckResult != SIGNATURE_CHECK_MISMATCH) - || (preO && checkGetAccountsPermission(packageName, uid, accounts.userId)) - || (checkReadContactsPermission(packageName, uid, accounts.userId) + || (preO && checkGetAccountsPermission(packageName, accounts.userId)) + || (checkReadContactsPermission(packageName, accounts.userId) && accountTypeManagesContacts(account.type, accounts.userId)) || isPrivileged) { // Use legacy for preO apps with GET_ACCOUNTS permission or pre/postO with signature @@ -3317,8 +3317,8 @@ public class AccountManagerService options.putInt(AccountManager.KEY_CALLER_PID, pid); // Check to see if the Password should be included to the caller. - String callerPkg = optionsIn.getString(AccountManager.KEY_ANDROID_PACKAGE_NAME); - boolean isPasswordForwardingAllowed = isPermitted( + String callerPkg = options.getString(AccountManager.KEY_ANDROID_PACKAGE_NAME); + boolean isPasswordForwardingAllowed = checkPermissionAndNote( callerPkg, uid, Manifest.permission.GET_PASSWORD); long identityToken = clearCallingIdentity(); @@ -3743,7 +3743,7 @@ public class AccountManagerService // Check to see if the Password should be included to the caller. String callerPkg = loginOptions.getString(AccountManager.KEY_ANDROID_PACKAGE_NAME); - boolean isPasswordForwardingAllowed = isPermitted( + boolean isPasswordForwardingAllowed = checkPermissionAndNote( callerPkg, uid, Manifest.permission.GET_PASSWORD); long identityToken = clearCallingIdentity(); @@ -5318,31 +5318,36 @@ public class AccountManagerService } } - private boolean isPermittedForPackage(String packageName, int uid, int userId, - String... permissions) { + private boolean isPermittedForPackage(String packageName, int userId, String... permissions) { final long identity = Binder.clearCallingIdentity(); try { + final int uid = mPackageManager.getPackageUidAsUser(packageName, userId); IPackageManager pm = ActivityThread.getPackageManager(); for (String perm : permissions) { if (pm.checkPermission(perm, packageName, userId) == PackageManager.PERMISSION_GRANTED) { // Checks runtime permission revocation. final int opCode = AppOpsManager.permissionToOpCode(perm); - if (opCode == AppOpsManager.OP_NONE || mAppOpsManager.noteOpNoThrow( + if (opCode == AppOpsManager.OP_NONE || mAppOpsManager.checkOpNoThrow( opCode, uid, packageName) == AppOpsManager.MODE_ALLOWED) { return true; } } } - } catch (RemoteException e) { - /* ignore - local call */ + } catch (NameNotFoundException | RemoteException e) { + // Assume permission is not granted if an error accrued. } finally { Binder.restoreCallingIdentity(identity); } return false; } - private boolean isPermitted(String opPackageName, int callingUid, String... permissions) { + /** + * Checks that package has at least one of given permissions and makes note of app + * performing the action. + */ + private boolean checkPermissionAndNote(String opPackageName, int callingUid, + String... permissions) { for (String perm : permissions) { if (mContext.checkCallingOrSelfPermission(perm) == PackageManager.PERMISSION_GRANTED) { if (Log.isLoggable(TAG, Log.VERBOSE)) { @@ -5447,13 +5452,13 @@ public class AccountManagerService // Method checks visibility for applications targeing API level below {@link // android.os.Build.VERSION_CODES#O}, // returns true if the the app has GET_ACCOUNTS or GET_ACCOUNTS_PRIVILEGED permission. - private boolean checkGetAccountsPermission(String packageName, int uid, int userId) { - return isPermittedForPackage(packageName, uid, userId, Manifest.permission.GET_ACCOUNTS, + private boolean checkGetAccountsPermission(String packageName, int userId) { + return isPermittedForPackage(packageName, userId, Manifest.permission.GET_ACCOUNTS, Manifest.permission.GET_ACCOUNTS_PRIVILEGED); } - private boolean checkReadContactsPermission(String packageName, int uid, int userId) { - return isPermittedForPackage(packageName, uid, userId, Manifest.permission.READ_CONTACTS); + private boolean checkReadContactsPermission(String packageName, int userId) { + return isPermittedForPackage(packageName, userId, Manifest.permission.READ_CONTACTS); } // Heuristic to check that account type may be associated with some contacts data and @@ -5473,7 +5478,7 @@ public class AccountManagerService for (RegisteredServicesCache.ServiceInfo serviceInfo : serviceInfos) { if (accountType.equals(serviceInfo.type.type)) { - return isPermittedForPackage(serviceInfo.type.packageName, serviceInfo.uid, userId, + return isPermittedForPackage(serviceInfo.type.packageName, userId, Manifest.permission.WRITE_CONTACTS); } } -- GitLab From aed215283904e1dddee81018351a3e88624e3d86 Mon Sep 17 00:00:00 2001 From: Holly Jiuyu Sun Date: Mon, 15 Apr 2019 14:04:12 -0700 Subject: [PATCH 050/473] Add EuiccManager#EXTRA_PHYSICAL_SLOT_ID to detect it's an operation for pSIM. Platform needs to pass LPA the pSIM slotId so that LPA knows it's a toggle action on pSIM. Bug: 123945155 Test: build Change-Id: Ie0db50e8ade4c6ce385ebfbfe7cf9e2982d67e34 Merged-In: Ie0db50e8ade4c6ce385ebfbfe7cf9e2982d67e34 --- .../java/android/telephony/euicc/EuiccManager.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java index 96a2514e8ff..cabd4dfd91f 100644 --- a/telephony/java/android/telephony/euicc/EuiccManager.java +++ b/telephony/java/android/telephony/euicc/EuiccManager.java @@ -333,6 +333,18 @@ public class EuiccManager { public static final String EXTRA_FROM_SUBSCRIPTION_ID = "android.telephony.euicc.extra.FROM_SUBSCRIPTION_ID"; + /** + * Key for an extra set on privileged actions {@link #ACTION_TOGGLE_SUBSCRIPTION_PRIVILEGED} + * providing the physical slot ID of the target slot. + * + *

Expected type of the extra data: int + * + * @hide + */ + // TODO: Make this a @SystemApi. + public static final String EXTRA_PHYSICAL_SLOT_ID = + "android.telephony.euicc.extra.PHYSICAL_SLOT_ID"; + /** * Optional meta-data attribute for a carrier app providing an icon to use to represent the * carrier. If not provided, the app's launcher icon will be used as a fallback. -- GitLab From 531db61ac1671745d81caaead9bf41e01baecc78 Mon Sep 17 00:00:00 2001 From: Nader Jawad Date: Sun, 14 Apr 2019 21:58:04 -0700 Subject: [PATCH 051/473] Added BlendMode equivalent APIs to replace deprecated PorterDuff variants Updated various framework Views to have equivalent BlendMode APIs to replace the deprecated PorterDuff equivalents. Updated InspectableProperty annotations to refer to the same xml attributes as the original tintmode APIs Bug: 126726419 Test: Added CTS tests to verify new BlendMode APIs Change-Id: Id9ab36d3d4d29f351250723e9d13d49bc6062c83 Merged-In: Id9ab36d3d4d29f351250723e9d13d49bc6062c83 --- api/current.txt | 112 +++++++----- core/java/android/view/MenuInflater.java | 2 +- core/java/android/view/MenuItem.java | 13 +- core/java/android/view/View.java | 40 ++--- core/java/android/widget/AbsSeekBar.java | 106 ++++++++--- core/java/android/widget/CheckedTextView.java | 46 ++++- core/java/android/widget/CompoundButton.java | 53 ++++-- core/java/android/widget/ImageView.java | 55 ++++-- core/java/android/widget/ProgressBar.java | 167 +++++++++++++++--- core/java/android/widget/Switch.java | 91 ++++++++-- core/java/android/widget/TextView.java | 51 +++++- .../java/android/graphics/BaseCanvas.java | 4 - .../android/graphics/BaseRecordingCanvas.java | 4 - graphics/java/android/graphics/Canvas.java | 3 - .../java/android/graphics/ComposeShader.java | 6 +- graphics/java/android/graphics/Paint.java | 7 - .../java/android/graphics/PorterDuff.java | 3 +- .../graphics/PorterDuffColorFilter.java | 4 - .../android/graphics/PorterDuffXfermode.java | 4 - .../drawable/AdaptiveIconDrawable.java | 4 +- .../drawable/AnimatedVectorDrawable.java | 4 +- .../graphics/drawable/BitmapDrawable.java | 2 +- .../graphics/drawable/ColorDrawable.java | 2 +- .../drawable/ColorStateListDrawable.java | 6 +- .../android/graphics/drawable/Drawable.java | 21 +-- .../graphics/drawable/DrawableContainer.java | 6 +- .../graphics/drawable/DrawableWrapper.java | 4 +- .../graphics/drawable/GradientDrawable.java | 2 +- .../java/android/graphics/drawable/Icon.java | 7 +- .../graphics/drawable/LayerDrawable.java | 4 +- .../graphics/drawable/NinePatchDrawable.java | 2 +- .../graphics/drawable/ShapeDrawable.java | 2 +- .../graphics/drawable/VectorDrawable.java | 2 +- 33 files changed, 594 insertions(+), 245 deletions(-) diff --git a/api/current.txt b/api/current.txt index f9db63d68bd..41048a6316c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -13790,7 +13790,7 @@ package android.graphics { method public void drawCircle(float, float, float, @NonNull android.graphics.Paint); method public void drawColor(@ColorInt int); method public void drawColor(@ColorLong long); - method @Deprecated public void drawColor(@ColorInt int, @NonNull android.graphics.PorterDuff.Mode); + method public void drawColor(@ColorInt int, @NonNull android.graphics.PorterDuff.Mode); 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); @@ -14107,7 +14107,7 @@ package android.graphics { public class ComposeShader extends android.graphics.Shader { ctor @Deprecated public ComposeShader(@NonNull android.graphics.Shader, @NonNull android.graphics.Shader, @NonNull android.graphics.Xfermode); - ctor @Deprecated public ComposeShader(@NonNull android.graphics.Shader, @NonNull android.graphics.Shader, @NonNull android.graphics.PorterDuff.Mode); + ctor public ComposeShader(@NonNull android.graphics.Shader, @NonNull android.graphics.Shader, @NonNull android.graphics.PorterDuff.Mode); ctor public ComposeShader(@NonNull android.graphics.Shader, @NonNull android.graphics.Shader, @NonNull android.graphics.BlendMode); } @@ -14496,7 +14496,7 @@ package android.graphics { method @Px public float getUnderlinePosition(); method @Px public float getUnderlineThickness(); method @Px public float getWordSpacing(); - method @Deprecated public android.graphics.Xfermode getXfermode(); + method public android.graphics.Xfermode getXfermode(); method public boolean hasGlyph(String); method public final boolean isAntiAlias(); method public final boolean isDither(); @@ -14553,7 +14553,7 @@ package android.graphics { method public android.graphics.Typeface setTypeface(android.graphics.Typeface); method public void setUnderlineText(boolean); method public void setWordSpacing(@Px float); - method @Deprecated public android.graphics.Xfermode setXfermode(android.graphics.Xfermode); + method public android.graphics.Xfermode setXfermode(android.graphics.Xfermode); field public static final int ANTI_ALIAS_FLAG = 1; // 0x1 field public static final int CURSOR_AFTER = 0; // 0x0 field public static final int CURSOR_AT = 4; // 0x4 @@ -14802,37 +14802,37 @@ package android.graphics { field public float y; } - @Deprecated public class PorterDuff { - ctor @Deprecated public PorterDuff(); + public class PorterDuff { + ctor public PorterDuff(); } - @Deprecated public enum PorterDuff.Mode { - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode ADD; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode CLEAR; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DARKEN; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DST; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DST_ATOP; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DST_IN; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DST_OUT; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DST_OVER; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode LIGHTEN; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode MULTIPLY; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode OVERLAY; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SCREEN; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SRC; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SRC_ATOP; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SRC_IN; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SRC_OUT; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SRC_OVER; - enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode XOR; + public enum PorterDuff.Mode { + enum_constant public static final android.graphics.PorterDuff.Mode ADD; + enum_constant public static final android.graphics.PorterDuff.Mode CLEAR; + enum_constant public static final android.graphics.PorterDuff.Mode DARKEN; + enum_constant public static final android.graphics.PorterDuff.Mode DST; + enum_constant public static final android.graphics.PorterDuff.Mode DST_ATOP; + enum_constant public static final android.graphics.PorterDuff.Mode DST_IN; + enum_constant public static final android.graphics.PorterDuff.Mode DST_OUT; + enum_constant public static final android.graphics.PorterDuff.Mode DST_OVER; + enum_constant public static final android.graphics.PorterDuff.Mode LIGHTEN; + enum_constant public static final android.graphics.PorterDuff.Mode MULTIPLY; + enum_constant public static final android.graphics.PorterDuff.Mode OVERLAY; + enum_constant public static final android.graphics.PorterDuff.Mode SCREEN; + enum_constant public static final android.graphics.PorterDuff.Mode SRC; + enum_constant public static final android.graphics.PorterDuff.Mode SRC_ATOP; + enum_constant public static final android.graphics.PorterDuff.Mode SRC_IN; + enum_constant public static final android.graphics.PorterDuff.Mode SRC_OUT; + enum_constant public static final android.graphics.PorterDuff.Mode SRC_OVER; + enum_constant public static final android.graphics.PorterDuff.Mode XOR; } - @Deprecated public class PorterDuffColorFilter extends android.graphics.ColorFilter { - ctor @Deprecated public PorterDuffColorFilter(@ColorInt int, @NonNull android.graphics.PorterDuff.Mode); + public class PorterDuffColorFilter extends android.graphics.ColorFilter { + ctor public PorterDuffColorFilter(@ColorInt int, @NonNull android.graphics.PorterDuff.Mode); } - @Deprecated public class PorterDuffXfermode extends android.graphics.Xfermode { - ctor @Deprecated public PorterDuffXfermode(android.graphics.PorterDuff.Mode); + public class PorterDuffXfermode extends android.graphics.Xfermode { + ctor public PorterDuffXfermode(android.graphics.PorterDuff.Mode); } public interface PostProcessor { @@ -15393,9 +15393,9 @@ package android.graphics.drawable { method public final boolean setLevel(@IntRange(from=0, to=10000) int); method public boolean setState(@NonNull int[]); method public void setTint(@ColorInt int); + method public void setTintBlendMode(@Nullable android.graphics.BlendMode); method public void setTintList(@Nullable android.content.res.ColorStateList); - method @Deprecated public void setTintMode(@Nullable android.graphics.PorterDuff.Mode); - method public void setTintMode(@Nullable android.graphics.BlendMode); + method public void setTintMode(@Nullable android.graphics.PorterDuff.Mode); method public boolean setVisible(boolean, boolean); method public void unscheduleSelf(@NonNull Runnable); } @@ -15552,9 +15552,9 @@ package android.graphics.drawable { method public void loadDrawableAsync(android.content.Context, android.os.Message); method public void loadDrawableAsync(android.content.Context, android.graphics.drawable.Icon.OnDrawableLoadedListener, android.os.Handler); method public android.graphics.drawable.Icon setTint(@ColorInt int); + method @NonNull public android.graphics.drawable.Icon setTintBlendMode(@NonNull android.graphics.BlendMode); method public android.graphics.drawable.Icon setTintList(android.content.res.ColorStateList); - method @Deprecated @NonNull public android.graphics.drawable.Icon setTintMode(@NonNull android.graphics.PorterDuff.Mode); - method @NonNull public android.graphics.drawable.Icon setTintMode(@NonNull android.graphics.BlendMode); + method @NonNull public android.graphics.drawable.Icon setTintMode(@NonNull android.graphics.PorterDuff.Mode); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5 @@ -49455,7 +49455,7 @@ package android.view { method public android.graphics.drawable.Drawable getIcon(); method @Nullable public default android.graphics.BlendMode getIconTintBlendMode(); method @Nullable public default android.content.res.ColorStateList getIconTintList(); - method @Deprecated @Nullable public default android.graphics.PorterDuff.Mode getIconTintMode(); + method @Nullable public default android.graphics.PorterDuff.Mode getIconTintMode(); method public android.content.Intent getIntent(); method public int getItemId(); method public android.view.ContextMenu.ContextMenuInfo getMenuInfo(); @@ -49483,9 +49483,9 @@ package android.view { method public android.view.MenuItem setEnabled(boolean); method public android.view.MenuItem setIcon(android.graphics.drawable.Drawable); method public android.view.MenuItem setIcon(@DrawableRes int); + method @NonNull public default android.view.MenuItem setIconTintBlendMode(@Nullable android.graphics.BlendMode); method public default android.view.MenuItem setIconTintList(@Nullable android.content.res.ColorStateList); - method @Deprecated @NonNull public default android.view.MenuItem setIconTintMode(@Nullable android.graphics.PorterDuff.Mode); - method @NonNull public default android.view.MenuItem setIconTintMode(@Nullable android.graphics.BlendMode); + method @NonNull public default android.view.MenuItem setIconTintMode(@Nullable android.graphics.PorterDuff.Mode); method public android.view.MenuItem setIntent(android.content.Intent); method public android.view.MenuItem setNumericShortcut(char); method public default android.view.MenuItem setNumericShortcut(char, int); @@ -50138,9 +50138,9 @@ package android.view { method public int getAutofillType(); method @Nullable public android.view.autofill.AutofillValue getAutofillValue(); method public android.graphics.drawable.Drawable getBackground(); - method @Nullable public android.graphics.BlendMode getBackgroundBlendMode(); + method @Nullable public android.graphics.BlendMode getBackgroundTintBlendMode(); method @Nullable public android.content.res.ColorStateList getBackgroundTintList(); - method @Deprecated @Nullable public android.graphics.PorterDuff.Mode getBackgroundTintMode(); + method @Nullable public android.graphics.PorterDuff.Mode getBackgroundTintMode(); method @android.view.ViewDebug.ExportedProperty(category="layout") public int getBaseline(); method @android.view.ViewDebug.CapturedViewProperty public final int getBottom(); method protected float getBottomFadingEdgeStrength(); @@ -50171,10 +50171,10 @@ package android.view { method public java.util.ArrayList getFocusables(int); method public void getFocusedRect(android.graphics.Rect); method public android.graphics.drawable.Drawable getForeground(); - method @Nullable public android.graphics.BlendMode getForegroundBlendMode(); method public int getForegroundGravity(); + method @Nullable public android.graphics.BlendMode getForegroundTintBlendMode(); method @Nullable public android.content.res.ColorStateList getForegroundTintList(); - method @Deprecated @Nullable public android.graphics.PorterDuff.Mode getForegroundTintMode(); + method @Nullable public android.graphics.PorterDuff.Mode getForegroundTintMode(); method public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point); method public final boolean getGlobalVisibleRect(android.graphics.Rect); method public android.os.Handler getHandler(); @@ -50486,9 +50486,9 @@ package android.view { method public void setBackgroundColor(@ColorInt int); method @Deprecated public void setBackgroundDrawable(android.graphics.drawable.Drawable); method public void setBackgroundResource(@DrawableRes int); + method public void setBackgroundTintBlendMode(@Nullable android.graphics.BlendMode); method public void setBackgroundTintList(@Nullable android.content.res.ColorStateList); - method @Deprecated public void setBackgroundTintMode(@Nullable android.graphics.PorterDuff.Mode); - method public void setBackgroundTintMode(@Nullable android.graphics.BlendMode); + method public void setBackgroundTintMode(@Nullable android.graphics.PorterDuff.Mode); method public final void setBottom(int); method public void setCameraDistance(float); method public void setClickable(boolean); @@ -50514,9 +50514,9 @@ package android.view { method public void setForceDarkAllowed(boolean); method public void setForeground(android.graphics.drawable.Drawable); method public void setForegroundGravity(int); + method public void setForegroundTintBlendMode(@Nullable android.graphics.BlendMode); method public void setForegroundTintList(@Nullable android.content.res.ColorStateList); - method @Deprecated public void setForegroundTintMode(@Nullable android.graphics.PorterDuff.Mode); - method public void setForegroundTintMode(@Nullable android.graphics.BlendMode); + method public void setForegroundTintMode(@Nullable android.graphics.PorterDuff.Mode); method public void setHapticFeedbackEnabled(boolean); method public void setHasTransientState(boolean); method public void setHorizontalFadingEdgeEnabled(boolean); @@ -54852,18 +54852,22 @@ package android.widget { method public boolean getSplitTrack(); method public android.graphics.drawable.Drawable getThumb(); method public int getThumbOffset(); + method @Nullable public android.graphics.BlendMode getThumbTintBlendMode(); method @Nullable public android.content.res.ColorStateList getThumbTintList(); method @Nullable public android.graphics.PorterDuff.Mode getThumbTintMode(); method public android.graphics.drawable.Drawable getTickMark(); + method @Nullable public android.graphics.BlendMode getTickMarkTintBlendMode(); method @Nullable public android.content.res.ColorStateList getTickMarkTintList(); method @Nullable public android.graphics.PorterDuff.Mode getTickMarkTintMode(); method public void setKeyProgressIncrement(int); method public void setSplitTrack(boolean); method public void setThumb(android.graphics.drawable.Drawable); method public void setThumbOffset(int); + method public void setThumbTintBlendMode(@Nullable android.graphics.BlendMode); method public void setThumbTintList(@Nullable android.content.res.ColorStateList); method public void setThumbTintMode(@Nullable android.graphics.PorterDuff.Mode); method public void setTickMark(android.graphics.drawable.Drawable); + method public void setTickMarkTintBlendMode(@Nullable android.graphics.BlendMode); method public void setTickMarkTintList(@Nullable android.content.res.ColorStateList); method public void setTickMarkTintMode(@Nullable android.graphics.PorterDuff.Mode); } @@ -55262,11 +55266,13 @@ package android.widget { ctor public CheckedTextView(android.content.Context, android.util.AttributeSet, int); ctor public CheckedTextView(android.content.Context, android.util.AttributeSet, int, int); method public android.graphics.drawable.Drawable getCheckMarkDrawable(); + method @Nullable public android.graphics.BlendMode getCheckMarkTintBlendMode(); method @Nullable public android.content.res.ColorStateList getCheckMarkTintList(); method @Nullable public android.graphics.PorterDuff.Mode getCheckMarkTintMode(); method @android.view.ViewDebug.ExportedProperty public boolean isChecked(); method public void setCheckMarkDrawable(@DrawableRes int); method public void setCheckMarkDrawable(@Nullable android.graphics.drawable.Drawable); + method public void setCheckMarkTintBlendMode(@Nullable android.graphics.BlendMode); method public void setCheckMarkTintList(@Nullable android.content.res.ColorStateList); method public void setCheckMarkTintMode(@Nullable android.graphics.PorterDuff.Mode); method public void setChecked(boolean); @@ -55301,11 +55307,13 @@ package android.widget { ctor public CompoundButton(android.content.Context, android.util.AttributeSet, int); ctor public CompoundButton(android.content.Context, android.util.AttributeSet, int, int); method @Nullable public android.graphics.drawable.Drawable getButtonDrawable(); + method @Nullable public android.graphics.BlendMode getButtonTintBlendMode(); method @Nullable public android.content.res.ColorStateList getButtonTintList(); method @Nullable public android.graphics.PorterDuff.Mode getButtonTintMode(); method @android.view.ViewDebug.ExportedProperty public boolean isChecked(); method public void setButtonDrawable(@DrawableRes int); method public void setButtonDrawable(@Nullable android.graphics.drawable.Drawable); + method public void setButtonTintBlendMode(@Nullable android.graphics.BlendMode); method public void setButtonTintList(@Nullable android.content.res.ColorStateList); method public void setButtonTintMode(@Nullable android.graphics.PorterDuff.Mode); method public void setChecked(boolean); @@ -55794,6 +55802,7 @@ package android.widget { method public android.graphics.drawable.Drawable getDrawable(); method public int getImageAlpha(); method public android.graphics.Matrix getImageMatrix(); + method @Nullable public android.graphics.BlendMode getImageTintBlendMode(); method @Nullable public android.content.res.ColorStateList getImageTintList(); method @Nullable public android.graphics.PorterDuff.Mode getImageTintMode(); method public int getMaxHeight(); @@ -55817,6 +55826,7 @@ package android.widget { method public void setImageMatrix(android.graphics.Matrix); method public void setImageResource(@DrawableRes int); method public void setImageState(int[], boolean); + method public void setImageTintBlendMode(@Nullable android.graphics.BlendMode); method public void setImageTintList(@Nullable android.content.res.ColorStateList); method public void setImageTintMode(@Nullable android.graphics.PorterDuff.Mode); method public void setImageURI(@Nullable android.net.Uri); @@ -56270,6 +56280,7 @@ package android.widget { ctor public ProgressBar(android.content.Context, android.util.AttributeSet, int, int); method @Nullable public android.graphics.drawable.Drawable getCurrentDrawable(); method public android.graphics.drawable.Drawable getIndeterminateDrawable(); + method @Nullable public android.graphics.BlendMode getIndeterminateTintBlendMode(); method @Nullable public android.content.res.ColorStateList getIndeterminateTintList(); method @Nullable public android.graphics.PorterDuff.Mode getIndeterminateTintMode(); method public android.view.animation.Interpolator getInterpolator(); @@ -56280,12 +56291,15 @@ package android.widget { method @Px public int getMinHeight(); method @Px public int getMinWidth(); method @android.view.ViewDebug.ExportedProperty(category="progress") public int getProgress(); + method @Nullable public android.graphics.BlendMode getProgressBackgroundTintBlendMode(); method @Nullable public android.content.res.ColorStateList getProgressBackgroundTintList(); method @Nullable public android.graphics.PorterDuff.Mode getProgressBackgroundTintMode(); method public android.graphics.drawable.Drawable getProgressDrawable(); + method @Nullable public android.graphics.BlendMode getProgressTintBlendMode(); method @Nullable public android.content.res.ColorStateList getProgressTintList(); method @Nullable public android.graphics.PorterDuff.Mode getProgressTintMode(); method @android.view.ViewDebug.ExportedProperty(category="progress") public int getSecondaryProgress(); + method @Nullable public android.graphics.BlendMode getSecondaryProgressTintBlendMode(); method @Nullable public android.content.res.ColorStateList getSecondaryProgressTintList(); method @Nullable public android.graphics.PorterDuff.Mode getSecondaryProgressTintMode(); method public final void incrementProgressBy(int); @@ -56297,6 +56311,7 @@ package android.widget { method public void setIndeterminate(boolean); method public void setIndeterminateDrawable(android.graphics.drawable.Drawable); method public void setIndeterminateDrawableTiled(android.graphics.drawable.Drawable); + method public void setIndeterminateTintBlendMode(@Nullable android.graphics.BlendMode); method public void setIndeterminateTintList(@Nullable android.content.res.ColorStateList); method public void setIndeterminateTintMode(@Nullable android.graphics.PorterDuff.Mode); method public void setInterpolator(android.content.Context, @InterpolatorRes int); @@ -56309,13 +56324,16 @@ package android.widget { method public void setMinWidth(@Px int); method public void setProgress(int); method public void setProgress(int, boolean); + method public void setProgressBackgroundTintBlendMode(@Nullable android.graphics.BlendMode); method public void setProgressBackgroundTintList(@Nullable android.content.res.ColorStateList); method public void setProgressBackgroundTintMode(@Nullable android.graphics.PorterDuff.Mode); method public void setProgressDrawable(android.graphics.drawable.Drawable); method public void setProgressDrawableTiled(android.graphics.drawable.Drawable); + method public void setProgressTintBlendMode(@Nullable android.graphics.BlendMode); method public void setProgressTintList(@Nullable android.content.res.ColorStateList); method public void setProgressTintMode(@Nullable android.graphics.PorterDuff.Mode); method public void setSecondaryProgress(int); + method public void setSecondaryProgressTintBlendMode(@Nullable android.graphics.BlendMode); method public void setSecondaryProgressTintList(@Nullable android.content.res.ColorStateList); method public void setSecondaryProgressTintMode(@Nullable android.graphics.PorterDuff.Mode); } @@ -56864,9 +56882,11 @@ package android.widget { method public CharSequence getTextOn(); method public android.graphics.drawable.Drawable getThumbDrawable(); method public int getThumbTextPadding(); + method @Nullable public android.graphics.BlendMode getThumbTintBlendMode(); method @Nullable public android.content.res.ColorStateList getThumbTintList(); method @Nullable public android.graphics.PorterDuff.Mode getThumbTintMode(); method public android.graphics.drawable.Drawable getTrackDrawable(); + method @Nullable public android.graphics.BlendMode getTrackTintBlendMode(); method @Nullable public android.content.res.ColorStateList getTrackTintList(); method @Nullable public android.graphics.PorterDuff.Mode getTrackTintMode(); method public void onMeasure(int, int); @@ -56882,10 +56902,12 @@ package android.widget { method public void setThumbDrawable(android.graphics.drawable.Drawable); method public void setThumbResource(@DrawableRes int); method public void setThumbTextPadding(int); + method public void setThumbTintBlendMode(@Nullable android.graphics.BlendMode); method public void setThumbTintList(@Nullable android.content.res.ColorStateList); method public void setThumbTintMode(@Nullable android.graphics.PorterDuff.Mode); method public void setTrackDrawable(android.graphics.drawable.Drawable); method public void setTrackResource(@DrawableRes int); + method public void setTrackTintBlendMode(@Nullable android.graphics.BlendMode); method public void setTrackTintList(@Nullable android.content.res.ColorStateList); method public void setTrackTintMode(@Nullable android.graphics.PorterDuff.Mode); } @@ -57043,6 +57065,7 @@ package android.widget { method public int getAutoSizeTextType(); method public int getBreakStrategy(); method public int getCompoundDrawablePadding(); + method @Nullable public android.graphics.BlendMode getCompoundDrawableTintBlendMode(); method public android.content.res.ColorStateList getCompoundDrawableTintList(); method public android.graphics.PorterDuff.Mode getCompoundDrawableTintMode(); method @NonNull public android.graphics.drawable.Drawable[] getCompoundDrawables(); @@ -57168,6 +57191,7 @@ package android.widget { method public void setAutoSizeTextTypeWithDefaults(int); method public void setBreakStrategy(int); method public void setCompoundDrawablePadding(int); + method public void setCompoundDrawableTintBlendMode(@Nullable android.graphics.BlendMode); method public void setCompoundDrawableTintList(@Nullable android.content.res.ColorStateList); method public void setCompoundDrawableTintMode(@Nullable android.graphics.PorterDuff.Mode); method public void setCompoundDrawables(@Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable, @Nullable android.graphics.drawable.Drawable); diff --git a/core/java/android/view/MenuInflater.java b/core/java/android/view/MenuInflater.java index 8b3b10f48a4..b6b11ab9249 100644 --- a/core/java/android/view/MenuInflater.java +++ b/core/java/android/view/MenuInflater.java @@ -488,7 +488,7 @@ public class MenuInflater { } if (mItemIconBlendMode != null) { - item.setIconTintMode(mItemIconBlendMode); + item.setIconTintBlendMode(mItemIconBlendMode); } if (itemIconTintList != null) { diff --git a/core/java/android/view/MenuItem.java b/core/java/android/view/MenuItem.java index 37853103ce0..a2fb596f743 100644 --- a/core/java/android/view/MenuItem.java +++ b/core/java/android/view/MenuItem.java @@ -270,11 +270,8 @@ public interface MenuItem { * @attr ref android.R.styleable#MenuItem_iconTintMode * @see #setIconTintList(ColorStateList) * @see Drawable#setTintMode(PorterDuff.Mode) - * @see Drawable#setTintMode(BlendMode) - * - * @deprecated use {@link #setIconTintMode(BlendMode)} instead + * @see Drawable#setTintBlendMode(BlendMode) */ - @Deprecated default @NonNull MenuItem setIconTintMode(@Nullable PorterDuff.Mode tintMode) { return this; } @@ -289,7 +286,7 @@ public interface MenuItem { * @attr ref android.R.styleable#MenuItem_iconTintMode * @see #setIconTintList(ColorStateList) */ - default @NonNull MenuItem setIconTintMode(@Nullable BlendMode blendMode) { + default @NonNull MenuItem setIconTintBlendMode(@Nullable BlendMode blendMode) { PorterDuff.Mode mode = BlendMode.blendModeToPorterDuffMode(blendMode); if (mode != null) { return setIconTintMode(mode); @@ -304,11 +301,9 @@ public interface MenuItem { * @return the blending mode used to apply the tint to this item's icon * @attr ref android.R.styleable#MenuItem_iconTintMode * @see #setIconTintMode(PorterDuff.Mode) - * @see #setIconTintMode(BlendMode) + * @see #setIconTintBlendMode(BlendMode) * - * @deprecated Use {@link #getIconTintBlendMode()} instead */ - @Deprecated @Nullable public default PorterDuff.Mode getIconTintMode() { return null; } @@ -317,7 +312,7 @@ public interface MenuItem { * * @return the blending mode used to apply the tint to this item's icon * @attr ref android.R.styleable#MenuItem_iconTintMode - * @see #setIconTintMode(BlendMode) + * @see #setIconTintBlendMode(BlendMode) * */ @Nullable diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 096c988c8cf..10f9d38c3c6 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -5608,7 +5608,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, break; case R.styleable.View_foregroundTintMode: if (targetSdkVersion >= Build.VERSION_CODES.M || this instanceof FrameLayout) { - setForegroundTintMode(Drawable.parseBlendMode(a.getInt(attr, -1), null)); + setForegroundTintBlendMode( + Drawable.parseBlendMode(a.getInt(attr, -1), + null)); } break; case R.styleable.View_foregroundTint: @@ -22873,17 +22875,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @attr ref android.R.styleable#View_backgroundTintMode * @see #getBackgroundTintMode() * @see Drawable#setTintMode(PorterDuff.Mode) - * - * @deprecated use @setBackgroundTintMode(BlendMode) instead */ - @Deprecated public void setBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { BlendMode mode = null; if (tintMode != null) { mode = BlendMode.fromValue(tintMode.nativeInt); } - setBackgroundTintMode(mode); + setBackgroundTintBlendMode(mode); } /** @@ -22895,9 +22894,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * {@code null} to clear tint * @attr ref android.R.styleable#View_backgroundTintMode * @see #getBackgroundTintMode() - * @see Drawable#setTintMode(BlendMode) + * @see Drawable#setTintBlendMode(BlendMode) */ - public void setBackgroundTintMode(@Nullable BlendMode blendMode) { + public void setBackgroundTintBlendMode(@Nullable BlendMode blendMode) { if (mBackgroundTint == null) { mBackgroundTint = new TintInfo(); } @@ -22915,13 +22914,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @return the blending mode used to apply the tint to the background * drawable * @attr ref android.R.styleable#View_backgroundTintMode - * @see #setBackgroundTintMode(BlendMode) + * @see #setBackgroundTintBlendMode(BlendMode) * - * @deprecated use #getBackgroundBlendMode() instead */ @Nullable @InspectableProperty - @Deprecated public PorterDuff.Mode getBackgroundTintMode() { PorterDuff.Mode porterDuffMode; if (mBackgroundTint != null && mBackgroundTint.mBlendMode != null) { @@ -22939,9 +22936,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @return the blending mode used to apply the tint to the background * drawable, null if no blend has previously been configured * @attr ref android.R.styleable#View_backgroundTintMode - * @see #setBackgroundTintMode(BlendMode) + * @see #setBackgroundTintBlendMode(BlendMode) */ - public @Nullable BlendMode getBackgroundBlendMode() { + public @Nullable BlendMode getBackgroundTintBlendMode() { return mBackgroundTint != null ? mBackgroundTint.mBlendMode : null; } @@ -22956,7 +22953,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } if (tintInfo.mHasTintMode) { - mBackground.setTintMode(tintInfo.mBlendMode); + mBackground.setTintBlendMode(tintInfo.mBlendMode); } // The drawable (or one of its children) may not have been @@ -23141,15 +23138,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @see #getForegroundTintMode() * @see Drawable#setTintMode(PorterDuff.Mode) * - * @deprecated use #setForegroundTintMode(BlendMode) */ - @Deprecated public void setForegroundTintMode(@Nullable PorterDuff.Mode tintMode) { BlendMode mode = null; if (tintMode != null) { mode = BlendMode.fromValue(tintMode.nativeInt); } - setForegroundTintMode(mode); + setForegroundTintBlendMode(mode); } /** @@ -23161,9 +23156,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * {@code null} to clear tint * @attr ref android.R.styleable#View_foregroundTintMode * @see #getForegroundTintMode() - * @see Drawable#setTintMode(BlendMode) + * @see Drawable#setTintBlendMode(BlendMode) */ - public void setForegroundTintMode(@Nullable BlendMode blendMode) { + public void setForegroundTintBlendMode(@Nullable BlendMode blendMode) { if (mForegroundInfo == null) { mForegroundInfo = new ForegroundInfo(); } @@ -23184,12 +23179,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * drawable * @attr ref android.R.styleable#View_foregroundTintMode * @see #setForegroundTintMode(PorterDuff.Mode) - * - * @deprecated use #getForegroundBlendMode() instead */ @InspectableProperty @Nullable - @Deprecated public PorterDuff.Mode getForegroundTintMode() { BlendMode blendMode = mForegroundInfo != null && mForegroundInfo.mTintInfo != null ? mForegroundInfo.mTintInfo.mBlendMode : null; @@ -23207,10 +23199,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @return the blending mode used to apply the tint to the foreground * drawable * @attr ref android.R.styleable#View_foregroundTintMode - * @see #setForegroundTintMode(BlendMode) + * @see #setForegroundTintBlendMode(BlendMode) * */ - public @Nullable BlendMode getForegroundBlendMode() { + public @Nullable BlendMode getForegroundTintBlendMode() { return mForegroundInfo != null && mForegroundInfo.mTintInfo != null ? mForegroundInfo.mTintInfo.mBlendMode : null; } @@ -23227,7 +23219,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } if (tintInfo.mHasTintMode) { - mForegroundInfo.mDrawable.setTintMode(tintInfo.mBlendMode); + mForegroundInfo.mDrawable.setTintBlendMode(tintInfo.mBlendMode); } // The drawable (or one of its children) may not have been diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java index cd5f2e222b3..18c6abb3f5f 100644 --- a/core/java/android/widget/AbsSeekBar.java +++ b/core/java/android/widget/AbsSeekBar.java @@ -22,6 +22,7 @@ import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.graphics.BlendMode; import android.graphics.Canvas; import android.graphics.Insets; import android.graphics.PorterDuff; @@ -48,15 +49,15 @@ public abstract class AbsSeekBar extends ProgressBar { @UnsupportedAppUsage private Drawable mThumb; private ColorStateList mThumbTintList = null; - private PorterDuff.Mode mThumbTintMode = null; + private BlendMode mThumbBlendMode = null; private boolean mHasThumbTint = false; - private boolean mHasThumbTintMode = false; + private boolean mHasThumbBlendMode = false; private Drawable mTickMark; private ColorStateList mTickMarkTintList = null; - private PorterDuff.Mode mTickMarkTintMode = null; + private BlendMode mTickMarkBlendMode = null; private boolean mHasTickMarkTint = false; - private boolean mHasTickMarkTintMode = false; + private boolean mHasTickMarkBlendMode = false; private int mThumbOffset; @UnsupportedAppUsage @@ -114,9 +115,9 @@ public abstract class AbsSeekBar extends ProgressBar { setThumb(thumb); if (a.hasValue(R.styleable.SeekBar_thumbTintMode)) { - mThumbTintMode = Drawable.parseTintMode(a.getInt( - R.styleable.SeekBar_thumbTintMode, -1), mThumbTintMode); - mHasThumbTintMode = true; + mThumbBlendMode = Drawable.parseBlendMode(a.getInt( + R.styleable.SeekBar_thumbTintMode, -1), mThumbBlendMode); + mHasThumbBlendMode = true; } if (a.hasValue(R.styleable.SeekBar_thumbTint)) { @@ -128,9 +129,9 @@ public abstract class AbsSeekBar extends ProgressBar { setTickMark(tickMark); if (a.hasValue(R.styleable.SeekBar_tickMarkTintMode)) { - mTickMarkTintMode = Drawable.parseTintMode(a.getInt( - R.styleable.SeekBar_tickMarkTintMode, -1), mTickMarkTintMode); - mHasTickMarkTintMode = true; + mTickMarkBlendMode = Drawable.parseBlendMode(a.getInt( + R.styleable.SeekBar_tickMarkTintMode, -1), mTickMarkBlendMode); + mHasTickMarkBlendMode = true; } if (a.hasValue(R.styleable.SeekBar_tickMarkTint)) { @@ -274,9 +275,25 @@ public abstract class AbsSeekBar extends ProgressBar { * @see Drawable#setTintMode(PorterDuff.Mode) */ public void setThumbTintMode(@Nullable PorterDuff.Mode tintMode) { - mThumbTintMode = tintMode; - mHasThumbTintMode = true; + setThumbTintBlendMode(tintMode != null ? BlendMode.fromValue(tintMode.nativeInt) : + null); + } + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setThumbTintList(ColorStateList)}} to the thumb drawable. The + * default mode is {@link BlendMode#SRC_IN}. + * + * @param blendMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * + * @attr ref android.R.styleable#SeekBar_thumbTintMode + * @see #getThumbTintMode() + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setThumbTintBlendMode(@Nullable BlendMode blendMode) { + mThumbBlendMode = blendMode; + mHasThumbBlendMode = true; applyThumbTint(); } @@ -291,19 +308,33 @@ public abstract class AbsSeekBar extends ProgressBar { @InspectableProperty @Nullable public PorterDuff.Mode getThumbTintMode() { - return mThumbTintMode; + return mThumbBlendMode != null + ? BlendMode.blendModeToPorterDuffMode(mThumbBlendMode) : null; + } + + /** + * Returns the blending mode used to apply the tint to the thumb drawable, + * if specified. + * + * @return the blending mode used to apply the tint to the thumb drawable + * @attr ref android.R.styleable#SeekBar_thumbTintMode + * @see #setThumbTintBlendMode(BlendMode) + */ + @Nullable + public BlendMode getThumbTintBlendMode() { + return mThumbBlendMode; } private void applyThumbTint() { - if (mThumb != null && (mHasThumbTint || mHasThumbTintMode)) { + if (mThumb != null && (mHasThumbTint || mHasThumbBlendMode)) { mThumb = mThumb.mutate(); if (mHasThumbTint) { mThumb.setTintList(mThumbTintList); } - if (mHasThumbTintMode) { - mThumb.setTintMode(mThumbTintMode); + if (mHasThumbBlendMode) { + mThumb.setTintBlendMode(mThumbBlendMode); } // The drawable (or one of its children) may not have been @@ -430,8 +461,24 @@ public abstract class AbsSeekBar extends ProgressBar { * @see Drawable#setTintMode(PorterDuff.Mode) */ public void setTickMarkTintMode(@Nullable PorterDuff.Mode tintMode) { - mTickMarkTintMode = tintMode; - mHasTickMarkTintMode = true; + setTickMarkTintBlendMode(tintMode != null ? BlendMode.fromValue(tintMode.nativeInt) : null); + } + + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setTickMarkTintList(ColorStateList)}} to the tick mark drawable. The + * default mode is {@link BlendMode#SRC_IN}. + * + * @param blendMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * + * @attr ref android.R.styleable#SeekBar_tickMarkTintMode + * @see #getTickMarkTintMode() + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setTickMarkTintBlendMode(@Nullable BlendMode blendMode) { + mTickMarkBlendMode = blendMode; + mHasTickMarkBlendMode = true; applyTickMarkTint(); } @@ -447,19 +494,34 @@ public abstract class AbsSeekBar extends ProgressBar { @InspectableProperty @Nullable public PorterDuff.Mode getTickMarkTintMode() { - return mTickMarkTintMode; + return mTickMarkBlendMode != null + ? BlendMode.blendModeToPorterDuffMode(mTickMarkBlendMode) : null; + } + + /** + * Returns the blending mode used to apply the tint to the tick mark drawable, + * if specified. + * + * @return the blending mode used to apply the tint to the tick mark drawable + * @attr ref android.R.styleable#SeekBar_tickMarkTintMode + * @see #setTickMarkTintMode(PorterDuff.Mode) + */ + @InspectableProperty(attributeId = android.R.styleable.SeekBar_tickMarkTintMode) + @Nullable + public BlendMode getTickMarkTintBlendMode() { + return mTickMarkBlendMode; } private void applyTickMarkTint() { - if (mTickMark != null && (mHasTickMarkTint || mHasTickMarkTintMode)) { + if (mTickMark != null && (mHasTickMarkTint || mHasTickMarkBlendMode)) { mTickMark = mTickMark.mutate(); if (mHasTickMarkTint) { mTickMark.setTintList(mTickMarkTintList); } - if (mHasTickMarkTintMode) { - mTickMark.setTintMode(mTickMarkTintMode); + if (mHasTickMarkBlendMode) { + mTickMark.setTintBlendMode(mTickMarkBlendMode); } // The drawable (or one of its children) may not have been diff --git a/core/java/android/widget/CheckedTextView.java b/core/java/android/widget/CheckedTextView.java index a211b4686f4..8b70f41f050 100644 --- a/core/java/android/widget/CheckedTextView.java +++ b/core/java/android/widget/CheckedTextView.java @@ -23,6 +23,7 @@ import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.graphics.BlendMode; import android.graphics.Canvas; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; @@ -58,7 +59,7 @@ public class CheckedTextView extends TextView implements Checkable { @UnsupportedAppUsage private Drawable mCheckMarkDrawable; private ColorStateList mCheckMarkTintList = null; - private PorterDuff.Mode mCheckMarkTintMode = null; + private BlendMode mCheckMarkBlendMode = null; private boolean mHasCheckMarkTint = false; private boolean mHasCheckMarkTintMode = false; @@ -99,8 +100,9 @@ public class CheckedTextView extends TextView implements Checkable { } if (a.hasValue(R.styleable.CheckedTextView_checkMarkTintMode)) { - mCheckMarkTintMode = Drawable.parseTintMode(a.getInt( - R.styleable.CheckedTextView_checkMarkTintMode, -1), mCheckMarkTintMode); + mCheckMarkBlendMode = Drawable.parseBlendMode(a.getInt( + R.styleable.CheckedTextView_checkMarkTintMode, -1), + mCheckMarkBlendMode); mHasCheckMarkTintMode = true; } @@ -259,7 +261,23 @@ public class CheckedTextView extends TextView implements Checkable { * @see Drawable#setTintMode(PorterDuff.Mode) */ public void setCheckMarkTintMode(@Nullable PorterDuff.Mode tintMode) { - mCheckMarkTintMode = tintMode; + setCheckMarkTintBlendMode(tintMode != null + ? BlendMode.fromValue(tintMode.nativeInt) : null); + } + + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setCheckMarkTintList(ColorStateList)} to the check mark + * drawable. The default mode is {@link PorterDuff.Mode#SRC_IN}. + * + * @param tintMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * @attr ref android.R.styleable#CheckedTextView_checkMarkTintMode + * @see #setCheckMarkTintList(ColorStateList) + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setCheckMarkTintBlendMode(@Nullable BlendMode tintMode) { + mCheckMarkBlendMode = tintMode; mHasCheckMarkTintMode = true; applyCheckMarkTint(); @@ -277,7 +295,23 @@ public class CheckedTextView extends TextView implements Checkable { @InspectableProperty @Nullable public PorterDuff.Mode getCheckMarkTintMode() { - return mCheckMarkTintMode; + return mCheckMarkBlendMode != null + ? BlendMode.blendModeToPorterDuffMode(mCheckMarkBlendMode) : null; + } + + /** + * Returns the blending mode used to apply the tint to the check mark + * drawable, if specified. + * + * @return the blending mode used to apply the tint to the check mark + * drawable + * @attr ref android.R.styleable#CheckedTextView_checkMarkTintMode + * @see #setCheckMarkTintMode(PorterDuff.Mode) + */ + @InspectableProperty(attributeId = android.R.styleable.CheckedTextView_checkMarkTintMode) + @Nullable + public BlendMode getCheckMarkTintBlendMode() { + return mCheckMarkBlendMode; } private void applyCheckMarkTint() { @@ -289,7 +323,7 @@ public class CheckedTextView extends TextView implements Checkable { } if (mHasCheckMarkTintMode) { - mCheckMarkDrawable.setTintMode(mCheckMarkTintMode); + mCheckMarkDrawable.setTintBlendMode(mCheckMarkBlendMode); } // The drawable (or one of its children) may not have been diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java index 80ec1c65293..2674ca4d159 100644 --- a/core/java/android/widget/CompoundButton.java +++ b/core/java/android/widget/CompoundButton.java @@ -23,6 +23,7 @@ import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.graphics.BlendMode; import android.graphics.Canvas; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; @@ -67,9 +68,9 @@ public abstract class CompoundButton extends Button implements Checkable { @UnsupportedAppUsage private Drawable mButtonDrawable; private ColorStateList mButtonTintList = null; - private PorterDuff.Mode mButtonTintMode = null; + private BlendMode mButtonBlendMode = null; private boolean mHasButtonTint = false; - private boolean mHasButtonTintMode = false; + private boolean mHasButtonBlendMode = false; @UnsupportedAppUsage private OnCheckedChangeListener mOnCheckedChangeListener; @@ -109,9 +110,9 @@ public abstract class CompoundButton extends Button implements Checkable { } if (a.hasValue(R.styleable.CompoundButton_buttonTintMode)) { - mButtonTintMode = Drawable.parseTintMode(a.getInt( - R.styleable.CompoundButton_buttonTintMode, -1), mButtonTintMode); - mHasButtonTintMode = true; + mButtonBlendMode = Drawable.parseBlendMode(a.getInt( + R.styleable.CompoundButton_buttonTintMode, -1), mButtonBlendMode); + mHasButtonBlendMode = true; } if (a.hasValue(R.styleable.CompoundButton_buttonTint)) { @@ -337,8 +338,23 @@ public abstract class CompoundButton extends Button implements Checkable { * @see Drawable#setTintMode(PorterDuff.Mode) */ public void setButtonTintMode(@Nullable PorterDuff.Mode tintMode) { - mButtonTintMode = tintMode; - mHasButtonTintMode = true; + setButtonTintBlendMode(tintMode != null ? BlendMode.fromValue(tintMode.nativeInt) : null); + } + + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setButtonTintList(ColorStateList)}} to the button drawable. The + * default mode is {@link PorterDuff.Mode#SRC_IN}. + * + * @param tintMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * @attr ref android.R.styleable#CompoundButton_buttonTintMode + * @see #getButtonTintMode() + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setButtonTintBlendMode(@Nullable BlendMode tintMode) { + mButtonBlendMode = tintMode; + mHasButtonBlendMode = true; applyButtonTint(); } @@ -348,22 +364,35 @@ public abstract class CompoundButton extends Button implements Checkable { * @attr ref android.R.styleable#CompoundButton_buttonTintMode * @see #setButtonTintMode(PorterDuff.Mode) */ - @InspectableProperty + @InspectableProperty(name = "buttonTintMode") @Nullable public PorterDuff.Mode getButtonTintMode() { - return mButtonTintMode; + return mButtonBlendMode != null ? BlendMode.blendModeToPorterDuffMode(mButtonBlendMode) : + null; + } + + /** + * @return the blending mode used to apply the tint to the button drawable + * @attr ref android.R.styleable#CompoundButton_buttonTintMode + * @see #setButtonTintBlendMode(BlendMode) + */ + @InspectableProperty(name = "buttonBlendMode", + attributeId = R.styleable.CompoundButton_buttonTintMode) + @Nullable + public BlendMode getButtonTintBlendMode() { + return mButtonBlendMode; } private void applyButtonTint() { - if (mButtonDrawable != null && (mHasButtonTint || mHasButtonTintMode)) { + if (mButtonDrawable != null && (mHasButtonTint || mHasButtonBlendMode)) { mButtonDrawable = mButtonDrawable.mutate(); if (mHasButtonTint) { mButtonDrawable.setTintList(mButtonTintList); } - if (mHasButtonTintMode) { - mButtonDrawable.setTintMode(mButtonTintMode); + if (mHasButtonBlendMode) { + mButtonDrawable.setTintBlendMode(mButtonBlendMode); } // The drawable (or one of its children) may not have been diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index 9ae62ef8ab7..be5d2211c67 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -27,6 +27,7 @@ import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; +import android.graphics.BlendMode; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.ImageDecoder; @@ -127,9 +128,9 @@ public class ImageView extends View { @UnsupportedAppUsage private BitmapDrawable mRecycleableBitmapDrawable = null; private ColorStateList mDrawableTintList = null; - private PorterDuff.Mode mDrawableTintMode = null; + private BlendMode mDrawableBlendMode = null; private boolean mHasDrawableTint = false; - private boolean mHasDrawableTintMode = false; + private boolean mHasDrawableBlendMode = false; private int[] mState = null; private boolean mMergeState = false; @@ -226,14 +227,14 @@ public class ImageView extends View { // Prior to L, this attribute would always set a color filter with // blending mode SRC_ATOP. Preserve that default behavior. - mDrawableTintMode = PorterDuff.Mode.SRC_ATOP; - mHasDrawableTintMode = true; + mDrawableBlendMode = BlendMode.SRC_ATOP; + mHasDrawableBlendMode = true; } if (a.hasValue(R.styleable.ImageView_tintMode)) { - mDrawableTintMode = Drawable.parseTintMode(a.getInt( - R.styleable.ImageView_tintMode, -1), mDrawableTintMode); - mHasDrawableTintMode = true; + mDrawableBlendMode = Drawable.parseBlendMode(a.getInt( + R.styleable.ImageView_tintMode, -1), mDrawableBlendMode); + mHasDrawableBlendMode = true; } applyImageTint(); @@ -674,8 +675,23 @@ public class ImageView extends View { * @see Drawable#setTintMode(PorterDuff.Mode) */ public void setImageTintMode(@Nullable PorterDuff.Mode tintMode) { - mDrawableTintMode = tintMode; - mHasDrawableTintMode = true; + setImageTintBlendMode(tintMode != null ? BlendMode.fromValue(tintMode.nativeInt) : null); + } + + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setImageTintList(ColorStateList)}} to the image drawable. The default + * mode is {@link BlendMode#SRC_IN}. + * + * @param blendMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * @attr ref android.R.styleable#ImageView_tintMode + * @see #getImageTintMode() + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setImageTintBlendMode(@Nullable BlendMode blendMode) { + mDrawableBlendMode = blendMode; + mHasDrawableBlendMode = true; applyImageTint(); } @@ -689,19 +705,32 @@ public class ImageView extends View { @Nullable @InspectableProperty(name = "tintMode") public PorterDuff.Mode getImageTintMode() { - return mDrawableTintMode; + return mDrawableBlendMode != null + ? BlendMode.blendModeToPorterDuffMode(mDrawableBlendMode) : null; + } + + /** + * Gets the blending mode used to apply the tint to the image Drawable + * @return the blending mode used to apply the tint to the image Drawable + * @attr ref android.R.styleable#ImageView_tintMode + * @see #setImageTintBlendMode(BlendMode) + */ + @Nullable + @InspectableProperty(name = "blendMode", attributeId = android.R.styleable.ImageView_tintMode) + public BlendMode getImageTintBlendMode() { + return mDrawableBlendMode; } private void applyImageTint() { - if (mDrawable != null && (mHasDrawableTint || mHasDrawableTintMode)) { + if (mDrawable != null && (mHasDrawableTint || mHasDrawableBlendMode)) { mDrawable = mDrawable.mutate(); if (mHasDrawableTint) { mDrawable.setTintList(mDrawableTintList); } - if (mHasDrawableTintMode) { - mDrawable.setTintMode(mDrawableTintMode); + if (mHasDrawableBlendMode) { + mDrawable.setTintBlendMode(mDrawableBlendMode); } // The drawable (or one of its children) may not have been diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java index 0b433b1f9dc..2e957434569 100644 --- a/core/java/android/widget/ProgressBar.java +++ b/core/java/android/widget/ProgressBar.java @@ -25,6 +25,7 @@ import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.graphics.BlendMode; import android.graphics.Canvas; import android.graphics.PorterDuff; import android.graphics.Rect; @@ -334,7 +335,7 @@ public class ProgressBar extends View { if (mProgressTintInfo == null) { mProgressTintInfo = new ProgressTintInfo(); } - mProgressTintInfo.mProgressTintMode = Drawable.parseTintMode(a.getInt( + mProgressTintInfo.mProgressBlendMode = Drawable.parseBlendMode(a.getInt( R.styleable.ProgressBar_progressTintMode, -1), null); mProgressTintInfo.mHasProgressTintMode = true; } @@ -352,7 +353,7 @@ public class ProgressBar extends View { if (mProgressTintInfo == null) { mProgressTintInfo = new ProgressTintInfo(); } - mProgressTintInfo.mProgressBackgroundTintMode = Drawable.parseTintMode(a.getInt( + mProgressTintInfo.mProgressBackgroundBlendMode = Drawable.parseBlendMode(a.getInt( R.styleable.ProgressBar_progressBackgroundTintMode, -1), null); mProgressTintInfo.mHasProgressBackgroundTintMode = true; } @@ -370,7 +371,7 @@ public class ProgressBar extends View { if (mProgressTintInfo == null) { mProgressTintInfo = new ProgressTintInfo(); } - mProgressTintInfo.mSecondaryProgressTintMode = Drawable.parseTintMode( + mProgressTintInfo.mSecondaryProgressBlendMode = Drawable.parseBlendMode( a.getInt(R.styleable.ProgressBar_secondaryProgressTintMode, -1), null); mProgressTintInfo.mHasSecondaryProgressTintMode = true; } @@ -388,7 +389,7 @@ public class ProgressBar extends View { if (mProgressTintInfo == null) { mProgressTintInfo = new ProgressTintInfo(); } - mProgressTintInfo.mIndeterminateTintMode = Drawable.parseTintMode(a.getInt( + mProgressTintInfo.mIndeterminateBlendMode = Drawable.parseBlendMode(a.getInt( R.styleable.ProgressBar_indeterminateTintMode, -1), null); mProgressTintInfo.mHasIndeterminateTintMode = true; } @@ -796,12 +797,29 @@ public class ProgressBar extends View { * @attr ref android.R.styleable#ProgressBar_indeterminateTintMode * @see #setIndeterminateTintList(ColorStateList) * @see Drawable#setTintMode(PorterDuff.Mode) + * */ public void setIndeterminateTintMode(@Nullable PorterDuff.Mode tintMode) { + setIndeterminateTintBlendMode(tintMode != null + ? BlendMode.fromValue(tintMode.nativeInt) : null); + } + + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setIndeterminateTintList(ColorStateList)} to the indeterminate + * drawable. The default mode is {@link PorterDuff.Mode#SRC_IN}. + * + * @param blendMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * @attr ref android.R.styleable#ProgressBar_indeterminateTintMode + * @see #setIndeterminateTintList(ColorStateList) + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setIndeterminateTintBlendMode(@Nullable BlendMode blendMode) { if (mProgressTintInfo == null) { mProgressTintInfo = new ProgressTintInfo(); } - mProgressTintInfo.mIndeterminateTintMode = tintMode; + mProgressTintInfo.mIndeterminateBlendMode = blendMode; mProgressTintInfo.mHasIndeterminateTintMode = true; applyIndeterminateTint(); @@ -819,7 +837,23 @@ public class ProgressBar extends View { @InspectableProperty @Nullable public PorterDuff.Mode getIndeterminateTintMode() { - return mProgressTintInfo != null ? mProgressTintInfo.mIndeterminateTintMode : null; + BlendMode mode = getIndeterminateTintBlendMode(); + return mode != null ? BlendMode.blendModeToPorterDuffMode(mode) : null; + } + + /** + * Returns the blending mode used to apply the tint to the indeterminate + * drawable, if specified. + * + * @return the blending mode used to apply the tint to the indeterminate + * drawable + * @attr ref android.R.styleable#ProgressBar_indeterminateTintMode + * @see #setIndeterminateTintBlendMode(BlendMode) + */ + @InspectableProperty(attributeId = R.styleable.ProgressBar_indeterminateTintMode) + @Nullable + public BlendMode getIndeterminateTintBlendMode() { + return mProgressTintInfo != null ? mProgressTintInfo.mIndeterminateBlendMode : null; } private void applyIndeterminateTint() { @@ -833,7 +867,7 @@ public class ProgressBar extends View { } if (tintInfo.mHasIndeterminateTintMode) { - mIndeterminateDrawable.setTintMode(tintInfo.mIndeterminateTintMode); + mIndeterminateDrawable.setTintBlendMode(tintInfo.mIndeterminateBlendMode); } // The drawable (or one of its children) may not have been @@ -956,7 +990,7 @@ public class ProgressBar extends View { target.setTintList(mProgressTintInfo.mProgressTintList); } if (mProgressTintInfo.mHasProgressTintMode) { - target.setTintMode(mProgressTintInfo.mProgressTintMode); + target.setTintBlendMode(mProgressTintInfo.mProgressBlendMode); } // The drawable (or one of its children) may not have been @@ -981,7 +1015,7 @@ public class ProgressBar extends View { target.setTintList(mProgressTintInfo.mProgressBackgroundTintList); } if (mProgressTintInfo.mHasProgressBackgroundTintMode) { - target.setTintMode(mProgressTintInfo.mProgressBackgroundTintMode); + target.setTintBlendMode(mProgressTintInfo.mProgressBackgroundBlendMode); } // The drawable (or one of its children) may not have been @@ -1006,7 +1040,7 @@ public class ProgressBar extends View { target.setTintList(mProgressTintInfo.mSecondaryProgressTintList); } if (mProgressTintInfo.mHasSecondaryProgressTintMode) { - target.setTintMode(mProgressTintInfo.mSecondaryProgressTintMode); + target.setTintBlendMode(mProgressTintInfo.mSecondaryProgressBlendMode); } // The drawable (or one of its children) may not have been @@ -1076,10 +1110,25 @@ public class ProgressBar extends View { * @see Drawable#setTintMode(PorterDuff.Mode) */ public void setProgressTintMode(@Nullable PorterDuff.Mode tintMode) { + setProgressTintBlendMode(tintMode != null ? BlendMode.fromValue(tintMode.nativeInt) : null); + } + + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setProgressTintList(ColorStateList)}} to the progress + * indicator. The default mode is {@link PorterDuff.Mode#SRC_IN}. + * + * @param blendMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * @attr ref android.R.styleable#ProgressBar_progressTintMode + * @see #getProgressTintMode() + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setProgressTintBlendMode(@Nullable BlendMode blendMode) { if (mProgressTintInfo == null) { mProgressTintInfo = new ProgressTintInfo(); } - mProgressTintInfo.mProgressTintMode = tintMode; + mProgressTintInfo.mProgressBlendMode = blendMode; mProgressTintInfo.mHasProgressTintMode = true; if (mProgressDrawable != null) { @@ -1099,7 +1148,23 @@ public class ProgressBar extends View { @InspectableProperty @Nullable public PorterDuff.Mode getProgressTintMode() { - return mProgressTintInfo != null ? mProgressTintInfo.mProgressTintMode : null; + BlendMode mode = getProgressTintBlendMode(); + return mode != null ? BlendMode.blendModeToPorterDuffMode(mode) : null; + } + + /** + * Returns the blending mode used to apply the tint to the progress + * drawable, if specified. + * + * @return the blending mode used to apply the tint to the progress + * drawable + * @attr ref android.R.styleable#ProgressBar_progressTintMode + * @see #setProgressTintBlendMode(BlendMode) + */ + @InspectableProperty(attributeId = android.R.styleable.ProgressBar_progressTintMode) + @Nullable + public BlendMode getProgressTintBlendMode() { + return mProgressTintInfo != null ? mProgressTintInfo.mProgressBlendMode : null; } /** @@ -1160,10 +1225,26 @@ public class ProgressBar extends View { * @see Drawable#setTintMode(PorterDuff.Mode) */ public void setProgressBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { + setProgressBackgroundTintBlendMode(tintMode != null + ? BlendMode.fromValue(tintMode.nativeInt) : null); + } + + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setProgressBackgroundTintList(ColorStateList)}} to the progress + * background. The default mode is {@link BlendMode#SRC_IN}. + * + * @param blendMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * @attr ref android.R.styleable#ProgressBar_progressBackgroundTintMode + * @see #setProgressBackgroundTintList(ColorStateList) + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setProgressBackgroundTintBlendMode(@Nullable BlendMode blendMode) { if (mProgressTintInfo == null) { mProgressTintInfo = new ProgressTintInfo(); } - mProgressTintInfo.mProgressBackgroundTintMode = tintMode; + mProgressTintInfo.mProgressBackgroundBlendMode = blendMode; mProgressTintInfo.mHasProgressBackgroundTintMode = true; if (mProgressDrawable != null) { @@ -1180,7 +1261,20 @@ public class ProgressBar extends View { @InspectableProperty @Nullable public PorterDuff.Mode getProgressBackgroundTintMode() { - return mProgressTintInfo != null ? mProgressTintInfo.mProgressBackgroundTintMode : null; + BlendMode mode = getProgressBackgroundTintBlendMode(); + return mode != null ? BlendMode.blendModeToPorterDuffMode(mode) : null; + } + + /** + * @return the blending mode used to apply the tint to the progress + * background + * @attr ref android.R.styleable#ProgressBar_progressBackgroundTintMode + * @see #setProgressBackgroundTintBlendMode(BlendMode) + */ + @InspectableProperty(attributeId = R.styleable.ProgressBar_progressBackgroundTintMode) + @Nullable + public BlendMode getProgressBackgroundTintBlendMode() { + return mProgressTintInfo != null ? mProgressTintInfo.mProgressBackgroundBlendMode : null; } /** @@ -1242,10 +1336,27 @@ public class ProgressBar extends View { * @see Drawable#setTintMode(PorterDuff.Mode) */ public void setSecondaryProgressTintMode(@Nullable PorterDuff.Mode tintMode) { + setSecondaryProgressTintBlendMode(tintMode != null + ? BlendMode.fromValue(tintMode.nativeInt) : null); + } + + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setSecondaryProgressTintList(ColorStateList)}} to the secondary + * progress indicator. The default mode is + * {@link PorterDuff.Mode#SRC_ATOP}. + * + * @param blendMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * @attr ref android.R.styleable#ProgressBar_secondaryProgressTintMode + * @see #setSecondaryProgressTintList(ColorStateList) + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setSecondaryProgressTintBlendMode(@Nullable BlendMode blendMode) { if (mProgressTintInfo == null) { mProgressTintInfo = new ProgressTintInfo(); } - mProgressTintInfo.mSecondaryProgressTintMode = tintMode; + mProgressTintInfo.mSecondaryProgressBlendMode = blendMode; mProgressTintInfo.mHasSecondaryProgressTintMode = true; if (mProgressDrawable != null) { @@ -1265,7 +1376,23 @@ public class ProgressBar extends View { @InspectableProperty @Nullable public PorterDuff.Mode getSecondaryProgressTintMode() { - return mProgressTintInfo != null ? mProgressTintInfo.mSecondaryProgressTintMode : null; + BlendMode mode = getSecondaryProgressTintBlendMode(); + return mode != null ? BlendMode.blendModeToPorterDuffMode(mode) : null; + } + + /** + * Returns the blending mode used to apply the tint to the secondary + * progress drawable, if specified. + * + * @return the blending mode used to apply the tint to the secondary + * progress drawable + * @attr ref android.R.styleable#ProgressBar_secondaryProgressTintMode + * @see #setSecondaryProgressTintBlendMode(BlendMode) + */ + @InspectableProperty(attributeId = android.R.styleable.ProgressBar_secondaryProgressTintMode) + @Nullable + public BlendMode getSecondaryProgressTintBlendMode() { + return mProgressTintInfo != null ? mProgressTintInfo.mSecondaryProgressBlendMode : null; } /** @@ -2208,22 +2335,22 @@ public class ProgressBar extends View { private static class ProgressTintInfo { ColorStateList mIndeterminateTintList; - PorterDuff.Mode mIndeterminateTintMode; + BlendMode mIndeterminateBlendMode; boolean mHasIndeterminateTint; boolean mHasIndeterminateTintMode; ColorStateList mProgressTintList; - PorterDuff.Mode mProgressTintMode; + BlendMode mProgressBlendMode; boolean mHasProgressTint; boolean mHasProgressTintMode; ColorStateList mProgressBackgroundTintList; - PorterDuff.Mode mProgressBackgroundTintMode; + BlendMode mProgressBackgroundBlendMode; boolean mHasProgressBackgroundTint; boolean mHasProgressBackgroundTintMode; ColorStateList mSecondaryProgressTintList; - PorterDuff.Mode mSecondaryProgressTintMode; + BlendMode mSecondaryProgressBlendMode; boolean mHasSecondaryProgressTint; boolean mHasSecondaryProgressTintMode; } diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java index ea9cd421d43..d57b3bc7ad3 100644 --- a/core/java/android/widget/Switch.java +++ b/core/java/android/widget/Switch.java @@ -26,6 +26,7 @@ import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.TypedArray; +import android.graphics.BlendMode; import android.graphics.Canvas; import android.graphics.Insets; import android.graphics.Paint; @@ -98,14 +99,14 @@ public class Switch extends CompoundButton { @UnsupportedAppUsage private Drawable mThumbDrawable; private ColorStateList mThumbTintList = null; - private PorterDuff.Mode mThumbTintMode = null; + private BlendMode mThumbBlendMode = null; private boolean mHasThumbTint = false; private boolean mHasThumbTintMode = false; @UnsupportedAppUsage private Drawable mTrackDrawable; private ColorStateList mTrackTintList = null; - private PorterDuff.Mode mTrackTintMode = null; + private BlendMode mTrackBlendMode = null; private boolean mHasTrackTint = false; private boolean mHasTrackTintMode = false; @@ -268,10 +269,11 @@ public class Switch extends CompoundButton { mThumbTintList = thumbTintList; mHasThumbTint = true; } - PorterDuff.Mode thumbTintMode = Drawable.parseTintMode( - a.getInt(com.android.internal.R.styleable.Switch_thumbTintMode, -1), null); - if (mThumbTintMode != thumbTintMode) { - mThumbTintMode = thumbTintMode; + BlendMode thumbTintMode = Drawable.parseBlendMode( + a.getInt(com.android.internal.R.styleable.Switch_thumbTintMode, -1), + null); + if (mThumbBlendMode != thumbTintMode) { + mThumbBlendMode = thumbTintMode; mHasThumbTintMode = true; } if (mHasThumbTint || mHasThumbTintMode) { @@ -284,10 +286,11 @@ public class Switch extends CompoundButton { mTrackTintList = trackTintList; mHasTrackTint = true; } - PorterDuff.Mode trackTintMode = Drawable.parseTintMode( - a.getInt(com.android.internal.R.styleable.Switch_trackTintMode, -1), null); - if (mTrackTintMode != trackTintMode) { - mTrackTintMode = trackTintMode; + BlendMode trackTintMode = Drawable.parseBlendMode( + a.getInt(com.android.internal.R.styleable.Switch_trackTintMode, -1), + null); + if (mTrackBlendMode != trackTintMode) { + mTrackBlendMode = trackTintMode; mHasTrackTintMode = true; } if (mHasTrackTint || mHasTrackTintMode) { @@ -587,7 +590,22 @@ public class Switch extends CompoundButton { * @see Drawable#setTintMode(PorterDuff.Mode) */ public void setTrackTintMode(@Nullable PorterDuff.Mode tintMode) { - mTrackTintMode = tintMode; + setTrackTintBlendMode(tintMode != null ? BlendMode.fromValue(tintMode.nativeInt) : null); + } + + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setTrackTintList(ColorStateList)}} to the track drawable. + * The default mode is {@link BlendMode#SRC_IN}. + * + * @param blendMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * @attr ref android.R.styleable#Switch_trackTintMode + * @see #getTrackTintMode() + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setTrackTintBlendMode(@Nullable BlendMode blendMode) { + mTrackBlendMode = blendMode; mHasTrackTintMode = true; applyTrackTint(); @@ -602,7 +620,20 @@ public class Switch extends CompoundButton { @InspectableProperty @Nullable public PorterDuff.Mode getTrackTintMode() { - return mTrackTintMode; + BlendMode mode = getTrackTintBlendMode(); + return mode != null ? BlendMode.blendModeToPorterDuffMode(mode) : null; + } + + /** + * @return the blending mode used to apply the tint to the track + * drawable + * @attr ref android.R.styleable#Switch_trackTintMode + * @see #setTrackTintBlendMode(BlendMode) + */ + @InspectableProperty(attributeId = com.android.internal.R.styleable.Switch_trackTintMode) + @Nullable + public BlendMode getTrackTintBlendMode() { + return mTrackBlendMode; } private void applyTrackTint() { @@ -614,7 +645,7 @@ public class Switch extends CompoundButton { } if (mHasTrackTintMode) { - mTrackDrawable.setTintMode(mTrackTintMode); + mTrackDrawable.setTintBlendMode(mTrackBlendMode); } // The drawable (or one of its children) may not have been @@ -713,7 +744,22 @@ public class Switch extends CompoundButton { * @see Drawable#setTintMode(PorterDuff.Mode) */ public void setThumbTintMode(@Nullable PorterDuff.Mode tintMode) { - mThumbTintMode = tintMode; + setThumbTintBlendMode(tintMode != null ? BlendMode.fromValue(tintMode.nativeInt) : null); + } + + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setThumbTintList(ColorStateList)}} to the thumb drawable. + * The default mode is {@link PorterDuff.Mode#SRC_IN}. + * + * @param blendMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * @attr ref android.R.styleable#Switch_thumbTintMode + * @see #getThumbTintMode() + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setThumbTintBlendMode(@Nullable BlendMode blendMode) { + mThumbBlendMode = blendMode; mHasThumbTintMode = true; applyThumbTint(); @@ -728,7 +774,20 @@ public class Switch extends CompoundButton { @InspectableProperty @Nullable public PorterDuff.Mode getThumbTintMode() { - return mThumbTintMode; + BlendMode mode = getThumbTintBlendMode(); + return mode != null ? BlendMode.blendModeToPorterDuffMode(mode) : null; + } + + /** + * @return the blending mode used to apply the tint to the thumb + * drawable + * @attr ref android.R.styleable#Switch_thumbTintMode + * @see #setThumbTintBlendMode(BlendMode) + */ + @InspectableProperty(attributeId = com.android.internal.R.styleable.Switch_thumbTintMode) + @Nullable + public BlendMode getThumbTintBlendMode() { + return mThumbBlendMode; } private void applyThumbTint() { @@ -740,7 +799,7 @@ public class Switch extends CompoundButton { } if (mHasThumbTintMode) { - mThumbDrawable.setTintMode(mThumbTintMode); + mThumbDrawable.setTintBlendMode(mThumbBlendMode); } // The drawable (or one of its children) may not have been diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 618b05f8cb0..17c56c3f216 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -55,6 +55,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.BaseCanvas; +import android.graphics.BlendMode; import android.graphics.Canvas; import android.graphics.Insets; import android.graphics.Paint; @@ -489,7 +490,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final Drawable[] mShowing = new Drawable[4]; ColorStateList mTintList; - PorterDuff.Mode mTintMode; + BlendMode mBlendMode; boolean mHasTint; boolean mHasTintMode; @@ -1036,7 +1037,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener Drawable drawableLeft = null, drawableTop = null, drawableRight = null, drawableBottom = null, drawableStart = null, drawableEnd = null; ColorStateList drawableTint = null; - PorterDuff.Mode drawableTintMode = null; + BlendMode drawableTintMode = null; int drawablePadding = 0; int ellipsize = ELLIPSIZE_NOT_SET; boolean singleLine = false; @@ -1139,7 +1140,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener break; case com.android.internal.R.styleable.TextView_drawableTintMode: - drawableTintMode = Drawable.parseTintMode(a.getInt(attr, -1), drawableTintMode); + drawableTintMode = Drawable.parseBlendMode(a.getInt(attr, -1), + drawableTintMode); break; case com.android.internal.R.styleable.TextView_drawablePadding: @@ -1543,7 +1545,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mDrawables.mHasTint = true; } if (drawableTintMode != null) { - mDrawables.mTintMode = drawableTintMode; + mDrawables.mBlendMode = drawableTintMode; mDrawables.mHasTintMode = true; } } @@ -3299,10 +3301,26 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @see Drawable#setTintMode(PorterDuff.Mode) */ public void setCompoundDrawableTintMode(@Nullable PorterDuff.Mode tintMode) { + setCompoundDrawableTintBlendMode(tintMode != null + ? BlendMode.fromValue(tintMode.nativeInt) : null); + } + + /** + * Specifies the blending mode used to apply the tint specified by + * {@link #setCompoundDrawableTintList(ColorStateList)} to the compound + * drawables. The default mode is {@link PorterDuff.Mode#SRC_IN}. + * + * @param blendMode the blending mode used to apply the tint, may be + * {@code null} to clear tint + * @attr ref android.R.styleable#TextView_drawableTintMode + * @see #setCompoundDrawableTintList(ColorStateList) + * @see Drawable#setTintBlendMode(BlendMode) + */ + public void setCompoundDrawableTintBlendMode(@Nullable BlendMode blendMode) { if (mDrawables == null) { mDrawables = new Drawables(getContext()); } - mDrawables.mTintMode = tintMode; + mDrawables.mBlendMode = blendMode; mDrawables.mHasTintMode = true; applyCompoundDrawableTint(); @@ -3316,10 +3334,27 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * drawables * @attr ref android.R.styleable#TextView_drawableTintMode * @see #setCompoundDrawableTintMode(PorterDuff.Mode) + * */ @InspectableProperty(name = "drawableTintMode") public PorterDuff.Mode getCompoundDrawableTintMode() { - return mDrawables != null ? mDrawables.mTintMode : null; + BlendMode mode = getCompoundDrawableTintBlendMode(); + return mode != null ? BlendMode.blendModeToPorterDuffMode(mode) : null; + } + + /** + * Returns the blending mode used to apply the tint to the compound + * drawables, if specified. + * + * @return the blending mode used to apply the tint to the compound + * drawables + * @attr ref android.R.styleable#TextView_drawableTintMode + * @see #setCompoundDrawableTintBlendMode(BlendMode) + */ + @InspectableProperty(name = "drawableBlendMode", + attributeId = com.android.internal.R.styleable.TextView_drawableTintMode) + public @Nullable BlendMode getCompoundDrawableTintBlendMode() { + return mDrawables != null ? mDrawables.mBlendMode : null; } private void applyCompoundDrawableTint() { @@ -3329,7 +3364,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mDrawables.mHasTint || mDrawables.mHasTintMode) { final ColorStateList tintList = mDrawables.mTintList; - final PorterDuff.Mode tintMode = mDrawables.mTintMode; + final BlendMode blendMode = mDrawables.mBlendMode; final boolean hasTint = mDrawables.mHasTint; final boolean hasTintMode = mDrawables.mHasTintMode; final int[] state = getDrawableState(); @@ -3353,7 +3388,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } if (hasTintMode) { - dr.setTintMode(tintMode); + dr.setTintBlendMode(blendMode); } // The drawable (or one of its children) may not have been diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java index c9431e3178f..6e7f286d19a 100644 --- a/graphics/java/android/graphics/BaseCanvas.java +++ b/graphics/java/android/graphics/BaseCanvas.java @@ -243,10 +243,6 @@ public abstract class BaseCanvas { nDrawColor(mNativeCanvasWrapper, color, BlendMode.SRC_OVER.getXfermode().porterDuffMode); } - /** - * @deprecated use {@link Canvas#drawColor(int, BlendMode)} - */ - @Deprecated public void drawColor(@ColorInt int color, @NonNull PorterDuff.Mode mode) { nDrawColor(mNativeCanvasWrapper, color, mode.nativeInt); } diff --git a/graphics/java/android/graphics/BaseRecordingCanvas.java b/graphics/java/android/graphics/BaseRecordingCanvas.java index 028b784d24c..2f5214cb1df 100644 --- a/graphics/java/android/graphics/BaseRecordingCanvas.java +++ b/graphics/java/android/graphics/BaseRecordingCanvas.java @@ -203,10 +203,6 @@ public class BaseRecordingCanvas extends Canvas { nDrawColor(mNativeCanvasWrapper, color, BlendMode.SRC_OVER.getXfermode().porterDuffMode); } - /** - * @deprecated use {@link #drawColor(int, BlendMode)} instead - */ - @Deprecated @Override public final void drawColor(@ColorInt int color, @NonNull PorterDuff.Mode mode) { nDrawColor(mNativeCanvasWrapper, color, mode.nativeInt); diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 6f00fc90784..d4d5ae7bddd 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -1700,10 +1700,7 @@ public class Canvas extends BaseCanvas { * * @param color the color to draw onto the canvas * @param mode the porter-duff mode to apply to the color - * - * @deprecated use {@link #drawColor(int, BlendMode)} instead */ - @Deprecated public void drawColor(@ColorInt int color, @NonNull PorterDuff.Mode mode) { super.drawColor(color, mode); } diff --git a/graphics/java/android/graphics/ComposeShader.java b/graphics/java/android/graphics/ComposeShader.java index 93ddb10d24b..64ee6bf1f30 100644 --- a/graphics/java/android/graphics/ComposeShader.java +++ b/graphics/java/android/graphics/ComposeShader.java @@ -39,9 +39,7 @@ public class ComposeShader extends Shader { * @param shaderB The colors from this shader are seen as the "src" by the mode * @param mode The mode that combines the colors from the two shaders. If mode * is null, then SRC_OVER is assumed. - * - * @deprecated use {@link #ComposeShader(Shader, Shader, BlendMode)} instead - */ + */ @Deprecated public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, @NonNull Xfermode mode) { this(shaderA, shaderB, mode.porterDuffMode); @@ -56,9 +54,7 @@ public class ComposeShader extends Shader { * @param shaderB The colors from this shader are seen as the "src" by the mode * @param mode The PorterDuff mode that combines the colors from the two shaders. * - * @deprecated use {@link #ComposeShader(Shader, Shader, BlendMode)} instead */ - @Deprecated public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, @NonNull PorterDuff.Mode mode) { this(shaderA, shaderB, mode.nativeInt); diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index db5f06524c1..b7316ab0361 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -1274,10 +1274,7 @@ public class Paint { * Get the paint's transfer mode object. * * @return the paint's transfer mode (or null) - * - * @deprecated use {@link #getBlendMode()} instead */ - @Deprecated public Xfermode getXfermode() { return mXfermode; } @@ -1308,11 +1305,7 @@ public class Paint { * * @param xfermode May be null. The xfermode to be installed in the paint * @return xfermode - * - * @deprecated Use {@link #setBlendMode} to apply a Xfermode directly - * through usage of {@link BlendMode} */ - @Deprecated public Xfermode setXfermode(Xfermode xfermode) { return installXfermode(xfermode); } diff --git a/graphics/java/android/graphics/PorterDuff.java b/graphics/java/android/graphics/PorterDuff.java index 459291b7565..bc1f66fdd5c 100644 --- a/graphics/java/android/graphics/PorterDuff.java +++ b/graphics/java/android/graphics/PorterDuff.java @@ -24,9 +24,8 @@ import android.annotation.UnsupportedAppUsage; * of {@link Paint}'s {@link Paint#setXfermode(Xfermode) transfer mode}. * All the available modes can be found in the {@link Mode} enum.

* - * @deprecated Use {@link BlendMode} with {@link Paint#setBlendMode(BlendMode)} instead + * Consider using {@link BlendMode} instead as it provides a wider variety of tinting options */ -@Deprecated public class PorterDuff { /** * {@usesMathJax} diff --git a/graphics/java/android/graphics/PorterDuffColorFilter.java b/graphics/java/android/graphics/PorterDuffColorFilter.java index c2a8eb7dbab..cc2d3a8969f 100644 --- a/graphics/java/android/graphics/PorterDuffColorFilter.java +++ b/graphics/java/android/graphics/PorterDuffColorFilter.java @@ -23,11 +23,7 @@ import android.annotation.UnsupportedAppUsage; /** * A color filter that can be used to tint the source pixels using a single * color and a specific {@link PorterDuff Porter-Duff composite mode}. - * - * @deprecated Consider using {@link BlendModeColorFilter} instead as it supports a wider - * set of blend modes than those defined in {@link PorterDuff.Mode} */ -@Deprecated public class PorterDuffColorFilter extends ColorFilter { @ColorInt private int mColor; diff --git a/graphics/java/android/graphics/PorterDuffXfermode.java b/graphics/java/android/graphics/PorterDuffXfermode.java index 5b933c49316..ff9ff8b0069 100644 --- a/graphics/java/android/graphics/PorterDuffXfermode.java +++ b/graphics/java/android/graphics/PorterDuffXfermode.java @@ -22,10 +22,6 @@ package android.graphics; * documentation of the {@link PorterDuff.Mode} enum for more * information on the available alpha compositing and blending modes.

* - * @deprecated Consider using {@link BlendMode} instead as it supports a wider - * set of blend modes than those defined in {@link PorterDuff.Mode} - * - * @see Paint#setBlendMode(BlendMode) */ public class PorterDuffXfermode extends Xfermode { /** diff --git a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java index 7def322c195..fab96a1e9fb 100644 --- a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java +++ b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java @@ -701,13 +701,13 @@ public class AdaptiveIconDrawable extends Drawable implements Drawable.Callback } @Override - public void setTintMode(@NonNull BlendMode blendMode) { + public void setTintBlendMode(@NonNull BlendMode blendMode) { final ChildDrawable[] array = mLayerState.mChildren; final int N = mLayerState.N_CHILDREN; for (int i = 0; i < N; i++) { final Drawable dr = array[i].mDrawable; if (dr != null) { - dr.setTintMode(blendMode); + dr.setTintBlendMode(blendMode); } } } diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index f45bf9b783e..66947da9166 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -477,8 +477,8 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { } @Override - public void setTintMode(@NonNull BlendMode blendMode) { - mAnimatedVectorState.mVectorDrawable.setTintMode(blendMode); + public void setTintBlendMode(@NonNull BlendMode blendMode) { + mAnimatedVectorState.mVectorDrawable.setTintBlendMode(blendMode); } @Override diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index 6b30158a183..e4aa774fd43 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -685,7 +685,7 @@ public class BitmapDrawable extends Drawable { } @Override - public void setTintMode(@NonNull BlendMode blendMode) { + public void setTintBlendMode(@NonNull BlendMode blendMode) { final BitmapState state = mBitmapState; if (state.mBlendMode != blendMode) { state.mBlendMode = blendMode; diff --git a/graphics/java/android/graphics/drawable/ColorDrawable.java b/graphics/java/android/graphics/drawable/ColorDrawable.java index efa806afce7..f5fa8c546be 100644 --- a/graphics/java/android/graphics/drawable/ColorDrawable.java +++ b/graphics/java/android/graphics/drawable/ColorDrawable.java @@ -215,7 +215,7 @@ public class ColorDrawable extends Drawable { } @Override - public void setTintMode(@NonNull BlendMode blendMode) { + public void setTintBlendMode(@NonNull BlendMode blendMode) { mColorState.mBlendMode = blendMode; mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, mColorState.mTint, blendMode); diff --git a/graphics/java/android/graphics/drawable/ColorStateListDrawable.java b/graphics/java/android/graphics/drawable/ColorStateListDrawable.java index b94b1146837..35021a66f57 100644 --- a/graphics/java/android/graphics/drawable/ColorStateListDrawable.java +++ b/graphics/java/android/graphics/drawable/ColorStateListDrawable.java @@ -114,9 +114,9 @@ public class ColorStateListDrawable extends Drawable implements Drawable.Callbac } @Override - public void setTintMode(@NonNull BlendMode blendMode) { + public void setTintBlendMode(@NonNull BlendMode blendMode) { mState.mBlendMode = blendMode; - mColorDrawable.setTintMode(blendMode); + mColorDrawable.setTintBlendMode(blendMode); onStateChange(getState()); } @@ -293,7 +293,7 @@ public class ColorStateListDrawable extends Drawable implements Drawable.Callbac } if (mState.mBlendMode != DEFAULT_BLEND_MODE) { - mColorDrawable.setTintMode(mState.mBlendMode); + mColorDrawable.setTintBlendMode(mState.mBlendMode); } } } diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index adc04fb03e2..08409869c62 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -213,17 +213,17 @@ public abstract class Drawable { protected int mSrcDensityOverride = 0; /** - * Flag used to break the recursive loop between setTintMode(PorterDuff.Mode) and - * setTintMode(BlendMode) as each default implementation invokes the other in order to + * Flag used to break the recursive loop between setTintBlendMode(PorterDuff.Mode) and + * setTintBlendMode(BlendMode) as each default implementation invokes the other in order to * support new use cases that utilize the new blending modes as well as support the legacy - * use cases. This flag tracks that {@link #setTintMode(BlendMode)} is only invoked once + * use cases. This flag tracks that {@link #setTintBlendMode(BlendMode)} is only invoked once * per invocation. */ private boolean mSetBlendModeInvoked = false; /** - * Flag used to break the recursive loop between setTintMode(PorterDuff.Mode) and - * setTintMode(BlendMode) as each default implementation invokes the other in order to + * Flag used to break the recursive loop between setTintBlendMode(PorterDuff.Mode) and + * setTintBlendMode(BlendMode) as each default implementation invokes the other in order to * support new use cases that utilize the new blending modes as well as support the legacy * use cases. This flag tracks that {@link #setTintMode(Mode)} is only invoked once * per invocation; @@ -651,7 +651,7 @@ public abstract class Drawable { * @param tintColor Color to use for tinting this drawable * @see #setTintList(ColorStateList) * @see #setTintMode(PorterDuff.Mode) - * @see #setTintMode(BlendMode) + * @see #setTintBlendMode(BlendMode) */ public void setTint(@ColorInt int tintColor) { setTintList(ColorStateList.valueOf(tintColor)); @@ -673,7 +673,7 @@ public abstract class Drawable { * {@code null} to clear the tint * @see #setTint(int) * @see #setTintMode(PorterDuff.Mode) - * @see #setTintMode(BlendMode) + * @see #setTintBlendMode(BlendMode) */ public void setTintList(@Nullable ColorStateList tint) {} @@ -693,15 +693,12 @@ public abstract class Drawable { * of {@link PorterDuff.Mode#SRC_IN} * @see #setTint(int) * @see #setTintList(ColorStateList) - * - * @deprecated use {@link #setTintMode(BlendMode)} instead */ - @Deprecated public void setTintMode(@Nullable PorterDuff.Mode tintMode) { if (!mSetTintModeInvoked) { mSetTintModeInvoked = true; BlendMode mode = tintMode != null ? BlendMode.fromValue(tintMode.nativeInt) : null; - setTintMode(mode != null ? mode : Drawable.DEFAULT_BLEND_MODE); + setTintBlendMode(mode != null ? mode : Drawable.DEFAULT_BLEND_MODE); mSetTintModeInvoked = false; } } @@ -721,7 +718,7 @@ public abstract class Drawable { * @see #setTint(int) * @see #setTintList(ColorStateList) */ - public void setTintMode(@Nullable BlendMode blendMode) { + public void setTintBlendMode(@Nullable BlendMode blendMode) { if (!mSetBlendModeInvoked) { mSetBlendModeInvoked = true; PorterDuff.Mode mode = BlendMode.blendModeToPorterDuffMode(blendMode); diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java index 3e0881aef9e..090d915a2f6 100644 --- a/graphics/java/android/graphics/drawable/DrawableContainer.java +++ b/graphics/java/android/graphics/drawable/DrawableContainer.java @@ -196,14 +196,14 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { } @Override - public void setTintMode(@NonNull BlendMode blendMode) { + public void setTintBlendMode(@NonNull BlendMode blendMode) { mDrawableContainerState.mHasTintMode = true; if (mDrawableContainerState.mBlendMode != blendMode) { mDrawableContainerState.mBlendMode = blendMode; if (mCurrDrawable != null) { - mCurrDrawable.setTintMode(blendMode); + mCurrDrawable.setTintBlendMode(blendMode); } } } @@ -544,7 +544,7 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { d.setTintList(mDrawableContainerState.mTintList); } if (mDrawableContainerState.mHasTintMode) { - d.setTintMode(mDrawableContainerState.mBlendMode); + d.setTintBlendMode(mDrawableContainerState.mBlendMode); } } diff --git a/graphics/java/android/graphics/drawable/DrawableWrapper.java b/graphics/java/android/graphics/drawable/DrawableWrapper.java index d81401d451c..64fc7042dfc 100644 --- a/graphics/java/android/graphics/drawable/DrawableWrapper.java +++ b/graphics/java/android/graphics/drawable/DrawableWrapper.java @@ -324,9 +324,9 @@ public abstract class DrawableWrapper extends Drawable implements Drawable.Callb } @Override - public void setTintMode(@NonNull BlendMode blendMode) { + public void setTintBlendMode(@NonNull BlendMode blendMode) { if (mDrawable != null) { - mDrawable.setTintMode(blendMode); + mDrawable.setTintBlendMode(blendMode); } } diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java index 6948bc4fd61..816d1fda57d 100644 --- a/graphics/java/android/graphics/drawable/GradientDrawable.java +++ b/graphics/java/android/graphics/drawable/GradientDrawable.java @@ -1211,7 +1211,7 @@ public class GradientDrawable extends Drawable { } @Override - public void setTintMode(@NonNull BlendMode blendMode) { + public void setTintBlendMode(@NonNull BlendMode blendMode) { mGradientState.mBlendMode = blendMode; mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, mGradientState.mTint, blendMode); diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java index 5fd18a1431e..3658f89abae 100644 --- a/graphics/java/android/graphics/drawable/Icon.java +++ b/graphics/java/android/graphics/drawable/Icon.java @@ -324,7 +324,7 @@ public final class Icon implements Parcelable { if (result != null && (mTintList != null || mBlendMode != DEFAULT_BLEND_MODE)) { result.mutate(); result.setTintList(mTintList); - result.setTintMode(mBlendMode); + result.setTintBlendMode(mBlendMode); } return result; } @@ -696,10 +696,7 @@ public final class Icon implements Parcelable { * * @param mode a blending mode, as in {@link Drawable#setTintMode(PorterDuff.Mode)}, may be null * @return this same object, for use in chained construction - * - * @deprecated use {@link #setTintMode(BlendMode)} instead */ - @Deprecated public @NonNull Icon setTintMode(@NonNull PorterDuff.Mode mode) { mBlendMode = BlendMode.fromValue(mode.nativeInt); return this; @@ -711,7 +708,7 @@ public final class Icon implements Parcelable { * @param mode a blending mode, as in {@link Drawable#setTintMode(PorterDuff.Mode)}, may be null * @return this same object, for use in chained construction */ - public @NonNull Icon setTintMode(@NonNull BlendMode mode) { + public @NonNull Icon setTintBlendMode(@NonNull BlendMode mode) { mBlendMode = mode; return this; } diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index e2c84927b57..f3a1b0eb52d 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -1397,13 +1397,13 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { } @Override - public void setTintMode(@NonNull BlendMode blendMode) { + public void setTintBlendMode(@NonNull BlendMode blendMode) { final ChildDrawable[] array = mLayerState.mChildren; final int N = mLayerState.mNumChildren; for (int i = 0; i < N; i++) { final Drawable dr = array[i].mDrawable; if (dr != null) { - dr.setTintMode(blendMode); + dr.setTintBlendMode(blendMode); } } } diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index 4972e6a82b7..8561d95ddd8 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -349,7 +349,7 @@ public class NinePatchDrawable extends Drawable { } @Override - public void setTintMode(@Nullable BlendMode blendMode) { + public void setTintBlendMode(@Nullable BlendMode blendMode) { mNinePatchState.mBlendMode = blendMode; mBlendModeFilter = updateBlendModeFilter(mBlendModeFilter, mNinePatchState.mTint, blendMode); diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java index b5fe7f9e432..9774b59f98a 100644 --- a/graphics/java/android/graphics/drawable/ShapeDrawable.java +++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java @@ -297,7 +297,7 @@ public class ShapeDrawable extends Drawable { } @Override - public void setTintMode(@NonNull BlendMode blendMode) { + public void setTintBlendMode(@NonNull BlendMode blendMode) { mShapeState.mBlendMode = blendMode; mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, mShapeState.mTint, blendMode); diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java index 43772ec20cf..aa19b2a0e94 100644 --- a/graphics/java/android/graphics/drawable/VectorDrawable.java +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java @@ -487,7 +487,7 @@ public class VectorDrawable extends Drawable { } @Override - public void setTintMode(@NonNull BlendMode blendMode) { + public void setTintBlendMode(@NonNull BlendMode blendMode) { final VectorDrawableState state = mVectorState; if (state.mBlendMode != blendMode) { state.mBlendMode = blendMode; -- GitLab From 00d02f142aa24d9bb49adad03ea26eee99277619 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Mon, 15 Apr 2019 09:48:30 -0400 Subject: [PATCH 052/473] Fixed concatenation to properly discard empty strings Before, concatenation of carrier names was done naively. Now we properly discard empty strings so there are no dangling separators. Extra mocking added because of temporary change in CarrierTextController. These should be removed with b/130246708. Test: atest Fixes: 130363633 Change-Id: I17bd437a4789eb48b3e4661f294c64e14efc9261 --- .../keyguard/CarrierTextController.java | 21 ++- .../keyguard/CarrierTextControllerTest.java | 138 +++++++++++++++++- 2 files changed, 157 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java index eca39262dfb..2e9b03c6b31 100644 --- a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java +++ b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java @@ -383,7 +383,7 @@ public class CarrierTextController { } if (TextUtils.isEmpty(displayText) && !airplaneMode) { - displayText = TextUtils.join(mSeparator, carrierNames); + displayText = joinNotEmpty(mSeparator, carrierNames); } final CarrierTextCallbackInfo info = new CarrierTextCallbackInfo( displayText, @@ -546,6 +546,25 @@ public class CarrierTextController { } } + /** + * Joins the strings in a sequence using a separator. Empty strings are discarded with no extra + * separator added so there are no extra separators that are not needed. + */ + private static CharSequence joinNotEmpty(CharSequence separator, CharSequence[] sequences) { + int length = sequences.length; + if (length == 0) return ""; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < length; i++) { + if (!TextUtils.isEmpty(sequences[i])) { + if (!TextUtils.isEmpty(sb)) { + sb.append(separator); + } + sb.append(sequences[i]); + } + } + return sb.toString(); + } + private static List append(List list, CharSequence string) { if (!TextUtils.isEmpty(string)) { list.add(string); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java index df534d79f73..9f91a17e846 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java @@ -104,7 +104,8 @@ public class CarrierTextControllerTest extends SysuiTestCase { mCarrierTextCallbackInfo = new CarrierTextController.CarrierTextCallbackInfo("", new CharSequence[]{}, false, new int[]{}); - when(mTelephonyManager.getPhoneCount()).thenReturn(2); + when(mTelephonyManager.getPhoneCount()).thenReturn(3); + mCarrierTextController = new TestCarrierTextController(mContext, SEPARATOR, true, true, mKeyguardUpdateMonitor); // This should not start listening on any of the real dependencies @@ -130,6 +131,12 @@ public class CarrierTextControllerTest extends SysuiTestCase { reset(mCarrierTextCallback); when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn( new ArrayList<>()); + + // STOPSHIP(b/130246708) This line makes sure that SubscriptionManager provides the + // same answer as KeyguardUpdateMonitor. Remove when this is addressed + when(mSubscriptionManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn( + new ArrayList<>()); + when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn( IccCardConstants.State.CARD_IO_ERROR); // This should not produce an out of bounds error, even though there are no subscriptions @@ -173,7 +180,11 @@ public class CarrierTextControllerTest extends SysuiTestCase { list.add(TEST_SUBSCRIPTION); when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(IccCardConstants.State.READY); when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list); + + // STOPSHIP(b/130246708) This line makes sure that SubscriptionManager provides the + // same answer as KeyguardUpdateMonitor. Remove when this is addressed when(mSubscriptionManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(list); + mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); ArgumentCaptor captor = @@ -197,7 +208,11 @@ public class CarrierTextControllerTest extends SysuiTestCase { list.add(TEST_SUBSCRIPTION_ROAMING); when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(IccCardConstants.State.READY); when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list); + + // STOPSHIP(b/130246708) This line makes sure that SubscriptionManager provides the + // same answer as KeyguardUpdateMonitor. Remove when this is addressed when(mSubscriptionManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(list); + mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); ArgumentCaptor captor = @@ -219,6 +234,12 @@ public class CarrierTextControllerTest extends SysuiTestCase { reset(mCarrierTextCallback); when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn( new ArrayList<>()); + + // STOPSHIP(b/130246708) This line makes sure that SubscriptionManager provides the + // same answer as KeyguardUpdateMonitor. Remove when this is addressed + when(mSubscriptionManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn( + new ArrayList<>()); + ArgumentCaptor captor = ArgumentCaptor.forClass( CarrierTextController.CarrierTextCallbackInfo.class); @@ -233,6 +254,121 @@ public class CarrierTextControllerTest extends SysuiTestCase { } + @Test + public void testCarrierText_twoValidSubscriptions() { + reset(mCarrierTextCallback); + List list = new ArrayList<>(); + list.add(TEST_SUBSCRIPTION); + list.add(TEST_SUBSCRIPTION); + when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(IccCardConstants.State.READY); + when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list); + + // STOPSHIP(b/130246708) This line makes sure that SubscriptionManager provides the + // same answer as KeyguardUpdateMonitor. Remove when this is addressed + when(mSubscriptionManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(list); + + mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); + + ArgumentCaptor captor = + ArgumentCaptor.forClass( + CarrierTextController.CarrierTextCallbackInfo.class); + + mCarrierTextController.updateCarrierText(); + mTestableLooper.processAllMessages(); + verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); + + assertEquals(TEST_CARRIER + SEPARATOR + TEST_CARRIER, + captor.getValue().carrierText); + } + + @Test + public void testCarrierText_oneDisabledSub() { + reset(mCarrierTextCallback); + List list = new ArrayList<>(); + list.add(TEST_SUBSCRIPTION); + list.add(TEST_SUBSCRIPTION); + when(mKeyguardUpdateMonitor.getSimState(anyInt())) + .thenReturn(IccCardConstants.State.READY) + .thenReturn(IccCardConstants.State.NOT_READY); + when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list); + + // STOPSHIP(b/130246708) This line makes sure that SubscriptionManager provides the + // same answer as KeyguardUpdateMonitor. Remove when this is addressed + when(mSubscriptionManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(list); + + mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); + + ArgumentCaptor captor = + ArgumentCaptor.forClass( + CarrierTextController.CarrierTextCallbackInfo.class); + + mCarrierTextController.updateCarrierText(); + mTestableLooper.processAllMessages(); + verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); + + assertEquals(TEST_CARRIER, + captor.getValue().carrierText); + } + + @Test + public void testCarrierText_firstDisabledSub() { + reset(mCarrierTextCallback); + List list = new ArrayList<>(); + list.add(TEST_SUBSCRIPTION); + list.add(TEST_SUBSCRIPTION); + when(mKeyguardUpdateMonitor.getSimState(anyInt())) + .thenReturn(IccCardConstants.State.NOT_READY) + .thenReturn(IccCardConstants.State.READY); + when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list); + + // STOPSHIP(b/130246708) This line makes sure that SubscriptionManager provides the + // same answer as KeyguardUpdateMonitor. Remove when this is addressed + when(mSubscriptionManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(list); + + mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); + + ArgumentCaptor captor = + ArgumentCaptor.forClass( + CarrierTextController.CarrierTextCallbackInfo.class); + + mCarrierTextController.updateCarrierText(); + mTestableLooper.processAllMessages(); + verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); + + assertEquals(TEST_CARRIER, + captor.getValue().carrierText); + } + + @Test + public void testCarrierText_threeSubsMiddleDisabled() { + reset(mCarrierTextCallback); + List list = new ArrayList<>(); + list.add(TEST_SUBSCRIPTION); + list.add(TEST_SUBSCRIPTION); + list.add(TEST_SUBSCRIPTION); + when(mKeyguardUpdateMonitor.getSimState(anyInt())) + .thenReturn(IccCardConstants.State.READY) + .thenReturn(IccCardConstants.State.NOT_READY) + .thenReturn(IccCardConstants.State.READY); + when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list); + mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); + + // STOPSHIP(b/130246708) This line makes sure that SubscriptionManager provides the + // same answer as KeyguardUpdateMonitor. Remove when this is addressed + when(mSubscriptionManager.getActiveSubscriptionInfoList(anyBoolean())).thenReturn(list); + + ArgumentCaptor captor = + ArgumentCaptor.forClass( + CarrierTextController.CarrierTextCallbackInfo.class); + + mCarrierTextController.updateCarrierText(); + mTestableLooper.processAllMessages(); + verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); + + assertEquals(TEST_CARRIER + SEPARATOR + TEST_CARRIER, + captor.getValue().carrierText); + } + public static class TestCarrierTextController extends CarrierTextController { private KeyguardUpdateMonitor mKUM; -- GitLab From e1ce1740c4494e338fd0f16e63e81fa4fc875ab6 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Tue, 16 Apr 2019 13:37:13 -0700 Subject: [PATCH 053/473] Remove spurious Slog.wtf() Fixes: 110490173 Test: force-stop the Settings app Change-Id: I3569ff17b47a7cf304ecb632d36a22ee5c9fa126 --- .../core/java/com/android/server/AlarmManagerService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index 1bd367cdfa9..1fa62cec6e3 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -3152,7 +3152,7 @@ class AlarmManagerService extends SystemService { void removeLocked(final int uid) { if (uid == Process.SYSTEM_UID) { - Slog.wtf(TAG, "removeLocked: Shouldn't for UID=" + uid); + // If a force-stop occurs for a system-uid package, ignore it. return; } boolean didRemove = false; @@ -3247,7 +3247,7 @@ class AlarmManagerService extends SystemService { // Only called for ephemeral apps void removeForStoppedLocked(final int uid) { if (uid == Process.SYSTEM_UID) { - Slog.wtf(TAG, "removeForStoppedLocked: Shouldn't for UID=" + uid); + // If a force-stop occurs for a system-uid package, ignore it. return; } boolean didRemove = false; @@ -3291,7 +3291,7 @@ class AlarmManagerService extends SystemService { void removeUserLocked(int userHandle) { if (userHandle == UserHandle.USER_SYSTEM) { - Slog.wtf(TAG, "removeForStoppedLocked: Shouldn't for user=" + userHandle); + // If we're told we're removing the system user, ignore it. return; } boolean didRemove = false; -- GitLab From d088e6b33d309dbbcc1f31a5619b6a1809de0866 Mon Sep 17 00:00:00 2001 From: Peiyong Lin Date: Tue, 16 Apr 2019 14:04:43 -0700 Subject: [PATCH 054/473] Make sure the color space range is checked properly. We only want to accept pre-defined color space,without the check it's possible that the color space is not pre-defined and thus can't be restored. BUG: b/116112787, b/130737691 Test: build Change-Id: Ic1d21501828d3edc5ad04534fece70a7146e78bd --- core/java/android/app/ActivityManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index cf4ef205b30..17368b78964 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -1863,7 +1863,7 @@ public class ActivityManager { mTopActivityComponent = ComponentName.readFromParcel(source); mSnapshot = source.readParcelable(null /* classLoader */); int colorSpaceId = source.readInt(); - mColorSpace = colorSpaceId >= 0 + mColorSpace = colorSpaceId >= 0 && colorSpaceId < ColorSpace.Named.values().length ? ColorSpace.get(ColorSpace.Named.values()[colorSpaceId]) : ColorSpace.get(ColorSpace.Named.SRGB); mOrientation = source.readInt(); -- GitLab From 879024a03b48cbd1177ea5d86c97d6583451564d Mon Sep 17 00:00:00 2001 From: Hall Liu Date: Wed, 17 Apr 2019 13:33:43 -0700 Subject: [PATCH 055/473] Change ServiceState and TelephonyRegistry logging When an app bypasses a location access check due to its target SDK for queries to ServiceState or when we're pushing out info through TelephonyRegistry, log it as info instead of error to avoid spamming the logs too much. Fixes: 130668054 Test: manual Change-Id: Ia490f2de2f0b5d326e5290e166e6f97b25e6e187 --- .../com/android/server/TelephonyRegistry.java | 2 ++ .../telephony/LocationAccessPolicy.java | 27 +++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index af78b769ce8..da91187c053 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -2300,6 +2300,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { .setCallingPid(r.callerPid) .setCallingUid(r.callerUid) .setMethod("TelephonyRegistry push") + .setLogAsInfo(true) // we don't need to log an error every time we push .setMinSdkVersionForFine(minSdk) .build(); @@ -2317,6 +2318,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { .setCallingPid(r.callerPid) .setCallingUid(r.callerUid) .setMethod("TelephonyRegistry push") + .setLogAsInfo(true) // we don't need to log an error every time we push .setMinSdkVersionForCoarse(minSdk) .build(); diff --git a/telephony/java/android/telephony/LocationAccessPolicy.java b/telephony/java/android/telephony/LocationAccessPolicy.java index b9d8eb637c3..eb744f619f2 100644 --- a/telephony/java/android/telephony/LocationAccessPolicy.java +++ b/telephony/java/android/telephony/LocationAccessPolicy.java @@ -63,15 +63,18 @@ public final class LocationAccessPolicy { public final int callingPid; public final int minSdkVersionForCoarse; public final int minSdkVersionForFine; + public final boolean logAsInfo; public final String method; private LocationPermissionQuery(String callingPackage, int callingUid, int callingPid, - int minSdkVersionForCoarse, int minSdkVersionForFine, String method) { + int minSdkVersionForCoarse, int minSdkVersionForFine, boolean logAsInfo, + String method) { this.callingPackage = callingPackage; this.callingUid = callingUid; this.callingPid = callingPid; this.minSdkVersionForCoarse = minSdkVersionForCoarse; this.minSdkVersionForFine = minSdkVersionForFine; + this.logAsInfo = logAsInfo; this.method = method; } @@ -81,6 +84,7 @@ public final class LocationAccessPolicy { private int mCallingPid; private int mMinSdkVersionForCoarse = Integer.MAX_VALUE; private int mMinSdkVersionForFine = Integer.MAX_VALUE; + private boolean mLogAsInfo = false; private String mMethod; /** @@ -135,14 +139,27 @@ public final class LocationAccessPolicy { return this; } + /** + * If called with {@code true}, log messages will only be printed at the info level. + */ + public Builder setLogAsInfo(boolean logAsInfo) { + mLogAsInfo = logAsInfo; + return this; + } + public LocationPermissionQuery build() { return new LocationPermissionQuery(mCallingPackage, mCallingUid, - mCallingPid, mMinSdkVersionForCoarse, mMinSdkVersionForFine, mMethod); + mCallingPid, mMinSdkVersionForCoarse, mMinSdkVersionForFine, + mLogAsInfo, mMethod); } } } - private static void logError(Context context, String errorMsg) { + private static void logError(Context context, LocationPermissionQuery query, String errorMsg) { + if (query.logAsInfo) { + Log.i(TAG, errorMsg); + return; + } Log.e(TAG, errorMsg); try { if (Build.IS_DEBUGGABLE) { @@ -201,13 +218,13 @@ public final class LocationAccessPolicy { + " because we're not enforcing API " + minSdkVersion + " yet." + " Please fix this app because it will break in the future. Called from " + query.method; - logError(context, errorMsg); + logError(context, query, errorMsg); return null; } else if (!isAppAtLeastSdkVersion(context, query.callingPackage, minSdkVersion)) { String errorMsg = "Allowing " + query.callingPackage + " " + locationTypeForLog + " because it doesn't target API " + minSdkVersion + " yet." + " Please fix this app. Called from " + query.method; - logError(context, errorMsg); + logError(context, query, errorMsg); return null; } else { // If we're not allowing it due to the above two conditions, this means that the app -- GitLab From 939df096be11d242c8f3473954c7c10c371cf142 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Tue, 9 Apr 2019 17:13:50 -0700 Subject: [PATCH 056/473] Add odm and oem policies This change adds parsing, encoding, and validating of odm and oem overlayable policies to aapt2, libandroidfw, and idmap2. Bug: 121033532 Test: aapt2_tests, idmap2_tests Change-Id: Ifc0d4b6c9f9c37e06b2988abade69dbb277c50c2 --- .../idmap2d/aidl/android/os/IIdmap2.aidl | 2 + cmds/idmap2/include/idmap2/Policies.h | 6 +- cmds/idmap2/libidmap2/Idmap.cpp | 1 + cmds/idmap2/libidmap2/Policies.cpp | 41 +++++++----- .../idmap2/tests/BinaryStreamVisitorTests.cpp | 34 ++++++---- cmds/idmap2/tests/Idmap2BinaryTests.cpp | 8 +-- cmds/idmap2/tests/IdmapTests.cpp | 61 +++++++++++------- cmds/idmap2/tests/PoliciesTests.cpp | 29 ++++++++- cmds/idmap2/tests/RawPrintVisitorTests.cpp | 2 +- .../res/values/values.xml | 2 + .../system-overlay-invalid.apk | Bin 1583 -> 1779 bytes .../data/target/res/values/overlayable.xml | 8 +++ .../tests/data/target/res/values/values.xml | 10 +-- .../data/target/target-no-overlayable.apk | Bin 2139 -> 2263 bytes cmds/idmap2/tests/data/target/target.apk | Bin 4853 -> 5017 bytes .../include/androidfw/ResourceTypes.h | 8 +++ .../com/android/server/om/IdmapManager.java | 12 +++- tools/aapt2/ResourceParser.cpp | 32 +++++---- tools/aapt2/ResourceParser_test.cpp | 22 +++++++ tools/aapt2/ResourceTable.h | 18 ++++-- tools/aapt2/Resources.proto | 2 + .../format/binary/BinaryResourceParser.cpp | 8 +++ tools/aapt2/format/binary/TableFlattener.cpp | 6 ++ .../format/binary/TableFlattener_test.cpp | 12 ++-- tools/aapt2/format/proto/ProtoDeserialize.cpp | 6 ++ tools/aapt2/format/proto/ProtoSerialize.cpp | 6 ++ .../format/proto/ProtoSerialize_test.cpp | 6 +- 27 files changed, 248 insertions(+), 94 deletions(-) diff --git a/cmds/idmap2/idmap2d/aidl/android/os/IIdmap2.aidl b/cmds/idmap2/idmap2d/aidl/android/os/IIdmap2.aidl index 4a66715ad2b..cd474c0fe05 100644 --- a/cmds/idmap2/idmap2d/aidl/android/os/IIdmap2.aidl +++ b/cmds/idmap2/idmap2d/aidl/android/os/IIdmap2.aidl @@ -25,6 +25,8 @@ interface IIdmap2 { const int POLICY_VENDOR_PARTITION = 0x00000004; const int POLICY_PRODUCT_PARTITION = 0x00000008; const int POLICY_SIGNATURE = 0x00000010; + const int POLICY_ODM_PARTITION = 0x00000020; + const int POLICY_OEM_PARTITION = 0x00000040; @utf8InCpp String getIdmapPath(@utf8InCpp String overlayApkPath, int userId); boolean removeIdmap(@utf8InCpp String overlayApkPath, int userId); diff --git a/cmds/idmap2/include/idmap2/Policies.h b/cmds/idmap2/include/idmap2/Policies.h index 90c698cc6e4..87edd3506d3 100644 --- a/cmds/idmap2/include/idmap2/Policies.h +++ b/cmds/idmap2/include/idmap2/Policies.h @@ -26,11 +26,13 @@ namespace android::idmap2 { -constexpr const char* kPolicyPublic = "public"; +constexpr const char* kPolicyOdm = "odm"; +constexpr const char* kPolicyOem = "oem"; constexpr const char* kPolicyProduct = "product"; +constexpr const char* kPolicyPublic = "public"; +constexpr const char* kPolicySignature = "signature"; constexpr const char* kPolicySystem = "system"; constexpr const char* kPolicyVendor = "vendor"; -constexpr const char* kPolicySignature = "signature"; using PolicyFlags = ResTable_overlayable_policy_header::PolicyFlags; using PolicyBitmask = uint32_t; diff --git a/cmds/idmap2/libidmap2/Idmap.cpp b/cmds/idmap2/libidmap2/Idmap.cpp index aec1a6fc2ba..4649675965d 100644 --- a/cmds/idmap2/libidmap2/Idmap.cpp +++ b/cmds/idmap2/libidmap2/Idmap.cpp @@ -282,6 +282,7 @@ Result CheckOverlayable(const LoadedPackage& target_package, const utils::OverlayManifestInfo& overlay_info, const PolicyBitmask& fulfilled_policies, const ResourceId& resid) { static constexpr const PolicyBitmask sDefaultPolicies = + PolicyFlags::POLICY_ODM_PARTITION | PolicyFlags::POLICY_OEM_PARTITION | PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION | PolicyFlags::POLICY_PRODUCT_PARTITION | PolicyFlags::POLICY_SIGNATURE; diff --git a/cmds/idmap2/libidmap2/Policies.cpp b/cmds/idmap2/libidmap2/Policies.cpp index 0a0cecf1393..495fe615a91 100644 --- a/cmds/idmap2/libidmap2/Policies.cpp +++ b/cmds/idmap2/libidmap2/Policies.cpp @@ -17,8 +17,8 @@ #include "idmap2/Policies.h" #include -#include #include +#include #include #include "androidfw/ResourceTypes.h" @@ -27,19 +27,17 @@ namespace android::idmap2 { -namespace { - -const std::map kStringToFlag = { - {kPolicyPublic, PolicyFlags::POLICY_PUBLIC}, - {kPolicyProduct, PolicyFlags::POLICY_PRODUCT_PARTITION}, - {kPolicySystem, PolicyFlags::POLICY_SYSTEM_PARTITION}, - {kPolicyVendor, PolicyFlags::POLICY_VENDOR_PARTITION}, - {kPolicySignature, PolicyFlags::POLICY_SIGNATURE}, -}; - -} // namespace - Result PoliciesToBitmask(const std::vector& policies) { + static const std::unordered_map kStringToFlag = { + {kPolicyOdm, PolicyFlags::POLICY_ODM_PARTITION}, + {kPolicyOem, PolicyFlags::POLICY_OEM_PARTITION}, + {kPolicyPublic, PolicyFlags::POLICY_PUBLIC}, + {kPolicyProduct, PolicyFlags::POLICY_PRODUCT_PARTITION}, + {kPolicySignature, PolicyFlags::POLICY_SIGNATURE}, + {kPolicySystem, PolicyFlags::POLICY_SYSTEM_PARTITION}, + {kPolicyVendor, PolicyFlags::POLICY_VENDOR_PARTITION}, + }; + PolicyBitmask bitmask = 0; for (const std::string& policy : policies) { const auto iter = kStringToFlag.find(policy); @@ -55,6 +53,15 @@ Result PoliciesToBitmask(const std::vector& policies std::vector BitmaskToPolicies(const PolicyBitmask& bitmask) { std::vector policies; + + if ((bitmask & PolicyFlags::POLICY_ODM_PARTITION) != 0) { + policies.emplace_back(kPolicyOdm); + } + + if ((bitmask & PolicyFlags::POLICY_OEM_PARTITION) != 0) { + policies.emplace_back(kPolicyOem); + } + if ((bitmask & PolicyFlags::POLICY_PUBLIC) != 0) { policies.emplace_back(kPolicyPublic); } @@ -63,6 +70,10 @@ std::vector BitmaskToPolicies(const PolicyBitmask& bitmask) { policies.emplace_back(kPolicyProduct); } + if ((bitmask & PolicyFlags::POLICY_SIGNATURE) != 0) { + policies.emplace_back(kPolicySignature); + } + if ((bitmask & PolicyFlags::POLICY_SYSTEM_PARTITION) != 0) { policies.emplace_back(kPolicySystem); } @@ -71,10 +82,6 @@ std::vector BitmaskToPolicies(const PolicyBitmask& bitmask) { policies.emplace_back(kPolicyVendor); } - if ((bitmask & PolicyFlags::POLICY_SIGNATURE) != 0) { - policies.emplace_back(kPolicySignature); - } - return policies; } diff --git a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp index 9cdc86ca181..9348ab72149 100644 --- a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp +++ b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp @@ -109,49 +109,55 @@ TEST(BinaryStreamVisitorTests, CreateIdmapFromApkAssetsInteropWithLoadedIdmap) { success = LoadedIdmap::Lookup(header, 0x0002, &entry); // string/c ASSERT_FALSE(success); - success = LoadedIdmap::Lookup(header, 0x0003, &entry); // string/other + success = LoadedIdmap::Lookup(header, 0x0003, &entry); // string/policy_odm ASSERT_FALSE(success); - success = LoadedIdmap::Lookup(header, 0x0004, &entry); // string/not_overlayable + success = LoadedIdmap::Lookup(header, 0x0004, &entry); // string/policy_oem ASSERT_FALSE(success); - success = LoadedIdmap::Lookup(header, 0x0005, &entry); // string/policy_product + success = LoadedIdmap::Lookup(header, 0x0005, &entry); // string/other ASSERT_FALSE(success); - success = LoadedIdmap::Lookup(header, 0x0006, &entry); // string/policy_public + success = LoadedIdmap::Lookup(header, 0x0006, &entry); // string/not_overlayable ASSERT_FALSE(success); - success = LoadedIdmap::Lookup(header, 0x0007, &entry); // string/policy_system + success = LoadedIdmap::Lookup(header, 0x0007, &entry); // string/policy_product ASSERT_FALSE(success); - success = LoadedIdmap::Lookup(header, 0x0008, &entry); // string/policy_system_vendor + success = LoadedIdmap::Lookup(header, 0x0008, &entry); // string/policy_public ASSERT_FALSE(success); - success = LoadedIdmap::Lookup(header, 0x0009, &entry); // string/policy_signature + success = LoadedIdmap::Lookup(header, 0x0009, &entry); // string/policy_system ASSERT_FALSE(success); - success = LoadedIdmap::Lookup(header, 0x000a, &entry); // string/str1 + success = LoadedIdmap::Lookup(header, 0x000a, &entry); // string/policy_system_vendor + ASSERT_FALSE(success); + + success = LoadedIdmap::Lookup(header, 0x000b, &entry); // string/policy_signature + ASSERT_FALSE(success); + + success = LoadedIdmap::Lookup(header, 0x000c, &entry); // string/str1 ASSERT_TRUE(success); ASSERT_EQ(entry, 0x0000); - success = LoadedIdmap::Lookup(header, 0x000b, &entry); // string/str2 + success = LoadedIdmap::Lookup(header, 0x000d, &entry); // string/str2 ASSERT_FALSE(success); - success = LoadedIdmap::Lookup(header, 0x000c, &entry); // string/str3 + success = LoadedIdmap::Lookup(header, 0x000e, &entry); // string/str3 ASSERT_TRUE(success); ASSERT_EQ(entry, 0x0001); - success = LoadedIdmap::Lookup(header, 0x000d, &entry); // string/str4 + success = LoadedIdmap::Lookup(header, 0x000f, &entry); // string/str4 ASSERT_TRUE(success); ASSERT_EQ(entry, 0x0002); - success = LoadedIdmap::Lookup(header, 0x000e, &entry); // string/x + success = LoadedIdmap::Lookup(header, 0x0010, &entry); // string/x ASSERT_FALSE(success); - success = LoadedIdmap::Lookup(header, 0x000f, &entry); // string/y + success = LoadedIdmap::Lookup(header, 0x0011, &entry); // string/y ASSERT_FALSE(success); - success = LoadedIdmap::Lookup(header, 0x0010, &entry); // string/z + success = LoadedIdmap::Lookup(header, 0x0012, &entry); // string/z ASSERT_FALSE(success); } diff --git a/cmds/idmap2/tests/Idmap2BinaryTests.cpp b/cmds/idmap2/tests/Idmap2BinaryTests.cpp index c18744ccb2d..8a48f4b8e6d 100644 --- a/cmds/idmap2/tests/Idmap2BinaryTests.cpp +++ b/cmds/idmap2/tests/Idmap2BinaryTests.cpp @@ -128,9 +128,9 @@ TEST_F(Idmap2BinaryTests, Dump) { ASSERT_THAT(result, NotNull()); ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr; ASSERT_NE(result->stdout.find("0x7f010000 -> 0x7f010000 integer/int1"), std::string::npos); - ASSERT_NE(result->stdout.find("0x7f02000a -> 0x7f020000 string/str1"), std::string::npos); - ASSERT_NE(result->stdout.find("0x7f02000c -> 0x7f020001 string/str3"), std::string::npos); - ASSERT_NE(result->stdout.find("0x7f02000d -> 0x7f020002 string/str4"), std::string::npos); + ASSERT_NE(result->stdout.find("0x7f02000c -> 0x7f020000 string/str1"), std::string::npos); + ASSERT_NE(result->stdout.find("0x7f02000e -> 0x7f020001 string/str3"), std::string::npos); + ASSERT_NE(result->stdout.find("0x7f02000f -> 0x7f020002 string/str4"), std::string::npos); ASSERT_EQ(result->stdout.find("00000210: 007f target package id"), std::string::npos); // clang-format off @@ -299,7 +299,7 @@ TEST_F(Idmap2BinaryTests, Lookup) { "lookup", "--idmap-path", GetIdmapPath(), "--config", "", - "--resid", "0x7f02000a"}); // string/str1 + "--resid", "0x7f02000c"}); // string/str1 // clang-format on ASSERT_THAT(result, NotNull()); ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr; diff --git a/cmds/idmap2/tests/IdmapTests.cpp b/cmds/idmap2/tests/IdmapTests.cpp index 90fe9a79bd1..0f47f1e77d7 100644 --- a/cmds/idmap2/tests/IdmapTests.cpp +++ b/cmds/idmap2/tests/IdmapTests.cpp @@ -194,7 +194,7 @@ TEST(IdmapTests, CreateIdmapFromApkAssets) { ASSERT_THAT(idmap->GetHeader(), NotNull()); ASSERT_EQ(idmap->GetHeader()->GetMagic(), 0x504d4449U); ASSERT_EQ(idmap->GetHeader()->GetVersion(), 0x01U); - ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), 0xd513ca1b); + ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), 0x76a20829); ASSERT_EQ(idmap->GetHeader()->GetOverlayCrc(), 0x8635c2ed); ASSERT_EQ(idmap->GetHeader()->GetTargetPath().to_string(), target_apk_path); ASSERT_EQ(idmap->GetHeader()->GetOverlayPath(), overlay_apk_path); @@ -220,7 +220,7 @@ TEST(IdmapTests, CreateIdmapFromApkAssets) { ASSERT_EQ(types[1]->GetTargetTypeId(), 0x02U); ASSERT_EQ(types[1]->GetOverlayTypeId(), 0x02U); ASSERT_EQ(types[1]->GetEntryCount(), 4U); - ASSERT_EQ(types[1]->GetEntryOffset(), 10U); + ASSERT_EQ(types[1]->GetEntryOffset(), 12U); ASSERT_EQ(types[1]->GetEntry(0), 0x0000U); ASSERT_EQ(types[1]->GetEntry(1), kNoEntry); ASSERT_EQ(types[1]->GetEntry(2), 0x0001U); @@ -251,7 +251,7 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublic) { ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U); ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U); ASSERT_EQ(types[0]->GetEntryCount(), 4U); - ASSERT_EQ(types[0]->GetEntryOffset(), 6U); + ASSERT_EQ(types[0]->GetEntryOffset(), 8U); ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_public ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/policy_signature ASSERT_EQ(types[0]->GetEntry(2), 0x0001U); // string/policy_system @@ -281,7 +281,7 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignature) { ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U); ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U); ASSERT_EQ(types[0]->GetEntryCount(), 1U); - ASSERT_EQ(types[0]->GetEntryOffset(), 7U); + ASSERT_EQ(types[0]->GetEntryOffset(), 9U); ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_signature } @@ -310,11 +310,11 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalid) { ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U); ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U); ASSERT_EQ(types[0]->GetEntryCount(), 4U); - ASSERT_EQ(types[0]->GetEntryOffset(), 6U); - ASSERT_EQ(types[0]->GetEntry(0), 0x0003U); // string/policy_public + ASSERT_EQ(types[0]->GetEntryOffset(), 8U); + ASSERT_EQ(types[0]->GetEntry(0), 0x0005U); // string/policy_public ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/policy_signature - ASSERT_EQ(types[0]->GetEntry(2), 0x0005U); // string/policy_system - ASSERT_EQ(types[0]->GetEntry(3), 0x0006U); // string/policy_system_vendor + ASSERT_EQ(types[0]->GetEntry(2), 0x0007U); // string/policy_system + ASSERT_EQ(types[0]->GetEntry(3), 0x0008U); // string/policy_system_vendor } // Overlays should ignore all overlayable restrictions if enforcement of overlayable is disabled. @@ -341,15 +341,17 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalidIgn ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U); ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U); - ASSERT_EQ(types[0]->GetEntryCount(), 7U); + ASSERT_EQ(types[0]->GetEntryCount(), 9U); ASSERT_EQ(types[0]->GetEntryOffset(), 3U); ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/not_overlayable - ASSERT_EQ(types[0]->GetEntry(1), 0x0001U); // string/other - ASSERT_EQ(types[0]->GetEntry(2), 0x0002U); // string/policy_product - ASSERT_EQ(types[0]->GetEntry(3), 0x0003U); // string/policy_signature - ASSERT_EQ(types[0]->GetEntry(4), 0x0004U); // string/policy_public - ASSERT_EQ(types[0]->GetEntry(5), 0x0005U); // string/policy_system - ASSERT_EQ(types[0]->GetEntry(6), 0x0006U); // string/policy_system_vendor + ASSERT_EQ(types[0]->GetEntry(1), 0x0001U); // string/policy_odm + ASSERT_EQ(types[0]->GetEntry(2), 0x0002U); // string/policy_oem + ASSERT_EQ(types[0]->GetEntry(3), 0x0003U); // string/other + ASSERT_EQ(types[0]->GetEntry(4), 0x0004U); // string/policy_product + ASSERT_EQ(types[0]->GetEntry(5), 0x0005U); // string/policy_public + ASSERT_EQ(types[0]->GetEntry(6), 0x0006U); // string/policy_signature + ASSERT_EQ(types[0]->GetEntry(7), 0x0007U); // string/policy_system + ASSERT_EQ(types[0]->GetEntry(8), 0x0008U); // string/policy_system_vendor } // Overlays that do not specify a target can overlay resources defined as overlayable. @@ -381,7 +383,7 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsNoDefinedOverlayableAndNoTar ASSERT_EQ(types[1]->GetTargetTypeId(), 0x02U); ASSERT_EQ(types[1]->GetOverlayTypeId(), 0x02U); ASSERT_EQ(types[1]->GetEntryCount(), 4U); - ASSERT_EQ(types[1]->GetEntryOffset(), 10U); + ASSERT_EQ(types[1]->GetEntryOffset(), 12U); ASSERT_EQ(types[1]->GetEntry(0), 0x0000U); // string/str1 ASSERT_EQ(types[1]->GetEntry(1), kNoEntry); // string/str2 ASSERT_EQ(types[1]->GetEntry(2), 0x0001U); // string/str3 @@ -412,7 +414,6 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsDefaultPolicies) { ASSERT_EQ(dataBlocks.size(), 1U); const std::unique_ptr& data = dataBlocks[0]; - ASSERT_EQ(data->GetHeader()->GetTargetPackageId(), 0x7fU); ASSERT_EQ(data->GetHeader()->GetTypeCount(), 1U); @@ -421,15 +422,17 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsDefaultPolicies) { ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U); ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U); - ASSERT_EQ(types[0]->GetEntryCount(), 7U); + ASSERT_EQ(types[0]->GetEntryCount(), 9U); ASSERT_EQ(types[0]->GetEntryOffset(), 3U); ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/not_overlayable - ASSERT_EQ(types[0]->GetEntry(1), 0x0001U); // string/other - ASSERT_EQ(types[0]->GetEntry(2), 0x0002U); // string/policy_product - ASSERT_EQ(types[0]->GetEntry(3), 0x0003U); // string/policy_public - ASSERT_EQ(types[0]->GetEntry(4), 0x0004U); // string/string/policy_signature - ASSERT_EQ(types[0]->GetEntry(5), 0x0005U); // string/policy_system - ASSERT_EQ(types[0]->GetEntry(6), 0x0006U); // string/policy_system_vendor + ASSERT_EQ(types[0]->GetEntry(1), 0x0001U); // string/policy_odm + ASSERT_EQ(types[0]->GetEntry(2), 0x0002U); // string/policy_oem + ASSERT_EQ(types[0]->GetEntry(3), 0x0003U); // string/other + ASSERT_EQ(types[0]->GetEntry(4), 0x0004U); // string/policy_product + ASSERT_EQ(types[0]->GetEntry(5), 0x0005U); // string/policy_public + ASSERT_EQ(types[0]->GetEntry(6), 0x0006U); // string/policy_signature + ASSERT_EQ(types[0]->GetEntry(7), 0x0007U); // string/policy_system + ASSERT_EQ(types[0]->GetEntry(8), 0x0008U); // string/policy_system_vendor }; CreateIdmap(target_apk_path, overlay_apk_path, PolicyFlags::POLICY_SIGNATURE, @@ -451,6 +454,16 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsDefaultPolicies) { /* enforce_overlayable */ true, &idmap); ASSERT_THAT(idmap, NotNull()); CheckEntries(); + + CreateIdmap(target_apk_path, overlay_apk_path, PolicyFlags::POLICY_ODM_PARTITION, + /* enforce_overlayable */ true, &idmap); + ASSERT_THAT(idmap, NotNull()); + CheckEntries(); + + CreateIdmap(target_apk_path, overlay_apk_path, PolicyFlags::POLICY_OEM_PARTITION, + /* enforce_overlayable */ true, &idmap); + ASSERT_THAT(idmap, NotNull()); + CheckEntries(); } TEST(IdmapTests, FailToCreateIdmapFromApkAssetsIfPathTooLong) { diff --git a/cmds/idmap2/tests/PoliciesTests.cpp b/cmds/idmap2/tests/PoliciesTests.cpp index e30da76ddd9..eca74045f42 100644 --- a/cmds/idmap2/tests/PoliciesTests.cpp +++ b/cmds/idmap2/tests/PoliciesTests.cpp @@ -38,9 +38,10 @@ TEST(PoliciesTests, PoliciesToBitmasks) { ASSERT_TRUE(bitmask3); ASSERT_EQ(*bitmask3, PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION); - const auto bitmask4 = PoliciesToBitmask({"public", "product", "system", "vendor"}); + const auto bitmask4 = PoliciesToBitmask({"odm", "oem", "public", "product", "system", "vendor"}); ASSERT_TRUE(bitmask4); - ASSERT_EQ(*bitmask4, PolicyFlags::POLICY_PUBLIC | PolicyFlags::POLICY_PRODUCT_PARTITION | + ASSERT_EQ(*bitmask4, PolicyFlags::POLICY_ODM_PARTITION | PolicyFlags::POLICY_OEM_PARTITION | + PolicyFlags::POLICY_PUBLIC | PolicyFlags::POLICY_PRODUCT_PARTITION | PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION); @@ -64,4 +65,28 @@ TEST(PoliciesTests, PoliciesToBitmasks) { ASSERT_FALSE(bitmask10); } +TEST(PoliciesTests, BitmaskToPolicies) { + const auto policies1 = BitmaskToPolicies(PolicyFlags::POLICY_PUBLIC); + ASSERT_EQ(1, policies1.size()); + ASSERT_EQ(policies1[0], "public"); + + const auto policies2 = BitmaskToPolicies(PolicyFlags::POLICY_SYSTEM_PARTITION | + PolicyFlags::POLICY_VENDOR_PARTITION); + ASSERT_EQ(2, policies2.size()); + ASSERT_EQ(policies2[0], "system"); + ASSERT_EQ(policies2[1], "vendor"); + + const auto policies3 = BitmaskToPolicies( + PolicyFlags::POLICY_ODM_PARTITION | PolicyFlags::POLICY_OEM_PARTITION | + PolicyFlags::POLICY_PUBLIC | PolicyFlags::POLICY_PRODUCT_PARTITION | + PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION); + ASSERT_EQ(2, policies2.size()); + ASSERT_EQ(policies3[0], "odm"); + ASSERT_EQ(policies3[1], "oem"); + ASSERT_EQ(policies3[2], "public"); + ASSERT_EQ(policies3[3], "product"); + ASSERT_EQ(policies3[4], "system"); + ASSERT_EQ(policies3[5], "vendor"); +} + } // namespace android::idmap2 diff --git a/cmds/idmap2/tests/RawPrintVisitorTests.cpp b/cmds/idmap2/tests/RawPrintVisitorTests.cpp index 64518fdf8de..26951763cd6 100644 --- a/cmds/idmap2/tests/RawPrintVisitorTests.cpp +++ b/cmds/idmap2/tests/RawPrintVisitorTests.cpp @@ -49,7 +49,7 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) { ASSERT_NE(stream.str().find("00000000: 504d4449 magic\n"), std::string::npos); ASSERT_NE(stream.str().find("00000004: 00000001 version\n"), std::string::npos); - ASSERT_NE(stream.str().find("00000008: d513ca1b target crc\n"), std::string::npos); + ASSERT_NE(stream.str().find("00000008: 76a20829 target crc\n"), std::string::npos); ASSERT_NE(stream.str().find("0000000c: 8635c2ed overlay crc\n"), std::string::npos); ASSERT_NE(stream.str().find("0000021c: 00000000 0x7f010000 -> 0x7f010000 integer/int1\n"), std::string::npos); diff --git a/cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml b/cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml index 02704009d74..9ebfae41e4c 100644 --- a/cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml +++ b/cmds/idmap2/tests/data/system-overlay-invalid/res/values/values.xml @@ -23,6 +23,8 @@ policy_product policy_signature + policy_odm + policy_oem not_overlayable diff --git a/cmds/idmap2/tests/data/system-overlay-invalid/system-overlay-invalid.apk b/cmds/idmap2/tests/data/system-overlay-invalid/system-overlay-invalid.apk index 9448939b56366c58a37861ed4dd249d316820d19..1456e749e796460ab3c0be174f99779d26de548d 100644 GIT binary patch delta 928 zcmZ3_^O<*oVg1y}wtj~lL|W35nV#7*atWB2h=}m1E^290QuycMJLSXj7KA-RPm&iC8fJ++%RpZ8l3Fq?VO#in=ML6I+ur*tkqz;%Nq z_XC66LE{R>`~_Jn7&&*a`aclWS!lh)`0ACbZAqpjXWkWlO%SS|yXjSC`;K*L`cf*W#jUckjrTeVw~y|CZjex$Bw3V*TzG7q9VN z^-6Es_Z5K`8#*s$9_Tq#BB6V&^wGWP-Kp>HB$sSi#zx|QMJmsWF2A1Q zcW35QdG$8Gg=b$KvEI5bDRyW5@2w|dt(Q%H{c=rlrtG{8){d!jci-eQt$TU4KI>As z$@zEw@qy<;S*qU}ZQ~Z4n)}K0`tI{_%ckD^u77vN1pN@H$%fqt*#~AU$?y?BG3A5i z)C1P%1wI>S9Jrra@w-Rhyg}E$-P?XM&F8w)Dzp*;SWfGjK+4Q)2h5&DN4&jnD*1H%P7(7@Q7y`VRSr{OoVLoFCf6Gh@76t|o=3`)F zC`v8PFD*(=E!ImcDo$o#V&Gx0sApkdU}OMc8HNiC3=EtQ-5>!52N;`yfkB9YfkBFa zfkB;tfx(1n|%Co{P+K0hTFiIbYkz{gjRKiP~al7&fuF=q2rCV$3!Iy+&qAyX_b6O#bgOQ2xj zoP3c6$b+Y13Lo)0|x^GGn59gL6{jN p7vRmv1PVJ2kVwOPMnn`%-o|P!jT$c?g)sbkG6$O?TLK%14**BeHM;-+ delta 695 zcmey&yPju)VSVqUvtEZCL|V_AtUb2P$yL0|wM1R-Qtyre?HxfY?K`-|r-kKi^z~Zo zRBq=SZr6GKfivf?vn5v~1m_eOm7lZyerB&?qf;*1q`=sGw^`S}XQe$d-N3AOkj181 z`~%mumABb`KVb5ibAE4>)XT8zF20Ypy{ovrIpp6&TO~P*I>yj?Cz}xe+8M#6E3DL| zG+Vtz7DxST&+0E{SNr$L%xc=(*FC|f)~e_Ee{l%Cee{yfs~NilYx-kv1&P14Eq}Y} z;N(Sb7s)N~5q_DhztNxr`GC|@GV#8^a`f``z_|4pS=32ZTe?d^ZiYW&QFgm4_^1^FaHg3 + + + + + + + + diff --git a/cmds/idmap2/tests/data/target/res/values/values.xml b/cmds/idmap2/tests/data/target/res/values/values.xml index edd53f4c9b5..a892c98f0fb 100644 --- a/cmds/idmap2/tests/data/target/res/values/values.xml +++ b/cmds/idmap2/tests/data/target/res/values/values.xml @@ -29,11 +29,13 @@ not_overlayable - policy_system - policy_system_vendor - policy_product policy_public + policy_odm + policy_oem + policy_product policy_signature + policy_system + policy_system_vendor - + other diff --git a/cmds/idmap2/tests/data/target/target-no-overlayable.apk b/cmds/idmap2/tests/data/target/target-no-overlayable.apk index 908b54a2f0c3fe718b1061407a175e45ff948f2b..033305aaed4f5b5570251663431ca8685be241b8 100644 GIT binary patch delta 514 zcmcaDa9wZ#Bj@>sxj!bbF)&P+%*iNS4`MMgFfcGO$S~M2GB5};Kmj8ILk5%yqF5Lh z7&sUh7M7~~ij7}OXT7>pSh7#tWF7y=m>7!ny67)lrz7+M$@7-lmtFf3zWVA#mO zz_5pbf#Em<1H)+s28Qz>dl(ZL7#Wio7#Wip`1$iD&tv3QWM$1S$w)0?;NmLC&&f=# zjL%QWMdGC9PF}+}m5qT(fzg9?vl~+yqo4&N1A_?2Ss={Fz>qU}FSD|t6$1lk;bg++sr zVe)R4M$Q-p1_mYu1_t5DiA?^2j7%X67Z{-;3=9klCO>3xpZtW?Ayj~ofkA;05?Y{; zn*B0^9RK?n_wFOUgB elMUIIAjR!Hc3-9q?2`l7B__La2(W?UjsXB_T27Gw delta 390 zcmcaEcw1lrBj++79SIRO1_qJIoQ%>LAQmG70|O(241)+G1A`y~6fiO{BtV%UikX3d zft`VYft!JWfuDhaL6L!h!H9u@!HI!^A(VlEA(erFp@xBhp`C$&VG;ua!(0Xih7}A9 z3~Lw|7&b64Fif7vs5tow;}ljV1;#HdoAa2`7zIK034sg;VMYdql*vz-l{M`c7#RE* z7#I>67#Io}7#KPj7#R8)7#OBOO diff --git a/cmds/idmap2/tests/data/target/target.apk b/cmds/idmap2/tests/data/target/target.apk index da3c1aef5fba575a528014075371c0cc06b28f11..9bcd6dcabcde4271e5cd1e3933d06f0ef4ef4885 100644 GIT binary patch delta 697 zcmeyWI#YeaZ^n9F(_RJ%0R}MUV_;?|N-fSWElN%;)=MlZPG(?WU}E3_OENMrFfcO6 zFoZBNFo-Zf0V4xL4wMO^SQr=>I2afhco-NM5*Zj6 zN*EXzS{N7@W-~A_tYZ*oVA#pPz;J|tf#Ey@1H&x_28MeK3=EGZ_b@3cva;rvWTX}` zaB&sn=VT^V#^`By%yNpbH}dgDA)$Ak4_XP%!x}i?XQ| z0|SFQ0|P?@0|P?_0|P@f0|P@h0|Ub%1_p+e3=9k#7#J9~GcYjhV_;x7#K6FCjDdmS z)MQ;&14-N#$FTNHe#Y9w83PU>1_t5Djm-X{j7%X67Z^cd#=s!Vz`(Eo37|_!$^Ln2&*(p(wRDzqBYhwOB8)s5qH{fq{vE2Q10Rz`(%B zAj6=;$iN`P00oQ;3@K11h+<}7U|?rpVBlt8VBlw9U{GXWU@&4}U~pn!Ug0|SE}0|P@M0|P@L0|P?`)bwc#3=DG_7#Nl? zFfgoOU|?9oz`(F!axAOCF zFo;0i4sj1tJxq*kGNX|2o({_+(jOAEpU{lLLe#!~(oo U*+2oy!ob4tpMinl0Vog{04fegh5!Hn diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h index 875b90b7ac6..fc635aaeb0d 100644 --- a/libs/androidfw/include/androidfw/ResourceTypes.h +++ b/libs/androidfw/include/androidfw/ResourceTypes.h @@ -1651,6 +1651,14 @@ struct ResTable_overlayable_policy_header // The overlay must be signed with the same signature as the actor of the target resource, // which can be separate or the same as the target package with the resource. POLICY_SIGNATURE = 0x00000010, + + // The overlay must reside of the odm partition or must have existed on the odm + // partition before an upgrade to overlay these resources. + POLICY_ODM_PARTITION = 0x00000020, + + // The overlay must reside of the oem partition or must have existed on the oem + // partition before an upgrade to overlay these resources. + POLICY_OEM_PARTITION = 0x00000040, }; uint32_t policy_flags; diff --git a/services/core/java/com/android/server/om/IdmapManager.java b/services/core/java/com/android/server/om/IdmapManager.java index fd68a8bc1ca..4b435de3538 100644 --- a/services/core/java/com/android/server/om/IdmapManager.java +++ b/services/core/java/com/android/server/om/IdmapManager.java @@ -220,9 +220,19 @@ class IdmapManager { return fulfilledPolicies | IIdmap2.POLICY_PRODUCT_PARTITION; } + // Odm partition (/odm) + if (ai.isOdm()) { + return fulfilledPolicies | IIdmap2.POLICY_ODM_PARTITION; + } + + // Oem partition (/oem) + if (ai.isOem()) { + return fulfilledPolicies | IIdmap2.POLICY_OEM_PARTITION; + } + // Check partitions for which there exists no policy so overlays on these partitions will // not fulfill the system policy. - if (ai.isOem() || ai.isProductServices()) { + if (ai.isProductServices()) { return fulfilledPolicies; } diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp index 5e8d870488c..fe401e22c50 100644 --- a/tools/aapt2/ResourceParser.cpp +++ b/tools/aapt2/ResourceParser.cpp @@ -1143,34 +1143,38 @@ bool ResourceParser::ParseOverlayable(xml::XmlPullParser* parser, ParsedResource } else if (Maybe maybe_type = xml::FindNonEmptyAttribute(parser, "type")) { // Parse the polices separated by vertical bar characters to allow for specifying multiple // policies. Items within the policy tag will have the specified policy. - for (StringPiece part : util::Tokenize(maybe_type.value(), '|')) { + static const auto kPolicyMap = + ImmutableMap::CreatePreSorted({ + {"odm", OverlayableItem::Policy::kOdm}, + {"oem", OverlayableItem::Policy::kOem}, + {"product", OverlayableItem::Policy::kProduct}, + {"public", OverlayableItem::Policy::kPublic}, + {"signature", OverlayableItem::Policy::kSignature}, + {"system", OverlayableItem::Policy::kSystem}, + {"vendor", OverlayableItem::Policy::kVendor}, + }); + + for (const StringPiece& part : util::Tokenize(maybe_type.value(), '|')) { StringPiece trimmed_part = util::TrimWhitespace(part); - if (trimmed_part == "public") { - current_policies |= OverlayableItem::Policy::kPublic; - } else if (trimmed_part == "product") { - current_policies |= OverlayableItem::Policy::kProduct; - } else if (trimmed_part == "system") { - current_policies |= OverlayableItem::Policy::kSystem; - } else if (trimmed_part == "vendor") { - current_policies |= OverlayableItem::Policy::kVendor; - } else if (trimmed_part == "signature") { - current_policies |= OverlayableItem::Policy::kSignature; - } else { + const auto policy = kPolicyMap.find(trimmed_part); + if (policy == kPolicyMap.end()) { diag_->Error(DiagMessage(element_source) << " has unsupported type '" << trimmed_part << "'"); error = true; continue; } + + current_policies |= policy->second; } } else { diag_->Error(DiagMessage(element_source) - << " must have a 'type' attribute"); + << " must have a 'type' attribute"); error = true; continue; } } else if (!ShouldIgnoreElement(element_namespace, element_name)) { diag_->Error(DiagMessage(element_source) << "invalid element <" << element_name << "> " - << " in "); + << " in "); error = true; break; } diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp index 85779219290..7c8b6d054cd 100644 --- a/tools/aapt2/ResourceParser_test.cpp +++ b/tools/aapt2/ResourceParser_test.cpp @@ -971,6 +971,12 @@ TEST_F(ResourceParserTest, ParseOverlayablePolicy) { + + + + + + )"; ASSERT_TRUE(TestParse(input)); @@ -1013,6 +1019,22 @@ TEST_F(ResourceParserTest, ParseOverlayablePolicy) { result_overlayable_item = search_result.value().entry->overlayable_item.value(); EXPECT_THAT(result_overlayable_item.overlayable->name, Eq("Name")); EXPECT_THAT(result_overlayable_item.policies, Eq(OverlayableItem::Policy::kSignature)); + + search_result = table_.FindResource(test::ParseNameOrDie("string/biz")); + ASSERT_TRUE(search_result); + ASSERT_THAT(search_result.value().entry, NotNull()); + ASSERT_TRUE(search_result.value().entry->overlayable_item); + result_overlayable_item = search_result.value().entry->overlayable_item.value(); + EXPECT_THAT(result_overlayable_item.overlayable->name, Eq("Name")); + EXPECT_THAT(result_overlayable_item.policies, Eq(OverlayableItem::Policy::kOdm)); + + search_result = table_.FindResource(test::ParseNameOrDie("string/buz")); + ASSERT_TRUE(search_result); + ASSERT_THAT(search_result.value().entry, NotNull()); + ASSERT_TRUE(search_result.value().entry->overlayable_item); + result_overlayable_item = search_result.value().entry->overlayable_item.value(); + EXPECT_THAT(result_overlayable_item.overlayable->name, Eq("Name")); + EXPECT_THAT(result_overlayable_item.policies, Eq(OverlayableItem::Policy::kOem)); } TEST_F(ResourceParserTest, ParseOverlayableNoPolicyError) { diff --git a/tools/aapt2/ResourceTable.h b/tools/aapt2/ResourceTable.h index 7ed78975a01..30ba1aed25f 100644 --- a/tools/aapt2/ResourceTable.h +++ b/tools/aapt2/ResourceTable.h @@ -79,22 +79,28 @@ struct OverlayableItem { // Represents the types overlays that are allowed to overlay the resource. typedef uint32_t PolicyFlags; enum Policy : uint32_t { - kNone = 0x00, + kNone = 0x00000000, // The resource can be overlaid by any overlay. - kPublic = 0x01, + kPublic = 0x00000001, // The resource can be overlaid by any overlay on the system partition. - kSystem = 0x02, + kSystem = 0x00000002, // The resource can be overlaid by any overlay on the vendor partition. - kVendor = 0x04, + kVendor = 0x00000004, // The resource can be overlaid by any overlay on the product partition. - kProduct = 0x08, + kProduct = 0x00000008, // The resource can be overlaid by any overlay signed with the same signature as its actor. - kSignature = 0x010, + kSignature = 0x00000010, + + // The resource can be overlaid by any overlay on the odm partition. + kOdm = 0x00000020, + + // The resource can be overlaid by any overlay on the oem partition. + kOem = 0x00000040, }; std::shared_ptr overlayable; diff --git a/tools/aapt2/Resources.proto b/tools/aapt2/Resources.proto index a2fd7c664b0..12cf65be05c 100644 --- a/tools/aapt2/Resources.proto +++ b/tools/aapt2/Resources.proto @@ -157,6 +157,8 @@ message OverlayableItem { VENDOR = 3; PRODUCT = 4; SIGNATURE = 5; + ODM = 6; + OEM = 7; } // The location of the declaration in source. diff --git a/tools/aapt2/format/binary/BinaryResourceParser.cpp b/tools/aapt2/format/binary/BinaryResourceParser.cpp index 59eb9ec2d41..fd8e36ebf82 100644 --- a/tools/aapt2/format/binary/BinaryResourceParser.cpp +++ b/tools/aapt2/format/binary/BinaryResourceParser.cpp @@ -475,6 +475,14 @@ bool BinaryResourceParser::ParseOverlayable(const ResChunk_header* chunk) { & ResTable_overlayable_policy_header::POLICY_SIGNATURE) { policies |= OverlayableItem::Policy::kSignature; } + if (policy_header->policy_flags + & ResTable_overlayable_policy_header::POLICY_ODM_PARTITION) { + policies |= OverlayableItem::Policy::kOdm; + } + if (policy_header->policy_flags + & ResTable_overlayable_policy_header::POLICY_OEM_PARTITION) { + policies |= OverlayableItem::Policy::kOem; + } const ResTable_ref* const ref_begin = reinterpret_cast( ((uint8_t *)policy_header) + util::DeviceToHost32(policy_header->header.headerSize)); diff --git a/tools/aapt2/format/binary/TableFlattener.cpp b/tools/aapt2/format/binary/TableFlattener.cpp index aa578a2a6ff..f2e72da4056 100644 --- a/tools/aapt2/format/binary/TableFlattener.cpp +++ b/tools/aapt2/format/binary/TableFlattener.cpp @@ -496,6 +496,12 @@ class PackageFlattener { if (item.policies & OverlayableItem::Policy::kSignature) { policy_flags |= ResTable_overlayable_policy_header::POLICY_SIGNATURE; } + if (item.policies & OverlayableItem::Policy::kOdm) { + policy_flags |= ResTable_overlayable_policy_header::POLICY_ODM_PARTITION; + } + if (item.policies & OverlayableItem::Policy::kOem) { + policy_flags |= ResTable_overlayable_policy_header::POLICY_OEM_PARTITION; + } auto policy = overlayable_chunk->policy_ids.find(policy_flags); if (policy != overlayable_chunk->policy_ids.end()) { diff --git a/tools/aapt2/format/binary/TableFlattener_test.cpp b/tools/aapt2/format/binary/TableFlattener_test.cpp index 4c5dbec8ade..a9409235e07 100644 --- a/tools/aapt2/format/binary/TableFlattener_test.cpp +++ b/tools/aapt2/format/binary/TableFlattener_test.cpp @@ -724,8 +724,8 @@ TEST_F(TableFlattenerTest, FlattenMultipleOverlayable) { std::string name_two = "com.app.test:integer/overlayable_two"; OverlayableItem overlayable_item_two(group); - overlayable_item_two.policies |= OverlayableItem::Policy::kProduct; - overlayable_item_two.policies |= OverlayableItem::Policy::kSystem; + overlayable_item_two.policies |= OverlayableItem::Policy::kOdm; + overlayable_item_two.policies |= OverlayableItem::Policy::kOem; overlayable_item_two.policies |= OverlayableItem::Policy::kVendor; std::string name_three = "com.app.test:integer/overlayable_three"; @@ -744,6 +744,7 @@ TEST_F(TableFlattenerTest, FlattenMultipleOverlayable) { .AddSimple(name_three, ResourceId(0x7f020003)) .SetOverlayable(name_three, overlayable_item_three) .Build(); + ResourceTable output_table; ASSERT_TRUE(Flatten(context_.get(), {}, table.get(), &output_table)); auto search_result = output_table.FindResource(test::ParseNameOrDie(name_zero)); @@ -755,6 +756,7 @@ TEST_F(TableFlattenerTest, FlattenMultipleOverlayable) { EXPECT_EQ(result_overlayable.overlayable->actor, "overlay://theme"); EXPECT_EQ(result_overlayable.policies, OverlayableItem::Policy::kSystem | OverlayableItem::Policy::kProduct); + search_result = output_table.FindResource(test::ParseNameOrDie(name_one)); ASSERT_TRUE(search_result); ASSERT_THAT(search_result.value().entry, NotNull()); @@ -763,6 +765,7 @@ TEST_F(TableFlattenerTest, FlattenMultipleOverlayable) { EXPECT_EQ(result_overlayable.overlayable->name, "OtherName"); EXPECT_EQ(result_overlayable.overlayable->actor, "overlay://customization"); EXPECT_EQ(result_overlayable.policies, OverlayableItem::Policy::kPublic); + search_result = output_table.FindResource(test::ParseNameOrDie(name_two)); ASSERT_TRUE(search_result); ASSERT_THAT(search_result.value().entry, NotNull()); @@ -770,9 +773,10 @@ TEST_F(TableFlattenerTest, FlattenMultipleOverlayable) { result_overlayable = search_result.value().entry->overlayable_item.value(); EXPECT_EQ(result_overlayable.overlayable->name, "TestName"); EXPECT_EQ(result_overlayable.overlayable->actor, "overlay://theme"); - EXPECT_EQ(result_overlayable.policies, OverlayableItem::Policy::kSystem - | OverlayableItem::Policy::kProduct + EXPECT_EQ(result_overlayable.policies, OverlayableItem::Policy::kOdm + | OverlayableItem::Policy::kOem | OverlayableItem::Policy::kVendor); + search_result = output_table.FindResource(test::ParseNameOrDie(name_three)); ASSERT_TRUE(search_result); ASSERT_THAT(search_result.value().entry, NotNull()); diff --git a/tools/aapt2/format/proto/ProtoDeserialize.cpp b/tools/aapt2/format/proto/ProtoDeserialize.cpp index 06f1bf74d7e..bb21c1c539f 100644 --- a/tools/aapt2/format/proto/ProtoDeserialize.cpp +++ b/tools/aapt2/format/proto/ProtoDeserialize.cpp @@ -393,6 +393,12 @@ bool DeserializeOverlayableItemFromPb(const pb::OverlayableItem& pb_overlayable, case pb::OverlayableItem::SIGNATURE: out_overlayable->policies |= OverlayableItem::Policy::kSignature; break; + case pb::OverlayableItem::ODM: + out_overlayable->policies |= OverlayableItem::Policy::kOdm; + break; + case pb::OverlayableItem::OEM: + out_overlayable->policies |= OverlayableItem::Policy::kOem; + break; default: *out_error = "unknown overlayable policy"; return false; diff --git a/tools/aapt2/format/proto/ProtoSerialize.cpp b/tools/aapt2/format/proto/ProtoSerialize.cpp index eb2b1a2f35d..58e1e6ee35c 100644 --- a/tools/aapt2/format/proto/ProtoSerialize.cpp +++ b/tools/aapt2/format/proto/ProtoSerialize.cpp @@ -312,6 +312,12 @@ static void SerializeOverlayableItemToPb(const OverlayableItem& overlayable_item if (overlayable_item.policies & OverlayableItem::Policy::kSignature) { pb_overlayable_item->add_policy(pb::OverlayableItem::SIGNATURE); } + if (overlayable_item.policies & OverlayableItem::Policy::kOdm) { + pb_overlayable_item->add_policy(pb::OverlayableItem::ODM); + } + if (overlayable_item.policies & OverlayableItem::Policy::kOem) { + pb_overlayable_item->add_policy(pb::OverlayableItem::OEM); + } SerializeSourceToPb(overlayable_item.source, source_pool, pb_overlayable_item->mutable_source()); diff --git a/tools/aapt2/format/proto/ProtoSerialize_test.cpp b/tools/aapt2/format/proto/ProtoSerialize_test.cpp index d369ac4c881..f252f33f44f 100644 --- a/tools/aapt2/format/proto/ProtoSerialize_test.cpp +++ b/tools/aapt2/format/proto/ProtoSerialize_test.cpp @@ -529,6 +529,8 @@ TEST(ProtoSerializeTest, SerializeAndDeserializeOverlayable) { OverlayableItem overlayable_item_boz(std::make_shared( "IconPack", "overlay://theme")); overlayable_item_boz.policies |= OverlayableItem::Policy::kSignature; + overlayable_item_boz.policies |= OverlayableItem::Policy::kOdm; + overlayable_item_boz.policies |= OverlayableItem::Policy::kOem; OverlayableItem overlayable_item_biz(std::make_shared( "Other", "overlay://customization")); @@ -587,7 +589,9 @@ TEST(ProtoSerializeTest, SerializeAndDeserializeOverlayable) { overlayable_item = search_result.value().entry->overlayable_item.value(); EXPECT_THAT(overlayable_item.overlayable->name, Eq("IconPack")); EXPECT_THAT(overlayable_item.overlayable->actor, Eq("overlay://theme")); - EXPECT_THAT(overlayable_item.policies, Eq(OverlayableItem::Policy::kSignature)); + EXPECT_THAT(overlayable_item.policies, Eq(OverlayableItem::Policy::kSignature + | OverlayableItem::Policy::kOdm + | OverlayableItem::Policy::kOem)); search_result = new_table.FindResource(test::ParseNameOrDie("com.app.a:bool/biz")); ASSERT_TRUE(search_result); -- GitLab From 453b3bd3924fcfd77914f574a9152c0aa4acd327 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 17 Apr 2019 16:11:17 -0700 Subject: [PATCH 057/473] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I5178ff720b051bf5c6804015ed8d360dfb28550e --- .../legacy/recents/res/values-es/strings.xml | 2 +- .../res-keyguard/values-af/strings.xml | 80 ------------- .../res-keyguard/values-am/strings.xml | 80 ------------- .../res-keyguard/values-ar/strings.xml | 86 +------------- .../res-keyguard/values-as/strings.xml | 80 ------------- .../res-keyguard/values-az/strings.xml | 80 ------------- .../res-keyguard/values-b+sr+Latn/strings.xml | 81 ------------- .../res-keyguard/values-be/strings.xml | 82 -------------- .../res-keyguard/values-bg/strings.xml | 80 ------------- .../res-keyguard/values-bn/strings.xml | 80 ------------- .../res-keyguard/values-bs/strings.xml | 81 ------------- .../res-keyguard/values-ca/strings.xml | 80 ------------- .../res-keyguard/values-cs/strings.xml | 82 -------------- .../res-keyguard/values-da/strings.xml | 80 ------------- .../res-keyguard/values-de/strings.xml | 80 ------------- .../res-keyguard/values-el/strings.xml | 80 ------------- .../res-keyguard/values-en-rAU/strings.xml | 80 ------------- .../res-keyguard/values-en-rCA/strings.xml | 80 ------------- .../res-keyguard/values-en-rGB/strings.xml | 80 ------------- .../res-keyguard/values-en-rIN/strings.xml | 80 ------------- .../res-keyguard/values-en-rXC/strings.xml | 80 ------------- .../res-keyguard/values-es-rUS/strings.xml | 80 ------------- .../res-keyguard/values-es/strings.xml | 80 ------------- .../res-keyguard/values-et/strings.xml | 80 ------------- .../res-keyguard/values-eu/strings.xml | 80 ------------- .../res-keyguard/values-fa/strings.xml | 80 ------------- .../res-keyguard/values-fi/strings.xml | 80 ------------- .../res-keyguard/values-fr-rCA/strings.xml | 80 ------------- .../res-keyguard/values-fr/strings.xml | 80 ------------- .../res-keyguard/values-gl/strings.xml | 80 ------------- .../res-keyguard/values-gu/strings.xml | 80 ------------- .../res-keyguard/values-hi/strings.xml | 29 +---- .../res-keyguard/values-hr/strings.xml | 81 ------------- .../res-keyguard/values-hu/strings.xml | 80 ------------- .../res-keyguard/values-hy/strings.xml | 80 ------------- .../res-keyguard/values-in/strings.xml | 80 ------------- .../res-keyguard/values-is/strings.xml | 19 ---- .../res-keyguard/values-it/strings.xml | 80 ------------- .../res-keyguard/values-iw/strings.xml | 82 -------------- .../res-keyguard/values-ja/strings.xml | 80 ------------- .../res-keyguard/values-ka/strings.xml | 80 ------------- .../res-keyguard/values-kk/strings.xml | 80 ------------- .../res-keyguard/values-km/strings.xml | 80 ------------- .../res-keyguard/values-kn/strings.xml | 80 ------------- .../res-keyguard/values-ko/strings.xml | 80 ------------- .../res-keyguard/values-ky/strings.xml | 80 ------------- .../res-keyguard/values-lo/strings.xml | 80 ------------- .../res-keyguard/values-lt/strings.xml | 82 -------------- .../res-keyguard/values-lv/strings.xml | 81 ------------- .../res-keyguard/values-mk/strings.xml | 80 ------------- .../res-keyguard/values-ml/strings.xml | 80 ------------- .../res-keyguard/values-mn/strings.xml | 80 ------------- .../res-keyguard/values-mr/strings.xml | 80 ------------- .../res-keyguard/values-ms/strings.xml | 80 ------------- .../res-keyguard/values-my/strings.xml | 80 ------------- .../res-keyguard/values-nb/strings.xml | 80 ------------- .../res-keyguard/values-ne/strings.xml | 80 ------------- .../res-keyguard/values-nl/strings.xml | 80 ------------- .../res-keyguard/values-or/strings.xml | 80 ------------- .../res-keyguard/values-pa/strings.xml | 80 ------------- .../res-keyguard/values-pl/strings.xml | 82 -------------- .../res-keyguard/values-pt-rBR/strings.xml | 80 ------------- .../res-keyguard/values-pt-rPT/strings.xml | 80 ------------- .../res-keyguard/values-pt/strings.xml | 80 ------------- .../res-keyguard/values-ro/strings.xml | 81 ------------- .../res-keyguard/values-ru/strings.xml | 82 -------------- .../res-keyguard/values-si/strings.xml | 80 ------------- .../res-keyguard/values-sk/strings.xml | 82 -------------- .../res-keyguard/values-sl/strings.xml | 82 -------------- .../res-keyguard/values-sq/strings.xml | 80 ------------- .../res-keyguard/values-sr/strings.xml | 81 ------------- .../res-keyguard/values-sv/strings.xml | 80 ------------- .../res-keyguard/values-sw/strings.xml | 80 ------------- .../res-keyguard/values-ta/strings.xml | 31 +---- .../res-keyguard/values-te/strings.xml | 80 ------------- .../res-keyguard/values-th/strings.xml | 80 ------------- .../res-keyguard/values-tl/strings.xml | 80 ------------- .../res-keyguard/values-tr/strings.xml | 80 ------------- .../res-keyguard/values-uk/strings.xml | 82 -------------- .../res-keyguard/values-ur/strings.xml | 27 ----- .../res-keyguard/values-uz/strings.xml | 80 ------------- .../res-keyguard/values-vi/strings.xml | 82 +------------- .../res-keyguard/values-zh-rCN/strings.xml | 80 ------------- .../res-keyguard/values-zh-rHK/strings.xml | 80 ------------- .../res-keyguard/values-zh-rTW/strings.xml | 80 ------------- .../res-keyguard/values-zu/strings.xml | 80 ------------- packages/SystemUI/res/values-af/strings.xml | 1 + packages/SystemUI/res/values-am/strings.xml | 1 + packages/SystemUI/res/values-ar/strings.xml | 12 +- packages/SystemUI/res/values-as/strings.xml | 4 +- packages/SystemUI/res/values-az/strings.xml | 1 + .../SystemUI/res/values-b+sr+Latn/strings.xml | 1 + packages/SystemUI/res/values-be/strings.xml | 4 +- packages/SystemUI/res/values-bg/strings.xml | 1 + packages/SystemUI/res/values-bn/strings.xml | 8 +- packages/SystemUI/res/values-bs/strings.xml | 11 +- packages/SystemUI/res/values-ca/strings.xml | 11 +- packages/SystemUI/res/values-cs/strings.xml | 1 + packages/SystemUI/res/values-da/strings.xml | 16 +-- packages/SystemUI/res/values-de/strings.xml | 9 +- packages/SystemUI/res/values-el/strings.xml | 1 + .../SystemUI/res/values-en-rAU/strings.xml | 1 + .../SystemUI/res/values-en-rCA/strings.xml | 1 + .../SystemUI/res/values-en-rGB/strings.xml | 1 + .../SystemUI/res/values-en-rIN/strings.xml | 1 + .../SystemUI/res/values-en-rXC/strings.xml | 1 + .../SystemUI/res/values-es-rUS/strings.xml | 4 +- packages/SystemUI/res/values-es/strings.xml | 13 ++- packages/SystemUI/res/values-et/strings.xml | 23 ++-- packages/SystemUI/res/values-eu/strings.xml | 13 ++- packages/SystemUI/res/values-fa/strings.xml | 14 +-- packages/SystemUI/res/values-fi/strings.xml | 3 +- .../SystemUI/res/values-fr-rCA/strings.xml | 8 +- packages/SystemUI/res/values-fr/strings.xml | 4 +- packages/SystemUI/res/values-gl/strings.xml | 16 +-- packages/SystemUI/res/values-gu/strings.xml | 4 +- packages/SystemUI/res/values-hi/strings.xml | 22 ++-- packages/SystemUI/res/values-hr/strings.xml | 1 + packages/SystemUI/res/values-hu/strings.xml | 1 + packages/SystemUI/res/values-hy/strings.xml | 4 +- packages/SystemUI/res/values-in/strings.xml | 7 +- packages/SystemUI/res/values-is/strings.xml | 4 +- packages/SystemUI/res/values-it/strings.xml | 1 + packages/SystemUI/res/values-iw/strings.xml | 5 +- packages/SystemUI/res/values-ja/strings.xml | 3 +- packages/SystemUI/res/values-ka/strings.xml | 1 + packages/SystemUI/res/values-kk/strings.xml | 10 +- packages/SystemUI/res/values-km/strings.xml | 5 +- packages/SystemUI/res/values-kn/strings.xml | 4 +- packages/SystemUI/res/values-ko/strings.xml | 8 +- packages/SystemUI/res/values-ky/strings.xml | 1 + packages/SystemUI/res/values-lo/strings.xml | 1 + packages/SystemUI/res/values-lt/strings.xml | 1 + packages/SystemUI/res/values-lv/strings.xml | 1 + packages/SystemUI/res/values-mk/strings.xml | 1 + packages/SystemUI/res/values-ml/strings.xml | 4 +- packages/SystemUI/res/values-mn/strings.xml | 1 + packages/SystemUI/res/values-mr/strings.xml | 4 +- packages/SystemUI/res/values-ms/strings.xml | 1 + packages/SystemUI/res/values-my/strings.xml | 3 +- packages/SystemUI/res/values-nb/strings.xml | 8 +- packages/SystemUI/res/values-ne/strings.xml | 4 +- packages/SystemUI/res/values-nl/strings.xml | 3 +- packages/SystemUI/res/values-or/strings.xml | 6 +- packages/SystemUI/res/values-pa/strings.xml | 4 +- packages/SystemUI/res/values-pl/strings.xml | 3 +- .../SystemUI/res/values-pt-rBR/strings.xml | 1 + .../SystemUI/res/values-pt-rPT/strings.xml | 3 +- packages/SystemUI/res/values-pt/strings.xml | 1 + packages/SystemUI/res/values-ro/strings.xml | 7 +- packages/SystemUI/res/values-ru/strings.xml | 1 + packages/SystemUI/res/values-si/strings.xml | 1 + packages/SystemUI/res/values-sk/strings.xml | 10 +- packages/SystemUI/res/values-sl/strings.xml | 1 + packages/SystemUI/res/values-sq/strings.xml | 4 +- packages/SystemUI/res/values-sr/strings.xml | 1 + packages/SystemUI/res/values-sv/strings.xml | 1 + packages/SystemUI/res/values-sw/strings.xml | 14 +-- packages/SystemUI/res/values-ta/strings.xml | 106 +++++++----------- packages/SystemUI/res/values-te/strings.xml | 8 +- packages/SystemUI/res/values-th/strings.xml | 5 +- packages/SystemUI/res/values-tl/strings.xml | 3 +- packages/SystemUI/res/values-tr/strings.xml | 4 +- packages/SystemUI/res/values-uk/strings.xml | 1 + packages/SystemUI/res/values-ur/strings.xml | 93 ++++++--------- packages/SystemUI/res/values-uz/strings.xml | 15 +-- packages/SystemUI/res/values-vi/strings.xml | 5 +- .../SystemUI/res/values-zh-rCN/strings.xml | 3 +- .../SystemUI/res/values-zh-rHK/strings.xml | 1 + .../SystemUI/res/values-zh-rTW/strings.xml | 1 + packages/SystemUI/res/values-zu/strings.xml | 1 + 171 files changed, 306 insertions(+), 6916 deletions(-) diff --git a/packages/SystemUI/legacy/recents/res/values-es/strings.xml b/packages/SystemUI/legacy/recents/res/values-es/strings.xml index 4f04a12af05..43fb3ad7436 100644 --- a/packages/SystemUI/legacy/recents/res/values-es/strings.xml +++ b/packages/SystemUI/legacy/recents/res/values-es/strings.xml @@ -28,7 +28,7 @@ "No hay elementos recientes" "Has borrado todo" "Información de la aplicación" - "bloqueo de pantalla" + "fijación de pantalla" "buscar" "No se ha podido iniciar la aplicación %s." "La aplicación %s se ha inhabilitado en modo seguro." diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml index ad4523ca9a3..9637cc201ba 100644 --- a/packages/SystemUI/res-keyguard/values-af/strings.xml +++ b/packages/SystemUI/res-keyguard/values-af/strings.xml @@ -151,84 +151,4 @@ SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het %d pogings oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede. SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het %d poging oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede. - - ""Dis"\n"^1\n^2 - ""Dis"\n"^1\n^2 - - - "Twaalf" - "Een" - "Twee" - "Drie" - "Vier" - "Vyf" - "Ses" - "Sewe" - "Agt" - "Nege" - "Tien" - "Elf" - - - "uur" - "Nul een" - "Nul twee" - "Nul drie" - "Nul vier" - "Nul vyf" - "Nul ses" - "Nul sewe" - "Nul agt" - "Nul nege" - "Tien" - "Elf" - "Twaalf" - "Dertien" - "Veertien" - "Vyftien" - "Sestien" - "Sewentien" - "Agtien" - "Negentien" - "Twintig" - "Een en\ntwintig" - "Twee en\ntwintig" - "Drie en\ntwintig" - "Vier en\ntwintig" - "Vyf en\ntwintig" - "Ses en\ntwintig" - "Sewe en\ntwintig" - "Agt en\ntwintig" - "Nege en\ntwintig" - "Dertig" - "Een en\ndertig" - "Twee en\ndertig" - "Drie en\ndertig" - "Vier en\ndertig" - "Vyf en\ndertig" - "Ses en\ndertig" - "Sewe en\ndertig" - "Agt en\ndertig" - "Nege en\ndertig" - "Veertig" - "Een en\nveertig" - "Twee en\nveertig" - "Drie en\nveertig" - "Vier en\nveertig" - "Vyf en\nveertig" - "Ses en\nveertig" - "Sewe en\nveertig" - "Agt en\nveertig" - "Nege en\nveertig" - "Vyftig" - "Een en\nvyftig" - "Twee en\nvyftig" - "Drie en\nvyftig" - "Vier en\nvyftig" - "Vyf en\nvyftig" - "Ses en\nvyftig" - "Sewe en\nvyftig" - "Agt en\nvyftig" - "Nege en\nvyftig" - diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml index a5f33dfc27c..d64bcf644c0 100644 --- a/packages/SystemUI/res-keyguard/values-am/strings.xml +++ b/packages/SystemUI/res-keyguard/values-am/strings.xml @@ -151,84 +151,4 @@ ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት %d ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ። ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት %d ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ። - - "\n"^1\n^2 ነው - "\n"^1\n^2 ነው - - - "አስራ ሁለት" - "አንድ" - "ሁለት" - "ሶስት" - "አራት" - "አምስት" - "ስድስት" - "ሰባት" - "ስምንት" - "ዘጠኝ" - "አስር" - "አስራ አንድ" - - - "ሰዓት" - "ኦ አንድ" - "ኦ ሁለት" - "ኦ ሦስት" - "ኦ አራት" - "ኦ አምስት" - "ኦ ስድስት" - "ኦ ሰባት" - "ኦ ስምንት" - "ኦ ዘጠኝ" - "አስር" - "አስራ አንድ" - "አስራ ሁለት" - "አስራ ሶስት" - "አስራ አራት" - "አስራ አምስት" - "አስራ ስድስት" - "አስራ ሰባት" - "አስራ ስምንት" - "አስራ ዘጠኝ" - "ሃያ" - "ሃያ\nአንድ" - "ሃያ\nሁለት" - "ሃያ\nሶስት" - "ሃያ\nአራት" - "ሃያ\nአምስት" - "ሃያ\nስድስት" - "ሃያ\nሰባት" - "ሃያ\nስምንት" - "ሃያ\nዘጠኝ" - "ሰላሳ" - "ሰላሳ\nአንድ" - "ሰላሳ\nሁለት" - "ሰላሳ\nሶስት" - "ሰላሳ\nአራት" - "ሰላሳ\nአምስት" - "ሰላሳ\nስድስት" - "ሰላሳ\nሰባት" - "ሰላሳ\nስምንት" - "ሰላሳ\nዘጠኝ" - "አርባ" - "አርባ\nአንድ" - "አርባ\nሁለት" - "አርባ\nሶስት" - "አርባ\nአራት" - "አርባ\nአምስት" - "አርባ\nስድስት" - "አርባ\nሰባት" - "አርባ\nስምንት" - "አርባ\nዘጠኝ" - "ሃምሳ" - "ሃምሳ\nአንድ" - "ሃምሳ\nሁለት" - "ሃምሳ\nሶስት" - "ሃምሳ\nአራት" - "ሃምሳ\nአምስት" - "ሃምሳ\nስድስት" - "ሃምሳ\nሰባት" - "ሃምሳ\nስምንት" - "ሃምሳ\nዘጠኝ" - diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml index dbc7d48dbf9..0c27b8a8976 100644 --- a/packages/SystemUI/res-keyguard/values-ar/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml @@ -62,7 +62,7 @@ "‏يتعذّر إيقاف eSIM بسبب خطأ." "Enter" "نسيت النقش" - "نقش غير صحيح" + "النقش غير صحيح" "كلمة مرور غير صحيحة" "رقم تعريف شخصي خاطئ" @@ -183,88 +183,4 @@ ‏تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك %d محاولة قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل. ‏تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك محاولة واحدة (%d) قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل. - - ""الساعة الآن"\n"^1\n^2 - ""الساعة الآن"\n"^1\n^2 - ""الساعة الآن"\n"^1\n^2 - ""الساعة الآن"\n"^1\n^2 - ""الساعة الآن"\n"^1\n^2 - ""الساعة الآن"\n"^1\n^2 - - - "الثانية عشرة" - "الواحدة" - "الثانية" - "الثالثة" - "الرابعة" - "الخامسة" - "السادسة" - "السابعة" - "الثامنة" - "التاسعة" - "العاشرة" - "الحادية عشرة" - - - "بالضبط" - "Oh One" - "Oh Two" - "Oh Three" - "Oh Four" - "Oh Five" - "Oh Six" - "Oh Seven" - "Oh Eight" - "Oh Nine" - "عَشر" - "إحدى عشرة" - "اثنتا عشرة" - "ثلاث عشرة" - "أربع عشرة" - "خمس عشرة" - "ست عشرة" - "سبع عشرة" - "ثمان عشرة" - "تسع عشرة" - "عشرون" - "إحدى\nوعشرون" - "اثنتان\nوعشرون" - "ثلاث\nوعشرون" - "أربع\nوعشرون" - "خمس\nوعشرون" - "ست\nوعشرون" - "سبع\nوعشرون" - "ثمانٍ\nوعشرون" - "تسع\nوعشرون" - "ثلاثون" - "إحدى\nوثلاثون" - "اثنتا\nوثلاثون" - "ثلاث\nوثلاثون" - "أربع\nوثلاثون" - "خمس\nوثلاثون" - "ست\nوثلاثون" - "سبع\nوثلاثون" - "ثمانٍ\nوثلاثون" - "تسع\nوثلاثون" - "أربعون" - "واحد\nوأربعون" - "اثنتان\nوأربعون" - "ثلاث\nوأربعون" - "أربع\nوأربعون" - "خمس\nوأربعون" - "ست\nوأربعون" - "سبع\nوأربعون" - "ثمانٍ\nوأربعون" - "تسع\nوأربعون" - "خمسون" - "إحدى\nوخمسون" - "اثنتان\nوخمسون" - "ثلاث\nوخمسون" - "أربع\nوخمسون" - "خمس\nوخمسون" - "ست\nوخمسون" - "سبع\nوخمسون" - "ثمانٍ\nوخمسون" - "تسع\nوخمسون" - diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml index a3e061c0e09..59382420cba 100644 --- a/packages/SystemUI/res-keyguard/values-as/strings.xml +++ b/packages/SystemUI/res-keyguard/values-as/strings.xml @@ -151,84 +151,4 @@ ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত %dটা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক। ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত %dটা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক। - - ""এতিয়া সময়"\n"^1\n^2 হৈছে - ""এতিয়া সময়"\n"^1\n^2 হৈছে - - - "বাৰ" - "এক" - "দুই" - "তিনি" - "চাৰি" - "পাঁচ" - "ছয়" - "সাত" - "আঠ" - "ন" - "দহ" - "এঘাৰ" - - - "বাজিছে" - "এক" - "দুই" - "তিনি" - "চাৰি" - "পাঁচ" - "ছয়" - "সাত" - "আঠ" - "ন" - "দহ" - "এঘাৰ" - "বাৰ" - "তেৰ" - "চৈধ্য" - "পোন্ধৰ" - "ষোল্ল" - "সোতৰ" - "ওঠৰ" - "ঊনৈছ" - "বিছ" - "একৈছ\n" - "বাইছ\n" - "তেইছ\n" - "চৌবিছ\n" - "পঁচিছ\n" - "ছাব্বিছ\n" - "সাতাইছ\n" - "আঠাইছ\n" - "ঊনত্ৰিছ\n" - "ত্ৰিছ" - "একত্ৰিছ\n" - "বত্ৰিছ\n" - "তেত্ৰিছ\n" - "চৌত্ৰিছ\n" - "পঁইত্ৰিছ\n" - "ছয়ত্ৰিছ\n" - "সাতত্ৰিছ\n" - "আঠত্ৰিছ\n" - "ঊনচল্লিছ\n" - "চল্লিছ" - "একচল্লিছ\n" - "বিয়াল্লিছ\n" - "তিয়াল্লিছ\n" - "চৌৰাল্লিছ\n" - "পঞ্চলিছ\n" - "ছয়চল্লিছ\n" - "সাতচল্লিছ\n" - "আঠচল্লিছ\n" - "ঊনপঞ্চাছ\n" - "পঞ্চাছ" - "একাৱন\n" - "বাৱন\n" - "তেৱন\n" - "চৌৱন\n" - "পঁচপন\n" - "ছাপন\n" - "সাতাৱন\n" - "আঠাৱন\n" - "ঊনষাঠি\n" - diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml index c6c52c64a6e..19cf402b098 100644 --- a/packages/SystemUI/res-keyguard/values-az/strings.xml +++ b/packages/SystemUI/res-keyguard/values-az/strings.xml @@ -151,84 +151,4 @@ SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə %d cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın. SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə %d cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın. - - ""Saat"\n"^1\n^2 - ""Saat"\n"^1\n^2 - - - "On iki" - "Bir" - "İki" - "Üç" - "Dörd" - "Beş" - "Altı" - "Yeddi" - "Səkkiz" - "Doqquz" - "On" - "On bir" - - - "Saat" - "Bir" - "İki" - "Üç" - "Dörd" - "Beş" - "Altı" - "Yeddi" - "Səkkiz" - "Doqquz" - "On" - "On bir" - "On iki" - "On üç" - "On dörd" - "On beş" - "On altı" - "On yeddi" - "On səkkiz" - "On doqquz" - "İyirmi" - "İyirmi\nBir" - "İyirmi\nİki" - "İyirmi\nÜç" - "İyirmi\nDörd" - "İyirmi\nBeş" - "İyirmi\nAltı" - "İyirmi\nYeddi" - "İyirmi\nSəkkiz" - "İyirmi\nDoqquz" - "Otuz" - "Otuz\nBir" - "Otuz\nİki" - "Otuz\nÜç" - "Otuz\nDörd" - "Otuz\nBeş" - "Otuz\nAltı" - "Otuz\nYeddi" - "Otuz\nYeddi" - "Otuz\nDoqquz" - "Qırx" - "Qırx\nBir" - "Qırx\nİki" - "Qırx\nÜç" - "Qırx\nİki" - "Qırx\nBeş" - "Qırx\nAltı" - "Qırx\nYeddi" - "Qırx\nSəkkiz" - "Qırx\nDoqquz" - "Əlli" - "Əlli\nBir" - "Əlli\nİki" - "Əlli\nÜç" - "Əlli\nDörd" - "Əlli\nBeş" - "Əlli\nAltı" - "Əlli\nYeddi" - "Əlli\nSəkkiz" - "Əlli\nDoqquz" - diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml index b802dadc106..9b8b697b387 100644 --- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml @@ -159,85 +159,4 @@ SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još %d pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera. SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još %d pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera. - - ""Sada je"\n"^1\n^2 - ""Sada je"\n"^1\n^2 - ""Sada je"\n"^1\n^2 - - - "dvanaest" - "jedan" - "dva" - "tri" - "četiri" - "pet" - "šest" - "sedam" - "osam" - "devet" - "deset" - "jedanaest" - - - "sata(i)" - "jedan" - "dva" - "tri" - "četiri" - "pet" - "šest" - "sedam" - "osam" - "devet" - "deset" - "jedanaest" - "dvanaest" - "trinaest" - "četrnaest" - "petnaest" - "šesnaest" - "sedamnaest" - "osamnaest" - "devetnaest" - "dvadeset" - "dvadeset\njedan" - "dvadeset\ndva" - "dvadeset\ntri" - "dvadeset\nčetiri" - "dvadeset\npet" - "dvadeset\nšest" - "dvadeset\nsedam" - "dvadeset\nosam" - "dvadeset\ndevet" - "trideset" - "trideset\njedan" - "trideset\ndva" - "trideset\ntri" - "trideset\nčetiri" - "trideset\npet" - "trideset\nšest" - "trideset\nsedam" - "trideset\nosam" - "trideset\ndevet" - "četrdeset" - "četrdeset\njedan" - "četrdeset\ndva" - "četrdeset\ntri" - "četrdeset\nčetiri" - "četrdeset\npet" - "četrdeset\nšest" - "četrdeset\nsedam" - "četrdeset\nosam" - "četrdeset\ndevet" - "pedeset" - "pedeset\njedan" - "pedeset\ndva" - "pedeset\ntri" - "pedeset\nčetiri" - "pedeset\npet" - "pedeset\nšest" - "pedeset\nsedam" - "pedeset\nosam" - "pedeset\ndevet" - diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml index b29b1b7a1cf..e1ee01f2c9e 100644 --- a/packages/SystemUI/res-keyguard/values-be/strings.xml +++ b/packages/SystemUI/res-keyguard/values-be/strings.xml @@ -167,86 +167,4 @@ SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ %d спроб, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш. SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ %d спробы, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш. - - "\n"^1\n^2 - "\n"^1\n^2 - "\n"^1\n^2 - "\n"^1\n^2 - - - "Дванаццаць" - "Адна" - "Дзве" - "Тры" - "Чатыры" - "Пяць" - "Шэсць" - "Сем" - "Восем" - "Дзевяць" - "Дзесяць" - "Адзінаццаць" - - - "нуль нуль" - "Адна" - "Дзве" - "Тры" - "Чатыры" - "Пяць" - "Шэсць" - "Сем" - "Восем" - "Дзевяць" - "дзесяць" - "адзінаццаць" - "дванаццаць" - "трынаццаць" - "чатырнаццаць" - "пятнаццаць" - "шаснаццаць" - "сямнаццаць" - "васямнаццаць" - "дзевятнаццаць" - "дваццаць" - "дваццаць\nадна" - "дваццаць\nдзве" - "дваццаць\nтры" - "дваццаць\nчатыры" - "дваццаць\nпяць" - "дваццаць\nшэсць" - "дваццаць\nсем" - "дваццаць\nвосем" - "дваццаць\nдзевяць" - "трыццаць" - "трыццаць\nадна" - "трыццаць\nдзве" - "трыццаць\nтры" - "трыццаць\nчатыры" - "трыццаць\nпяць" - "трыццаць\nшэсць" - "трыццаць\nсем" - "трыццаць\nвосем" - "трыццаць\nдзевяць" - "сорак" - "сорак\nадна" - "сорак\nдзве" - "сорак\nтры" - "сорак\nчатыры" - "сорак\nпяць" - "сорак\nшэсць" - "сорак\nсем" - "сорак\nвосем" - "сорак\nдзевяць" - "пяцьдзясят" - "пяцьдзясят\nадна" - "пяцьдзясят\nдзве" - "пяцьдзясят\nтры" - "пяцьдзясят\nчатыры" - "пяцьдзясят\nпяць" - "пяцьдзясят\nшэсць" - "пяцьдзясят\nсем" - "пяцьдзясят\nвосем" - "пяцьдзясят\nдзевяць" - diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index 2d3cf6f9708..706eb7f0860 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -151,84 +151,4 @@ SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остават ви %d опита, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности. SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остава ви %d опит, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности. - - ""Часът е"\n"^1\n^2 - ""Часът е"\n"^1\n^2 - - - "дванайсет" - "един" - "два" - "три" - "четири" - "пет" - "шест" - "седем" - "осем" - "девет" - "десет" - "единайсет" - - - "часа" - "и една" - "и две" - "и три" - "и четири" - "и пет" - "и шест" - "и седем" - "и осем" - "и девет" - "десет" - "единайсет" - "дванайсет" - "тринайсет" - "четиринайсет" - "петнайсет" - "шестнайсет" - "седемнайсет" - "осемнайсет" - "деветнайсет" - "двайсет" - "двайсет\nи една" - "двайсет\nи две" - "двайсет\nи три" - "двайсет\nи четири" - "двайсет\nи пет" - "двайсет\nи шест" - "двайсет\nи седем" - "двайсет\nи осем" - "двайсет\nи девет" - "трийсет" - "трийсет\nи една" - "трийсет\nи две" - "трийсет\nи три" - "трийсет\nи четири" - "трийсет\nи пет" - "трийсет\nи шест" - "трийсет\nи седем" - "трийсет\nи осем" - "трийсет\nи девет" - "четиресет" - "четиресет\nи една" - "четиресет\nи две" - "четиресет\nи три" - "четиресет\nи четири" - "четиресет\nи пет" - "четиресет\nи шест" - "четиресет\nи седем" - "четиресет\nи осем" - "четиресет\nи девет" - "петдесет" - "петдесет\nи една" - "петдесет\nи две" - "петдесет\nи три" - "петдесет\nи четири" - "петдесет\nи пет" - "петдесет\nи шест" - "петдесет\nи седем" - "петдесет\nи осем" - "петдесет\nи девет" - diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml index 375b74cc262..9a09a1cfd90 100644 --- a/packages/SystemUI/res-keyguard/values-bn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml @@ -151,84 +151,4 @@ সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর %d বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন। সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর %d বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন। - - ""এখন"\n"^1\n^2 - ""এখন"\n"^1\n^2 - - - "বারো" - "এক" - "দুই" - "তিন" - "চার" - "পাঁচ" - "ছয়" - "সাত" - "আট" - "নয়" - "দশ" - "ইলেভেন" - - - "বাজচ্ছে" - "এক" - "দুই" - "তিন" - "চার" - "পাঁচ" - "ছয়" - "সাত" - "আট" - "নয়" - "দশ" - "ইলেভেন" - "বারো" - "তেরো" - "চোদ্দো" - "পনেরো" - "ষোল" - "সতেরো" - "আঠারো" - "উনিশ" - "কুড়ি" - "এ\nকুশ" - "বাই\nশ" - "তেই\nশ" - "চব্বি\nশ" - "পঁচি\nশ" - "চাব্বি\nশ" - "সা\nতাশ" - "আটা\nশ" - "উন\nত্রিশ" - "তিরিশ" - "এক\nত্রিশ" - "বত্রি\nশ" - "তে\nত্রিশ" - "চৌ\nত্রিশ" - "পঁয়\nত্রিশ" - "ছত্রি\nশ" - "সাই\nত্রিশ" - "আট\nত্রিশ" - "উন\nচল্লিশ" - "চল্লিশ" - "একচ\nল্লিশ" - "বিয়া\nল্লিশ" - "তেতা\nল্লিশ" - "চুয়া\nল্লিশ" - "পঁয়তা\nল্লিশ" - "চুয়া\nল্লিশ" - "সাত\nচল্লিশ" - "আটচ\nল্লিশ" - "উন\nপঞ্চাশ" - "পঞ্চাশ" - "একা\nন্ন" - "বাহ\nন্ন" - "তিপা\nন্ন" - "চুয়া\nন্ন" - "পঞ্চা\nন্ন" - "পঞ্চা\nন্ন" - "সা\nতান্ন" - "আটা\nন্ন" - "উন\nষাট" - diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index 3258ec71b5c..ef28b1dc797 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -159,85 +159,4 @@ SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još %d pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera. SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još %d pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera. - - ""Sada je"\n"^1\n^2 - ""Sada je"\n"^1\n^2 - ""Sada je"\n"^1\n^2 - - - "Dvanaest" - "Jedan" - "Dva" - "Tri" - "Četiri" - "Pet" - "Šest" - "Sedam" - "Osam" - "Devet" - "Deset" - "Jedanaest" - - - "sata(i)" - "Jedan" - "Dva" - "Tri" - "Četiri" - "Pet" - "Šest" - "Sedam" - "Osam" - "Devet" - "Deset" - "Jedanaest" - "Dvanaest" - "Trinaest" - "Četrnaest" - "Petnaest" - "Šesnaest" - "Sedamnaest" - "Osamnaest" - "Devetnaest" - "Dvadeset" - "Dvadeset\njedna" - "Dvadeset\ndvije" - "Dvadeset\ntri" - "Dvadeset\nčetiri" - "Dvadeset\npet" - "Dvadeset\nšest" - "Dvadeset\nsedam" - "Dvadeset\nosam" - "Dvadeset\ndevet" - "Trideset" - "Trideset\njedna" - "Trideset\ndva" - "Trideset\ntri" - "Trideset\nčetiri" - "Trideset\npet" - "Trideset\nšest" - "Trideset\nsedam" - "Trideset\nosam" - "Trideset\ndevet" - "Četrdeset" - "Četrdeset\njedna" - "Četrdeset\ndvije" - "Četrdeset\ntri" - "Četrdeset\nčetiri" - "Četrdeset\npet" - "Četrdeset\nšest" - "Četrdeset\nsedam" - "Četrdeset\nosam" - "Četrdeset\ndevet" - "Pedeset" - "Pedeset\njedna" - "Pedeset\ndvije" - "Pedeset\ntri" - "Pedeset\nčetiri" - "Pedeset\npet" - "Pedeset\nšest" - "Pedeset\nsedam" - "Pedeset\nosam" - "Pedeset\ndevet" - diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index a74373fa7fc..a0b8cdcdd8e 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -151,84 +151,4 @@ La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queden %d intents; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació. La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queda %d intent; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació. - - ""Són les"\n"^1 i\n^2 - ""És la"\n"^1 i\n^2 - - - "i dotze" - "Una" - "Dues" - "Tres" - "Quatre" - "Cinc" - "Sis" - "Set" - "Vuit" - "Nou" - "Deu" - "i onze" - - - "en punt" - "I un" - "I dos" - "I tres" - "I quatre" - "I cinc" - "I sis" - "I set" - "I vuit" - "I nou" - "i deu" - "i onze" - "i dotze" - "i tretze" - "i catorze" - "i quinze" - "i setze" - "i disset" - "i divuit" - "i dinou" - "i vint" - "i vint-i-\nu" - "i vint-i-\ndos" - "i vint-i-\ntres" - "i vint-i-\nquatre" - "i vint-i-\ncinc" - "i vint-i-\nsis" - "i vint-i-\nset" - "i vint-i-\nvuit" - "i vint-i-\nnou" - "i trenta" - "i trenta-\nu" - "i trenta-\ndos" - "i trenta-\ntres" - "i trenta-\nquatre" - "i trenta-\ncinc" - "i trenta-\nsis" - "i trenta-\nset" - "i trenta-\nvuit" - "i trenta-\nnou" - "i quaranta" - "i quaranta-\nu" - "i quaranta-\ndos" - "i quaranta-\ntres" - "quaranta-\nquatre" - "i quaranta-\ncinc" - "i quaranta-\nsis" - "i quaranta-\nset" - "i quaranta-\nvuit" - "i quaranta-\nnou" - "i cinquanta" - "i cinquanta-\nun" - "i cinquanta-\ndos" - "i cinquanta-\ntres" - "cinquanta-\nquatre" - "i cinquanta-\ncinc" - "i cinquanta-\nsis" - "i cinquanta-\nset" - "i cinquanta-\nvuit" - "i cinquanta-\nnou" - diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml index 4a7f95b7f22..c38b495b1df 100644 --- a/packages/SystemUI/res-keyguard/values-cs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml @@ -167,86 +167,4 @@ SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě %d pokusů, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor. SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě %d pokus, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor. - - ""Je"\n"^1\n^2 - ""Je"\n"^1\n^2 - ""Je"\n"^1\n^2 - ""Je"\n"^1\n^2 - - - "Dvanáct" - "Jedna" - "Dvě" - "Tři" - "Čtyři" - "Pět" - "Šest" - "Sedm" - "Osm" - "Devět" - "Deset" - "Jedenáct" - - - - "Nula jedna" - "Nula dva" - "Nula tři" - "Nula čtyři" - "Nula pět" - "Nula šest" - "Nula sedm" - "Nula osm" - "Nula devět" - "Deset" - "Jedenáct" - "Dvanáct" - "Třináct" - "Čtrnáct" - "Patnáct" - "Šestnáct" - "Sedmnáct" - "Osmnáct" - "Devatenáct" - "Dvacet" - "Dvacet\njedna" - "Dvacet\ndva" - "Dvacet\ntři" - "Dvacet\nčtyři" - "Dvacet\npět" - "Dvacet\nšest" - "Dvacet\nsedm" - "Dvacet\nosm" - "Dvacet\ndevět" - "Třicet" - "Třicet\njedna" - "Třicet\ndva" - "Třicet\ntři" - "Třicet\nčtyři" - "Třicet\npět" - "Třicet\nšest" - "Třicet\nsedm" - "Třicet\nosm" - "Třicet\ndevět" - "Čtyřicet" - "Čtyřicet\njedna" - "Čtyřicet\ndva" - "Čtyřicet\ntři" - "Čtyřicet\nčtyři" - "Čtyřicet\npět" - "Čtyřicet\nšest" - "Čtyřicet\nsedm" - "Čtyřicet\nosm" - "Čtyřicet\ndevět" - "Padesát" - "Padesát\njedna" - "Padesát\ndva" - "Padesát\ntři" - "Padesát\nčtyři" - "Padesát\npět" - "Padesát\nšest" - "Padesát\nsedm" - "Padesát\nosm" - "Padesát\ndevět" - diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml index 3ade21a69b9..304d4de070f 100644 --- a/packages/SystemUI/res-keyguard/values-da/strings.xml +++ b/packages/SystemUI/res-keyguard/values-da/strings.xml @@ -151,84 +151,4 @@ SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har %d forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger. SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har %d forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger. - - ""Den er"\n"^1\n^2 - ""Den er"\n"^1\n^2 - - - "Tolv" - "Et" - "To" - "Tre" - "Fire" - "Fem" - "Seks" - "Syv" - "Otte" - "Ni" - "Ti" - "Elleve" - - - "-" - "Et" - "To" - "Tre" - "Fire" - "Fem" - "Seks" - "Syv" - "Otte" - "Ni" - "Ti" - "Elleve" - "Tolv" - "Tretten" - "Fjorten" - "Femten" - "Seksten" - "Sytten" - "Atten" - "Nitten" - "Tyve" - "Enogtyve\n" - "Toogtyve\n" - "Treogtyve\n" - "Fireogtyve\n" - "Femogtyve\n" - "Seksogtyve\n" - "Syvogtyve\n" - "Otteogtyve\n" - "Niogtyve\n" - "Tredive" - "Enogtredive\n" - "Toogtredive\n" - "Treogtredive\n" - "Fireogtredive\n" - "Femogtredive\n" - "Seksogtredive\n" - "Syvogtredive\n" - "Otteogtredive\n" - "Niogtredive\n" - "Fyrre" - "Enogfyrre\n" - "Toogfyrre\n" - "Treogfyrre\n" - "Fireogfyrre\n" - "Femogfyrre\n" - "Seksogfyrre\n" - "Syvogfyrre\n" - "Otteogfyrre\n" - "Niogfyrre\n" - "Halvtreds" - "Enoghalvtreds\n" - "Tooghalvtreds\n" - "Treoghalvtreds\n" - "Fireoghalvtreds\n" - "Femoghalvtreds\n" - "Seksoghalvtreds\n" - "Syvoghalvtreds\n" - "Otteoghalvtreds\n" - "Nioghalvtreds\n" - diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml index 6e7d909f713..ef171cf675d 100644 --- a/packages/SystemUI/res-keyguard/values-de/strings.xml +++ b/packages/SystemUI/res-keyguard/values-de/strings.xml @@ -151,84 +151,4 @@ Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch %d Versuche, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter. Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch %d Versuch, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter. - - ""Es ist"\n"^1\n^2 - ""Es ist"\n"^1\n^2 - - - "zwölf Uhr" - "ein Uhr" - "zwei Uhr" - "drei Uhr" - "vier Uhr" - "fünf Uhr" - "sechs Uhr" - "sieben Uhr" - "acht Uhr" - "neun Uhr" - "zehn Uhr" - "elf Uhr" - - - - "Eins" - "Zwei" - "Drei" - "Vier" - "Fünf" - "Sechs" - "Sieben" - "Acht" - "Neun" - "zehn" - "elf" - "zwölf" - "dreizehn" - "vierzehn" - "fünfzehn" - "sechzehn" - "siebzehn" - "achtzehn" - "neunzehn" - "zwanzig" - "einund-\nzwanzig" - "zweiund-\nzwanzig" - "dreiund-\nzwanzig" - "vierund-\nzwanzig" - "fünfund-\nzwanzig" - "sechsund-\nzwanzig" - "siebenund-\nzwanzig" - "achtund-\nzwanzig" - "neunund-\nzwanzig" - "dreißig" - "einund-\ndreißig" - "zweiund-\ndreißig" - "dreiund-\ndreißig" - "vierund-\ndreißig" - "fünfund-\ndreißig" - "sechsund-\ndreißig" - "siebenund-\ndreißig" - "achtund-\ndreißig" - "neunund-\ndreißig" - "vierzig" - "einund-\nvierzig" - "zweiund-\nvierzig" - "dreiund-\nvierzig" - "vierund-\nvierzig" - "fünfund-\nvierzig" - "sechsund-\nvierzig" - "siebenund-\nvierzig" - "achtund-\nvierzig" - "neunund-\nvierzig" - "fünfzig" - "einund-\nfünfzig" - "zweiund-\nfünfzig" - "dreiund-\nfünfzig" - "vierund-\nfünfzig" - "fünfund-\nfünfzig" - "sechsund-\nfünfzig" - "siebenund-\nfünfzig" - "achtund-\nfünfzig" - "neunund-\nfünfzig" - diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml index e1f52d947e1..e2c3fba3a50 100644 --- a/packages/SystemUI/res-keyguard/values-el/strings.xml +++ b/packages/SystemUI/res-keyguard/values-el/strings.xml @@ -151,84 +151,4 @@ Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένουν %d ακόμη προσπάθειες προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες. Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένει %d ακόμη προσπάθεια προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες. - - ""Είναι"\n"^1\n^2 - ""Είναι"\n"^1\n^2 - - - "Δώδεκα" - "Μία" - "Δύο" - "Τρία" - "Τέσσερα" - "Πέντε" - "Έξι" - "Επτά" - "Οκτώ" - "Εννέα" - "Δέκα" - "Έντεκα" - - - "Ακριβώς" - "Ένα" - "Δύο" - "Τρία" - "Τέσσερα" - "Πέντε" - "Έξι" - "Επτά" - "Οκτώ" - "Εννέα" - "Δέκα" - "Έντεκα" - "Δώδεκα" - "Δεκατρία" - "Δεκατέσσερα" - "Δεκαπέντε" - "Δεκαέξι" - "Δεκαεπτά" - "Δεκαοκτώ" - "Δεκαεννέα" - "Είκοσι" - "Είκοσι\nένα" - "Είκοσι\nδύο" - "Είκοσι\nτρία" - "Είκοσι\nτέσσερα" - "Είκοσι\nπέντε" - "Είκοσι\nέξι" - "Είκοσι\nεπτά" - "Είκοσι\nοκτώ" - "Είκοσι\nεννέα" - "Τριάντα" - "Τριάντα\nένα" - "Τριάντα\nδύο" - "Τριάντα\nοκτώ" - "Τριάντα\nοκτώ" - "Τριάντα\nπέντε" - "Τριάντα\nέξι" - "Τριάντα\nεπτά" - "Τριάντα\nοκτώ" - "Τριάντα\nεννέα" - "Σαράντα" - "Σαράντα\nένα" - "Σαράντα\nδύο" - "Σαράντα\nτρία" - "Σαράντα\nτέσσερα" - "Σαράντα\nπέντε" - "Σαράντα\nέξι" - "Σαράντα\nεπτά" - "Σαράντα\nοκτώ" - "Σαράντα\nεννέα" - "Πενήντα" - "Πενήντα\nένα" - "Πενήντα\nδύο" - "Πενήντα\nτρία" - "Πενήντα\nτέσσερα" - "Πενήντα\nπέντε" - "Πενήντα\nέξι" - "Πενήντα\nεπτά" - "Πενήντα\nοκτώ" - "Πενήντα\nεννέα" - diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml index 15823e404e9..af8eaa5885f 100644 --- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml @@ -151,84 +151,4 @@ SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact operator for details. SIM is now disabled. Enter PUK code to continue. You have %d remaining attempt before SIM becomes permanently unusable. Contact operator for details. - - ""It’s"\n"^1\n^2 - ""It’s"\n"^1\n^2 - - - "Twelve" - "One" - "Two" - "Three" - "Four" - "Five" - "Six" - "Seven" - "Eight" - "Nine" - "Ten" - "Eleven" - - - "O’Clock" - "Oh One" - "Oh Two" - "Oh Three" - "Oh Four" - "Oh Five" - "Oh Six" - "Oh Seven" - "Oh Eight" - "Oh Nine" - "Ten" - "Eleven" - "Twelve" - "Thirteen" - "Fourteen" - "15" - "Sixteen" - "Seventeen" - "Eighteen" - "Nineteen" - "Twenty" - "Twenty\nOne" - "Twenty\nTwo" - "Twenty\nThree" - "Twenty\nFour" - "Twenty\nFive" - "Twenty\nSix" - "Twenty\nSeven" - "Twenty\nEight" - "Twenty\nNine" - "Thirty" - "Thirty\nOne" - "Thirty\nTwo" - "Thirty\nThree" - "Thirty\nFour" - "Thirty\nFive" - "Thirty\nSix" - "Thirty\nSeven" - "Thirty\nEight" - "Thirty\nNine" - "Forty" - "Forty\nOne" - "Forty\nTwo" - "Forty\nThree" - "Forty\nFour" - "Forty\nFive" - "Forty\nSix" - "Forty\nSeven" - "Forty\nEight" - "Forty\nNine" - "Fifty" - "Fifty\nOne" - "Fifty\nTwo" - "Fifty\nThree" - "Fifty\nFour" - "Fifty\nFive" - "Fifty\nSix" - "Fifty\nSeven" - "Fifty\nEight" - "Fifty\nNine" - diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml index d8a85c1aa85..ee700503362 100644 --- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml @@ -151,84 +151,4 @@ SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact operator for details. SIM is now disabled. Enter PUK code to continue. You have %d remaining attempt before SIM becomes permanently unusable. Contact operator for details. - - ""It’s"\n"^1\n^2 - ""It’s"\n"^1\n^2 - - - "Twelve" - "One" - "Two" - "Three" - "Four" - "Five" - "Six" - "Seven" - "Eight" - "Nine" - "Ten" - "Eleven" - - - "O’Clock" - "Oh One" - "Oh Two" - "Oh Three" - "Oh Four" - "Oh Five" - "Oh Six" - "Oh Seven" - "Oh Eight" - "Oh Nine" - "Ten" - "Eleven" - "Twelve" - "Thirteen" - "Fourteen" - "15" - "Sixteen" - "Seventeen" - "Eighteen" - "Nineteen" - "Twenty" - "Twenty\nOne" - "Twenty\nTwo" - "Twenty\nThree" - "Twenty\nFour" - "Twenty\nFive" - "Twenty\nSix" - "Twenty\nSeven" - "Twenty\nEight" - "Twenty\nNine" - "Thirty" - "Thirty\nOne" - "Thirty\nTwo" - "Thirty\nThree" - "Thirty\nFour" - "Thirty\nFive" - "Thirty\nSix" - "Thirty\nSeven" - "Thirty\nEight" - "Thirty\nNine" - "Forty" - "Forty\nOne" - "Forty\nTwo" - "Forty\nThree" - "Forty\nFour" - "Forty\nFive" - "Forty\nSix" - "Forty\nSeven" - "Forty\nEight" - "Forty\nNine" - "Fifty" - "Fifty\nOne" - "Fifty\nTwo" - "Fifty\nThree" - "Fifty\nFour" - "Fifty\nFive" - "Fifty\nSix" - "Fifty\nSeven" - "Fifty\nEight" - "Fifty\nNine" - diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml index 15823e404e9..af8eaa5885f 100644 --- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml @@ -151,84 +151,4 @@ SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact operator for details. SIM is now disabled. Enter PUK code to continue. You have %d remaining attempt before SIM becomes permanently unusable. Contact operator for details. - - ""It’s"\n"^1\n^2 - ""It’s"\n"^1\n^2 - - - "Twelve" - "One" - "Two" - "Three" - "Four" - "Five" - "Six" - "Seven" - "Eight" - "Nine" - "Ten" - "Eleven" - - - "O’Clock" - "Oh One" - "Oh Two" - "Oh Three" - "Oh Four" - "Oh Five" - "Oh Six" - "Oh Seven" - "Oh Eight" - "Oh Nine" - "Ten" - "Eleven" - "Twelve" - "Thirteen" - "Fourteen" - "15" - "Sixteen" - "Seventeen" - "Eighteen" - "Nineteen" - "Twenty" - "Twenty\nOne" - "Twenty\nTwo" - "Twenty\nThree" - "Twenty\nFour" - "Twenty\nFive" - "Twenty\nSix" - "Twenty\nSeven" - "Twenty\nEight" - "Twenty\nNine" - "Thirty" - "Thirty\nOne" - "Thirty\nTwo" - "Thirty\nThree" - "Thirty\nFour" - "Thirty\nFive" - "Thirty\nSix" - "Thirty\nSeven" - "Thirty\nEight" - "Thirty\nNine" - "Forty" - "Forty\nOne" - "Forty\nTwo" - "Forty\nThree" - "Forty\nFour" - "Forty\nFive" - "Forty\nSix" - "Forty\nSeven" - "Forty\nEight" - "Forty\nNine" - "Fifty" - "Fifty\nOne" - "Fifty\nTwo" - "Fifty\nThree" - "Fifty\nFour" - "Fifty\nFive" - "Fifty\nSix" - "Fifty\nSeven" - "Fifty\nEight" - "Fifty\nNine" - diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml index 15823e404e9..af8eaa5885f 100644 --- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml @@ -151,84 +151,4 @@ SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact operator for details. SIM is now disabled. Enter PUK code to continue. You have %d remaining attempt before SIM becomes permanently unusable. Contact operator for details. - - ""It’s"\n"^1\n^2 - ""It’s"\n"^1\n^2 - - - "Twelve" - "One" - "Two" - "Three" - "Four" - "Five" - "Six" - "Seven" - "Eight" - "Nine" - "Ten" - "Eleven" - - - "O’Clock" - "Oh One" - "Oh Two" - "Oh Three" - "Oh Four" - "Oh Five" - "Oh Six" - "Oh Seven" - "Oh Eight" - "Oh Nine" - "Ten" - "Eleven" - "Twelve" - "Thirteen" - "Fourteen" - "15" - "Sixteen" - "Seventeen" - "Eighteen" - "Nineteen" - "Twenty" - "Twenty\nOne" - "Twenty\nTwo" - "Twenty\nThree" - "Twenty\nFour" - "Twenty\nFive" - "Twenty\nSix" - "Twenty\nSeven" - "Twenty\nEight" - "Twenty\nNine" - "Thirty" - "Thirty\nOne" - "Thirty\nTwo" - "Thirty\nThree" - "Thirty\nFour" - "Thirty\nFive" - "Thirty\nSix" - "Thirty\nSeven" - "Thirty\nEight" - "Thirty\nNine" - "Forty" - "Forty\nOne" - "Forty\nTwo" - "Forty\nThree" - "Forty\nFour" - "Forty\nFive" - "Forty\nSix" - "Forty\nSeven" - "Forty\nEight" - "Forty\nNine" - "Fifty" - "Fifty\nOne" - "Fifty\nTwo" - "Fifty\nThree" - "Fifty\nFour" - "Fifty\nFive" - "Fifty\nSix" - "Fifty\nSeven" - "Fifty\nEight" - "Fifty\nNine" - diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml index cd51dd87836..fa314e786bc 100644 --- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml @@ -151,84 +151,4 @@ ‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎SIM is now disabled. Enter PUK code to continue. You have ‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎ remaining attempts before SIM becomes permanently unusable. Contact carrier for details.‎‏‎‎‏‎ ‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎SIM is now disabled. Enter PUK code to continue. You have ‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎ remaining attempt before SIM becomes permanently unusable. Contact carrier for details.‎‏‎‎‏‎ - - ‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎""‎‏‎‎‏‏‏‎It’s‎‏‎‎‏‏‎""‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎^1‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎^2‎‏‎‎‏‎ - ‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎""‎‏‎‎‏‏‏‎It’s‎‏‎‎‏‏‎""‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎^1‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎^2‎‏‎‎‏‎ - - - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎Twelve‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‎One‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎Two‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‎Three‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‎‎Four‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎Five‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‎Six‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‎‏‏‎‏‏‎‎‏‏‎‎‏‏‏‏‏‏‏‎Seven‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‎‎‏‎‎Eight‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‏‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎Nine‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‎Ten‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‏‏‎‎Eleven‎‏‎‎‏‎" - - - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‏‎O’Clock‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎Oh One‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‎‎‎‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‏‎‏‎‏‎Oh Two‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎‏‎Oh Three‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎Oh Four‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‎‏‎‏‏‎‏‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‎‎‎‏‎‏‎‎‎‎‏‏‎‏‏‎‎‎‏‏‎‎Oh Five‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‎‏‏‎‎‎‏‎‎‎‎‎‏‎‎‎‎‏‎‎Oh Six‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‏‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‏‏‏‎Oh Seven‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‎‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‎‎‏‏‏‏‎‎‏‏‎‎‎Oh Eight‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‏‎‎‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‎Oh Nine‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎Ten‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‎Eleven‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎Twelve‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‎Thirteen‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‎‎‏‎Fourteen‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‏‏‎‏‎Fifteen‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎Sixteen‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‏‏‎Seventeen‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‎Eighteen‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎Nineteen‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‏‏‎Twenty‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‏‏‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‏‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‏‏‏‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‏‎Thirty‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‏‏‏‎‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‎‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‏‏‎Forty‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‏‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‎‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‏‏‏‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‎‏‎‎Fifty‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‎‏‎‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‏‎‎‏‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‏‎‎‎‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‏‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎" - diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index f51a9af0f69..b646fcbfbe7 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -151,84 +151,4 @@ Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te quedan %d intentos más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles. Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te queda %d intento más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles. - - ""Son"\n"^1\n^2 - ""Son"\n"^1\n^2 - - - "Doce" - "Una" - "Dos" - "Tres" - "Cuatro" - "Cinco" - "Seis" - "Siete" - "Ocho" - "Nueve" - "Diez" - "Once" - - - "En punto" - "Cero uno" - "Cero dos" - "Cero tres" - "Cero cuatro" - "Cero cinco" - "Cero seis" - "Cero siete" - "Cero ocho" - "Cero nueve" - "Diez" - "Once" - "Doce" - "Trece" - "Catorce" - "Quince" - "Dieciséis" - "Diecisiete" - "Dieciocho" - "Diecinueve" - "Veinte" - "Veintiuno\n" - "Veintidós\n" - "Veintitrés\n" - "Veinticuatro\n" - "Veinticinco\n" - "Veintiséis\n" - "Veintisiete\n" - "Veintiocho\n" - "Veintinueve\n" - "Treinta" - "Treinta\ny uno" - "Treinta\ny dos" - "Treinta\ny tres" - "Treinta\ny cuatro" - "Treinta\ny cinco" - "Treinta\ny seis" - "Treinta\ny siete" - "Treinta\ny ocho" - "Treinta\ny nueve" - "Cuarenta" - "Cuarenta\ny uno" - "Cuarenta\ny dos" - "Cuarenta\ny tres" - "Cuarenta\ny cuatro" - "Cuarenta\ny cinco" - "Cuarenta\ny seis" - "Cuarenta\ny siete" - "Cuarenta\ny ocho" - "Cuarenta\ny nueve" - "Cincuenta" - "Cincuenta\ny uno" - "Cincuenta\ny dos" - "Cincuenta\ny tres" - "Cincuenta\ny cuatro" - "Cincuenta\ny cinco" - "Cincuenta\ny seis" - "Cincuenta\ny siete" - "Cincuenta\ny ocho" - "Cincuenta\ny nueve" - diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index 481367e4670..754a1cdf9ed 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -151,84 +151,4 @@ La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te quedan %d intentos para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información. La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te queda %d intento para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información. - - ""Las"\n"^1\ny ^2 - ""La"\n"^1\ny ^2 - - - "Doce" - "Uno" - "Dos" - "Tres" - "Cuatro" - "Cinco" - "Seis" - "Siete" - "Ocho" - "Nueve" - "Diez" - "Once" - - - "En punto" - "Uno" - "Dos" - "Tres" - "Cuatro" - "Cinco" - "Seis" - "Siete" - "Ocho" - "Nueve" - "Diez" - "Once" - "Doce" - "Trece" - "Catorce" - "Quince" - "Dieciséis" - "Diecisiete" - "Dieciocho" - "Diecinueve" - "Veinte" - "Veintiuno\n" - "Veintidós\n" - "Veintitrés\n" - "Veinticuatro\n" - "Veinticinco\n" - "Veintiséis\n" - "Veintisiete\n" - "Veintiocho\n" - "Veintinueve\n" - "Treinta" - "Treinta\ny uno" - "Treinta\ny dos" - "Treinta\ny tres" - "Treinta\ny cuatro" - "Treinta\ny cinco" - "Treinta\ny seis" - "Treinta\ny siete" - "Treinta\ny ocho" - "Treinta\ny nueve" - "Cuarenta" - "Cuarenta\ny uno" - "Cuarenta\ny dos" - "Cuarenta\ny tres" - "Cuarenta\ny cuatro" - "Cuarenta\ny cinco" - "Cuarenta\n y seis" - "Cuarenta\ny siete" - "Cuarenta\ny ocho" - "Cuarenta\ny nueve" - "Cincuenta" - "Cincuenta\ny uno" - "Cincuenta\ny dos" - "Cincuenta\ny tres" - "Cincuenta\ny cuatro" - "Cincuenta\ny cinco" - "Cincuenta\ny seis" - "Cincuenta\ny siete" - "Cincuenta\ny ocho" - "Cincuenta\ny nueve" - diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml index eb7f943396a..5c1db4e6499 100644 --- a/packages/SystemUI/res-keyguard/values-et/strings.xml +++ b/packages/SystemUI/res-keyguard/values-et/strings.xml @@ -151,84 +151,4 @@ SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel %d katset enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt. SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel %d katse enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt. - - ""Kell on"\n"^1\n^2 - ""Kell on"\n"^1\n^2 - - - "Kaksteist" - "Üks" - "Kaks" - "Kolm" - "Neli" - "Viis" - "Kuus" - "Seitse" - "Kaheksa" - "Üheksa" - "Kümme" - "Üksteist" - - - "null üks" - "null üks" - "null kaks" - "null kolm" - "null neli" - "null viis" - "null kuus" - "null seitse" - "null kaheksa" - "null üheksa" - "Kümme" - "Üksteist" - "Kaksteist" - "Kolmteist" - "Neliteist" - "Viisteist" - "Kuusteist" - "Seitseteist" - "Kaheksateist" - "Üheksateist" - "Kakskümmend" - "Kakskümmend\nüks" - "Kakskümmend\nkaks" - "Kakskümmend\nkolm" - "Kakskümmend\nneli" - "Kakskümmend\nviis" - "Kakskümmend\nkuus" - "Kakskümmend\nseitse" - "Kakskümmend\nkaheksa" - "Kakskümmend\nüheksa" - "Kolmkümmend" - "Kolmkümmend\nüks" - "Kolmkümmend\nkaks" - "Kolmkümmend\nkolm" - "Kolmkümmend\nneli" - "Kolmkümmend\nviis" - "Kolmkümmend\nkuus" - "Kolmkümmend\nseitse" - "Kolmkümmend\nkaheksa" - "Kolmkümmend\nüheksa" - "Nelikümmend" - "Nelikümmend\nüks" - "Nelikümmend\nkaks" - "Nelikümmend\nkolm" - "Nelikümmend\nneli" - "Nelikümmend\nviis" - "Nelikümmend\nkuus" - "Nelikümmend\nseitse" - "Nelikümmend\nkaheksa" - "Nelikümmend\nüheksa" - "Viiskümmend" - "Viiskümmend\nüks" - "Viiskümmend\nkaks" - "Viiskümmend\nkolm" - "Viiskümmend\nneli" - "Viiskümmend\nviis" - "Viiskümmend\nkuus" - "Viiskümmend\nseitse" - "Viiskümmend\nkaheksa" - "Viiskümmend\nüheksa" - diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index 12db5338893..d72a1a3bac1 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -151,84 +151,4 @@ Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. %d saiakera geratzen zaizkizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan. Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. %d saiakera geratzen zaizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan. - - ""Ordua:"\n"^1\n^2 - ""Ordua:"\n"^1\n^2 - - - "Hamabiak" - "Ordu bata" - "Ordu biak" - "Hirurak" - "Laurak" - "Bostak" - "Seiak" - "Zazpiak" - "Zortziak" - "Bederatziak" - "Hamarrak" - "Hamaikak" - - - "dira" - "eta bat" - "eta bi" - "eta hiru" - "eta lau" - "eta bost" - "eta sei" - "eta zazpi" - "eta zortzi" - "eta bederatzi" - "hamar" - "hamaika" - "hamabi" - "hamahiru" - "hamalau" - "hamabost" - "hamasei" - "hamazazpi" - "hemezortzi" - "hemeretzi" - "hogei" - "hogeita\nbat" - "hogeita\nbi" - "hogeita\nhiru" - "hogeita\nlau" - "hogeita\nbost" - "hogeita\nsei" - "hogeita\nzazpi" - "hogeita\nzortzi" - "hogeita\nbederatzi" - "hogeita hamar" - "hogeita\nhamaika" - "hogeita\nhamabi" - "hogeita\nhamahiru" - "hogeita\nhamalau" - "hogeita\nhamabost" - "hogeita\nhamasei" - "hogeita\nhamazazpi" - "hogeita\nhemezortzi" - "hogeita\nhemeretzi" - "berrogei" - "berrogeita\nbat" - "berrogeita\nbi" - "berrogeita\nhiru" - "berrogeita\nlau" - "berrogeita\nbost" - "berrogeita\nsei" - "berrogeita\nzazpi" - "berrogeita\nzortzi" - "berrogeita\nbederatzi" - "berrogeita hamar" - "berrogeita\nhamaika" - "berrogeita\nhamabi" - "berrogeita\nhamahiru" - "berrogeita\nhamalau" - "berrogeita\nhamabost" - "berrogeita\nhamasei" - "berrogeita\nhamazazpi" - "berrogeita\nhemezortzi" - "berrogeita\nhemeretzi" - diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml index c9bb7c9a86b..580ca78429a 100644 --- a/packages/SystemUI/res-keyguard/values-fa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml @@ -151,84 +151,4 @@ ‏سیم‌کارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. %d تلاش دیگر باقی مانده است و پس از آن سیم‌کارت برای همیشه غیرقابل‌استفاده می‌شود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید. ‏سیم‌کارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. %d تلاش دیگر باقی مانده است و پس از آن سیم‌کارت برای همیشه غیرقابل‌استفاده می‌شود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید. - - ""ساعت"\n"^1\n^2 - ""ساعت"\n"^1\n^2 - - - "دوازده" - "یک" - "دو" - "سه" - "چهار" - "پنج" - "شش" - "هفت" - "هشت" - "نه" - "ده" - "یازده" - - - "ساعت" - "و یک" - "و دو" - "و سه" - "و چهار" - "و پنج" - "و شش" - "و هفت" - "و هشت" - "و نُه" - "ده" - "یازده" - "دوازده" - "سیزده" - "چهارده" - "پانزده" - "شانزده" - "هفده" - "هجده" - "نوزده" - "بیست" - "بیست‌و\nیک" - "بیست‌و\nدو" - "بیست‌و\nسه" - "بیست و\nچهار" - "بیست‌و\nپنج" - "بیست‌و\nشش" - "بیست‌و\nهفت" - "بیست‌و\nهشت" - "بیست‌و\nنه" - "سی" - "سی‌و\nیک" - "سی‌و\nدو" - "سی‌و\nسه" - "سی‌و\nچهار" - "سی‌و\nپنج" - "سی‌و\nشش" - "سی‌و\nهفت" - "سی‌و\nهشت" - "سی‌و\nنه" - "چهل" - "چهل‌و\nیک" - "چهل‌و\nدو" - "چهل‌و\nسه" - "چهل‌و\nچهار" - "چهل‌و\nپنج" - "چهل‌و\nشش" - "چهل‌و\nهفت" - "چهل‌و\nهشت" - "چهل‌و\nنه" - "پنجاه" - "پنجاه‌و\nیک" - "پنجاه‌و\nدو" - "چهل‌و\nسه" - "چهل‌و\nچهار" - "پنجاه‌و\nپنج" - "پنجاه‌و\nشش" - "پنجاه‌و\nهفت" - "پنجاه‌و\nهشت" - "پنجاه‌و\nنه" - diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml index ff61966e299..fe299f6823f 100644 --- a/packages/SystemUI/res-keyguard/values-fi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml @@ -151,84 +151,4 @@ SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on %d yritystä jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi. SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on %d yritys jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi. - - ""Kello on"\n"^1\n^2 - ""Kello on"\n"^1\n^2 - - - "Kaksitoista" - "Yksi" - "Kaksi" - "Kolme" - "Neljä" - "Viisi" - "Kuusi" - "Seitsemän" - "Kahdeksan" - "Yhdeksän" - "Kymmenen" - "Yksitoista" - - - "Nolla nolla" - "Nolla yksi" - "Nolla kaksi" - "Nolla kolme" - "Nolla neljä" - "Nolla viisi" - "Nolla kuusi" - "Nolla seitsemän" - "Nolla kahdeksan" - "Nolla yhdeksän" - "Kymmenen" - "Yksitoista" - "Kaksitoista" - "Kolmetoista" - "Neljätoista" - "Viisitoista" - "Kuusitoista" - "Seitsemäntoista" - "Kahdeksantoista" - "Yhdeksäntoista" - "Kaksikymmentä" - "Kaksikymmentä-\nyksi" - "Kaksikymmentä-\nkaksi" - "Kaksikymmentä-\nkolme" - "Kaksikymmentä-\nneljä" - "Kaksikymmentä-\nviisi" - "Kaksikymmentä-\nkuusi" - "Kaksikymmentä-\nseitsemän" - "28\n" - "Kaksikymmentä-\nyhdeksän" - "Kolmekymmentä" - "Kolmekymmentä-\nyksi" - "Kolmekymmentä-\nkaksi" - "Kolmekymmentä-\nkolme" - "Kolmekymmentä-\nneljä" - "Kolmekymmentä-\nviisi" - "Kolmekymmentä-\nkuusi" - "Kolmekymmentä-\nseitsemän" - "Kolmekymmentä-\nkahdeksan" - "Kolmekymmentä-\nyhdeksän" - "Neljäkymmentä" - "Neljäkymmentä-\nyksi" - "Neljäkymmentä-\nkaksi" - "Neljäkymmentä-\nkolme" - "Neljäkymmentä-\nneljä" - "Neljäkymmentä-\nviisi" - "Neljäkymmentä-\nkuusi" - "Neljäkymmentä-\nseitsemän" - "Neljäkymmentä-\nkahdeksan" - "Neljäkymmentä-\nyhdeksän" - "Viisikymmentä" - "Viisikymmentä-\nyksi" - "Viisikymmentä-\nkaksi" - "Viisikymmentä-\nkolme" - "Viisikymmentä-\nneljä" - "Viisikymmentä-\nviisi" - "Viisikymmentä-\nkuusi" - "Viisikymmentä-\nseitsemän" - "Viisikymmentä-\nkahdeksan" - "Viisikymmentä-\nyhdeksän" - diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index c2226a2e6fe..65e0f3ad876 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -151,84 +151,4 @@ La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste %d tentative avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services. La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste %d tentatives avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services. - - ""Il est"\n"^1\n^2 - ""Il est"\n"^1\n^2 - - - "douze h." - "Une h." - "Deux h." - "Trois h." - "Quatre h." - "Cinq h." - "Six h." - "Sept h." - "Huit h." - "Neuf h." - "Dix h." - "Onze h." - - - "heures" - "et un" - "et deux" - "et trois" - "et quatre" - "et cinq" - "et six" - "et sept" - "et huit" - "et neuf" - "dix" - "onze" - "douze" - "treize" - "quatorze" - "quinze" - "seize" - "dix-sept" - "dix-huit" - "dix-neuf" - "vingt" - "vingt\n-et-un" - "vingt\n-deux" - "vingt\n-trois" - "vingt\n-quatre" - "vingt\n-cinq" - "vingt\n-six" - "vingt\n-sept" - "vingt\n-huit" - "vingt\n-neuf" - "trente" - "trente\n-et-un" - "trente\n-deux" - "trente\n-trois" - "trente\n-quatre" - "trente\n-cinq" - "trente\n-six" - "trente\n-sept" - "trente\n-huit" - "trente\n-neuf" - "quarante" - "quarante\n-et-un" - "quarante\n-deux" - "quarante\n-trois" - "quarante\n-quatre" - "quarante\n-cinq" - "quarante\n-six" - "quarante\n-sept" - "quarante\n-huit" - "quarante\n-neuf" - "cinquante" - "cinquante\n-et-un" - "cinquante\n-deux" - "cinquante\n-trois" - "cinquante\n-quatre" - "cinquante\n-cinq" - "cinquante\n-six" - "cinquante\n-sept" - "cinquante\n-huit" - "cinquante\n-neuf" - diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index bfe7ec98a4f..db85aaa48fd 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -151,84 +151,4 @@ La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste %d tentative avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur. La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste %d tentatives avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur. - - ""Il est"\n"^1\n^2 - ""Il est"\n"^1\n^2 - - - "douze heures" - "une heure" - "deux heures" - "trois heures" - "quatre heures" - "cinq heures" - "six heures" - "sept heures" - "huit heures" - "Neuf" - "dix heures" - "onze heures" - - - - "Une" - "Deux" - "Trois" - "Quatre" - "Cinq" - "Six" - "Sept" - "Huit" - "Neuf" - "dix" - "onze" - "douze" - "treize" - "quatorze" - "quinze" - "seize" - "dix-sept" - "dix-huit" - "dix-neuf" - "vingt" - "vingt\net un" - "vingt-\ndeux" - "vingt-\ntrois" - "vingt-\nquatre" - "vingt-\ncinq" - "vingt-\nsix" - "vingt-\nsept" - "vingt-\nhuit" - "vingt-\nneuf" - "trente" - "trente\net un" - "trente-\ndeux" - "trente-\ntrois" - "trente-\nquatre" - "trente-\ncinq" - "trente-\nsix" - "trente-\nsept" - "trente-\nhuit" - "trente-\nneuf" - "quarante" - "quarante\net un" - "quarante-\ndeux" - "quarante-\ntrois" - "quarante-\nquatre" - "quarante-\ncinq" - "quarante-\nsix" - "quarante-\nsept" - "quarante-\nhuit" - "quarante-\nneuf" - "cinquante" - "cinquante\net un" - "cinquante-\ndeux" - "cinquante-\ntrois" - "cinquante-\nquatre" - "cinquante-\ncinq" - "cinquante-\nsix" - "cinquante-\nsept" - "cinquante-\nhuit" - "cinquante-\nneuf" - diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml index 36930632945..d384950f60d 100644 --- a/packages/SystemUI/res-keyguard/values-gl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml @@ -151,84 +151,4 @@ A SIM está desactivada. Introduce o código PUK para continuar. Quédanche %d intentos antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información. A SIM está desactivada. Introduce o código PUK para continuar. Quédache %d intento antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información. - - ""Hora:"\n"^1\n^2 - ""Hora:"\n"^1\n^2 - - - "Doce" - "Unha" - "Dúas" - "Tres" - "Catro" - "Cinco" - "Seis" - "Sete" - "Oito" - "Nove" - "Dez" - "Once" - - - "En punto" - "Un" - "Dous" - "Tres" - "Catro" - "Cinco" - "Seis" - "Sete" - "Oito" - "Nove" - "Dez" - "Once" - "Doce" - "Trece" - "Catorce" - "Quince" - "Dezaseis" - "Dezasete" - "Dezaoito" - "Dezanove" - "Vinte" - "Vinte\ne un" - "Vinte\ne dous" - "Vinte\ne tres" - "Vinte\ne catro" - "Vinte\ne cinco" - "Vinte\ne seis" - "Vinte\ne sete" - "Vinte\ne oito" - "Vinte\ne nove" - "Trinta" - "Trinta\ne un" - "Trinta\ne dous" - "Trinta\ne tres" - "Trinta\ne catro" - "Trinta\ne cinco" - "Trinta\ne seis" - "Trinta\ne sete" - "Trinta\ne oito" - "Trinta\ne nove" - "Corenta" - "Corenta\ne un" - "Corenta\ne dous" - "Corenta\ne tres" - "Corenta\ne catro" - "Corenta\ne cinco" - "Corenta\ne seis" - "Corenta\ne sete" - "Corenta\ne oito" - "Corenta\ne nove" - "Cincuenta" - "Cincuenta\ne un" - "Cincuenta\ne dous" - "Cincuenta\ne tres" - "Cincuenta\ne catro" - "Cincuenta\ne cinco" - "Cincuenta\ne seis" - "Cincuenta\ne sete" - "Cincuenta\ne oito" - "Cincuenta\ne nove" - diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml index 0a966c16296..79524286d31 100644 --- a/packages/SystemUI/res-keyguard/values-gu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml @@ -151,84 +151,4 @@ સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે %d પ્રયાસ બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો. સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે %d પ્રયાસો બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો. - - ""સમય"\n"^1\n^2 - ""સમય"\n"^1\n^2 - - - "બાર" - "એક" - "બે" - "ત્રણ" - "ચાર" - "પાંચ" - "છ" - "સાત" - "આઠ" - "નવ" - "દસ" - "અગિયાર" - - - "વાગ્યે" - "ઓહ એક" - "ઓહ બે" - "ઓહ ત્રણ" - "ઓહ ચાર" - "ઓહ પાંચ" - "ઓહ છ" - "ઓહ સાત" - "ઓહ આઠ" - "ઓહ નવ" - "દસ" - "અગિયાર" - "બાર" - "તેર" - "ચૌદ" - "પંદર" - "સોળ" - "સત્તર" - "અઢાર" - "ઓગણીસ" - "વીસ" - "એકવીસ\n" - "બાવીસ\n" - "ત્રેવીસ\n" - "ચોવીસ\n" - "પચ્ચીસ\n" - "છવ્વીસ\n" - "સત્યાવીસ\n" - "અઠ્ઠયાવીસ\n" - "ઓગણત્રીસ\n" - "ત્રીસ" - "એકત્રીસ\n" - "બત્રીસ\n" - "તેત્રીસ\n" - "ચોત્રીસ\n" - "પાંત્રીસ\n" - "છત્રીસ\n" - "તેત્રીસ\n" - "આડત્રીસ\n" - "ઓગણચાલીસ\n" - "ચાલીસ" - "એકતાળીસ\n" - "બેતાલીસ\n" - "તેતાલીસ\n" - "ચુમાલીસ\n" - "પિસ્તાળીસ\n" - "છેંતાલીસ\n" - "સુડતાળીસ\n" - "અડતાલીસ\n" - "ઓગણપચાસ\n" - "પચાસ" - "એકાવન\n" - "બાવન\n" - "ત્રેપન\n" - "ચોપન\n" - "પંચાવન\n" - "છપ્પન\n" - "સત્તાવન\n" - "અઠ્ઠાવન\n" - "ઓગણસાઠ\n" - diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml index 0197e7df69c..8948e9ef9be 100644 --- a/packages/SystemUI/res-keyguard/values-hi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml @@ -81,7 +81,7 @@ "मनचाहे पिन कोड की पुष्टि करें" "SIM कार्ड अनलॉक हो रहा है…" "कोई ऐसा पिन लिखें, जिसमें 4 से 8 अंक हों." - "PUK कोड 8 या अधिक संख्या वाला होना चाहिए." + "PUK कोड 8 या ज़्यादा संख्या वाला होना चाहिए." "सही PUK कोड दोबारा डालें. बार-बार कोशिश करने से SIM हमेशा के लिए अक्षम हो जाएगा." "पिन कोड का मिलान नहीं हो रहा है" "पैटर्न के लिए बहुत ज़्यादा बार कोशिश की गई है" @@ -151,31 +151,4 @@ सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास %d मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें. सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास %d मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें. - - ""अभी"\n"^1\n^2 बजे हैं - ""अभी"\n"^1\n^2 बजे हैं - - - "बारह" - "एक" - "दो" - "तीन" - "चार" - "पाँच" - "छह" - "सात" - "आठ" - "नौ" - "दस" - "ग्यारह" - - - - - - - - - - diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml index b13d7c37054..f149b40ee06 100644 --- a/packages/SystemUI/res-keyguard/values-hr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml @@ -159,85 +159,4 @@ SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još %d pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera. SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još %d pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera. - - ""Sada je"\n"^1\n^2 - ""Sada je"\n"^1\n^2 - ""Sada je"\n"^1\n^2 - - - "Dvanaest" - "Jedan" - "Dva" - "Tri" - "Četiri" - "Pet" - "Šest" - "Sedam" - "Osam" - "Devet" - "Deset" - "Jedanaest" - - - - "Nula jedan" - "Nula dva" - "Nula tri" - "Nula četiri" - "Nula pet" - "Nula šest" - "Nula sedam" - "Nula osam" - "Nula devet" - "Deset" - "Jedanaest" - "Dvanaest" - "Trinaest" - "Četrnaest" - "Petnaest" - "Šesnaest" - "Sedamnaest" - "Osamnaest" - "Devetnaest" - "Dvadeset" - "Dvadeset\njedan" - "Dvadeset\ndva" - "Dvadeset\ntri" - "Dvadeset\nčetiri" - "Dvadeset\npet" - "Dvadeset\nšest" - "Dvadeset\nsedam" - "Dvadeset\nosam" - "Dvadeset\ndevet" - "Trideset" - "Trideset\njedan" - "Trideset\ndva" - "Trideset\ntri" - "Trideset\nčetiri" - "Trideset\npet" - "Trideset\nšest" - "Trideset\nsedam" - "Trideset\nosam" - "Trideset\ndevet" - "Četrdeset" - "Četrdeset\njedan" - "Četrdeset\ndva" - "Četrdeset\ntri" - "Četrdeset\nčetiri" - "Četrdeset\npet" - "Četrdeset\nšest" - "Četrdeset\nsedam" - "Četrdeset\nosam" - "Četrdeset\ndevet" - "Pedeset" - "Pedeset\njedan" - "Pedeset\ndva" - "Pedeset\ntri" - "Četrdeset\nčetiri" - "Pedeset\npet" - "Pedeset\nšest" - "Pedeset\nsedam" - "Pedeset\nosam" - "Pedeset\ndevet" - diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml index fcb396fdb10..4462901101e 100644 --- a/packages/SystemUI/res-keyguard/values-hu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml @@ -151,84 +151,4 @@ A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még %d próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz. A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még %d próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz. - - ""Idő:"\n"^1\n^2 - ""Idő:"\n"^1\n^2 - - - "Tizenkettő" - "Egy" - "Kettő" - "Három" - "Négy" - "Öt" - "Hat" - "Hét" - "Nyolc" - "Kilenc" - "Tíz" - "Tizenegy" - - - "óra" - "Nulla egy" - "Nulla kettő" - "Nulla három" - "Nulla négy" - "Nulla öt" - "Nulla hat" - "Nulla hét" - "Nulla nyolc" - "Nulla kilenc" - "Tíz" - "Tizenegy" - "Tizenkettő" - "Tizenhárom" - "Tizennégy" - "Tizenöt" - "Tizenhat" - "Tizenhét" - "Tizennyolc" - "Tizenkilenc" - "Húsz" - "Huszon\negy" - "Huszon\nkettő" - "Huszon\nhárom" - "Huszon\nnégy" - "Huszon\nöt" - "Huszon\nhat" - "Huszon\nhét" - "Huszon\nnyolc" - "Huszon\nkilenc" - "Harminc" - "Harminc\negy" - "Harminc\nkettő" - "Harminc\nhárom" - "Harminc\nnégy" - "Harminc\nöt" - "Harminc\nhat" - "Harminc\nhét" - "Harminc\nnyolc" - "Harminc\nkilenc" - "Negyven" - "Negyven\negy" - "Negyven\nkettő" - "Negyven\nhárom" - "Negyven\nnégy" - "Negyven\nöt" - "Negyven\nhat" - "Negyven\nhét" - "Negyven\nnyolc" - "Negyven\nkilenc" - "Ötven" - "Ötven\negy" - "Ötven\nkettő" - "Ötven\nhárom" - "Ötven\nnégy" - "Ötven\nöt" - "Ötven\nhat" - "Ötven\nhét" - "Ötven\nnyolc" - "Ötven\nkilenc" - diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml index 658d8db61ad..09ade055b0e 100644 --- a/packages/SystemUI/res-keyguard/values-hy/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml @@ -151,84 +151,4 @@ SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է %d փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին: SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է %d փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին: - - ""Ժամը"\n"^1ն անց\n^2 է - ""Ժամը"\n"^1ն անց\n^2 է - - - "տասներկու" - "մեկ" - "երկու" - "երեք" - "չորս" - "հինգ" - "վեց" - "յոթ" - "ութ" - "ինը" - "տասը" - "տասնմեկ" - - - "ուղիղ" - "զրո մեկ" - "զրո երկու" - "զրո երեք" - "զրո չորս" - "զրո հինգ" - "զրո վեց" - "զրո յոթ" - "զրո ութ" - "զրո ինը" - "տասը" - "տասնմեկ" - "տասներկու" - "տասներեք" - "տասնչորս" - "տասնհինգ" - "տասնվեց" - "տասնյոթ" - "տասնութ" - "տասնինը" - "քսան" - "քսան\nմեկ" - "քսան\nերկու" - "քսան\nերեք" - "քսան\nչորս" - "քսան\nհինգ" - "քսան\nվեց" - "քսան\nյոթ" - "քսան\nութ" - "քսան\nինը" - "երեսուն" - "երեսուն\nմեկ" - "երեսուն\nերկու" - "երեսուն\nերեք" - "երեսուն\nչորս" - "երեսուն\nհինգ" - "երեսուն\nվեց" - "երեսուն\nյոթ" - "երեսուն\nութ" - "երեսուն\nինը" - "քառասուն" - "քառասուն\nմեկ" - "քառասուն\nերկու" - "քառասուն\nերեք" - "քառասուն\nչորս" - "քառասուն\nհինգ" - "քառասուն\nվեց" - "քառասուն\nյոթ" - "քառասուն\nութ" - "քառասուն\nինը" - "հիսուն" - "հիսուն\nմեկ" - "հիսուն\nերկու" - "հիսուն\nերեք" - "հիսուն\nչորս" - "հիսուն\nհինգ" - "հիսուն\nվեց" - "հիսուն\nյոթ" - "հիսուն\nութ" - "հիսուն\nինը" - diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml index d58168b6167..86f994c2a46 100644 --- a/packages/SystemUI/res-keyguard/values-in/strings.xml +++ b/packages/SystemUI/res-keyguard/values-in/strings.xml @@ -151,84 +151,4 @@ SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa %d percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya. SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa %d percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya. - - ""Pukul"\n"^1\n^2 - ""Pukul"\n"^1\n^2 - - - "Dua Belas" - "Satu" - "Dua" - "Tiga" - "Empat" - "Lima" - "Enam" - "Tujuh" - "Delapan" - "Sembilan" - "Sepuluh" - "Sebelas" - - - "Tepat" - "Oh Satu" - "Oh Dua" - "Oh Tiga" - "Oh Empat" - "Oh Lima" - "Oh Enam" - "Oh Tujuh" - "Oh Delapan" - "Oh Sembilan" - "Sepuluh" - "Sebelas" - "Dua Belas" - "Tiga Belas" - "Empat Belas" - "Lima Belas" - "Enam Belas" - "Tujuh Belas" - "Delapan Belas" - "Sembilan Belas" - "Dua Puluh" - "Dua Puluh\nSatu" - "Dua Puluh\nDua" - "Dua Puluh\nTiga" - "Dua Puluh\nEmpat" - "Dua Puluh\nLima" - "Dua Puluh\nEnam" - "Dua Puluh\nTujuh" - "Dua Puluh\nDelapan" - "Dua Puluh\nSembilan" - "Tiga Puluh" - "Tiga Puluh\nSatu" - "Tiga Puluh\nDua" - "Tiga Puluh\nTiga" - "Tiga Puluh\nEmpat" - "Tiga Puluh\nLima" - "Tiga Puluh\nEnam" - "Tiga Puluh\nTujuh" - "Tiga Puluh\nDelapan" - "Tiga Puluh\nSembilan" - "Empat Puluh" - "Empat Puluh\nSatu" - "Empat Puluh\nDua" - "Empat Puluh\nTiga" - "Empat Puluh\nEmpat" - "Empat Puluh\nLima" - "Empat Puluh\nEnam" - "Empat Puluh\nTujuh" - "Empat Puluh\nDelapan" - "Empat Puluh\nSembilan" - "Lima Puluh" - "Lima Puluh\nSatu" - "Lima Puluh\nDua" - "Lima Puluh\nTiga" - "Lima Puluh\nEmpat" - "Lima Puluh\nLima" - "Lima Puluh\nEnam" - "Lima Puluh\nTujuh" - "Lima Puluh\nDelapan" - "Lima Puluh\nSembilan" - diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml index 8fc3da4acf6..3c615c12bc4 100644 --- a/packages/SystemUI/res-keyguard/values-is/strings.xml +++ b/packages/SystemUI/res-keyguard/values-is/strings.xml @@ -151,23 +151,4 @@ SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það er %d tilraun eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar. SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það eru %d tilraunir eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar. - - ""Hún er"\n"^1\n^2 - ""Hún er"\n"^1\n^2 - - - "Tólf" - "Eitt" - "Tvö" - "Þrjú" - "Fjögur" - "Fimm" - "Sex" - "Sjö" - "Átta" - "Níu" - "Tíu" - "Ellefu" - - diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index 4526a4f303a..36f9cca6d7e 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -151,84 +151,4 @@ La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora %d tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore. La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora %d tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore. - - ""Ora: "\n"^1\n^2S - ""Ora: "\n"^1\n^2S - - - "Dodici" - "Una" - "Due" - "Tre" - "Quattro" - "Cinque" - "Sei" - "Sette" - "Otto" - "Nove" - "Dieci" - "Undici" - - - "in punto" - "Uno" - "Due" - "Tre" - "Quattro" - "Cinque" - "Sei" - "Sette" - "Otto" - "Nove" - "Dieci" - "Undici" - "Dodici" - "Tredici" - "Quattordici" - "Quindici" - "Sedici" - "Diciassette" - "Diciotto" - "Diciannove" - "Venti" - "Ventuno\n" - "Ventidue\n" - "Ventitre\n" - "Ventiquattro\n" - "Venticinque\n" - "Ventisei\n" - "Ventisette\n" - "Ventotto\n" - "Ventinove\n" - "Trenta" - "Trentuno\n" - "Trentadue\n" - "Trentatre\n" - "Trentaquattro\n" - "Trentacinque\n" - "Trentasei\n" - "Trentasette\n" - "Trentotto\n" - "Trentanove\n" - "Quaranta" - "Quarantuno\n" - "Quarantadue\n" - "Quarantatre\n" - "Quarantaquattro\n" - "Quarantacinque\n" - "Quarantasei\n" - "Quarantasette\n" - "Quarantotto\n" - "Quarantanove\n" - "Cinquanta" - "Cinquantuno\n" - "Cinquantadue\n" - "Cinquantatre\n" - "Cinquantaquattro\n" - "Cinquantacinque\n" - "Cinquantasei\n" - "Cinquantasette\n" - "Cinquantotto\n" - "Cinquantanove\n" - diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index f9556e1b2a3..f499f43ff5e 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -167,86 +167,4 @@ ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך. ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותר לך %d ניסיון נוסף לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך. - - ""השעה היא"\n"^1\n^2 - ""השעה היא"\n"^1\n^2 - ""השעה היא"\n"^1\n^2 - ""השעה היא"\n"^1\n^2 - - - "שתים-עשרה" - "אחת" - "שתיים" - "שלוש" - "ארבע" - "חמש" - "שש" - "שבע" - "שמונה" - "תשע" - "עשר" - "אחת-עשרה" - - - "בדיוק" - "אפס אחת" - "אפס שתיים" - "אפס שלוש" - "אפס ארבע" - "אפס חמש" - "אפס שש" - "אפס שבע" - "אפס שמונה" - "אפס תשע" - "עשר" - "אחת-עשרה" - "שתים-עשרה" - "שלוש-עשרה" - "ארבע-עשרה" - "חמש-עשרה" - "שש-עשרה" - "שבע-עשרה" - "שמונה-עשרה" - "תשע-עשרה" - "עשרים" - "עשרים\nואחת" - "עשרים\nושתיים" - "עשרים\nושלוש" - "עשרים\nוארבע" - "עשרים\nוחמש" - "עשרים\nושש" - "עשרים\nושבע" - "עשרים\nושמונה" - "עשרים\nותשע" - "שלושים" - "שלושים\nואחת" - "שלושים\nושתיים" - "שלושים\nושלוש" - "שלושים\nוארבע" - "שלושים\nוחמש" - "שלושים\nושש" - "שלושים\nושבע" - "שלושים\nושמונה" - "שלושים\nותשע" - "ארבעים" - "ארבעים\nואחת" - "ארבעים\nושתיים" - "ארבעים\nושלוש" - "ארבעים\nוארבע" - "ארבעים\nוחמש" - "ארבעים\nושש" - "ארבעים\nושבע" - "ארבעים\nושמונה" - "ארבעים\nותשע" - "חמישים" - "חמישים\nואחת" - "חמישים\nושתיים" - "חמישים\nושלוש" - "חמישים\nוארבע" - "חמישים\nוחמש" - "חמישים\nושש" - "חמישים\nושבע" - "חמישים\nושמונה" - "חמישים\nותשע" - diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml index c8177062e1b..8b361966fe6 100644 --- a/packages/SystemUI/res-keyguard/values-ja/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml @@ -151,84 +151,4 @@ SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと %d 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。 SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと %d 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。 - - ^1 時\n^2 分\n""です"" - ^1 時\n^2 分\n""です"" - - - "12" - "1" - "2" - "3" - "4" - "5" - "6" - "7" - "8" - "9" - "10" - "11" - - - "時" - "1分" - "2分" - "3分" - "4分" - "5分" - "6分" - "7分" - "8分" - "9分" - "10" - "11" - "12" - "13" - "14" - "15" - "16" - "17" - "18" - "19" - "20" - "21\n" - "22\n" - "23\n" - "24\n" - "25\n" - "26\n" - "27\n" - "28\n" - "29\n" - "30" - "31\n" - "32\n" - "33\n" - "34\n" - "35\n" - "36\n" - "37\n" - "38\n" - "39\n" - "40" - "41\n" - "42\n" - "43\n" - "44\n" - "45\n" - "46\n" - "47\n" - "48\n" - "49\n" - "50" - "51\n" - "52\n" - "53\n" - "54\n" - "55\n" - "56\n" - "57\n" - "58\n" - "59\n" - diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml index 4e6344e4f45..2663ec67a64 100644 --- a/packages/SystemUI/res-keyguard/values-ka/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml @@ -151,84 +151,4 @@ SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ %d მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს. SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ %d მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს. - - ""ახლა არის"\n"^1\n^2 - ""ახლა არის"\n"^1\n^2 - - - "თორმეტი" - "ერთი" - "ორი" - "სამი" - "ოთხი" - "ხუთი" - "ექვსი" - "შვიდი" - "რვა" - "ცხრა" - "ათი" - "თერთმეტი" - - - "საათი" - "ნული-ერთი" - "ნული-ორი" - "ნული-სამი" - "ნული-ოთხი" - "ნული-ხუთი" - "ნული-ექვსი" - "ნული-შვიდი" - "ნული-რვა" - "ნული-ცხრა" - "ათი" - "თერთმეტი" - "თორმეტი" - "ცამეტი" - "თოთხმეტი" - "თხუთმეტი" - "თექვსმეტი" - "ჩვიდმეტი" - "თვრამეტი" - "ცხრამეტი" - "ოცი" - "ოცდაერთი\n" - "ოცდაორი\n" - "ოცდასამი\n" - "ოცდაოთხი\n" - "ოცდახუთი\n" - "ოცდაექვსი\n" - "ოცდაშვიდი\n" - "ოცდარვა\n" - "ოცდაცხრა\n" - "ოცდაათი" - "ოცდათერთმეტი\n" - "ოცდათორმეტი\n" - "ოცდაცამეტი\n" - "ოცდათოთხმეტი\n" - "ოცდათხუთმეტი\n" - "ოცდათექვსმეტი\n" - "ოცდაჩვიდმეტი\n" - "ოცდათვრამეტი\n" - "ოცდაცხრამეტი\n" - "ორმოცი" - "ორმოცდაერთი\n" - "ორმოცდაორი\n" - "ორმოცდასამი\n" - "ორმოცდაოთხი\n" - "ორმოცდახუთი\n" - "ორმოცდაექვსი\n" - "ორმოცდაშვიდი\n" - "ორმოცდარვა\n" - "ორმოცდაცხრა\n" - "ორმოცდაათი" - "ორმოცდათხუთმეტი\n" - "ორმოცდათორმეტი\n" - "ორმოცდაცამეტი\n" - "ორმოცდათოთხმეტი\n" - "ორმოცდათხუთმეტი\n" - "ორმოცდათექვსმეტი\n" - "ორმოცდაჩვიდმეტი\n" - "ორმოცდათვრამეტი\n" - "ორმოცდაცხრამეტი\n" - diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml index 3529bad5c3f..e649dd95670 100644 --- a/packages/SystemUI/res-keyguard/values-kk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml @@ -151,84 +151,4 @@ SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. %d мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз. SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. %d мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз. - - ""Сағат:"\n"^1\n^2 - ""Сағат:"\n"^1\n^2 - - - "Он екі" - "Бір" - "Екі" - "Үш" - "Төрт" - "Бес" - "Алты" - "Жеті" - "Сегіз" - "Тоғыз" - "Он" - "Он бір" - - - - "Нөл бір" - "Нөл екі" - "Нөл үш" - "Нөл төрт" - "Нөл бес" - "Нөл алты" - "Нөл жеті" - "Нөл сегіз" - "Нөл тоғыз" - "Он" - "Он бір" - "Он екі" - "Он үш" - "Он төрт" - "Он бес" - "Он алты" - "Он жеті" - "Он сегіз" - "Он тоғыз" - "Жиырма" - "Жиырма\nбір" - "Жиырма\nекі" - "Жиырма\nүш" - "Жиырма\nтөрт" - "Жиырма\nбес" - "Жиырма\nалты" - "Жиырма\nжеті" - "Жиырма\nсегіз" - "Жиырма\nтоғыз" - "Отыз" - "Отыз\nбір" - "Отыз\nекі" - "Отыз\nүш" - "Отыз\nтөрт" - "Отыз\nбес" - "Отыз\nалты" - "Отыз\nжеті" - "Отыз\nсегіз" - "Отыз\nтоғыз" - "Қырық" - "Қырық\nбір" - "Қырық\nекі" - "Қырық\nүш" - "Қырық\nтөрт" - "Қырық\nбес" - "Қырық\nалты" - "Қырық\nжеті" - "Қырық\nсегіз" - "Қырық\nтоғыз" - "Елу" - "Елу\nбір" - "Елу\nекі" - "Елу\nүш" - "Елу\nтөрт" - "Елу\nбес" - "Елу\nалты" - "Елу\nжеті" - "Елу\nсегіз" - "Елу\nтоғыз" - diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml index 852270a1b11..c78e0bb6a8e 100644 --- a/packages/SystemUI/res-keyguard/values-km/strings.xml +++ b/packages/SystemUI/res-keyguard/values-km/strings.xml @@ -151,84 +151,4 @@ ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម %d ដងទៀត​មុនពេល​ស៊ីម​មិនអាច​ប្រើបាន​ជា​អចិន្ត្រៃយ៍។ ទាក់ទង​ទៅ​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ​សម្រាប់ព័ត៌មានលម្អិត។ ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម %d ដងទៀតមុនពេលស៊ីមមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។ ទាក់ទង​ទៅ​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ​សម្រាប់​ព័ត៌មាន​លម្អិត។ - - ""ម៉ោង"\n"^1\n^2 - ""ម៉ោង"\n"^1\n^2 - - - "ដប់ពីរ" - "មួយ" - "ពីរ" - "បី" - "បួន" - "ប្រាំ" - "ប្រាំមួយ" - "ប្រាំពីរ" - "ប្រាំបី" - "ប្រាំបួន" - "ដប់" - "ដប់មួយ" - - - "ម៉ោង" - "Oh One" - "Oh Two" - "Oh Three" - "Oh Four" - "Oh Five" - "Oh Six" - "Oh Seven" - "Oh Eight" - "Oh Nine" - "ដប់" - "ដប់មួយ" - "ដប់ពីរ" - "ដប់បី" - "ដប់បួន" - "ដប់ប្រាំ" - "ដប់ប្រាំមួយ" - "ដប់ប្រាំពីរ" - "ដប់​ប្រាំបី" - "ដប់​ប្រាំបួន" - "ម្ភៃ" - "ម្ភៃ\nមួយ" - "ម្ភៃ\nពីរ" - "ម្ភៃ\nបី" - "ម្ភៃ\nបួន" - "ម្ភៃ\nប្រាំ" - "ម្ភៃ\nប្រាំមួយ" - "ម្ភៃ\nប្រាំពីរ" - "ម្ភៃ\nប្រាំបី" - "ម្ភៃ\nប្រាំបួន" - "សាមសិប" - "សាមសិប\nមួយ" - "សាមសិប\nពីរ" - "សាមសិប\nបី" - "សាមសិប\nបួន" - "សាមសិប\nប្រាំ" - "សាមសិប\nប្រាំមួយ" - "សាមសិប\nប្រាំពីរ" - "សាមសិប\nប្រាំបី" - "សាមសិប\nប្រាំបួន" - "សែសិប" - "សែសិប\nមួយ" - "សែសិប\nពីរ" - "សែសិប\nបី" - "សែសិប\nបួន" - "សែសិប\nប្រាំ" - "សែសិប\nប្រាំមួយ" - "សែសិប\nប្រាំពីរ" - "សែសិប\nប្រាំបី" - "សែសិប\nប្រាំបួន" - "ហាសិប" - "ហាសិប\nមួយ" - "ហាសិប\nពីរ" - "ហាសិប\nបី" - "ហាសិប\nបួន" - "ហាសិប\nប្រាំ" - "ហាសិប\nប្រាំមួយ" - "ហាសិប\nប្រាំពីរ" - "ហាសិប\nប្រាំបី" - "ហាសិប\nប្រាំបួន" - diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index e0c4748ab9a..8bb047ce467 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -151,84 +151,4 @@ ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ %d ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ. ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ %d ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ. - - ""ಇದು"\n"^1\n^2 - ""ಇದು"\n"^1\n^2 - - - "ಹನ್ನೆರಡು" - "ಒಂದು" - "ಎರಡು" - "ಮೂರು" - "ನಾಲ್ಕು" - "ಐದು" - "ಆರು" - "ಏಳು" - "ಎಂಟು" - "ಒಂಬತ್ತು" - "ಹತ್ತು" - "ಹನ್ನೊಂದು" - - - "ಗಂಟೆ" - "ಓಹ್ ಒಂದು" - "ಓಹ್ ಎರಡು" - "ಓಹ್ ಮೂರು" - "ಓಹ್ ನಾಲ್ಕು" - "ಓಹ್ ಐದು" - "ಓಹ್ ಆರು" - "ಓಹ್ ಏಳು" - "ಓಹ್ ಎಂಟು" - "ಓಹ್ ಒಂಬತ್ತು" - "ಹತ್ತು" - "ಹನ್ನೊಂದು" - "ಹನ್ನೆರಡು" - "ಹದಿಮೂರು" - "ಹದಿನಾಲ್ಕು" - "ಹದಿನೈದು" - "ಹದಿನಾರು" - "ಹದಿನೇಳು" - "ಹದಿನೆಂಟು" - "ಹತ್ತೊಂಬತ್ತು" - "ಇಪ್ಪತ್ತು" - "ಇಪ್ಪತ್ತೊಂದು\n" - "ಇಪ್ಪತ್ತೆರಡು\n" - "ಇಪ್ಪತ್ತಮೂರು\n" - "ಇಪ್ಪತ್ತನಾಲ್ಕು\n" - "ಇಪ್ಪತ್ತೈದು\n" - "ಇಪ್ಪತ್ತಾರು\n" - "ಇಪ್ಪತ್ತೇಳು\n" - "ಇಪ್ಪತ್ತೆಂಟು\n" - "ಇಪ್ಪತ್ತೊಂಬತ್ತು\n" - "ಮೂವತ್ತು" - "ಮೂವತ್ತೊಂದು\n" - "ಮೂವತ್ತೆರಡು\n" - "ಮೂವತ್ಮೂರು\n" - "ಮೂವತ್ತು\nನಾಲ್ಕು" - "ಮೂವತ್ತೈದು\n" - "ಮೂವತ್ತಾರು\n" - "ಮೂವತ್ತೇಳು\n" - "ಮೂವತ್ತೆಂಟು \n" - "ಮೂವತ್ತೊಂಬತ್ತು\n" - "ನಲವತ್ತು" - "ನಲವತ್ತೊಂದು\n" - "ನಲವತ್ತೇರಡು\n" - "ನಲವತ್ಮೂರು\n" - "ನಲವತ್ತು\nನಾಲ್ಕು" - "ನಲವತ್ತೈದು\n" - "ನಲವತ್ತಾರು\n" - "ನಲವತ್ತೇಳು\n" - "ನಲವತ್ತೆಂಟು\n" - "ನಲವತ್ತೊಂಬತ್ತು\n" - "ಐವತ್ತು" - "ಐವತ್ತೊಂದು\n" - "ಐವತ್ತೇರಡು\n" - "ಐವತ್ಮೂರು\n" - "ಐವತ್ನಾಲ್ಕು\n" - "ಐವತ್ತೈದು\n" - "ಐವತ್ತಾರು\n" - "ಐವತ್ತೇಳು\n" - "ಐವತ್ತೆಂಟು\n" - "ಐವತ್ತೊಂಬತ್ತು\n" - diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml index 86661ff886a..7d6538be506 100644 --- a/packages/SystemUI/res-keyguard/values-ko/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml @@ -151,84 +151,4 @@ SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. %d번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요. SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. %d번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요. - - ""현재 시각:"\n"^1\n^2 - ""현재 시각:"\n"^1\n^2 - - - "열두 시" - "한 시" - "두 시" - "세 시" - "네 시" - "다섯 시" - "여섯 시" - "일곱 시" - "여덟 시" - "아홉 시" - "열 시" - "열한 시" - - - "정각" - "일 분" - "이 분" - "삼 분" - "사 분" - "오 분" - "육 분" - "칠 분" - "팔 분" - "구 분" - "십 분" - "십일 분" - "십이 분" - "십삼 분" - "십사 분" - "십오 분" - "십육 분" - "십칠 분" - "십팔 분" - "십구 분" - "이십 분" - "이십\n일 분" - "이십\n이 분" - "이십\n삼 분" - "이십\n사 분" - "이십\n오 분" - "이십\n육 분" - "이십\n칠 분" - "이십\n팔 분" - "이십\n구 분" - "삼십 분" - "삼십\n일 분" - "삼십\n이 분" - "삼십\n삼 분" - "삼십\n사분" - "삼십\n오 분" - "삼십\n육 분" - "삼십\n칠 분" - "삼십\n팔 분" - "삼십\n구 분" - "사십 분" - "사십\n일 분" - "사십\n이 분" - "사십\n삼 분" - "사십\n사 분" - "사십\n오 분" - "사십\n육분" - "사십\n칠 분" - "사십\n팔 분" - "사십\n구 분" - "오십 분" - "오십\n일 분" - "오십\n이 분" - "오십\n삼 분" - "사십\n사 분" - "오십\n오 분" - "오십\n육 분" - "오십\n칠 분" - "사십\n팔 분" - "오십\n구 분" - diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index e98d9878323..cffc2f6973b 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -151,84 +151,4 @@ SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгарына %d аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз. SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгаарына %d аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз. - - ""–"\n"^1\n^2 - ""–"\n"^1\n^2 - - - "Он эки" - "Бир" - "Эки" - "Үч" - "Төрт" - "Беш" - "Алты" - "Жети" - "Сегиз" - "Тогуз" - "Он" - "Он бир" - - - "Саат" - "Ноль бир" - "Ноль эки" - "Ноль үч" - "Ноль төрт" - "Ноль беш" - "Ноль алты" - "Ноль жети" - "Ноль сегиз" - "Ноль тогуз" - "Он" - "Он бир" - "Он эки" - "Он үч" - "Он төрт" - "Он беш" - "Он алты" - "Он жети" - "Он сегиз" - "Он тогуз" - "Жыйырма" - "Жыйырма\nбир" - "Жыйырма\nэки" - "Жыйырма\nүч" - "Жыйырма\nтөрт" - "Жыйырма\nбеш" - "Жыйырма\nалты" - "Жыйырма\nжети" - "Жыйырма\nсегиз" - "Жыйырма\nтогуз" - "Отуз" - "Отуз\nбир" - "Отуз\nэки" - "Отуз\nүч" - "Отуз\nтөрт" - "Отуз\nбеш" - "Отуз\nалты" - "Кырк\nжети" - "Отуз\nсегиз" - "Отуз\nтогуз" - "Кырк" - "Кырк\nбир" - "Кырк\nэки" - "Кырк\nүч" - "Кырк\nтөрт" - "Кырк\nбеш" - "Кырк\nалты" - "Кырк\nжети" - "Кырк\nсегиз" - "Кырк\nтогуз" - "Элүү" - "Элүү\nбир" - "Элүү\nэки" - "Элүү\nүч" - "Элүү\nтөрт" - "Кырк\nбеш" - "Элүү\nалты" - "Кырк\nжети" - "Элүү\nсегиз" - "Элүү\nтогуз" - diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index 4a9fe4fb67e..b0678ce0073 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -151,84 +151,4 @@ ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ %d ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ. ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ %d ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ. - - ""ມັນແມ່ນ"\n"^1\n^2 - ""ມັນແມ່ນ"\n"^1\n^2 - - - "ສິບສອງ" - "ໜຶ່ງ" - "ສອງ" - "ສາມ" - "ສີ່" - "ຫ້າ" - "ຫົກ" - "ເຈັດ" - "ແປດ" - "ເກົ້າ" - "ສິບ" - "ສິບເອັດ" - - - "O’Clock" - "ໂອ້ ໜຶ່ງ" - "ໂອ້ ສອງ" - "ໂອ້ ສາມ" - "ໂອ້ ສີ່" - "ໂອ້ ຫ້າ" - "ໂອ້ ຫົກ" - "ໂອ້ ເຈັດ" - "ໂອ້ ແປດ" - "ໂອ້ ເກົ້າ" - "ສິບ" - "ສິບເອັດ" - "ສິບສອງ" - "ສິບສາມ" - "ສິບສີ່" - "ສິບຫ້າ" - "ສິບຫົກ" - "ສິບເຈັດ" - "ສິບແປດ" - "ສິບເກົ້າ" - "ຊາວ" - "ຊາວ\nເອັດ" - "ຊາວ\nສອງ" - "ຊາວ\nສາມ" - "ຊາວ\nສີ່" - "ຊາວ\nຫ້າ" - "ຊາວ\nຫົກ" - "ຊາວ\nເຈັດ" - "ຊາວ\nແປດ" - "ຊາວ\nເກົ້າ" - "ສາມສິບ" - "ສາມ\nສິບເອັດ" - "ສາມ\nສິບສອງ" - "ສາມ\nສິບສາມ" - "ສາມ\nສິບສີ່" - "ສາມ\nສິບຫ້າ" - "ສາມ\nສິບຫົກ" - "ສາມ\nສິບເຈັດ" - "ສາມສິບ\nແປດ" - "ສາມ\nສິບເກົ້າ" - "ສີ່ສິບ" - "ສີ່\nສິບເອັດ" - "ສີ່\nສິບສອງ" - "ສີ່\nສິບສາມ" - "ສີ່\nສິບສີ່" - "ສີ່\nສິບຫ້າ" - "ສີ່\nສິບຫົກ" - "ສີ່\nສິບເຈັດ" - "ສີ່\nສິບແປດ" - "ສີ່\nສິບເກົ້າ" - "ຫ້າສິບ" - "ຫ້າ\nສິບເອັດ" - "ຫ້າ\nສິບສອງ" - "ຫ້າ\nສິບສາມ" - "ຫ້າ\nສິບສີ່" - "ຫ້າ\nສິບຫ້າ" - "ຫ້າ\nສິບຫົກ" - "ຫ້າ\nສິບເຈັດ" - "ຫ້າ\nສິບແປດ" - "ຫ້າ\nສິບເກົ້າ" - diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml index 90d174b7be4..ea4d1a77e09 100644 --- a/packages/SystemUI/res-keyguard/values-lt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml @@ -167,86 +167,4 @@ SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko %d bandymo. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi. SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko %d bandymų. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi. - - ""Dabar"\n"^1\n^2 - ""Dabar"\n"^1\n^2 - ""Dabar"\n"^1\n^2 - ""Dabar"\n"^1\n^2 - - - "Dvylika" - "Pirma" - "Dvi" - "Trys" - "Keturios" - "Penkios" - "Šešios" - "Septyn." - "Aštuon." - "Devynios" - "Dešimt" - "Vienuol." - - - "val." - "Pirma" - "Dvi" - "Trys" - "Keturios" - "Penkios" - "Šešios" - "Septynios" - "Aštuonios" - "Devynios" - "Dešimt" - "Vienuolika" - "Dvylika" - "Trylika" - "Keturiolika" - "Penkiolika" - "Šešiolika" - "Septyniolika" - "Aštuoniolika" - "Devyniolika" - "Dvidešimt" - "Dvidešimt\nviena" - "Dvidešimt\ndvi" - "Dvidešimt\ntrys" - "Dvidešimt\nketur." - "Dvidešimt\npenkios" - "Dvidešimt\nšešios" - "Dvidešimt\nseptyn." - "Dvidešimt\naštuon." - "Dvidešimt\ndevyn." - "Trisdešimt" - "Trisdešimt\nviena" - "Trisdešimt\ndvi" - "Trisdešimt\ntrys" - "Trisdešimt\nketur." - "Trisdeš.\npenkios" - "Trisdešimt\nšešios" - "Trisdeš.\nseptyn." - "Trisdeš.\naštuon." - "Trisdešimt\ndevyn." - "Keturiasdešimt" - "Keturiasd.\nviena" - "Keturiasdeš.\ndvi" - "Keturiasdeš.\ntrys" - "Keturiasd.\nketur." - "Keturiasd.\npenk." - "Keturiasd.\nšešios" - "Keturiasd.\nsept." - "Keturiasdeš.\našt." - "Keduriasd.\ndevyn." - "Penkiasdešimt" - "Penkiasdeš.\nviena" - "Penkiasdešimt\ndvi" - "Penkiasdeš.\ntrys" - "Penkiasd.\nketur." - "Penkiasdeš.\npenk." - "Penkiasd.\nšešios" - "Penkiasd.\nseptyn." - "Penkiasd.\naštuon." - "Penkiasd.\ndevyn." - diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml index 877d4096c12..2512ae21120 100644 --- a/packages/SystemUI/res-keyguard/values-lv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml @@ -159,85 +159,4 @@ SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl %d reizi. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru. SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl %d reizes. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru. - - ""Laiks:"\n"^1\n^2 - ""Laiks:"\n"^1\n^2 - ""Laiks:"\n"^1\n^2 - - - "Divpadsmit" - "Viens" - "Divi" - "Trīs" - "Četri" - "Pieci" - "Seši" - "Septiņi" - "Astoņi" - "Deviņi" - "Desmit" - "Vienpadsmit" - - - "Nulle, nulle" - "nulle viena" - "nulle divas" - "nulle trīs" - "nulle četras" - "nulle piecas" - "nulle sešas" - "nulle septiņas" - "nulle astoņas" - "nulle deviņas" - "Desmit" - "Vienpadsmit" - "Divpadsmit" - "Trīspadsmit" - "Četrpadsmit" - "Piecpadsmit" - "Sešdpadsmit" - "Septiņpadsmit" - "Astoņpadsmit" - "Deviņpadsmit" - "Divdesmit" - "Divdesmit\nviena" - "Divdesmit\ndivas" - "Divdesmit\ntrīs" - "Divdesmit\nčetras" - "Divdesmit\npiecas" - "Divdesmit\nsešas" - "Divdesmit\nseptiņas" - "Divdesmit\nastoņas" - "Divdesmit\ndeviņas" - "Trīsdesmit" - "Trīsdesmit\nviena" - "Trīsdesmit\ndivas" - "Trīsdesmit\ntrīs" - "Trīsdesmit\nčetras" - "Trīsdesmit\npiecas" - "Trīsdesmit\nsešas" - "Trīsdesmit\nseptiņas" - "Trīsdesmit\nastoņas" - "Trīsdesmit\ndeviņas" - "Četrdesmit" - "Četrdesmit\nviena" - "Četrdesmit\ndivas" - "Četrdesmit\ntrīs" - "Četrdesmit\nčetras" - "Četrdesmit\npiecas" - "Četrdesmit\nsešas" - "Četrdesmit\nseptiņas" - "Četrdesmit\nastoņas" - "Četrdesmit\ndeviņas" - "Piecdesmit" - "Piecdesmit\nviena" - "Piecdesmit\ndivas" - "Piecdesmit\ntrīs" - "Piecdesmit\nčetras" - "Piecdesmit\npiecas" - "Piecdesmit\nsešas" - "Piecdesmit\nseptiņas" - "Piecdesmit\nastoņas" - "Piecdesmit\ndeviņas" - diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml index a59dc681132..1d08adecf6c 100644 --- a/packages/SystemUI/res-keyguard/values-mk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml @@ -151,84 +151,4 @@ SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостанува уште %d обид пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали. SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостануваат уште %d обиди пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали. - - ""Сега е"\n"^1\n^2 - ""Сега е"\n"^1\n^2 - - - "Дванаесет" - "Еден" - "Два" - "Три" - "Четири" - "Пет" - "Шест" - "Седум" - "Осум" - "Девет" - "Десет" - "Единаесет" - - - "часот" - "нула еден" - "нула два" - "нула три" - "нула четири" - "нула пет" - "нула шест" - "нула седум" - "нула осум" - "нула девет" - "Десет" - "Единаесет" - "Дванаесет" - "Тринаесет" - "Четиринаесет" - "Петнаесет" - "Шестнаесет" - "Седумнаесет" - "Осумнаесет" - "Деветнаесет" - "Дваесет" - "Дваесет\nи еден" - "Дваесет\nи два" - "Дваесет\nи три" - "Дваесет\nи четири" - "Дваесет\nи пет" - "Дваесет\nи шест" - "Дваесет\nи седум" - "Дваесет\nи осум" - "Дваесет\nи девет" - "Триесет" - "Триесет\nи еден" - "Триесет\nи два" - "Триесет\nи три" - "Триесет\nи четири" - "Триесет\nи пет" - "Триесет\nи шест" - "Триесет\nи седум" - "Триесет\nи осум" - "Триесет\nи девет" - "Четириесет" - "Четириесет\nи еден" - "Четириесет\nи два" - "Четириесет\nи три" - "Четириесет\nи четири" - "Четириесет\nи пет" - "Четириесет\nи шест" - "Четириесет\nи седум" - "Четириесет\nи осум" - "Четириесет\nи девет" - "Педесет" - "Педесет\nи еден" - "Педесет\nи два" - "Педесет\nи три" - "Педесет\nи четири" - "Педесет\nи пет" - "Педесет\nи шест" - "Педесет\nи седум" - "Педесет\nи осум" - "Педесет\nи девет" - diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index 6836f1e3377..aec0c63e068 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -151,84 +151,4 @@ സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി %d ശ്രമങ്ങൾ കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക. സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി %d ശ്രമം കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക. - - ""സമയം"\n"^1\n^2 - ""സമയം"\n"^1\n^2 - - - "പന്ത്രണ്ട്" - "ഒന്ന്" - "രണ്ട്" - "മൂന്ന്" - "നാല്" - "അഞ്ച്" - "ആറ്" - "ഏഴ്" - "എട്ട്" - "ഒമ്പത്" - "പത്ത്" - "പതിനൊന്ന്" - - - "മണി" - "ഓ ഒരു മിനിറ്റ്" - "ഓ രണ്ട് മിനിറ്റ്" - "ഓ മൂന്ന് മിനിറ്റ്" - "ഓ നാലു മിനിറ്റ്" - "ഓ അഞ്ച് മിനിറ്റ്" - "ഓ ആറ് മിനിറ്റ്" - "ഓ ഏഴ് മിനിറ്റ്" - "ഓ എട്ട് മിനിറ്റ്" - "ഓ ഒമ്പത് മിനിറ്റ്" - "പത്ത്" - "പതിനൊന്ന്" - "പന്ത്രണ്ട്" - "പതിമൂന്ന്" - "പതിനാല്" - "പതിനഞ്ച്" - "പതിനാറ്" - "പതിനേഴ്" - "പതിനെട്ട്" - "പത്തൊമ്പത്" - "ഇരുപത്" - "ഇരുപത്തിയൊന്ന്\n" - "ഇരുപത്തിരണ്ട്\n" - "ഇരുപത്തിമൂന്ന്\n" - "ഇരുപത്തിനാല്\n" - "ഇരുപത്തിയഞ്ച്\n" - "ഇരുപത്തിയാറ്\n" - "ഇരുപത്തിയേഴ്\n" - "ഇരുപത്തിയെട്ട്\n" - "ഇരുപത്തിയൊമ്പത്\n" - "മുപ്പത്" - "മുപ്പത്തിയൊന്ന്\n" - "മുപ്പത്തിരണ്ട്\n" - "മുപ്പത്തിമൂന്ന്\n" - "മുപ്പത്തിനാല്\n" - "അമ്പത്തിയഞ്ച്\n" - "മുപ്പത്തിയാറ്\n" - "മുപ്പത്തിയേഴ്\n" - "മുപ്പത്തിയെട്ട്\n" - "മുപ്പത്തിയൊമ്പത്\n" - "നാൽപത്" - "നാൽപ്പത്തിയൊന്ന്\n" - "നാൽപത്തിരണ്ട്\n" - "നാൽപ്പത്തിമൂന്ന്\n" - "നാൽപത്തിനാല്\n" - "നാൽപത്തിയഞ്ച്\n" - "നാൽപ്പത്തിയാറ്\n" - "നാൽപത്തിയേഴ്\n" - "നാൽപത്തിയെട്ട്\n" - "നാൽപത്തിയൊമ്പത്\n" - "അമ്പത്" - "അമ്പത്തിയൊന്ന്\n" - "അമ്പത്തിരണ്ട്\n" - "അമ്പത്തിമൂന്ന്\n" - "അമ്പത്തിനാല്\n" - "അമ്പത്തിയഞ്ച്\n" - "അമ്പത്തിയാറ്\n" - "അമ്പത്തിയേഴ്\n" - "അമ്പത്തിയെട്ട്\n" - "അമ്പത്തിയൊമ്പത്\n" - diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml index 01c87ef9f80..c4f748116b9 100644 --- a/packages/SystemUI/res-keyguard/values-mn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml @@ -151,84 +151,4 @@ SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл %d оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу. SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл %d оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу. - - ""Одоо"\n"^1\n^2 - ""Одоо"\n"^1\n^2 - - - "Арван хоёр" - "Нэг" - "Хоёр" - "Гурав" - "Дөрөв" - "Тав" - "Зургаа" - "Долоо" - "Найм" - "Ес" - "Арав" - "Арван нэг" - - - "Цаг" - "Нэг" - "Хоёр" - "Гурав" - "Дөрөв" - "Тав" - "Зургаа" - "Долоо" - "Найм" - "Ес" - "Арав" - "Арван нэг" - "Арван хоёр" - "Арван гурав" - "Арван дөрөв" - "Арван тав" - "Арван зургаа" - "Арван долоо" - "Арван найм" - "Арван ес" - "Хорь" - "Хорь\nНэг" - "Хорь\nХоёр" - "Хорь\nГурав" - "Хорь\nДөрөв" - "Хорь\nТав" - "Хорь\nЗургаа" - "Хорь\nДолоо" - "Хорь\nНайм" - "Хорь\nЕс" - "Гуч" - "Гуч\nНэг" - "Гуч\nХоёр" - "Гуч\nГурав" - "Гуч\nДөрөв" - "Гуч\nТав" - "Гуч\nЗургаа" - "Гуч\nДолоо" - "Гуч\nНайм" - "Гуч\nЕс" - "Дөч" - "Дөч\nНэг" - "Дөч\nХоёр" - "Дөч\nГурав" - "Дөч\nДөрөв" - "Дөч\nТав" - "Дөч\nЗургаа" - "Дөч\nДолоо" - "Дөч\nНайм" - "Дөч\nЕс" - "Тавь" - "Тавь\nНэг" - "Тавь\nХоёр" - "Тавь\nГурав" - "Тавь\nДөрөв" - "Тавь\nТав" - "Тавь\nЗургаа" - "Тавь\nДолоо" - "Тавь\nНайм" - "Тавь\nЕс" - diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml index 0111cd1e772..942e04e8b20 100644 --- a/packages/SystemUI/res-keyguard/values-mr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml @@ -151,84 +151,4 @@ सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे %d प्रयत्न शिल्लक आहे. तपशीलांसाठी वाहकाशी संपर्क साधा. सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे %d प्रयत्न शिल्लक आहेत. तपशीलांसाठी वाहकाशी संपर्क साधा. - - ""वेळ"\n"ता\nमि - ""वेळ"\n"ता\nमि - - - "बारा" - "एक" - "दोन" - "तीन" - "चार" - "पाच" - "सहा" - "सात" - "आठ" - "नऊ" - "दहा" - "एकरा" - - - "वाजता" - "शून्य एक" - "शून्य दोन" - "शून्य तीन" - "शून्य चार" - "शून्य पाच" - "शून्य सहा" - "शून्य सात" - "शून्य आठ" - "शून्य नऊ" - "दहा" - "एकरा" - "बारा" - "तेरा" - "चौदा" - "पंधरा" - "सोळा" - "सतरा" - "अठरा" - "एकोणीस" - "वीस" - "एकवीस\n" - "बावीस\n" - "तेवीस\n" - "चोवीस\n" - "पंचवीस\n" - "सव्वीस\n" - "सत्तावीस\n" - "अठ्ठावीस\n" - "एकोणतीस\n" - "तीस" - "एकतीस\n" - "बत्तीस\n" - "तेहतीस\n" - "चौतीस\n" - "पस्तीस\n" - "छत्तीस\n" - "सदतीस\n" - "अडतीस\n" - "एकोणचाळीस\n" - "चाळीस" - "एकेचाळीस\n" - "बेचाळीस\n" - "त्रेचाळीस\n" - "चव्वेचाळीस\n" - "पंचेचाळीस\n" - "शेहेचाळीस\n" - "सत्तेचाळीस\n" - "अठ्ठेचाळीस\n" - "एकोणपन्नास\n" - "पन्नास" - "एकावन्न\n" - "बावन्न\n" - "त्रेपन्न\n" - "चौपन्न\n" - "पंचावन्न\n" - "छप्पन\n" - "सत्तावन्न\n" - "अठ्ठावन्न\n" - "एकोणसाठ\n" - diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml index 553757efd90..2052848a820 100644 --- a/packages/SystemUI/res-keyguard/values-ms/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml @@ -151,84 +151,4 @@ Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal %d percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran. Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal %d percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran. - - ""Pukul"\n"^1\n^2 - ""Pukul"\n"^1\n^2 - - - "Dua bls" - "Satu" - "Dua" - "Tiga" - "Empat" - "Lima" - "Enam" - "Tujuh" - "Lapan" - "Sembilan" - "Sepuluh" - "Sebelas" - - - "Pukul" - "Kosong Satu" - "Kosong Dua" - "Kosong Tiga" - "Kosong Empat" - "Kosong Lima" - "Kosong Enam" - "Kosong Tujuh" - "Kosong Lapan" - "Kosong Sembilan" - "Sepuluh" - "Sebelas" - "Dua belas" - "Tiga belas" - "Empat belas" - "Lima belas" - "Enam belas" - "Tujuh belas" - "Lapan belas" - "Sembilan belas" - "Dua puluh" - "Dua Puluh\nSatu" - "Dua Puluh\nDua" - "Dua Puluh\nTiga" - "Dua Puluh\nEmpat" - "Dua Puluh\nLima" - "Dua Puluh\nEnam" - "Dua Puluh\nTujuh" - "Dua Puluh\nLapan" - "Dua Puluh\nSembilan" - "Tiga puluh" - "Tiga Puluh\nSatu" - "Tiga Puluh\nDua" - "Tiga Puluh\nTiga" - "Tiga Puluh\nEmpat" - "Tiga Puluh\nLima" - "Tiga Puluh\nEnam" - "Tiga Puluh\nTujuh" - "Tiga Puluh\nLapan" - "Tiga Puluh\nSembilan" - "Empat Puluh" - "Empat Puluh\nSatu" - "Empat Puluh\nDua" - "Empat Puluh\nTiga" - "Empat Puluh\nEmpat" - "Empat Puluh\nLima" - "Empat Puluh\nEnam" - "Empat Puluh\nTujuh" - "Empat Puluh\nLapan" - "Empat Puluh\nSmbln" - "Lima puluh" - "Lima Puluh\nSatu" - "Lima Puluh\nDua" - "Lima Puluh\nTiga" - "Lima Puluh\nEmpat" - "Lima Puluh\nLima" - "Lima Puluh\nEnam" - "Lima Puluh\nTujuh" - "Lima Puluh\nLapan" - "Lima Puluh\nSembln" - diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml index 0fe308573b5..f834c35023d 100644 --- a/packages/SystemUI/res-keyguard/values-my/strings.xml +++ b/packages/SystemUI/res-keyguard/values-my/strings.xml @@ -151,84 +151,4 @@ ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် %d ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။ ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် %d ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။ - - ""၎င်းသည်"\n"^1\n^2 ဖြစ်သည် - ""၎င်းသည်"\n"^1\n^2 ဖြစ်သည် - - - "ဆယ့်နှစ်" - "တစ်" - "နှစ်" - "သုံး" - "လေး" - "ငါး" - "ခြောက်" - "ခုနစ်" - "ရှစ်" - "ကိုး" - "တစ်ဆယ်" - "ဆယ့်တစ်" - - - "နာရီ" - "တစ်" - "နှစ်" - "သုံး" - "လေး" - "ငါး" - "ခြောက်" - "ခုနစ်" - "ရှစ်" - "ကိုး" - "တစ်ဆယ်" - "တစ်ဆယ့်တစ်" - "တစ်ဆယ့်နှစ်" - "တစ်ဆယ့်သုံး" - "တစ်ဆယ့်လေး" - "တစ်ဆယ့်ငါး" - "တစ်ဆယ့်ခြောက်" - "တစ်ဆယ့်ခုနစ်" - "တစ်ဆယ့်ရှစ်" - "တစ်ဆယ့်ကိုး" - "နှစ်ဆယ်" - "နှစ်ဆယ့်\nတစ်" - "နှစ်ဆယ့်\nနှစ်" - "နှစ်ဆယ့်\nသုံး" - "နှစ်ဆယ့်\nလေး" - "နှစ်ဆယ့်\nငါး" - "နှစ်ဆယ့်\nခြောက်" - "နှစ်ဆယ့်\nခုနစ်" - "နှစ်ဆယ့်\nရှစ်" - "နှစ်ဆယ့်\nကိုး" - "သုံးဆယ်" - "သုံးဆယ့်\nတစ်" - "သုံးဆယ့်\nနှစ်" - "သုံးဆယ့်\nသုံး" - "သုံးဆယ့်\nလေး" - "သုံးဆယ့်\nငါး" - "သုံးဆယ့်\nခြောက်" - "သုံးဆယ့်\nခုနစ်" - "သုံးဆယ့်\nရှစ်" - "သုံးဆယ့်\nကိုး" - "လေးဆယ်" - "လေးဆယ့်\nတစ်" - "လေးဆယ့်\nနှစ်" - "လေးဆယ့်\nသုံး" - "လေးဆယ့်\nလေး" - "လေးဆယ့်\nငါး" - "လေးဆယ့်\nခြောက်" - "လေးဆယ့်\nခုနစ်" - "လေးဆယ့်\nရှစ်" - "လေးဆယ့်\nကိုး" - "ငါးဆယ်" - "ငါးဆယ့်\nတစ်" - "ငါးဆယ့်\nနှစ်" - "ငါးဆယ့်\nသုံး" - "ငါးဆယ့်\nလေး" - "ငါးဆယ့်\nငါး" - "ငါးဆယ့်\nခြောက်" - "ငါးဆယ့်\nခုနစ်" - "ငါးဆယ့်\nရှစ်" - "ငါးဆယ့်\nကိုး" - diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml index 01ba2358e56..711478d0a58 100644 --- a/packages/SystemUI/res-keyguard/values-nb/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml @@ -151,84 +151,4 @@ SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har %d forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer. SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har %d forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer. - - ""Klokken er"\n"^1\n^2 - ""Klokken er"\n"^1\n^2 - - - "Tolv" - "Ett" - "To" - "Tre" - "Fire" - "Fem" - "Seks" - "Sju" - "Åtte" - "Ni" - "Ti" - "Elleve" - - - "null-null" - "En" - "To" - "Tre" - "Fire" - "Fem" - "Seks" - "Sju" - "Åtte" - "Ni" - "Ti" - "Elleve" - "Tolv" - "Tretten" - "Fjorten" - "Femten" - "Seksten" - "Sytten" - "Atten" - "Nitten" - "Tjue" - "Tjue\nen" - "Tjue\nto" - "Tjue\ntre" - "Tjue\nfire" - "Tjue\nfem" - "Tjue\nseks" - "Tjue\nsju" - "Tjue\nåtte" - "Tjue\nni" - "Tretti" - "Tretti\nen" - "Tretti\nto" - "Tretti\ntre" - "Tretti\nfire" - "Tretti\nfem" - "Tretti\nseks" - "Tretti\nsju" - "Tretti\nåtte" - "Tretti\nni" - "Førti" - "Førti\nen" - "Førti\nto" - "Førti\ntre" - "Førti\nfire" - "Førti\nfem" - "Førti\nseks" - "Førti\nsju" - "Førti\nåtte" - "Førti\nni" - "Femti" - "Femti\nen" - "Femti\nto" - "Femti\ntre" - "Femti\nfire" - "Femti\nfem" - "Femti\nseks" - "Femti\nsju" - "Femti\nåtte" - "Femti\nni" - diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index 3f99a380142..ae45eb5044f 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -151,84 +151,4 @@ SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग %d प्रयासहरू बाँकी छन्, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्। SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग %d प्रयास बाँकी छ, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्। - - ""यो"\n"^१\n^२ हो - ""यो"\n"^१\n^२ हो - - - "बाह्र" - "एक" - "दुई" - "तीन" - "चार" - "पाँच" - "छ" - "सात" - "आठ" - "नौ" - "दस" - "एघार" - - - "बज्यो" - "बजेर एक मिनेट" - "बजेर दुई मिनेट" - "बजेर तीन मिनेट" - "बजेर चार मिनेट" - "बजेर पाँच मिनेट" - "बजेर छ मिनेट" - "बजेर सात मिनेट" - "बजेर आठ मिनेट" - "बजेर ९ मिनेट" - "दस" - "एघार" - "बाह्र" - "तेह्र" - "चौध" - "पन्ध्र" - "सोह्र" - "सत्र" - "अठार" - "उन्नाइस" - "बिस" - "एक्काइस\n" - "बाइस\n" - "तेइस\n" - "चौबिस\n" - "पच्चिस\n" - "छब्बिस\n" - "सत्ताइस\n" - "अट्ठाइस\n" - "उनन्तिस\n" - "तिस" - "एकतिस\n" - "बत्तिस\n" - "तेत्तिस\n" - "चौतिस\n" - "पैँतिस\n" - "छत्तिस\n" - "सैँतिस\n" - "अड्तिस\n" - "उनन्चालिस\n" - "चालिस" - "एकचालिस\n" - "बयालिस\n" - "त्रिचालिस\n" - "चवालिस\n" - "पैँतालिस\n" - "छयालिस\n" - "सड्चालिस\n" - "अड्चालिस\n" - "उनन्चास\n" - "पचास" - "एकाउन्न\n" - "बाउन्न\n" - "त्रिपन्न\n" - "चवन्न\n" - "पचपन्न\n" - "छपन्न\n" - "सन्ताउन्न\n" - "अन्ठाउन्न\n" - "उनन्साठी\n" - diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index 16407d72964..fd80a6c5048 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -151,84 +151,4 @@ De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog %d pogingen over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie. De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog %d poging over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie. - - ""Het is"\n"^1\n^2 - ""Het is"\n"^1\n^2 - - - "Twaalf" - "Eén" - "Twee" - "Drie" - "Vier" - "Vijf" - "Zes" - "Zeven" - "Acht" - "Negen" - "Tien" - "Elf" - - - "uur" - "Nul één" - "Nul twee" - "Nul drie" - "Nul vier" - "Nul vijf" - "Nul zes" - "Nul zeven" - "Nul acht" - "Nul negen" - "Tien" - "Elf" - "Twaalf" - "Dertien" - "Veertien" - "Vijftien" - "Zestien" - "Zeventien" - "Achttien" - "Negentien" - "Twintig" - "Eénentwintig\n" - "Tweeëntwintig\n" - "Drieëntwintig\n" - "Vierentwintig\n" - "Vijfentwintig\n" - "Zesentwintig\n" - "Zevenentwintig\n" - "Achtentwintig\n" - "Negenentwintig\n" - "Dertig" - "Eénendertig\n" - "Tweeëndertig\n" - "Drieëndertig\n" - "Vierendertig\n" - "Vijfendertig\n" - "Zesendertig\n" - "Zevenendertig\n" - "Achtendertig\n" - "Negenendertig\n" - "Veertig" - "Eenenveertig\n" - "Tweeënveertig\n" - "Drieënveertig\n" - "Vierenveertig\n" - "Vijfenveertig\n" - "Zesenveertig\n" - "Zevenenveertig\n" - "Achtenveertig\n" - "Negenenveertig\n" - "Vijftig" - "Eenenvijftig\n" - "Tweeënvijftig\n" - "Drieënvijftig\n" - "Vierenvijftig\n" - "Vijfenvijftig\n" - "Zesenvijftig\n" - "Zevenenvijftig\n" - "Achtenvijftig\n" - "Negenenvijftig\n" - diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml index 671069e9371..94afe6835ee 100644 --- a/packages/SystemUI/res-keyguard/values-or/strings.xml +++ b/packages/SystemUI/res-keyguard/values-or/strings.xml @@ -151,84 +151,4 @@ SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍‍ ଲେଖନ୍ତୁ। ଆଉ %d ଥର ଭୁଲ କୋଡ୍‍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍‌ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ। SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍‍ ଲେଖନ୍ତୁ। ଆଉ %d ଥର ଭୁଲ କୋଡ୍‍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍‌ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ। - - ""ଏହାର"\n"^1\n^2 - ""ଏହାର"\n"^1\n^2 - - - "ବାର" - "ଏକ" - "ଦୁଇ" - "ତିନି" - "ଚାରି" - "ପାଞ୍ଚ" - "ଛଅ" - "ସାତ" - "ଆଠ" - "ନଅ" - "ଦଶ" - "ଏଗାର" - - - "ଘଣ୍ଟା" - "ଏକ" - "ଦୁଇ" - "ତିନି" - "ଚାରି" - "ପାଞ୍ଚ" - "ଛଅ" - "ସାତ" - "ଆଠ" - "ନଅ" - "ଦଶ" - "ଏଗାର" - "ବାର" - "ତେର" - "ଚଉଦ" - "ପନ୍ଦର" - "ଷୋହଳ" - "ସତର" - "ଅଠର" - "ଉଣେଇଶି" - "କୋଡି଼ଏ" - "ଏକୋଇଶି\n" - "ବାଇଶି\n" - "ତେଇଶି\n" - "ଚବିଶି\n" - "ପଚିଶି\n" - "ଛବିଶି\n" - "ସତାଇଶି\n" - "ଅଠାଇଶି\n" - "ଅଣତିରିଶି\n" - "ତିରିଶି" - "ଏକତିରିଶି\n" - "ବତିଶି\n" - "ତେତିଶି\n" - "ଚଉତିରିଶି\n" - "ପଞ୍ଚତିରିଶି\n" - "ଛତିଶି\n" - "ସଂଇତିରିଶି\n" - "ଅଠତିରିଶ\n" - "ଅଣଚାଳିଶି\n" - "ଚାଳିଶି" - "ଏକଚାଳିଶି\n" - "ବୟାଳିଶି\n" - "ତେୟାଳିଶି\n" - "ଚଉରାଳିଶି\n" - "ପଞ୍ଚଚାଳିଶି\n" - "ଛୟାଳିଶି\n" - "ସତଚାଳିଶି\n" - "ଅଠଚାଳିଶି\n" - "ଅଣଚାଶ\n" - "ପଚାଶ" - "ଏକାବନ\n" - "ବାଉନ\n" - "ତେପନ\n" - "ଚଉରାଳିଶି\n" - "ପଞ୍ଚାବନ\n" - "ଛପନ\n" - "ସତାବନ\n" - "ଅଠାବନ\n" - "ଅଣଷଠି\n" - diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index a9a43d4d1a5..d9fada78a40 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -151,84 +151,4 @@ ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ %d ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ। ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ %d ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ। - - ""ਸਮਾਂ"\n"^1\n^2 - ""ਸਮਾਂ"\n"^1\n^2 - - - "ਬਾਰਾਂ" - "ਇੱਕ" - "ਦੋ" - "ਤਿੰਨ" - "ਚਾਰ" - "ਪੰਜ" - "ਛੇ" - "ਸੱਤ" - "ਅੱਠ" - "ਨੌ" - "ਦਸ" - "ਗਿਆਰਾਂ" - - - "ਵਜੇ" - "ਓਹੋ ਇੱਕ" - "ਓਹੋ ਦੋ" - "ਓਹੋ ਤਿੰਨ" - "ਓਹੋ ਚਾਰ" - "ਓਹੋ ਪੰਜ" - "ਓਹੋ ਛੇ" - "ਓਹੋ ਸੱਤ" - "ਓਹੋ ਅੱਠ" - "ਓਹੋ ਨੌਂ" - "ਦਸ" - "ਗਿਆਰਾਂ" - "ਬਾਰਾਂ" - "ਤੇਰਾਂ" - "ਚੌਦਾਂ" - "ਪੰਦਰਾਂ" - "ਸੋਲਾਂ" - "ਸਤਾਰਾਂ" - "ਅਠਾਰਾਂ" - "ਉੱਨੀ" - "ਵੀਹ" - "ਵੀਹ\nਇੱਕ" - "ਵੀਹ\nਦੋ" - "ਵੀਹ\nਤਿੰਨ" - "ਵੀਹ\nਚਾਰ" - "ਵੀਹ\nਪੰਜ" - "ਵੀਹ\nਛੇ" - "ਵੀਹ\nਸੱਤ" - "ਵੀਹ\nਅੱਠ" - "ਵੀਹ\nਨੌ" - "ਤੀਹ" - "ਤੀਹ\nਇੱਕ" - "ਤੀਹ\nਦੋ" - "ਤੀਹ\nਤਿੰਨ" - "ਤੀਹ\nਚਾਰ" - "ਤੀਹ\nਪੰਜ" - "ਤੀਹ\nਛੇ" - "ਤੀਹ\nਸੱਤ" - "ਤੀਹ\nਅੱਠ" - "ਤੀਹ\nਨੌ" - "ਚਾਲੀ" - "ਚਾਲੀ\nਇੱਕ" - "ਚਾਲੀ\nਦੋ" - "ਚਾਲੀ\nਤਿੰਨ" - "ਚਾਲੀ\nਚਾਰ" - "ਚਾਲੀ\nਪੰਜ" - "ਚਾਲੀ\nਛੇ" - "ਚਾਲੀ\nਸੱਤ" - "ਚਾਲੀ\nਅੱਠ" - "ਚਾਲੀ\nਨੌ" - "ਪੰਜਾਹ" - "ਪੰਜਾਹ\nਇੱਕ" - "ਪੰਜਾਹ\nਦੋ" - "ਪੰਜਾਹ\nਤਿੰਨ" - "ਪੰਜਾਹ\nਚਾਰ" - "ਪੰਜਾਹ\nਪੰਜ" - "ਪੰਜਾਹ\nਛੇ" - "ਪੰਜਾਹ\nਸੱਤ" - "ਪੰਜਾਹ\nਅੱਠ" - "ਪੰਜਾਹ\nਨੌ" - diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index 517ee3d196f..8e9a9948dcf 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -167,86 +167,4 @@ Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze %d próby, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem. Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze %d próbę, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem. - - ""Jest"\n"^1\n^2 - ""Jest"\n"^1\n^2 - ""Jest"\n"^1\n^2 - ""Jest"\n"^1\n^2 - - - "Dwanaście" - "Jeden" - "Dwa" - "Trzy" - "Cztery" - "Pięć" - "Sześć" - "Siedem" - "Osiem" - "Dziewięć" - "Dziesięć" - "Jedenaście" - - - "Zero zero" - "Zero jeden" - "Zero dwa" - "Zero trzy" - "Zero cztery" - "Zero pięć" - "Zero sześć" - "Zero siedem" - "Zero osiem" - "Zero dziewięć" - "Dziesięć" - "Jedenaście" - "Dwanaście" - "Trzynaście" - "Czternaście" - "Piętnaście" - "Szesnaście" - "Siedemnaście" - "Osiemnaście" - "Dziewiętnaście" - "Dwadzieścia" - "Dwadzieścia\njeden" - "Dwadzieścia\ndwa" - "Dwadzieścia\ntrzy" - "Dwadzieścia\ncztery" - "Dwadzieścia\npięć" - "Dwadzieścia\nsześć" - "Dwadzieścia\nsiedem" - "Dwadzieścia\nosiem" - "Dwadzieścia\ndziewięć" - "Trzydzieści" - "Trzydzieści\njeden" - "Trzydzieści\ndwa" - "Trzydzieści\ntrzy" - "Trzydzieści\ncztery" - "Trzydzieści\npięć" - "Trzydzieści\nsześć" - "Trzydzieści\nsiedem" - "Trzydzieści\nosiem" - "Trzydzieści\ndziewięć" - "Czterdzieści" - "Czterdzieści\njeden" - "Czterdzieści\ndwa" - "Czterdzieści\ntrzy" - "Czterdzieści\ncztery" - "Czterdzieści\npięć" - "Czterdzieści\nsześć" - "Czterdzieści\nsiedem" - "Czterdzieści\nosiem" - "Czterdzieści\ndziewięć" - "Pięćdziesiąt" - "Pięćdziesiąt\njeden" - "Pięćdziesiąt\ndwa" - "Pięćdziesiąt\ntrzy" - "Pięćdziesiąt\ncztery" - "Pięćdziesiąt\npięć" - "Pięćdziesiąt\nsześć" - "Pięćdziesiąt\nsiedem" - "Pięćdziesiąt\nosiem." - "Pięćdziesiąt\ndziewięć" - diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index 9ee2011543c..48fb04f6f77 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -151,84 +151,4 @@ O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. - - ""É"\n"^1\ne ^2 - ""São"\n"^1\ne ^2 - - - "Doze" - "Uma" - "Duas" - "Três" - "Quatro" - "Cinco" - "Seis" - "Sete" - "Oito" - "Nove" - "Dez" - "Onze" - - - "Em ponto" - "Um" - "Dois" - "Três" - "Quatro" - "Cinco" - "Seis" - "Sete" - "Oito" - "Nove" - "Dez" - "Onze" - "Doze" - "Treze" - "Catorze" - "Quinze" - "Dezesseis" - "Dezessete" - "Dezoito" - "Dezenove" - "Vinte" - "Vinte\ne um" - "Vinte\ne dois" - "Vinte\ne três" - "Vinte\ne quatro" - "Vinte\ne cinco" - "Vinte\ne seis" - "Vinte\ne sete" - "Vinte\ne oito" - "Vinte\ne nove" - "Trinta" - "Trinta\ne um" - "Trinta\ne dois" - "Trinta\ne três" - "Trinta\ne quatro" - "Trinta\ne cinco" - "Trinta\ne seis" - "Trinta\ne sete" - "Trinta\ne oito" - "Trinta\ne nove" - "Quarenta" - "Quarenta\ne um" - "Quarenta\ne dois" - "Quarenta\ne três" - "Quarenta\ne quatro" - "Quarenta\ne cinco" - "Quarenta\ne seis" - "Quarenta\ne sete" - "Quarenta\ne oito" - "Quarenta\ne nove" - "Cinquenta" - "Cinquenta\ne um" - "Cinquenta\ne dois" - "Cinquenta\ne três" - "Cinquenta\ne quatro" - "Cinquenta\ne cinco" - "Cinquenta\ne seis" - "Cinquenta\ne sete" - "Cinquenta\ne oito" - "Cinquenta\ne nove" - diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index fa68a54877e..e1d2b4a4874 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -151,84 +151,4 @@ O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais %d tentativas antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes. O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais %d tentativa antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes. - - ""São"\n"^1\n^2 - ""São"\n"^1\n^2 - - - "Doze" - "Google One" - "Duas" - "Três" - "Quatro" - "Cinco" - "Seis" - "Sete" - "Oito" - "Nove" - "Dez" - "Onze" - - - - "Zero, um" - "Zero, dois" - "Zero, três" - "Zero, quatro" - "Zero, cinco" - "Zero, seis" - "Zero, sete" - "Zero, oito" - "Zero, nove" - "Dez" - "Onze" - "Doze" - "Treze" - "Catorze" - "Quinze" - "Dezasseis" - "Dezassete" - "Dezoito" - "Dezanove" - "Vinte" - "Vinte\ne um" - "Vinte\ne dois" - "Vinte\ne três" - "Vinte\ne quatro" - "Vinte\ne cinco" - "Vinte\ne seis" - "Vinte\ne sete" - "Vinte\ne oito" - "Vinte\ne nove" - "Trinta" - "Trinta\ne um" - "Trinta\ne dois" - "Trinta\ne três" - "Trinta\ne quatro" - "Trinta\ne cinco" - "Trinta\ne seis" - "Trinta\ne sete" - "Trinta\ne oito" - "Trinta\ne nove" - "Quarenta" - "Quarenta\ne um" - "Quarenta\ne dois" - "Quarenta\ne três" - "Quarenta\ne quatro" - "Quarenta\ne cinco" - "Quarenta\ne seis" - "Quarenta\ne sete" - "Quarenta\ne oito" - "Quarenta\ne nove" - "Cinquenta" - "Cinquenta\ne um" - "Cinquenta\ne dois" - "Cinquenta\ne três" - "Cinquenta\ne quatro" - "Cinquenta\ne cinco" - "Cinquenta\ne seis" - "Cinquenta\ne sete" - "Cinquenta\ne oito" - "Cinquenta\ne nove" - diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index 9ee2011543c..48fb04f6f77 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -151,84 +151,4 @@ O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. - - ""É"\n"^1\ne ^2 - ""São"\n"^1\ne ^2 - - - "Doze" - "Uma" - "Duas" - "Três" - "Quatro" - "Cinco" - "Seis" - "Sete" - "Oito" - "Nove" - "Dez" - "Onze" - - - "Em ponto" - "Um" - "Dois" - "Três" - "Quatro" - "Cinco" - "Seis" - "Sete" - "Oito" - "Nove" - "Dez" - "Onze" - "Doze" - "Treze" - "Catorze" - "Quinze" - "Dezesseis" - "Dezessete" - "Dezoito" - "Dezenove" - "Vinte" - "Vinte\ne um" - "Vinte\ne dois" - "Vinte\ne três" - "Vinte\ne quatro" - "Vinte\ne cinco" - "Vinte\ne seis" - "Vinte\ne sete" - "Vinte\ne oito" - "Vinte\ne nove" - "Trinta" - "Trinta\ne um" - "Trinta\ne dois" - "Trinta\ne três" - "Trinta\ne quatro" - "Trinta\ne cinco" - "Trinta\ne seis" - "Trinta\ne sete" - "Trinta\ne oito" - "Trinta\ne nove" - "Quarenta" - "Quarenta\ne um" - "Quarenta\ne dois" - "Quarenta\ne três" - "Quarenta\ne quatro" - "Quarenta\ne cinco" - "Quarenta\ne seis" - "Quarenta\ne sete" - "Quarenta\ne oito" - "Quarenta\ne nove" - "Cinquenta" - "Cinquenta\ne um" - "Cinquenta\ne dois" - "Cinquenta\ne três" - "Cinquenta\ne quatro" - "Cinquenta\ne cinco" - "Cinquenta\ne seis" - "Cinquenta\ne sete" - "Cinquenta\ne oito" - "Cinquenta\ne nove" - diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index 4ff1a9a0250..7a9d51ae709 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -159,85 +159,4 @@ Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas %d de încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii. Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-a mai rămas %d încercare până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii. - - ""Este"\n"^1\n^2 - ""Este"\n"^1\n^2 - ""Este"\n"^1\n^2 - - - "Douăsprezece" - "Unu" - "Două" - "Trei" - "Patru" - "Cinci" - "Șase" - "Șapte" - "Opt" - "Nouă" - "Zece" - "Unsprezece" - - - "." - "Ora unu" - "Ora două" - "Ora trei" - "Ora patru" - "Ora cinci" - "Ora șase" - "Ora șapte" - "Ora opt" - "Ora nouă" - "Zece" - "Unsprezece" - "Douăsprezece" - "Treisprezece" - "Paisprezece" - "Cincisprezece" - "Șaisprezece" - "Șaptesprezece" - "Optsprezece" - "Nouăsprezece" - "Douăzeci" - "Douăzeci\nși unu" - "Douăzeci\nși doi" - "Douăzeci\nși trei" - "Douăzeci\nși patru" - "Douăzeci\nși cinci" - "Douăzeci\nși șase" - "Douăzeci\nși șapte" - "Douăzeci\nși opt" - "Douăzeci\nși nouă" - "Treizeci" - "Treizeci\nși unu" - "Treizeci\nși două" - "Treizeci\nși trei" - "Treizeci\nși patru" - "Treizeci\nși cinci" - "Treizeci\nși șase" - "Treizeci\nși șapte" - "Treizeci\nși opt" - "Treizeci\nși nouă" - "Patruzeci" - "Patruzeci\nși unu" - "Patruzeci\nși două" - "Patruzeci\nși trei" - "Patruzeci\nși patru" - "Patruzeci\nși cinci" - "Patruzeci\nși șase" - "Patruzeci\nși șapte" - "Patruzeci\nși opt" - "Patruzeci\nși nouă" - "Cincizeci" - "Cincizeci\nși unu" - "Cincizeci\nși doi" - "Cincizeci\nși trei" - "Cincizeci\nși patru" - "Cincizeci\nși cinci" - "Cincizeci\nși șase" - "Cincizeci\nși șapte" - "Cincizeci\nși opt" - "Cincizeci\nși nouă" - diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml index 8ce71fc20ad..85347196270 100644 --- a/packages/SystemUI/res-keyguard/values-ru/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml @@ -167,86 +167,4 @@ SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось %d попыток. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи. SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось %d попытки. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи. - - ""Сейчас"\n"^1\n^2 - ""Сейчас"\n"^1\n^2 - ""Сейчас"\n"^1\n^2 - ""Сейчас"\n"^1\n^2 - - - "двенадцать" - "один" - "два" - "три" - "четыре" - "пять" - "шесть" - "семь" - "восемь" - "девять" - "десять" - "одиннадцать" - - - "ровно" - "Ноль одна" - "Ноль две" - "Ноль три" - "Ноль четыре" - "Ноль пять" - "Ноль шесть" - "Ноль семь" - "Ноль восемь" - "Ноль девять" - "десять" - "одиннадцать" - "двенадцать" - "тринадцать" - "четырнадцать" - "пятнадцать" - "шестнадцать" - "семнадцать" - "восемнадцать" - "девятнадцать" - "двадцать" - "двадцать\nодна" - "двадцать\nдве" - "двадцать\nтри" - "двадцать\nчетыре" - "двадцать\nпять" - "двадцать\nшесть" - "двадцать\nсемь" - "двадцать\nвосемь" - "двадцать\nдевять" - "тридцать" - "тридцать\nодна" - "тридцать\nдве" - "тридцать\nтри" - "тридцать\nчетыре" - "тридцать\nпять" - "тридцать\nшесть" - "тридцать\nсемь" - "тридцать\nвосемь" - "тридцать\nдевять" - "сорок" - "сорок\nодна" - "сорок\nдве" - "сорок\nтри" - "сорок\nчетыре" - "сорок\nпять" - "сорок\nшесть" - "cорок\nсемь" - "сорок\nвосемь" - "сорок\nдевять" - "пятьдесят" - "пятьдесят\nодна" - "пятьдесят\nдве" - "пятьдесят\nтри" - "пятьдесят\nчетыре" - "пятьдесят\nпять" - "пятьдесят\nшесть" - "пятьдесят\nсемь" - "пятьдесят\nвосемь" - "пятьдесят\nдевять" - diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml index 566eb57e741..849ff30a2bb 100644 --- a/packages/SystemUI/res-keyguard/values-si/strings.xml +++ b/packages/SystemUI/res-keyguard/values-si/strings.xml @@ -151,84 +151,4 @@ SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් %dක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න. SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් %dක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න. - - ""එය"\n"^1\n^2 යි - ""එය"\n"^1\n^2 යි - - - "දොළහ" - "එක" - "දෙක" - "තුන" - "හතර" - "පහ" - "හය" - "හත" - "අට" - "නවය" - "දහය" - "එකොළහ" - - - "පැය" - "බින්දුවයි එක" - "බින්දුවයි දෙක" - "බින්දුවයි තුන" - "බින්දුවයි හතර" - "බින්දුවයි පහ" - "බින්දුවයි හය" - "බින්දුවයි හත" - "බින්දුවයි අට" - "බින්දුවයි නවය" - "දහය" - "එකොළහ" - "දොළහ" - "දහතුන" - "දහහතර" - "පහළොව" - "දහසය" - "දහහත" - "දහඅට" - "දහනවය" - "විස්ස" - "විසි\nඑක" - "විසි\nදෙක" - "විසි\nතුනයි" - "විසි\nහතර" - "විසි\nපහ" - "විසි\nහය" - "විසි\nහත" - "විසි\nඅට" - "විසි\nනවය" - "තිහ" - "තිස්\nඑක" - "තිස්\nදෙක" - "තිස්\nතුන" - "තිස්\nහතර" - "තිස්\nපහ" - "තිස්\nහය" - "තිස්\nහත" - "තිස්\nඅට" - "තිස්\nනවය" - "හතළිහ" - "හතළිස්\nඑක" - "හතළිස්\nදෙක" - "හතළිස්\nතුන" - "හතළිස්\nහතර" - "හතළිස්\nපහ" - "හතළිස්\nහය" - "හතළිස්\nහත" - "හතළිස්\nඅට" - "හතළිස්\nනවය" - "පනහ" - "පනස්\nඑක" - "පනස්\nදෙක" - "පනස්\nතුන" - "පනස්\nහතර" - "පනස්\nපහ" - "පනස\nහය" - "පනස්\nහත" - "පනස්\nඅට" - "පනස්\nනවය" - diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml index 025ecc5514d..c9222511cfc 100644 --- a/packages/SystemUI/res-keyguard/values-sk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml @@ -167,86 +167,4 @@ SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám %d pokusov, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor. SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám %d pokus, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor. - - ""Je"\n"^1\n^2 - ""Je"\n"^1\n^2 - ""Je"\n"^1\n^2 - ""Je"\n"^1\n^2 - - - "Dvanásť" - "Jedna" - "Dve" - "Tri" - "Štyri" - "Päť" - "Šesť" - "Sedem" - "Osem" - "Deväť" - "Desať" - "Jedenásť" - - - "hod." - "Nula jeden" - "Nula dva" - "Nula tri" - "Nula štyri" - "Nula päť" - "Nula šesť" - "Nula sedem" - "Nula osem" - "Nula deväť" - "Desať" - "Jedenásť" - "Dvanásť" - "Trinásť" - "Štrnásť" - "Päťnásť" - "Šesťnásť" - "Sedemnásť" - "Osemnásť" - "Deväťnásť" - "Dvadsať" - "Dvadsaťjeden\n" - "Dvadsaťdva\n" - "Dvadsaťtri\n" - "Dvadsaťštyri\n" - "Dvadsaťpäť\n" - "Dvadsaťšesť\n" - "Dvadsaťsedem\n" - "Dvadsaťosem\n" - "Dvadsaťdeväť\n" - "Tridsať" - "Tridsaťjeden\n" - "Tridsaťdva\n" - "Tridsaťtri\n" - "Tridsaťštyri\n" - "Tridsaťpäť\n" - "Tridsaťšesť\n" - "Tridsaťsedem\n" - "Tridsaťosem\n" - "Tridsaťdeväť\n" - "Štyridsať" - "Štyridsaťjeden\n" - "Štyridsaťdva\n" - "Štyridsaťtri\n" - "Štyridsaťštyri\n" - "Štyridsaťpäť\n" - "Štyridsaťšesť\n" - "Štyridsaťsedem\n" - "Štyridsaťosem\n" - "Štyridsaťdeväť\n" - "Päťdesiať" - "Päťdesiatjeden\n" - "Päťdesiatdva\n" - "Päťdesiattri\n" - "Päťdesiatštyri\n" - "Päťdesiaťpäť\n" - "Päťdesiatšesť\n" - "Päťdesiatsedem\n" - "Päťdesiatosem\n" - "Päťdesiatdeväť\n" - diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index 6fc5c332832..2b3afe292e0 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -167,86 +167,4 @@ Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še %d poskuse. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja. Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še %d poskusov. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja. - - ""Ura je"\n"^1\n^2 - ""Ura je"\n"^1\n^2 - ""Ura je"\n"^1\n^2 - ""Ura je"\n"^1\n^2 - - - "Dvanajst" - "Ena" - "Dve" - "Tri" - "Štiri" - "Pet" - "Šest" - "Sedem" - "Osem" - "Devet" - "Deset" - "Enajst" - - - - "ena" - "dve" - "tri" - "štiri" - "pet" - "šest" - "sedem" - "osem" - "devet" - "Deset" - "Enajst" - "Dvanajst" - "Trinajst" - "Štirinajst" - "Petnajst" - "Šestnajst" - "Sedemnajst" - "Osemnajst" - "Devetnajst" - "Dvajset" - "Enaindvajset\n" - "Dvaindvajset\n" - "Triindvajset\n" - "Štiriindvajset\n" - "Petindvajset\n" - "Šestindvajset\n" - "Sedemindvajset\n" - "Osemindvajset\n" - "Devetindvajset\n" - "Trideset" - "Enaintrideset\n" - "Dvaintrideset\n" - "Triintrideset\n" - "Štiriintrideset\n" - "Petintrideset\n" - "Šestintrideset\n" - "Sedemintrideset\n" - "Osemintrideset\n" - "Devetintrideset\n" - "Štirideset" - "Enainštirideset\n" - "Dvainštirideset\n" - "Triinštirideset\n" - "Štiriinštirides.\n" - "Petinštirideset\n" - "Šestinštirideset\n" - "Sedeminštirides.\n" - "Oseminštirideset\n" - "Devetinštirides.\n" - "Petdeset" - "Enainpetdeset\n" - "Dvainpetdeset\n" - "Triinpetdeset\n" - "Štiriinpetdeset\n" - "Petinpetdeset\n" - "Šestinpetdeset\n" - "Sedeminpetdeset\n" - "Oseminpetdeset\n" - "Devetinpetdeset\n" - diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml index 3bd33bd232c..da9a04862e0 100644 --- a/packages/SystemUI/res-keyguard/values-sq/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml @@ -151,84 +151,4 @@ Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të kanë mbetur edhe %d përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje. Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të ka mbetur edhe %d përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje. - - ""Ora është"\n"^1\n^2 - ""Ora është"\n"^1\n^2 - - - "Dymbëdhjetë" - "Një" - "Dy" - "Tre" - "Katër" - "Pesë" - "Gjashtë" - "Shtatë" - "Tetë" - "Nëntë" - "Dhjetë" - "Njëmbëdhjetë" - - - "Fiks" - "e një" - "e dy" - "e tre" - "e katër" - "e pesë" - "e gjashtë" - "e shtatë" - "e tetë" - "e nëntë" - "Dhjetë" - "Njëmbëdhjetë" - "Dymbëdhjetë" - "Trembëdhjetë" - "Katërmbëdhjetë" - "Pesëmbëdhjetë" - "Gjashtëmbëdhjetë" - "Shtatëmbëdhjetë" - "Tetëmbëdhjetë" - "Nëntëmbëdhjetë" - "Njëzet" - "Njëzet\ne një" - "Njëzet\ne dy" - "Njëzet\ne tre" - "Njëzet\ne katër" - "Njëzet\ne pesë" - "Njëzet\ne gjashtë" - "Njëzet\ne shtatë" - "Njëzet\ne tetë" - "Njëzet\ne nëntë" - "Tridhjetë" - "Tridhjetë\ne një" - "Tridhjetë\ne dy" - "Tridhjetë\ne tre" - "Tridhjetë\ne katër" - "Tridhjetë\ne pesë" - "Tridhjetë\ne gjashtë" - "Tridhjetë\ne shtatë" - "Tridhjetë\ne tetë" - "Tridhjetë\ne nëntë" - "Dyzet" - "Dyzet\ne një" - "Dyzet\ne dy" - "Dyzet\ne tre" - "Dyzet\ne katër" - "Dyzet\ne pesë" - "Dyzet\ne gjashtë" - "Dyzet\ne shtatë" - "Dyzet\ne tetë" - "Dyzet\ne nëntë" - "Pesëdhjetë" - "Pesëdhjetë\ne një" - "Pesëdhjetë\ne dy" - "Pesëdhjetë\ne tre" - "Pesëdhjetë\ne katër" - "Pesëdhjetë\ne pesë" - "Pesëdhjetë\ne gjashtë" - "Pesëdhjetë\ne shtatë" - "Pesëdhjetë\ne tetë" - "Pesëdhjetë\ne nëntë" - diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml index 68b768ad438..f069013b966 100644 --- a/packages/SystemUI/res-keyguard/values-sr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml @@ -159,85 +159,4 @@ SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још %d покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера. SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још %d покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера. - - ""Сада је"\n"^1\n^2 - ""Сада је"\n"^1\n^2 - ""Сада је"\n"^1\n^2 - - - "дванаест" - "један" - "два" - "три" - "четири" - "пет" - "шест" - "седам" - "осам" - "девет" - "десет" - "једанаест" - - - "сата(и)" - "један" - "два" - "три" - "четири" - "пет" - "шест" - "седам" - "осам" - "девет" - "десет" - "једанаест" - "дванаест" - "тринаест" - "четрнаест" - "петнаест" - "шеснаест" - "седамнаест" - "осамнаест" - "деветнаест" - "двадесет" - "двадесет\nједан" - "двадесет\nдва" - "двадесет\nтри" - "двадесет\nчетири" - "двадесет\nпет" - "двадесет\nшест" - "двадесет\nседам" - "двадесет\nосам" - "двадесет\nдевет" - "тридесет" - "тридесет\nједан" - "тридесет\nдва" - "тридесет\nтри" - "тридесет\nчетири" - "тридесет\nпет" - "тридесет\nшест" - "тридесет\nседам" - "тридесет\nосам" - "тридесет\nдевет" - "четрдесет" - "четрдесет\nједан" - "четрдесет\nдва" - "четрдесет\nтри" - "четрдесет\nчетири" - "четрдесет\nпет" - "четрдесет\nшест" - "четрдесет\nседам" - "четрдесет\nосам" - "четрдесет\nдевет" - "педесет" - "педесет\nједан" - "педесет\nдва" - "педесет\nтри" - "педесет\nчетири" - "педесет\nпет" - "педесет\nшест" - "педесет\nседам" - "педесет\nосам" - "педесет\nдевет" - diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml index 62f1873fcf4..58da9bbb26b 100644 --- a/packages/SystemUI/res-keyguard/values-sv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml @@ -151,84 +151,4 @@ SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. %d försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information. SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. %d försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information. - - "\n"^1\n^2 - "\n"^1\n^2 - - - "Tolv" - "En" - "Två" - "Tre" - "Fyra" - "Fem" - "Sex" - "Sju" - "Åtta" - "Nio" - "Tio" - "Elva" - - - "Klockan" - "Noll ett" - "Noll två" - "Noll tre" - "Noll fyra" - "Noll fem" - "Noll sex" - "Noll sju" - "Noll åtta" - "Noll nio" - "Tio" - "Elva" - "Tolv" - "Tretton" - "Fjorton" - "Femton" - "Sexton" - "Sjutton" - "Arton" - "Nitton" - "Tjugo" - "Tjugoett\n" - "Tjugotvå\n" - "Tjugotre\n" - "Tjugofyra\n" - "Tjugofem\n" - "Tjugosex\n" - "Tjugosju\n" - "Tjugoåtta\n" - "Tjugonio\n" - "Trettio" - "Trettioett\n" - "Trettiotvå\n" - "Trettiotre\n" - "Trettiofyra\n" - "Trettiofem\n" - "Trettiosex\n" - "Trettiosju\n" - "Trettioåtta\n" - "Trettionio\n" - "Fyrtio" - "Fyrtioett\n" - "Fyrtiotvå\n" - "Fyrtiotre\n" - "Fyrtiofyra\n" - "Fyrtiofem\n" - "Fyrtiosex\n" - "Fyrtiosju\n" - "Fyrtioåtta\n" - "Fyrtionio\n" - "Femtio" - "Femtioett\n" - "Femtiotvå\n" - "Femtiotre\n" - "Femtiofyra\n" - "Femtiofem\n" - "Femtiosex\n" - "Femtiosju\n" - "Femtioåtta\n" - "Femtionio\n" - diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml index 76b40b75736..f948cd2ca77 100644 --- a/packages/SystemUI/res-keyguard/values-sw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml @@ -151,84 +151,4 @@ Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na majaribio %d kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo. Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na jaribio %d kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo. - - ""Ni saa"\n"^1\n^2 - ""Ni saa"\n"^1\n^2 - - - "Sita" - "Saba" - "Nane" - "Tisa" - "Kumi" - "Kumi na moja" - "Kumi na mbili" - "Moja" - "Mbili" - "Tatu" - "Nne" - "Tano" - - - "Kamili" - "Na Dakika Moja" - "Na Dakika Mbili" - "Na Dakika Tatu" - "Na Dakika Nne" - "Na Dakika Tano" - "Na Dakika Sita" - "Na Dakika Saba" - "Na Dakika Nane" - "Na Dakika Tisa" - "Kumi" - "Kumi na Moja" - "Kumi na Mbili" - "Kumi na tatu" - "Kumi na nne" - "Kumi na Tano" - "Kumi na Sita" - "Kumi na Saba" - "Kumi na nane" - "Kumi na tisa" - "Ishirini" - "Ishirini na\nMoja" - "Ishirini na\nMbili" - "Ishirini na\nTatu" - "Ishirini na\nNne" - "Ishirini na \nTano" - "Ishirni na\nSita" - "Ishirini na\nSaba" - "Ishirini na\nNane" - "Ishirini na\nTisa" - "Thelathini" - "Thelathini na\nMoja" - "Thelathini na\nMbili" - "Thelathini na\nTatu" - "Thelathini na\nNne" - "Thelathini na\nTano" - "Thelathini na\nSita" - "Thelathini na\nSaba" - "Thelathini na\nNane" - "Thelathini na\nTisa" - "Arobaini" - "Arobaini na\nMoja" - "Arobaini na\nMbili" - "Arobaini na\nTatu" - "Arobaini na\nNne" - "Arobaini na\nTano" - "Arobaini na\nSita" - "Arobaini na\nSaba" - "Arobaini na\nNane" - "Arobaini na\nTisa" - "Hamsini" - "Hamsini na\nMoja" - "Hamsini na\nMbili" - "Hamsini\nTatu" - "Hamsini na\nNne" - "Hamsini na\nTano" - "Hamsini na\nSita" - "Hamsini na\nSaba" - "Hamsini na\nNane" - "Hamsini na\nTisa" - diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml index d52b6e124c9..e72ffce917e 100644 --- a/packages/SystemUI/res-keyguard/values-ta/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml @@ -56,11 +56,11 @@ "சிம் பின்னுக்கான பகுதி" "சிம் PUKக்கான பகுதி" "அடுத்த அலாரம் %1$sக்கு அமைக்கப்பட்டுள்ளது" - "நீக்கும் பொத்தான்" + "நீக்கும் பட்டன்" "இ-சிம்மை முடக்கும்" "eSIMஐ முடக்க முடியவில்லை" "பிழை ஏற்பட்டதால் eSIMஐ முடக்க முடியவில்லை." - "என்டர் பொத்தான்" + "என்டர் பட்டன்" "பேட்டர்ன் நினைவில்லையா" "தவறான பேட்டர்ன்" "தவறான கடவுச்சொல்" @@ -151,31 +151,4 @@ சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் %d முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும். சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் %d முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும். - - ""மணி இப்போது"\n"^1\n^2 - ""மணி இப்போது"\n"^1\n^2 - - - "பன்னிரண்டு" - "ஒன்று" - "இரண்டு" - "மூன்று" - "நான்கு" - "ஐந்து" - "ஆறு" - "ஏழு" - "எட்டு" - "ஒன்பது" - "பத்து" - "பதினொன்று" - - - - - - - - - - diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index 4c628670dc8..8afb7867c9e 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -151,84 +151,4 @@ SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్‌ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు %d ప్రయత్నాలు మిగిలి ఉన్నాయి. వివరాల కోసం కారియర్‌ను సంప్రదించండి. SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్‌ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు %d ప్రయత్నం మిగిలి ఉంది వివరాల కోసం కారియర్‌ను సంప్రదించండి. - - ""సమయం"\n"^1\n^2 - ""సమయం"\n"^1\n^2 - - - "పన్నెండు" - "ఒకటి" - "రెండు" - "మూడు" - "నాలుగు" - "ఐదు" - "ఆరు" - "ఏడు" - "ఎనిమిది" - "తొమ్మిది" - "పది" - "పదకొండు" - - - "అవుతుంది" - "ఒక నిమిషం" - "రెండు నిమిషాలు" - "మూడు నిమిషాలు" - "నాలుగు నిమిషాలు" - "ఐదు నిమిషాలు" - "ఆరు నిమిషాలు" - "ఏడు నిమిషాలు" - "ఎనిమిది నిమిషాలు" - "తొమ్మిది నిమిషాలు" - "పది" - "పదకొండు" - "పన్నెండు" - "పదమూడు" - "పద్నాలుగు" - "పదిహేను" - "పదహారు" - "పదిహేడు" - "పద్దెనిమిది" - "పంతొమ్మిది" - "ఇరవై" - "ఇరవై\nఒకటి" - "ఇరవై\nరెండు" - "ఇరవై\nమూడు" - "ఇరవై\nనాలుగు" - "ఇరవై\nఐదు" - "ఇరవై\nఆరు" - "ఇరవై\nఏడు" - "ఇరవై\nఎనిమిది" - "ఇరవై\nతొమ్మిది" - "ముప్పై" - "ముప్పై\nఒకటి" - "ముప్పై\nరెండు" - "ముప్పై\nమూడు" - "ముప్పై\nనాలుగు" - "ముప్పై\nఐదు" - "ముప్పై\nఆరు" - "ముప్పై\nఏడు" - "ముప్ఫై\nఎనిమిది" - "ముప్పై\nతొమ్మిది" - "నలభై" - "నలభై\nఒకటి" - "నలభై\nరెండు" - "నలభై\nమూడు" - "నలభై\nనాలుగు" - "నలభై\nఐదు" - "నలభై\nఆరు" - "నలభై\nఏడు" - "నలభై\nఎనిమిది" - "నలభై\nతొమ్మిది" - "యాభై" - "యాభై\nఒకటి" - "యాభై\nరెండు" - "యాభై\nమూడు" - "యాభై\nనాలుగు" - "యాభై\nఐదు" - "యాభై\nఆరు" - "యాభై\nఏడు" - "యాభై\nఎనిమిది" - "యాభై\nతొమ్మిది" - diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml index 6baa8c43cf8..e923ab72359 100644 --- a/packages/SystemUI/res-keyguard/values-th/strings.xml +++ b/packages/SystemUI/res-keyguard/values-th/strings.xml @@ -151,84 +151,4 @@ ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก %d ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก %d ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ - - ""เวลา"\n"^1\n^2 - ""เวลา"\n"^1\n^2 - - - "สิบสอง" - "หนึ่ง" - "สอง" - "สาม" - "สี่" - "ห้า" - "หก" - "เจ็ด" - "แปด" - "เก้า" - "สิบ" - "สิบเอ็ด" - - - "นาฬิกา" - "ศูนย์หนึ่ง" - "ศูนย์สอง" - "ศูนย์สาม" - "ศูนย์สี่" - "ศูนย์ห้า" - "ศูนย์หก" - "ศูนย์เจ็ด" - "ศูนย์แปด" - "ศูนย์เก้า" - "สิบ" - "สิบเอ็ด" - "สิบสอง" - "สิบสาม" - "สิบสี่" - "สิบห้า" - "สิบหก" - "สิบเจ็ด" - "สิบแปด" - "สิบเก้า" - "ยี่สิบ" - "ยี่สิบ\nเอ็ด" - "ยี่สิบ\nสอง" - "ยี่สิบ\nสาม" - "ยี่สิบ\nสี่" - "ยี่สิบ\nห้า" - "ยี่สิบ\nหก" - "ยี่สิบ\nเจ็ด" - "ยี่สิบ\nแปด" - "ยี่สิบ\nเก้า" - "สามสิบ" - "สามสิบ\nเอ็ด" - "สามสิบ\nสอง" - "สามสิบ\nสาม" - "สามสิบ\nสี่" - "สามสิบ\nห้า" - "สามสิบ\nหก" - "สามสิบ\nเจ็ด" - "สามสิบ\nแปด" - "สามสิบ\nเก้า" - "สี่สิบ" - "สี่สิบ\nเอ็ด" - "สี่สิบ\nสอง" - "สี่สิบ\nสาม" - "สี่สิบ\nสี่" - "สี่สิบ\nห้า" - "สี่สิบ\nหก" - "สี่สิบ\nเจ็ด" - "สี่สิบ\nแปด" - "สี่สิบ\nเก้า" - "ห้าสิบ" - "ห้าสิบ\nเอ็ด" - "ห้าสิบ\nสอง" - "ห้าสิบ\nสาม" - "ห้าสิบ\nสี่" - "ห้าสิบ\nห้า" - "ห้าสิบ\nหก" - "ห้าสิบ\nเจ็ด" - "ห้าสิบ\nแปด" - "ห้าสิบ\nเก้า" - diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml index 2e0f218f90c..7fb8cd58b74 100644 --- a/packages/SystemUI/res-keyguard/values-tl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml @@ -151,84 +151,4 @@ Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang %d natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye. Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang %d na natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye. - - ""Ang oras ay"\n"^1\n^2 - ""Ang oras ay"\n"^1\n^2 - - - "Twelve" - "One" - "Two" - "Three" - "Four" - "Five" - "Six" - "Seven" - "Eight" - "Nine" - "Ten" - "Eleven" - - - "O’Clock" - "Oh One" - "Oh Two" - "Oh Three" - "Oh Four" - "Oh Five" - "Oh Six" - "Oh Seven" - "Oh Eight" - "Oh Nine" - "Ten" - "Eleven" - "Twelve" - "Thirteen" - "Fourteen" - "Fifteen" - "Sixteen" - "Seventeen" - "Eighteen" - "Nineteen" - "Twenty" - "Twenty\nOne" - "Twenty\nTwo" - "Twenty\nThree" - "Twenty\nFour" - "Twenty\nFive" - "Twenty\nSix" - "Twenty\nSeven" - "Twenty\nEight" - "Twenty\nNine" - "Thirty" - "Thirty\nOne" - "Thirty\nTwo" - "Thirty\nThree" - "Thirty\nFour" - "Thirty\nFive" - "Thirty\nSix" - "Thirty\nSeven" - "Thirty\nEight" - "Thirty\nNine" - "Forty" - "Forty\nOne" - "Forty\nTwo" - "Forty\nThree" - "Forty\nFour" - "Forty\nFive" - "Forty\nSix" - "Forty\nSeven" - "Forty\nEight" - "Forty\nNine" - "Fifty" - "Fifty\nOne" - "Fifty\nTwo" - "Fifty\nThree" - "Fifty\nFour" - "Fifty\nFive" - "Fifty\nSix" - "Fifty\nSeven" - "Fifty\nEight" - "Fifty\nNine" - diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml index 41a8a0cfe99..8d528b93b3a 100644 --- a/packages/SystemUI/res-keyguard/values-tr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml @@ -151,84 +151,4 @@ SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce %d deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun. SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce %d deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun. - - "" Saat"\n"^1\n^2 - "" Saat"\n"^1\n^2 - - - "On İki" - "Bir" - "İki" - "Üç" - "Dört" - "Beş" - "Altı" - "Yedi" - "Sekiz" - "Dokuz" - "On" - "On Bir" - - - "Saat" - "Bir" - "İki" - "Üç" - "Dört" - "Beş" - "Altı" - "Yedi" - "Sekiz" - "Dokuz" - "On" - "On Bir" - "On İki" - "On Üç" - "On Dört" - "On Beş" - "On Altı" - "On Yedi" - "On Sekiz" - "On Dokuz" - "Yirmi" - "Yirmi\nBir" - "Yirmi\nİki" - "Yirmi\nÜç" - "Yirmi\nDört" - "Yirmi\nBeş" - "Yirmi\nAltı" - "Yirmi\nYedi" - "Yirmi\nSekiz" - "Yirmi\nDokuz" - "Otuz" - "Otuz\nBir" - "Otuz\nİki" - "Otuz\nÜç" - "Otuz\nDört" - "Otuz\nBeş" - "Otuz\nAltı" - "Otuz\nYedi" - "Otuz\nSekiz" - "Otuz\nDokuz" - "Kırk" - "Kırk\nBir" - "Kırk\nİki" - "Kırk\nÜç" - "Kırk\nDört" - "Kırk\nBeş" - "Kırk\nAltı" - "Kırk\nYedi" - "Kırk\nSekiz" - "Kırk\nDokuz" - "Elli" - "Elli\nBir" - "Elli\nİki" - "Elli\nÜç" - "Elli\nDört" - "Elli\nBeş" - "Elli\nAltı" - "Elli\nYedi" - "Elli\nSekiz" - "Elli\nDokuz" - diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml index 1bb1ae2199d..8a58d22aed0 100644 --- a/packages/SystemUI/res-keyguard/values-uk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml @@ -167,86 +167,4 @@ SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося %d спроб. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора. SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося %d спроби. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора. - - ""Зараз"\n"^1\n^2 - ""Зараз"\n"^1\n^2 - ""Зараз"\n"^1\n^2 - ""Зараз"\n"^1\n^2 - - - "дванадцята" - "перша" - "друга" - "третя" - "четверта" - "п’ята" - "шоста" - "сьома" - "восьма" - "дев’ята" - "десята" - "одинадцята" - - - - "нуль одна" - "нуль дві" - "нуль три" - "нуль чотири" - "нуль п’ять" - "нуль шість" - "нуль сім" - "нуль вісім" - "нуль дев’ять" - "десять" - "одинадцять" - "дванадцять" - "тринадцять" - "чотирнадцять" - "п’ятнадцять" - "шістнадцять" - "сімнадцять" - "вісімнадцять" - "дев’ятнадцять" - "двадцять" - "двадцять\nодна" - "двадцять\nдві" - "двадцять\nтри" - "двадцять\nчотири" - "двадцять\nп’ять" - "двадцять\nшість" - "двадцять\nсім" - "двадцять\nвісім" - "двадцять\nдев’ять" - "тридцять" - "тридцять\nодна" - "тридцять\nдві" - "тридцять\nтри" - "тридцять\nчотири" - "тридцять\nп’ять" - "тридцять\nшість" - "тридцять\nсім" - "тридцять\nвісім" - "тридцять\nдев’ять" - "сорок" - "сорок\nодна" - "сорок\nдві" - "сорок\nтри" - "сорок\nчотири" - "сорок\nп’ять" - "сорок\nшість" - "сорок\nсім" - "сорок\nвісім" - "сорок\nдев’ять" - "п’ятдесят" - "п’ятдесят\nодна" - "п’ятдесят\nдві" - "п’ятдесят\nтри" - "п’ятдесят\nчотири" - "п’ятдесят\nп’ять" - "п’ятдесят\nшість" - "п’ятдесят\nсім" - "п’ятдесят\nвісім" - "п’ятдесят\nдев’ять" - diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index a27e8292aa3..e46c02605b2 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -151,31 +151,4 @@ ‏SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس %d کوششیں بچی ہیں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔ ‏SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس %d کوشش بچی ہے۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔ - - ""ابھی"\n"^1\n^2 ہو رہے ہیں - ""ابھی"\n"^1\n^2 ہو رہے ہیں - - - "بارہ" - "ایک" - "دو" - "تین" - "چار" - "پانچ" - "چھ" - "سات" - "آٹھ" - "نو" - "دس" - "گیارہ" - - - - - - - - - - diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml index 0f1fd83c41d..4110d2eb3a1 100644 --- a/packages/SystemUI/res-keyguard/values-uz/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml @@ -153,84 +153,4 @@ SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana %d marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling. SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana %d marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling. - - ""Soat"\n"^1\n^2 - ""Soat"\n"^1\n^2 - - - "Oʻn ikki" - "Bir" - "Ikki" - "Uch" - "Toʻrt" - "Besh" - "Olti" - "Yetti" - "Sakkiz" - "Toʻqqiz" - "Oʻn" - "Oʻn bir" - - - "Soat" - "Bir" - "Ikki" - "Uch" - "Toʻrt" - "Besh" - "Olti" - "Yetti" - "Sakkiz" - "Toʻqqiz" - "Oʻn" - "Oʻn bir" - "Oʻn ikki" - "Oʻn uch" - "Oʻn toʻrt" - "Oʻn besh" - "Oʻn olti" - "Oʻn yetti" - "Oʻn sakkiz" - "Oʻn toʻqqiz" - "Yigirma" - "Yigirma\nbir" - "Yigirma\nikki" - "Yigirma\nuch" - "Yigirma\ntoʻrt" - "Yigirma\nbesh" - "Yigirma\nolti" - "Yigirma\nyetti" - "Yigirma\nsakkiz" - "Yigirma\ntoʻqqiz" - "Oʻttiz" - "Oʻttiz\nbir" - "Oʻttiz\nikki" - "Oʻttiz\nuch" - "Oʻttiz\ntoʻrt" - "Oʻttiz\nbesh" - "Oʻttiz\nolti" - "Oʻttiz\nyetti" - "Oʻttiz\nsakkiz" - "Oʻttiz\ntoʻqqiz" - "Qirq" - "Qirq\nbir" - "Qirq\nikki" - "Qirq\nuch" - "Qirq\ntoʻrt" - "Qirq\nbesh" - "Qirq\nolti" - "Qirq\nyetti" - "Qirq\nsakkiz" - "Qirq\ntoʻqqiz" - "Ellik" - "Ellik\nbir" - "Ellik\nikki" - "Ellik\nuch" - "Ellik\ntoʻrt" - "Ellik\nbesh" - "Ellik\nolti" - "Ellik\nyetti" - "Ellik\nsakkiz" - "Ellik\ntoʻqqiz" - diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml index cc740652a67..19f62b2f812 100644 --- a/packages/SystemUI/res-keyguard/values-vi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml @@ -62,7 +62,7 @@ "Không thể tắt eSIM do lỗi." "Nhập" "Đã quên hình mở khóa" - "Hình mở khóa sai" + "Hình không chính xác" "Mật khẩu sai" "Mã PIN sai" @@ -151,84 +151,4 @@ SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn %d lần thử trước khi SIM vĩnh viễn không sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết. SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn %d lần thử trước khi SIM vĩnh viễn không thể sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết. - - "\n"^1\n^2 - "\n"^1\n^2 - - - "Mười hai" - "Một" - "Hai" - "Ba" - "Bốn" - "Năm" - "Sáu" - "Bảy" - "Tám" - "Chín" - "Mười" - "Mười một" - - - "Giờ" - "Không một" - "Không hai" - "Không ba" - "Không bốn" - "Không năm" - "Không sáu" - "Không bảy" - "Tám" - "Không chín" - "Mười" - "Mười một" - "Mười hai" - "Mười ba" - "Mười bốn" - "Mười lăm" - "Mười sáu" - "Mười bảy" - "Mười tám" - "Mười chín" - "Hai mươi" - "Hai mươi\nmốt" - "Hai mươi\nhai" - "Hai mươi\nba" - "Hai mươi\nbốn" - "Hai mươi\nlăm" - "Hai mươi\nsáu" - "Hai mươi\nbảy" - "Hai mươi\ntám" - "Hai mươi\nchín" - "Ba mươi" - "Ba mươi\nmốt" - "Ba mươi\nhai" - "Ba mươi\nba" - "Ba mươi\ntư" - "Ba mươi\nlăm" - "Ba mươi\nsáu" - "Ba mươi\nbảy" - "Ba mươi\ntám" - "Ba mươi\nchín" - "Bốn mươi" - "Bốn mươi\nmốt" - "Bốn mươi\nhai" - "Bốn mươi\nba" - "Bốn mươi\nbốn" - "Bốn mươi\nlăm" - "Bốn mươi\nsáu" - "Bốn mươi\nbảy" - "Bốn mươi\ntám" - "Bốn mươi\nchín" - "Năm mươi" - "Năm mươi\nmốt" - "Năm mươi\nhai" - "Năm mươi\nba" - "Năm mươi\nbốn" - "Năm mươi\nlăm" - "Năm mươi\nsáu" - "Năm mươi\nbảy" - "Năm mươi\ntám" - "Năm mươi\nchín" - diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml index 93d5a9d619d..85058df718a 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml @@ -151,84 +151,4 @@ SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 %d 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。 SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 %d 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。 - - ""时间是"\n"^1\n^2 - ""时间是"\n"^1\n^2 - - - "十二" - "一" - "二" - "三" - "四" - "五" - "六" - "七" - "八" - "九" - "十" - "十一" - - - "点整" - "零一" - "零二" - "零三" - "零四" - "零五" - "零六" - "零七" - "零八" - "零九" - "十" - "十一" - "十二" - "十三" - "十四" - "十五" - "十六" - "十七" - "十八" - "十九" - "二十" - "二十\n一" - "二十\n二" - "二十\n三" - "二十\n四" - "二十\n五" - "二十\n六" - "二十\n七" - "二十\n八" - "二十\n九" - "三十" - "三十\n一" - "三十\n二" - "三十\n三" - "三十\n四" - "三十\n五" - "三十\n六" - "三十\n七" - "三十\n八" - "三十\n九" - "四十" - "四十\n一" - "四十\n二" - "四十\n三" - "四十\n四" - "四十\n五" - "四十\n六" - "四十\n七" - "四十\n八" - "四十\n九" - "五十" - "五十\n一" - "五十\n二" - "五十\n三" - "五十\n四" - "五十\n五" - "五十\n六" - "五十\n七" - "五十\n八" - "五十\n九" - diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index cee833dbd4b..18503fd093c 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -151,84 +151,4 @@ SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 %d 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。 SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 %d 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。 - - ""現在是"\n"^1\n^2 - ""現在是"\n"^1\n^2 - - - "十二" - "一" - "二" - "三" - "四" - "五" - "六" - "七" - "八" - "九" - "十" - "十一" - - - "零九" - "零一分" - "零二分" - "零三分" - "零四分" - "零五分" - "零六分" - "零七分" - "零八分" - "零九分" - "十" - "十一" - "十二" - "十三" - "十四" - "十五" - "十六" - "十七" - "十八" - "十九" - "二十" - "二十\n一" - "二十\n二" - "二十\n三" - "二十\n四" - "二十\n五" - "二十\n六" - "二十\n七" - "二十\n八" - "二十\n九" - "三十" - "三十\n一" - "三十\n二" - "三十\n三" - "三十\n四" - "三十\n五" - "三十\n六" - "三十\n七" - "三十\n八" - "三十\n九" - "四十" - "四十\n一" - "四十\n二" - "四十\n三" - "四十\n四" - "四十\n五" - "四十\n六" - "四十\n七" - "四十\n八" - "四十\n九" - "五十" - "五十\n一" - "五十\n二" - "五十\n三" - "五十\n四" - "五十\n五" - "五十\n六" - "五十\n七" - "五十\n八" - "五十\n九" - diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index dc6e49c464d..ba61f433e11 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -151,84 +151,4 @@ SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 %d 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。 SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 %d 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。 - - ""現在是"\n"^1\n^2 - ""現在是"\n"^1\n^2 - - - "十二" - "一" - "二" - "三" - "四" - "五" - "六" - "七" - "八" - "九" - "十" - "十一" - - - "點整" - "零一" - "零二" - "零三" - "零四" - "零五" - "零六" - "零七" - "零八" - "零九" - "十" - "十一" - "十二" - "十三" - "十四" - "十五" - "十六" - "十七" - "十八" - "十九" - "二十" - "二十\n一" - "二十\n二" - "二十\n三" - "二十\n四" - "二十\n五" - "二十\n六" - "二十\n七" - "二十\n八" - "二十\n九" - "三十" - "三十\n一" - "三十\n二" - "三十\n三" - "三十\n四" - "三十\n五" - "三十\n六" - "三十\n七" - "三十\n八" - "三十\n九" - "四十" - "四十\n一" - "四十\n二" - "四十\n三" - "四十\n四" - "四十\n五" - "四十\n六" - "四十\n七" - "四十\n八" - "四十\n九" - "五十" - "五十\n一" - "五十\n二" - "五十\n三" - "五十\n四" - "五十\n五" - "五十\n六" - "五十\n七" - "五十\n八" - "五十\n九" - diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml index f9de4366c38..a6c5464fec9 100644 --- a/packages/SystemUI/res-keyguard/values-zu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml @@ -151,84 +151,4 @@ I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-%d esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane. I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-%d esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane. - - ""It’s"\n"^1\n^2 - ""It’s"\n"^1\n^2 - - - "Ishumi nambili" - "Kunye" - "Kubili" - "Kuthathu" - "Kune" - "Kuhlanu" - "Isithupha" - "Isikhombisa" - "Isishiyagalombili" - "Isishiyagalolunye" - "Ishumi" - "Ishumi nanye" - - - "Ezimpondweni" - "Oh okukodwa" - "Oh okubili" - "Oh okuthathu" - "Oh isine" - "Oh isihlanu" - "Oh isithupha" - "Oh isikhombisa" - "Oh isishiyagalombili" - "Oh isishiyagalolunye" - "Ishumi" - "Ishumi nanye" - "Ishumi nambili" - "Ishumi nantathu" - "Ishumi nane" - "Ishumi nanhlanu" - "Ishumi nesithupha" - "Ishumi nesikhombisa" - "Ishumi nesishiyagalombili" - "Ishumi nesishiyagalolunye" - "Amashumi amabili" - "Amashumi amabili\nnanye" - "Amashumi amabili\nnambili" - "Amashumi amabili\nnantathu" - "Amashumi amabili\nnane" - "Amashumi amabili\nnanhlanu" - "Amashumi amabili\nnesithupha" - "Amashumi amabili\nnesikhombisa" - "Amashumi nambili\nnesishiyagalombili" - "Amashumi amabili\nnesishiyagalolunye" - "Amashumi amathathu" - "Amashumi amathathu\nnanye" - "Amashumi amathathu\nnambili" - "Amashumi amathathu\nnantathu" - "Amashumi amathathu\nnane" - "Amashumi amathathu\nnesihlanu" - "Amashumi amathathu\nnesithupha" - "Amashumi amathathu\nnesikhombisa" - "Amshumi amathathu\nnesishiyagalombili" - "Amashumi amathathu\nnesishiyagalolunye" - "Amashumi amane" - "Amashumi amane\nnanye" - "Amashumi amane\nnambili" - "Amashumi amane\nnantathu" - "Amashumi amane\nnane" - "Amashumi amane\nnanhlanu" - "Amashumi amane\nnesithupha" - "Amashumi amane\nnesikhombisa" - "Amashumi nane\nnesishiyagalombili" - "Amashumi amane\nnesishiyagalolunye" - "Amashumi nanhlanu" - "Amashumi amahlanu\nnanye" - "Amashumi amahlanu\nnambili" - "Amashumi amahlanu\nnantathu" - "Amashumi amahlanu\nnane" - "Amashumi amahlanu\nnanhlanu" - "Amashumi amahlanu\nnesithupha" - "Amashumi amahlanu\nnesikhombisa" - "Amashumi amahlanu\nnesishiyagalombili" - "Amashumi amahlanu\nnesishiyagalolunye" - diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index baca541582e..3e3a164d0fa 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -368,6 +368,7 @@ "Tot sonsopkoms" "Aan om %s" "Tot %s" + "Donker-tema" "NFC" "NFC is gedeaktiveer" "NFC is geaktiveer" diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index e3250448f40..d707e8becdd 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -368,6 +368,7 @@ "ጸሐይ እስክትወጣ ድረስ" "%s ላይ ይበራል" "እስከ %s ድረስ" + "ጨለማ ገጽታ" "ኤንኤፍሲ" "ኤንኤፍሲ ተሰናክሏል" "ኤንኤፍሲ ነቅቷል" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 876609e3d45..d5ab8e3aac8 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -119,7 +119,7 @@ "إلغاء" "تأكيد" "إعادة المحاولة" - "المس جهاز استشعار بصمات الإصبع" + "المس زر استشعار بصمات الإصبع" "رمز بصمة الإصبع" "جارٍ البحث عن وجهك…" "رمز الوجه" @@ -172,8 +172,7 @@ "شبكة الجيل الرابع أو أحدث" "LTE" "LTE+‎" - - + "5Ge" "‏شبكة 5G" "‏شبكة 5G‎ والأحدث" "1X" @@ -186,7 +185,7 @@ "تم إيقاف بيانات الجوال" "لم يتم الضبط على استخدام البيانات" "إيقاف" - "ربط البلوتوث." + "التوصيل عبر البلوتوث" "وضع الطائرة." "‏الشبكة الافتراضية الخاصة (VPN) قيد التشغيل." "‏ليس هناك شريحة SIM." @@ -218,7 +217,7 @@ "%1$s." "‏تم إيقاف Wifi." "‏تم تشغيل Wifi." - "الجوال %1$s. %2$s. %3$s." + "الجوّال %1$s. %2$s. %3$s." "البطارية %s." "إيقاف وضع الطائرة." "تشغيل وضع الطائرة." @@ -377,6 +376,7 @@ "حتى شروق الشمس" "تفعيل الإعداد في %s" "حتى %s" + "مظهر الألوان الداكنة" "‏الاتصالات قصيرة المدى (NFC)" "تم إيقاف الاتصال القريب المدى" "تم تفعيل الاتصال القريب المدى" @@ -726,7 +726,7 @@ "رجوع" "الإشعارات" "اختصارات لوحة المفاتيح" - "تبديل نمط لوحة المفاتيح" + "تبديل تنسيق لوحة المفاتيح" "التطبيقات" "التطبيق المساعد" "المتصفح" diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 4b1db9d0c82..93d6c802d0a 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -172,8 +172,7 @@ "4G+" "এলটিই" "এলটিই+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "সূৰ্যোদয়ৰ লৈকে" "%sত অন কৰক" "%s পৰ্যন্ত" + "গাঢ় ৰঙৰ থীম" "NFC" "NFC নিষ্ক্ৰিয় হৈ আছে" "NFC সক্ষম হৈ আছে" diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 5354e0d9ade..df290c89431 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -368,6 +368,7 @@ "Şəfəq vaxtına qədər" "%s olduqda aktiv ediləcək" "%s vaxtına qədər" + "Tünd Tema" "NFC" "NFC deaktiv edilib" "NFC aktiv edilib" diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 242db2efcb2..5de7ef78a6e 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -370,6 +370,7 @@ "Do izlaska sunca" "Uključuje se u %s" "Do %s" + "Tamna tema" "NFC" "NFC je onemogućen" "NFC je omogućen" diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 396c4be82d7..fb69e2455ab 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -375,6 +374,7 @@ "Да ўсходу сонца" "Уключыць у %s" "Да %s" + "Цёмная тэма" "NFC" "NFC адключаны" "NFC уключаны" diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index dd6ffb275d6..345f6e3e4e9 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -368,6 +368,7 @@ "До изгрев" "Ще се включи в %s" "До %s" + "Тъмна тема" "КБП" "КБП е деактивирана" "КБП е активирана" diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index e8d3d3f6494..fbf296f173b 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -307,7 +306,7 @@ "হিয়ারিং এড" "চালু করা হচ্ছে…" "উজ্জ্বলতা" - "স্বতঃ ঘূর্ণায়মান" + "নিজে থেকে ঘুরবে" "অটো-রোটেট স্ক্রিন" "%s মোড" "ঘূর্ণন লক করা হয়েছে" @@ -369,6 +368,7 @@ "সূর্যোদয় পর্যন্ত" "%s এ চালু হবে" "%s পর্যন্ত" + "গাঢ় থিম" "NFC" "NFC অক্ষম করা আছে" "NFC সক্ষম করা আছে" @@ -750,7 +750,7 @@ "কিবোর্ড স্যুইচার" "সেভ করুন" - "আবার সেট করুন" + "রিসেট করুন" "বোতামের প্রস্থ সিঙ্ক করুন" "ক্লিপবোর্ড" "কাস্টম নেভিগেশন বোতাম" diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index a51ba975afd..4c4c4f2f88c 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -80,7 +80,7 @@ "Obavještenje za sesiju snimanja ekrana je u toku" "Započni snimanje" "Govor snimka" - "Prikaži dodirivanja" + "Prikaži dodire" "Zaustavi" "Pauza" "Nastavi" @@ -370,6 +370,7 @@ "Do svitanja" "Uključuje se u %s" "Do %s" + "Tema po mraku" "NFC" "NFC je onemogućen" "NFC je omogućen" @@ -432,7 +433,7 @@ "Odjavi trenutnog korisnika" "ODJAVI KORISNIKA" "Želite dodati novog korisnika?" - "Kada dodate novog korisnika, ta osoba treba uspostaviti svoj prostor.\n\nSvaki korisnik može ažurirati aplikacije za sve ostale korisnike." + "Kada dodate novog korisnika, ta osoba treba postaviti svoj prostor.\n\nSvaki korisnik može ažurirati aplikacije za sve ostale korisnike." "Dostignut limit za broj korisnika" Možete dodati najviše %d korisnika. @@ -756,7 +757,7 @@ "Prebacivač tastatura" "Sačuvaj" - "Vraćanje na zadano" + "Vrati na zadano" "Podesite širinu dugmeta" "Međumemorija" "Prilagođeno dugme za navigaciju" @@ -768,7 +769,7 @@ "Držite i prevucite da preuredite polja" "Prevucite ovdje za uklanjanje" "Trebate najmanje šest polja" - "Uredi" + "Uredite" "Vrijeme" "Prikaži sate, minute i sekunde" @@ -858,7 +859,7 @@ "Opće poruke" "Pohrana" "Savjeti" - "Instant-aplikacije" + "Instant aplikacije" "Pokrenuta je aplikacija %1$s" "Aplikacija je otvorena bez prethodne instalacije." "Aplikacija je otvorena bez prethodne instalacije. Dodirnite da saznate više." diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index fdf51f2b46e..0a75a5d4fdb 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -330,7 +330,7 @@ "La Wi-Fi està activada" "No hi ha cap xarxa Wi-Fi disponible" "S\'està activant…" - "Screen Cast" + "Emet pantalla" "En emissió" "Dispositiu sense nom" "A punt per emetre" @@ -368,6 +368,7 @@ "Fins a l\'alba" "S\'activarà a les %s" "Fins a les %s" + "Tema fosc" "NFC" "L\'NFC està desactivada" "L\'NFC està activada" @@ -705,7 +706,7 @@ "Enrere" "Notificacions" "Tecles de drecera" - "Canvia la disposició de teclat" + "Canvia disposició de teclat" "Aplicacions" "Assistència" "Navegador" @@ -731,7 +732,7 @@ "Activat" "Desactivat" "Barra de navegació" - "Disseny" + "Disposició" "Tipus de botó addicional de l\'esquerra" "Tipus de botó addicional de la dreta" "(predeterminat)" @@ -757,8 +758,8 @@ "Codi de tecla de la dreta" "Icona de l\'esquerra" "Icona de la dreta" - "Mantén premut i arrossega per afegir funcions" - "Mantén premut i arrossega per reorganitzar les funcions" + "Mantén premut i arrossega per afegir mosaics" + "Mantén premut i arrossega per reorganitzar els mosaics" "Arrossega aquí per suprimir una funció" "Necessites com a mínim 6 mosaics" "Edita" diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 924ad5a5d8b..1c596ddb2a0 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -372,6 +372,7 @@ "Do svítání" "Zapnout v %s" "Do %s" + "Tmavé téma" "NFC" "NFC je vypnuto" "NFC je zapnuto" diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index d347f8e65ad..8544ec0edc1 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -259,7 +258,7 @@ "Arbejdstilstand er slået fra." "Arbejdstilstand er slået til." "Datasparefunktionen er slået fra." - "Datasparefunktionen er slået til." + "Datasparefunktionen er aktiveret." "Privat sensortilstand blev deaktiveret." "Privat sensortilstand blev aktiveret." "Skærmens lysstyrke" @@ -331,7 +330,7 @@ "Wi-Fi er slået til" "Der er ingen tilgængelige Wi-Fi-netværk" "Aktiverer…" - "Cast af skærm" + "Cast skærm" "Caster" "Enhed uden navn" "Klar til at caste" @@ -369,6 +368,7 @@ "Indtil solopgang" "Tænd kl. %s" "Indtil %s" + "Mørkt tema" "NFC" "NFC er deaktiveret" "NFC er aktiveret" @@ -636,7 +636,7 @@ "Vil du fortsætte med at se notifikationer fra denne app?" "Blokerede notifikationer vises ikke nogen steder og afspiller ikke nogen lyd. Du kan fjerne blokeringen af notifikationer i indstillingerne." "Lydløse notifikationer vises i underretningspanelet, men de vises ikke på låseskærmen eller via et banner, og de afspiller ingen lyd." - "Når du modtager disse notifikationer, kan du høre en lyd og se dem i notifikationsskuffen, i statusbjælken og på låseskærmen" + "Når du modtager disse notifikationer, kan du høre en lyd og se dem i notifikationsskuffen, på statusbjælken og på låseskærmen" "Disse notifikationer kan ikke deaktiveres" "Du kan ikke konfigurere denne gruppe notifikationer her" "via %1$s" @@ -727,7 +727,7 @@ "Hovedtelefoner er tilsluttet" "Headset er forbundet" "Datasparefunktion" - "Datasparefunktionen er slået til" + "Datasparefunktionen er aktiveret" "Datasparefunktionen er slået fra" "Til" "Fra" @@ -759,7 +759,7 @@ "Venstre ikon" "Højre ikon" "Tilføj felter ved at holde dem nede og trække" - "Omorganiser felter ved at holde dem nede og trække" + "Flyt rundt på felterne ved at holde dem nede og trække" "Træk herhen for at fjerne" "Du skal bruge mindst seks felter" "Rediger" @@ -815,7 +815,7 @@ "Minimer" "Luk" "Indstillinger" - "Træk nedad for at afvise" + "Træk ned for at afvise" "Menu" "%s vises som integreret billede" "Hvis du ikke ønsker, at %s skal benytte denne funktion, kan du åbne indstillingerne og deaktivere den." diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index fb7628ad03f..e5734944d83 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -372,6 +372,7 @@ "Bis Sonnenaufgang" "An um %s" "Bis %s" + "Dunkles Design" "NFC" "NFC ist deaktiviert" "NFC ist aktiviert" @@ -761,8 +762,8 @@ "Rechter Keycode" "Linkes Symbol" "Rechtes Symbol" - "Halten und ziehen, um Kacheln hinzuzufügen" - "Halten und ziehen, um die Kacheln neu anzuordnen" + "Zum Hinzufügen von Kacheln Kachel halten und ziehen" + "Zum Verschieben der Kacheln Kachel halten und ziehen" "Zum Entfernen hierher ziehen" "Du brauchst mindestens sechs Kacheln" "Bearbeiten" @@ -905,8 +906,8 @@ "Kein Titel" "Tippe, um die App im Vollbildmodus neu zu starten." "%1$s öffnen" - "Einstellungen für %1$s-Infofelder" - "Infofelder von %1$s zulassen?" + "Einstellungen für %1$s-Bubbles" + "%1$s-Bubbles zulassen?" "Ablehnen" "Zulassen" "Später fragen" diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index ba5e1227329..2fc78072609 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -368,6 +368,7 @@ "Μέχρι την ανατολή" "Ενεργοποίηση στις %s" "Έως τις %s" + "Σκούρο θέμα" "NFC" "Το NFC είναι απενεργοποιημένο" "Το NFC είναι ενεργοποιημένο" diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 8ea35affa6c..74d97c21883 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -368,6 +368,7 @@ "Until sunrise" "On at %s" "Until %s" + "Dark Theme" "NFC" "NFC is disabled" "NFC is enabled" diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 92416703443..94a42e2223f 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -368,6 +368,7 @@ "Until sunrise" "On at %s" "Until %s" + "Dark Theme" "NFC" "NFC is disabled" "NFC is enabled" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 8ea35affa6c..74d97c21883 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -368,6 +368,7 @@ "Until sunrise" "On at %s" "Until %s" + "Dark Theme" "NFC" "NFC is disabled" "NFC is enabled" diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 8ea35affa6c..74d97c21883 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -368,6 +368,7 @@ "Until sunrise" "On at %s" "Until %s" + "Dark Theme" "NFC" "NFC is disabled" "NFC is enabled" diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index f28f761e4c2..635456dbe09 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -368,6 +368,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‎Until sunrise‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‎‏‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‎‏‏‏‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‎‏‎On at ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‎‏‏‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‏‎‏‏‎‎‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‏‏‎‎Until ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‎Dark Theme‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎NFC‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‏‎NFC is disabled‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‎‏‎‏‎‏‏‏‎NFC is enabled‎‏‎‎‏‎" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index fdee8a81324..c994c332365 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "Hasta el amanecer" "A la(s) %s" "Hasta %s" + "Tema oscuro" "NFC" "La tecnología NFC está inhabilitada" "La tecnología NFC está habilitada" diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 8e620d19b88..b25f84d176a 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -368,6 +368,7 @@ "Hasta el amanecer" "Hora: %s" "Hasta: %s" + "Tema oscuro" "NFC" "La conexión NFC está inhabilitada" "La conexión NFC está habilitada" @@ -580,8 +581,8 @@ "Alarma" "Perfil de trabajo" "Modo avión" - "Añadir mosaico" - "Mosaico de emisión" + "Añadir icono" + "Icono de emisión" "No oirás la próxima alarma (%1$s) a menos que desactives esta opción antes" "No oirás la próxima alarma (%1$s)" "a las %1$s" @@ -758,9 +759,9 @@ "Icono a la izquierda" "Icono a la derecha" "Pulsa y arrastra para añadir funciones" - "Mantener pulsado y arrastrar para reorganizar los mosaicos" + "Mantén pulsado un icono y arrástralo para reorganizarlo" "Arrastra aquí para quitar una función" - "Necesitas 6 mosaicos como mínimo" + "Necesitas al menos 6 iconos" "Editar" "Hora" @@ -901,8 +902,8 @@ "Sin título" "Toca para reiniciar esta aplicación e ir a la pantalla completa." "Abrir %1$s" - "Ajustes de los cuadros de %1$s" - "¿Quieres permitir los cuadros de %1$s?" + "Ajustes de las burbujas de %1$s" + "¿Quieres permitir las burbujas de %1$s?" "Denegar" "Permitir" "Preguntarme más tarde" diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 59616ace92d..9803841c434 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -257,8 +257,8 @@ "Töörežiim on sees." "Töörežiim on välja lülitatud." "Töörežiim on sisse lülitatud." - "Andmeside mahu säästja on välja lülitatud." - "Andmeside mahu säästja on sisse lülitatud." + "Andmemahu säästja on välja lülitatud." + "Andmemahu säästja on sisse lülitatud." "Andur Privaatsus on välja lülitatud." "Andur Privaatsus on sisse lülitatud." "Ekraani heledus" @@ -368,6 +368,7 @@ "Kuni päikesetõusuni" "Sisselülitam. kell %s" "Kuni %s" + "Tume teema" "NFC" "NFC on keelatud" "NFC on lubatud" @@ -523,11 +524,11 @@ "Väljundseadme vahetamine" "Ekraan on kinnitatud" "See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade." - "See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Avaekraan." + "See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Avakuva." "See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppu Ülevaade." - "See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppu Avaekraan." + "See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppu Avakuva." "Ekraanikuva vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade" - "Ekraanikuva vabastamiseks puudutage pikalt nuppe Tagasi ja Avaekraan" + "Ekraanikuva vabastamiseks puudutage pikalt nuppe Tagasi ja Avakuva" "Selge" "Tänan, ei" "Ekraanikuva on kinnitatud" @@ -674,7 +675,7 @@ "Akusäästja" "Vähendab jõudlust ja taustaandmeid" "Nupp %1$s" - "Avaekraan" + "Avakuva" "Tagasi" "Üles" "Alla" @@ -694,13 +695,13 @@ "Lehe võrra üles" "Lehe võrra alla" "Kustuta" - "Avaekraan" + "Avakuva" "Lõpp" "Sisesta" "Numbrilukk" "Numbriklahvistik %1$s" "Süsteem" - "Avaekraan" + "Avakuva" "Hiljutised" "Tagasi" "Märguanded" @@ -725,9 +726,9 @@ "avada seaded" "Kõrvaklapid on ühendatud" "Peakomplekt on ühendatud" - "Andmeside mahu säästja" - "Andmeside mahu säästja on sisse lülitatud" - "Andmeside mahu säästja on välja lülitatud" + "Andmemahu säästja" + "Andmemahu säästja on sisse lülitatud" + "Andmemahu säästja on välja lülitatud" "Sees" "Väljas" "Navigeerimisriba" diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 71a15840c2b..d02782d76aa 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -178,7 +178,7 @@ "1X" "Ibiltaritza" "EDGE" - "Wi-Fi konexioa" + "Wifia" "Ez dago SIM txartelik." "Datu-konexioa" "Datu-konexioa aktibatuta" @@ -323,7 +323,7 @@ "Ni" "Erabiltzailea" "Erabiltzaile berria" - "Wi-Fi konexioa" + "Wifia" "Konektatu gabe" "Ez dago sarerik" "Wi-Fi konexioa desaktibatuta" @@ -368,6 +368,7 @@ "Ilunabarrera arte" "Aktibatze-ordua: %s" "%s arte" + "Gai iluna" "NFC" "Desgaituta dago NFC" "Gaituta dago NFC" @@ -565,7 +566,7 @@ "Ez da aurkitu gailurik" "Ez da aurkitu gailurik. Aktibatu %1$s." "Bluetooth-a" - "Wi-Fi konexioa" + "Wifia" "Bluetooth eta Wi-Fi konexioak" "Sistemako erabiltzaile-interfazearen konfiguratzailea" "Erakutsi txertatutako bateriaren ehunekoa" @@ -875,7 +876,7 @@ "%s erabilita ezingo dituzu erabili datuak edo Internet. Wi-Fi sare baten bidez soilik konektatu ahal izango zara Internetera." "Uneko operadorea" "Aplikazio bat baimen-eskaera oztopatzen ari denez, ezarpenek ezin dute egiaztatu erantzuna." - "%1$s aplikazioari %2$s aplikazioaren zatiak erakustea baimendu nahi diozu?" + "%1$s aplikazioari %2$s aplikazioaren zatiak erakusteko baimena eman nahi diozu?" "- %1$s aplikazioaren informazioa irakur dezake." "- %1$s aplikazioan ekintzak gauza ditzake." "Baimendu %1$s aplikazioari edozein aplikazioren zatiak erakustea" @@ -901,8 +902,8 @@ "Ez du izenik" "Berrabiarazi aplikazio hau eta ezarri pantaila osoko modua." "Ireki %1$s" - "%1$s aplikazioaren ezarpenen globoak" - "%1$s aplikazioaren globoak onartu nahi dituzu?" + "%1$s aplikazioaren ezarpenen burbuilak" + "%1$s aplikazioaren burbuilak erabiltzeko baimena eman nahi duzu?" "Ukatu" "Onartu" "Galdetu geroago" diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index e673a49e915..d0c7422ed02 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -172,12 +172,11 @@ "4G+‎" "LTE" "LTE+‎" - - + "5Ge" "5G" "5G+" "1X" - "رومینگ" + "فراگردی" "EDGE" "Wi-Fi" "بدون سیم کارت." @@ -186,7 +185,7 @@ "داده تلفن همراه خاموش است" "برای استفاده از داده تنظیم نشده است" "خاموش" - "اتصال اینترنت با بلوتوث تلفن همراه." + "اشتراک‌گذاری اینترنت با بلوتوث." "حالت هواپیما." "‏VPN روشن است." "سیم‌کارتی موجود نیست." @@ -268,7 +267,7 @@ "‏داده 4G موقتاً متوقف شده است" "داده تلفن همراه موقتاً متوقف شده است" "داده موقتاً متوقف شده است" - "مصرف داده شما به محدودیت داده‌ای که تنظیم کردید رسیده است. دیگر از داده تلفن همراه استفاده نمی‌کنید.\n\n درصورت ازسرگیری، ممکن است هزینه‌های مصرف داده اعمال شود." + "به حدمجاز داده‌ای که تنظیم کردید رسیده است. دیگر از داده تلفن همراه استفاده نمی‌کنید.\n\n درصورت ازسرگیری، ممکن است هزینه‌های مصرف داده اعمال شود." "از سر‌گیری" "‏جستجو برای GPS" "‏مکان تنظیم شده توسط GPS" @@ -346,7 +345,7 @@ "متصل" "متصل، باتری %1$s" "در حال اتصال..." - "اتصال به اینترنت با تلفن همراه" + "اشتراک‌گذاری اینترنت" "نقطه اتصال" "روشن کردن…" "صرفه‌جویی داده روشن است" @@ -369,6 +368,7 @@ "تا طلوع" "ساعت %s روشن می‌شود" "تا %s" + "طرح زمینه تیره" "NFC" "‏NFC غیرفعال است" "‏NFC فعال است" @@ -758,7 +758,7 @@ "کدکلید راست" "نماد چپ" "نماد راست" - "نگه‌داشتن و کشیدن برای افزودن کاشی" + "برای افزودن کاشی، نگه دارید و بکشید" "برای تغییر دادن ترتیب کاشی‌ها، آن‌ها را نگه دارید و بکشید" "برای حذف، به اینجا بکشید" "حداقل به ۶ کاشی نیاز دارید" diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 512dc5cc1da..73d12d2b4c1 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -368,6 +368,7 @@ "Auringonnousuun" "Käyttöön klo %s" "%s saakka" + "Tumma teema" "NFC" "NFC on poistettu käytöstä" "NFC on käytössä" @@ -758,7 +759,7 @@ "Vasen kuvake" "Oikea kuvake" "Lisää osioita koskettamalla pitkään ja vetämällä" - "Järjestele ruutuja koskettamalla pitkään ja vetämällä" + "Järjestele osioita koskettamalla pitkään ja vetämällä" "Poista vetämällä tähän." "Kuusi osiota on vähimmäismäärä." "Muokkaa" diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 3293f41db52..23847fa39e2 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "Jusqu\'au lev. soleil" "Actif à %s" "Jusqu\'à %s" + "Thème sombre" "NFC" "NFC désactivée" "NFC activée" @@ -758,7 +758,7 @@ "Code de touche droit" "Icône à gauche" "Icône droite" - "Maint. doigt sur écran, puis glissez-le pour aj. des tuiles" + "Maint. doigt sur écran, puis glissez-le pour ajouter tuiles" "Maint. doigt sur l\'écran, puis glissez-le pour réorg. tuiles" "Faites glisser les tuiles ici pour les supprimer" "Vous avez besoin d\'au moins six tuiles" @@ -889,7 +889,7 @@ "La fonction Économie d\'énergie s\'activera automatiquement une fois que la pile sera en dessous de %d %%." "Paramètres" "OK" - "Capturer mémoire SysUI" + "Copier mémoire SysUI" "%1$s utilise votre %2$s." "Des applications utilisent votre %s." ", " diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index f13cdc3e142..41a7693d719 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "Jusqu\'à l\'aube" "Activé à %s" "Jusqu\'à %s" + "Thème foncé" "NFC" "La technologie NFC est désactivée" "La technologie NFC est activée" diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 17177d85baa..8566ec6ae13 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "Ata o amencer" "Activación (%s)" "Ata: %s" + "Tema escuro" "NFC" "A opción NFC está desactivada" "A opción NFC está activada" @@ -581,8 +581,8 @@ "Alarma" "Perfil de traballo" "Modo avión" - "Engade un mosaico" - "Mosaico controlado pola emisión" + "Engade un atallo" + "Atallo de emisión" "Non escoitarás a alarma seguinte %1$s a menos que desactives esta opción antes desa hora" "Non escoitarás a alarma seguinte %1$s" "ás %1$s" @@ -758,10 +758,10 @@ "Código de teclas á dereita" "Icona á esquerda" "Icona á dereita" - "Mantén premidas as funcións e arrástraas para engadilas" - "Para reorganizar os mosaicos, mantenos premidos e arrástraos" + "Mantén premido un elemento e arrástrao para engadir atallos" + "Para reorganizar os atallos, mantenos premidos e arrástraos" "Arrastra o elemento ata aquí para eliminalo" - "Necesitas polo menos 6 mosaicos" + "Como mínimo ten que haber 6 atallos" "Editar" "Hora" @@ -889,7 +889,7 @@ "Activarase automaticamente a función Aforro de batería en canto o nivel de carga sexa inferior ao %d %%." "Configuración" "De acordo" - "Baleirar mont. SysUI" + "Baleirado mem. SysUI" "%1$s está utilizando %2$s." "Hai aplicacións que están utilizando %s." ", " diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 8535a3f0634..9a8d5fbc063 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "સૂર્યોદય સુધી" "%s વાગ્યે" "%s સુધી" + "ઘેરી થીમ" "NFC" "NFC અક્ષમ કરેલ છે" "NFC સક્ષમ કરેલ છે" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 7d38dd9873a..c65351adc11 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -50,7 +50,7 @@ "%1$s को %2$s के एक्सेस की अनुमति दें?" "%2$s के लिए %1$s खोलें?" "%2$s के लिए %1$s खोलें?" - "इस USB सहायक डिवाइस के साथ कोई भी इंस्टॉल ऐप्स काम नहीं करता. इस सहायक डिवाइस के बारे में यहां अधिक जानें: %1$s" + "इस USB सहायक डिवाइस के साथ कोई भी इंस्टॉल ऐप्स काम नहीं करता. इस सहायक डिवाइस के बारे में यहां ज़्यादा जानें: %1$s" "USB सहायक साधन" "देखें" "%2$s के कनेक्ट होने पर हमेशा %1$s खोलें" @@ -175,8 +175,7 @@ "4G+" "एलटीई" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -191,7 +190,7 @@ "बंद है" "ब्लूटूथ से टेदरिंग." - "हवाई जहाज मोड." + "हवाई जहाज़ मोड." "VPN चालू." "कोई सिम कार्ड नहीं है." "मोबाइल और इंटरनेट सेवा देने वाली कंपनी का नेटवर्क बदल रहा है" @@ -249,7 +248,7 @@ "जगह की रिपोर्ट को चालू किया गया." "%s के लिए अलार्म सेट किया गया." "पैनल बंद करें." - "अधिक समय." + "ज़्यादा समय." "कम समय." "फ़्लैशलाइट बंद है." "फ़्लैशलाइट उपलब्ध नहीं है." @@ -315,7 +314,7 @@ "सुनने में मददगार डिवाइस" "ब्लूटूथ चालू हो रहा है…" "स्क्रीन की रोशनी" - "स्वत: घुमाएं" + "अपने आप घूमना" "स्‍क्रीन अपने आप घूमने की सुविधा चालू करें" "%s मोड" "घुमाना लॉक किया गया" @@ -367,7 +366,7 @@ "मोबाइल डेटा" "डेटा खर्च" "शेष डेटा" - "सीमा से अधिक" + "सीमा से ज़्यादा" "%s उपयोग किया गया" "%s सीमा" "%s चेतावनी" @@ -377,6 +376,7 @@ "सुबह तक चालू रहेगी" "%s पर चालू की जाएगी" "%s तक" + "गहरे रंग वाली थीम" "एनएफ़सी" "NFC बंद है" "NFC चालू है" @@ -392,7 +392,7 @@ "%s के लिए ऊपर स्‍लाइड करें." "%s के लिए बाएं स्‍लाइड करें." "आपको अलार्म, रिमाइंडर, इवेंट और चुनिंदा कॉल करने वालों के अलावा किसी और तरह से (आवाज़ करके और थरथरा कर ) परेशान नहीं किया जाएगा. आप फिर भी संगीत, वीडियो और गेम सहित अपना चुना हुआ सब कुछ सुन सकते हैं." - "आपको अलार्म छोड़कर दूसरी आवाज़ों और कंपनों से परेशान नहीं किया जाएगा. आपको अभी भी संगीत, वीडियो और गेम सहित वह सब कुछ सुनाई देगा जो आपने चलाने के लिए चुना है." + "आपको अलार्म छोड़कर दूसरी आवाज़ों और कंपनों से परेशान नहीं किया जाएगा. आपको अब भी संगीत, वीडियो और गेम सहित वह सब कुछ सुनाई देगा जो आपने चलाने के लिए चुना है." "अपनी पसंद के मुताबिक बनाएं" "इससे अलार्म, संगीत, वीडियो और गेम सहित सभी आवाज़ और कंपन (वाइब्रेशन) रोक दिए जाते हैं. आप तब भी फ़ोन काॅल कर सकेंगे." "इससे अलार्म, संगीत, वीडियो और गेम सहित सभी आवाज़ और कंपन (वाइब्रेशन) रोक दिए जाते हैं." @@ -508,7 +508,7 @@ "VPN सेटिंग खोलें" " " "भरोसेमंद क्रेडेंशियल खोलें" - "आपके एडमिन ने नेटवर्क लॉग करना चालू कर दिया है, जो आपके डिवाइस पर ट्रैफ़िक की निगरानी करता है.\n\nअधिक जानकारी के लिए अपने एडमिन से संपर्क करें." + "आपके एडमिन ने नेटवर्क लॉग करना चालू कर दिया है, जो आपके डिवाइस पर ट्रैफ़िक की निगरानी करता है.\n\nज़्यादा जानकारी के लिए अपने एडमिन से संपर्क करें." "आपने किसी ऐप को VPN कनेक्‍शन सेट करने की अनुमति दी है.\n\nयह ऐप ईमेल, ऐप्‍स और सुरक्षित वेबसाइटों सहित आपके डिवाइस और नेटवर्क की गतिविधि की निगरानी कर सकता है." "%1$s आपकी वर्क प्रोफ़ाइल को प्रबंधित करता है.\n\n आपका एडमिन ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nऔर जानकारी के लिए अपने एडमिन से संपर्क करें.\n\nआप ऐसे VPN से भी कनेक्‍ट हैं, जो आपकी नेटवर्क गतिविधि की निगरानी कर सकता है." "VPN" @@ -841,10 +841,10 @@ "पिछले पर जाएं" "गर्म होने के कारण फ़ोन बंद हुआ" "आपका फ़ोन अब सामान्य रूप से चल रहा है" - "फ़ोन बहुत गर्म हो गया था, इसलिए वह ठंडा होने के लिए बंद हो गया. फ़ोन अब सामान्य रूप से चल रहा है.\n\nफ़ोन तब बहुत गर्म हो सकता है जब आप:\n • अधिक संसाधनों का उपयोग करने वाले ऐप चलाते हैं (जैसे गेमिंग, वीडियो या मार्गदर्शक ऐप)\n • बड़ी फ़ाइलें डाउनलोड या अपलोड करते हैं\n • उच्च तापमान में फ़ोन का उपयोग करते हैं" + "फ़ोन बहुत गर्म हो गया था, इसलिए वह ठंडा होने के लिए बंद हो गया. फ़ोन अब सामान्य रूप से चल रहा है.\n\nफ़ोन तब बहुत गर्म हो सकता है जब आप:\n • ज़्यादा संसाधनों का उपयोग करने वाले ऐप चलाते हैं (जैसे गेमिंग, वीडियो या मार्गदर्शक ऐप)\n • बड़ी फ़ाइलें डाउनलोड या अपलोड करते हैं\n • उच्च तापमान में फ़ोन का उपयोग करते हैं" "फ़ोन गर्म हो रहा है" "फ़ोन के ठंडा होने के दौरान कुछ सुविधाएं सीमित होती हैं" - "आपका फ़ोन अपने आप ठंडा होने की कोशिश करेगा. आप अभी भी अपने फ़ोन का उपयोग कर सकते हैं, लेकिन हो सकता है कि यह धीमी गति से चले.\n\nठंडा हो जाने पर आपका फ़ोन सामान्य रूप से चलेगा." + "आपका फ़ोन अपने आप ठंडा होने की कोशिश करेगा. आप अब भी अपने फ़ोन का उपयोग कर सकते हैं, लेकिन हो सकता है कि यह धीमी गति से चले.\n\nठंडा हो जाने पर आपका फ़ोन सामान्य रूप से चलेगा." "चार्जर निकालें" "इस डिवाइस को चार्ज करने में समस्या हुई. पावर अडैप्टर का प्लग निकालें. ऐसा करते समय सावधानी बरतें क्योंकि तार गर्म हो सकता है." "प्रबंधन से जुड़े चरण देखें" diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index c6d9c750922..cae65e1fe61 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -370,6 +370,7 @@ "Do izlaska sunca" "Uključuje se u %s" "Do %s" + "Tamna tema" "NFC" "NFC je onemogućen" "NFC je omogućen" diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index ef0b84b4660..76883736a62 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -368,6 +368,7 @@ "Napfelkeltéig" "Bekapcsolás: %s" "Eddig: %s" + "Sötét téma" "NFC" "Az NFC ki van kapcsolva" "Az NFC be van kapcsolva" diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index aaf74b4726f..b8350607d05 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "Մինչև լուսաբաց" "Կմիացվի ժամը %s-ին" "Մինչև %s" + "Մուգ թեմա" "NFC" "NFC-ն անջատված է" "NFC-ն միացված է" diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index a816f42bf9d..e52f6c73ce6 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -267,7 +267,7 @@ "Data 4G dijeda" "Data seluler dijeda" "Data dijeda" - "Batas data yang Anda tetapkan telah tercapai. Anda tidak menggunakan data seluler lagi.\n\nJika Anda melanjutkan, tarif penggunaan data mungkin berlaku." + "Batas kuota yang Anda tetapkan telah tercapai. Anda tidak menggunakan data seluler lagi.\n\nJika Anda melanjutkan, tarif penggunaan data mungkin berlaku." "Lanjutkan" "Menelusuri GPS" "Lokasi yang disetel oleh GPS" @@ -356,7 +356,7 @@ "Notifikasi" "Lampu senter" "Data seluler" - "Penggunaan data" + "Penggunaan kuota" "Data tersisa" "Melebihi batas" "%s digunakan" @@ -368,6 +368,7 @@ "Sampai pagi" "Aktif pada %s" "Hingga %s" + "Tema Gelap" "NFC" "NFC dinonaktifkan" "NFC diaktifkan" @@ -887,7 +888,7 @@ "Jadwal Penghemat Baterai diaktifkan" "Penghemat Baterai akan aktif otomatis jika baterai kurang dari %d%%." "Setelan" - "OK" + "Oke" "Hapus Heap SysUI" "%1$s menggunakan %2$s." "Aplikasi menggunakan %s." diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 7a291459905..7ee6e7a4d23 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "Til sólarupprásar" "Kveikt klukkan %s" "Til klukkan %s" + "Dökkt þema" "NFC" "Slökkt á NFC" "Kveikt á NFC" diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index d304bedc028..25d5fd09f49 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -368,6 +368,7 @@ "Fino all\'alba" "Dalle %s" "Fino alle %s" + "Tema scuro" "NFC" "NFC non attiva" "NFC attiva" diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index f1e5a1ccdab..62bf89d43f9 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -58,7 +58,7 @@ "‏האם לאפשר ניפוי באגים ב-USB?" "‏טביעת האצבע של מפתח ה-RSA של המחשב היא:\n%1$s" "אפשר תמיד ממחשב זה" - "לאישור" + "יש אישור" "‏לא ניתן לבצע ניפוי באגים ב-USB" "‏למשתמש המחובר לחשבון במכשיר הזה אין אפשרות להפעיל ניפוי באגים ב-USB. כדי להשתמש בתכונה הזו יש לעבור אל המשתמש הראשי." "‏יציאת ה-USB מושבתת" @@ -372,6 +372,7 @@ "עד הזריחה" "מופעל בשעה %s" "עד %s" + "עיצוב כהה" "NFC" "‏NFC מושבת" "‏NFC מופעל" @@ -518,7 +519,7 @@ "קבלה מהירה של התראות" "צפה בהן לפני שתבטל נעילה" "לא, תודה" - "הגדר" + "הגדרה" "%1$s‏. %2$s" "כבה עכשיו" "הגדרות צליל" diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index ebe6dccaa2a..170752bb885 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -313,7 +313,7 @@ "縦向き" "横向き" "入力方法" - "現在地" + "位置情報" "現在地OFF" "メディアデバイス" "RSSI" @@ -368,6 +368,7 @@ "日の出まで" "%s に ON" "%s まで" + "ダークテーマ" "NFC" "NFC は無効です" "NFC は有効です" diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 1b326a1ce03..5cb4cf65ebe 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -368,6 +368,7 @@ "მზის ამოსვლამდე" "ჩაირთოს %s-ზე" "%s-მდე" + "მუქი თემა" "NFC" "NFC გათიშულია" "NFC ჩართულია" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index b74aeb18e31..340717c62ac 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -258,8 +257,8 @@ "Жұмыс режимі қосулы." "Жұмыс режимі өшірілді." "Жұмыс режимі қосылды." - "Трафикті үнемдеу функциясы өшірілді." - "Трафикті үнемдеу функциясы қосылды." + "Data Saver өшірілді." + "Data Saver қосылды." "Sensor Privacy функциясы өшірулі." "Sensor Privacy функциясы қосулы." "Дисплей жарықтығы" @@ -369,6 +368,7 @@ "Күн шыққанға дейін" "Қосылу уақыты: %s" "%s дейін" + "Қараңғы тақырып" "NFC" "NFC өшірулі" "NFC қосулы" @@ -706,7 +706,7 @@ "Артқа" "Хабарландырулар" "Пернелер тіркесімдері" - "Пернетақта орналасуын ауыстыру" + "Пернетақта форматын ауыстыру" "Қолданбалар" "Көмекші" "Браузер" diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 11764e1c25a..4ed5fdf1dec 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -185,8 +185,8 @@ "ទិន្នន័យ​ទូរសព្ទចល័ត​បានបិទ" "មិនបានកំណត់​ឱ្យប្រើ​ទិន្នន័យ​ទេ" "បិទ" - "ការ​ភ្ជាប់​ប៊្លូធូស។" - "របៀប​​ពេលជិះ​យន្តហោះ" + "ការ​ភ្ជាប់​តាមប៊្លូធូស" + "ពេល​ជិះ​យន្តហោះ" "បើក VPN ។" "គ្មានស៊ីមកាតទេ។" "បណ្តាញ​ក្រុមហ៊ុនសេវាទូរសព្ទ​កំពុងផ្លាស់ប្តូរ" @@ -368,6 +368,7 @@ "រហូត​ដល់​ពេល​ថ្ងៃរះ" "បើក​នៅម៉ោង %s" "រហូតដល់​ម៉ោង %s" + "រចនាប័ទ្ម​​​ងងឹត" "NFC" "បាន​បិទ NFC" "បាន​បើក NFC" diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 04c7bd2d813..8c91997f431 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "ಸೂರ್ಯೋದಯದ ತನಕ" "%s ಸಮಯದಲ್ಲಿ" "%s ವರೆಗೂ" + "ಡಾರ್ಕ್ ಥೀಮ್" "NFC" "NFC ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ" "NFC ಸಕ್ರಿಯಗೊಂಡಿದೆ" diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 56a6af28a27..9756477c245 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -172,8 +172,7 @@ "4G 이상" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "일출까지" "%s에" "%s까지" + "어두운 테마" "NFC" "NFC 사용 중지됨" "NFC 사용 설정됨" @@ -759,7 +759,7 @@ "왼쪽 아이콘" "오른쪽 아이콘" "길게 터치하고 드래그하여 타일 추가" - "길게 터치하고 드래그하여 타일을 다시 정렬" + "길게 터치하고 드래그하여 타일 재정렬" "여기로 드래그하여 삭제" "6개 이상의 타일이 필요합니다." "수정" @@ -850,7 +850,7 @@ "배터리" "스크린샷" "일반 메시지" - "저장공간" + "저장용량" "힌트" "인스턴트 앱" "%1$s 실행 중" diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 75308a5245b..69d9cf6f781 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -368,6 +368,7 @@ "Күн чыкканга чейин" "Саат %s күйөт" "%s чейин" + "Түнкү режим" "NFC" "NFC өчүрүлгөн" "NFC иштетилген" diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index b2103c8ce58..a68295bbe9b 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -368,6 +368,7 @@ "ຈົນກວ່າຕາເວັນຂຶ້ນ" "ເປີດຕອນ %s" "ຈົນກວ່າຈະຮອດ %s" + "ຮູບແບບສີສັນມືດ" "NFC" "NFC is disabled" "NFC is enabled" diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 28fa2c6d4ac..948e0a2b068 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -372,6 +372,7 @@ "Iki saulėtekio" "%s" "Iki %s" + "Tamsioji tema" "ALR" "ALR išjungtas" "ALR įjungtas" diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 77ff3b0eb20..1e898f02d07 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -370,6 +370,7 @@ "Līdz saullēktam" "Plkst. %s" "Līdz %s" + "Tumšais motīvs" "NFC" "NFC ir atspējoti" "NFC ir iespējoti" diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 985fa7b689d..b609273bf8c 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -368,6 +368,7 @@ "До изгрејсонце" "Ќе се вклучи во %s" "До %s" + "Темна тема" "NFC" "NFC е оневозможено" "NFC е овозможено" diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 25b4720b65b..292280e93c7 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "സൂര്യോദയം വരെ" "%s-ന്" "%s വരെ" + "ഇരുണ്ട തീം" "NFC" "NFC പ്രവർത്തനരഹിതമാക്കി" "NFC പ്രവർത്തനക്ഷമമാക്കി" diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index e414ea9e314..bd396399067 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -368,6 +368,7 @@ "Нар мандах хүртэл" "%s-д" "%s хүртэл" + "Бараан загвар" "NFC" "NFC-г цуцалсан" "NFC-г идэвхжүүлсэн" diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index a913a0095b9..7e0ae497ae1 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -172,8 +172,7 @@ "४G+" "LTE" "LTE+" - - + "५Ge" "5G" "5G+" "१X" @@ -369,6 +368,7 @@ "सूर्योदयापर्यंत" "%s वाजता चालू" "%s पर्यंत" + "गडद थीम" "NFC" "NFC अक्षम केले आहे" "NFC सक्षम केले आहे" diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 76472b6a909..e7ec94baa26 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -368,6 +368,7 @@ "Hingga matahari terbit" "Dihidupkan pada %s" "Hingga %s" + "Tema Gelap" "NFC" "NFC dilumpuhkan" "NFC didayakan" diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index ac9b5319502..81393309278 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -338,7 +338,7 @@ "Wi-Fi ချိတ်ဆက်ထားခြင်းမရှိပါ" "အလင်းတောက်ပမှု" "အလိုအလျောက်" - "အရောင်များ ပြောင်းပြန်လုပ်ရန်" + "အရောင်ပြောင်းပြန်" "အရောင် မှန်ကန်စေခြင်း အခြေအနေ" "နောက်ထပ် ဆက်တင်များ" "ပြီးပါပြီ" @@ -368,6 +368,7 @@ "နေထွက်ချိန် အထိ" "%s တွင် ဖွင့်ရန်" "%s အထိ" + "မှောင်သည့် အပြင်အဆင်" "NFC" "NFC ကို ပိတ်ထားသည်" "NFC ကို ဖွင့်ထားသည်" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index c35c3ece5de..d6b9530ba2d 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "Til soloppgang" "På kl. %s" "Til %s" + "Mørkt tema" "NFC" "NFC er slått av" "NFC er slått på" @@ -574,7 +574,7 @@ "Hurtiginnstillinger" "Statusrad" "Oversikt" - "Demomodus for systembrukergrensesnittet" + "Demomodus for systemgrensesnitt" "Slå på demo-modus" "Vis demo-modus" "Ethernet" @@ -759,7 +759,7 @@ "Venstre-ikon" "Høyre-ikon" "Hold og dra for å legge til ruter" - "Hold og dra for å endre rekkefølge for ruter" + "Hold og dra for å flytte på rutene" "Dra hit for å fjerne" "Du trenger minst seks ruter" "Endre" diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 98e1a96f38d..869b60b84d6 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "सूर्योदयसम्म" "%s मा सक्रिय" "%s सम्म" + "अँध्यारो विषयवस्तु" "NFC" "NFC लाई असक्षम पारिएको छ" "NFC लाई सक्षम पारिएको छ" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index d963138ae3a..8035f01ebac 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -368,6 +368,7 @@ "Tot zonsopgang" "Aan om %s" "Tot %s" + "Donker thema" "NFC" "NFC is uitgeschakeld" "NFC is ingeschakeld" @@ -512,7 +513,7 @@ "Sneller meldingen ontvangen" "Weergeven voordat u ontgrendelt" "Nee, bedankt" - "Configureren" + "Instellen" "%1$s. %2$s" "Nu uitschakelen" "Geluidsinstellingen" diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 65ac6c04d0d..9b7fed29274 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -119,7 +119,7 @@ "କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ" "ନିଶ୍ଚିତ କରନ୍ତୁ" "ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ" - "ଆଙ୍ଗୁଠି ଚିହ୍ନ ସେନସର୍‌କୁ ଛୁଅଁନ୍ତୁ" + "ଟିପଚିହ୍ନ ସେନସର୍‌କୁ ଛୁଅଁନ୍ତୁ" "ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍" "ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଛି…" "ମୁହଁ ଆଇକନ୍" @@ -368,6 +368,8 @@ "ସୂର୍ଯ୍ୟୋଦୟ ପର୍ଯ୍ୟନ୍ତ" "%sରେ ଅନ୍ ହେବ" "%s ପର୍ଯ୍ୟନ୍ତ" + + "NFC" "NFC ଅକ୍ଷମ କରାଯାଇଛି" "NFC ସକ୍ଷମ କରାଯାଇଛି" @@ -704,7 +706,7 @@ "ସମ୍ପ୍ରତି" "ଫେରନ୍ତୁ" "ବିଜ୍ଞପ୍ତି" - "କୀ\'ବୋର୍ଡ ଶର୍ଟକଟ୍" + "କୀ\'ବୋର୍ଡ ସର୍ଟକଟ୍" "କୀ\'ବୋର୍ଡ୍‍ର ଲେଆଉଟ୍‍କୁ ବଦଳାନ୍ତୁ" "ଆପ୍ଲିକେଶନ୍‌" "ସହାୟତା" diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 6a5c11d210d..018555c776f 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "ਸੂਰਜ ਚੜ੍ਹਨ ਤੱਕ" "%s ਵਜੇ ਚਾਲੂ" "%s ਤੱਕ" + "ਗੂੜ੍ਹਾ ਥੀਮ" "NFC" "NFC ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ" "NFC ਨੂੰ ਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index c42faae9182..02c4a4f3f9e 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -374,6 +374,7 @@ "Do wschodu słońca" "Włącz o %s" "Do %s" + "Ciemny motyw" "Komunikacja NFC" "Komunikacja NFC jest wyłączona" "Komunikacja NFC jest włączona" @@ -814,7 +815,7 @@ "Otwórz szybkie ustawienia." "Zamknij szybkie ustawienia." "Alarm ustawiony." - "Jesteś zalogowany jako %s" + "Zalogowany użytkownik: %s" "Brak internetu" "Otwórz szczegóły." "Niedostępne z powodu: %s" diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 1d3cf8d1022..4f12f4f7d40 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -368,6 +368,7 @@ "Até o nascer do sol" "Ativado às %s" "Até %s" + "Tema escuro" "NFC" "A NFC está desativada" "A NFC está ativada" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index e58de4f5548..44446ad6495 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -368,6 +368,7 @@ "Até ao amanhecer" "Ativada à(s) %s" "Até à(s) %s" + "Tema escuro" "NFC" "O NFC está desativado" "O NFC está ativado" @@ -888,7 +889,7 @@ "A Poupança de bateria é ativada automaticamente quando o nível de bateria está abaixo de %d%%." "Definições" "Compreendi" - "Cp ár. di. da. SysUI" + "Despejar pilha SysUI" "A aplicação %1$s está a utilizar o(a) %2$s." "As aplicações estão a utilizar o(a) %s." ", " diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 1d3cf8d1022..4f12f4f7d40 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -368,6 +368,7 @@ "Até o nascer do sol" "Ativado às %s" "Até %s" + "Tema escuro" "NFC" "A NFC está desativada" "A NFC está ativada" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 2837aa78ae4..b28a5d1642a 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -67,7 +67,7 @@ "Activați USB" "Zoom pt. a umple ecranul" "Înt. pt. a umple ecranul" - "Captură de ecran" + "Instantaneu" "Se salv. captura de ecran..." "Se salvează captura de ecran..." "Captură de ecran salvată" @@ -101,7 +101,7 @@ "Meniu" "Accesibilitate" "Rotiți ecranul" - "Vizualizare generală" + "Recente" "Căutați" "Cameră foto" "Telefon" @@ -211,7 +211,7 @@ "Setări rapide." "Ecranul de blocare." "Setări" - "Vizualizare generală" + "Recente" "Ecran de blocare pentru serviciu" "Închideți" "%1$s." @@ -370,6 +370,7 @@ "Până la răsărit" "Activată la %s" "Până la %s" + "Temă întunecată" "NFC" "Serviciul NFC este dezactivat" "Serviciul NFC este activat" diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 1236224f9c9..cbe6b580332 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -372,6 +372,7 @@ "До рассвета" "Включить в %s" "До %s" + "Тёмная тема" "Модуль NFC" "Модуль NFC отключен" "Модуль NFC включен" diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index bba9e797b9a..0513219144c 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -368,6 +368,7 @@ "හිරු නගින තෙක්" "%sට ක්‍රියාත්මකයි" "%s තෙක්" + "අඳුරු තේමාව" "NFC" "NFC අබලයි" "NFC සබලයි" diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index f38889ba16b..d5463dd6e9f 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -119,7 +119,7 @@ "Zrušiť" "Potvrdiť" "Skúsiť znova" - "Klepnite na senzor odtlačkov prstov" + "Dotknite sa senzora odtlačkov prstov" "Ikona odtlačku prsta" "Hľadáme vás…" "Ikona tváre" @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -373,6 +372,7 @@ "Do východu slnka" "Zapne sa o %s" "Do %s" + "Tmavý motív" "NFC" "NFC je deaktivované" "NFC je aktivované" @@ -882,7 +882,7 @@ "Nahradiť" "Aplikácie sú spustené na pozadí" "Klepnutím zobrazíte podrobnosti o batérii a spotrebe dát" - "Vypnúť mobilné dáta?" + "Chcete vypnúť mobilné dáta?" "Prostredníctvom operátora %s nebudete mať prístup k dátam ani internetu. Internet bude k dispozícii iba cez Wi-Fi." "váš operátor" "Nastavenia nemôžu overiť vašu odpoveď, pretože určitá aplikácia blokuje žiadosť o povolenie." @@ -914,7 +914,7 @@ "Otvoriť %1$s" "Nastavenia bublín aplikácie %1$s" "Povoliť bubliny z aplikácie %1$s?" - "Odmietnuť" + "Zamietnuť" "Povoliť" "Spýtať sa neskôr" "%1$s z aplikácie %2$s" diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index f8c3c9918d6..f06661fdd70 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -372,6 +372,7 @@ "Do sončnega vzhoda" "Vklop ob %s" "Do %s" + "Temna tema" "NFC" "Tehnologija NFC je onemogočena" "Tehnologija NFC je omogočena" diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 6cc23e2438c..54d294cef44 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "Deri në lindje të diellit" "Aktive në %s" "Deri në %s" + "Tema e errët" "NFC" "NFC është çaktivizuar" "NFC është aktivizuar" diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 8b1a6959329..e144f745888 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -370,6 +370,7 @@ "До изласка сунца" "Укључује се у %s" "До %s" + "Тамна тема" "NFC" "NFC је онемогућен" "NFC је омогућен" diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index b335402ed6c..4bb95cd4852 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -368,6 +368,7 @@ "Till soluppgången" "På från %s" "Till %s" + "Mörkt tema" "NFC" "NFC är inaktiverat" "NFC är aktiverat" diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 494dfc92dd7..5c1c561eacb 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -67,7 +67,7 @@ "Washa kipengele cha USB" "Kuza ili kujaza skrini" "Tanua ili kujaza skrini" - "Picha ya skrini" + "Pichaskrini" "Inahifadhi picha ya skrini..." "Inahifadhi picha ya skrini..." "Imehifadhi picha ya skrini" @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "Hadi macheo" "Itawashwa saa %s" "Hadi %s" + "Mandhari Meusi" "NFC" "NFC imezimwa" "NFC imewashwa" @@ -414,10 +414,10 @@ "Onyesha wasifu" "Ongeza mtumiaji" "Mtumiaji mpya" - "Aliyealikwa" + "Mgeni" "Ongeza mgeni" - "Ondoa aliyealikwa" - "Ungependa kumwondoa aliyealikwa?" + "Ondoa mgeni" + "Ungependa kumwondoa mgeni?" "Data na programu zote katika kipindi hiki zitafutwa." "Ondoa" "Karibu tena, mwalikwa!" @@ -425,7 +425,7 @@ "Anza tena" "Ndiyo, endelea" "Mtumiaji mgeni" - "Ili uweze kufuta programu na data, mwondoe mtumiaji aliyealikwa" + "Ili kufuta programu na data, mwondoe mtumiaji mgeni" "ONDOA MGENI" "Ondoa mtumiaji" "Mwondoe mtumiaji wa sasa" diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index c9b9dcad34e..df7f696288c 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -34,8 +34,7 @@ "உங்கள் சாதனத்துடன் வழங்கப்பட்ட சார்ஜரைப் பயன்படுத்தவும்" "அமைப்பு" "பேட்டரி சேமிப்பானை ஆன் செய்யவா?" - - + "பேட்டரி சேமிப்பான்- ஓர் அறிமுகம்" "இயக்கு" "பேட்டரி சேமிப்பானை ஆன் செய்" "அமைப்பு" @@ -64,10 +63,8 @@ "தற்போது இந்தச் சாதனத்தில் உள்நுழைந்துள்ள பயனரால் USB பிழைதிருத்தத்தை இயக்க முடியாது. இந்த அம்சத்தை இயக்க, முதன்மைப் பயனருக்கு மாறவும்." "USB போர்ட் முடக்கப்பட்டது" "தேவையற்றவையில் இருந்து உங்கள் சாதனத்தைப் பாதுகாக்க, USB போர்ட் முடக்கப்பட்டுள்ளது, மேலும் எந்த துணைக் கருவிகளையும் கண்டறியாது.\n\nUSB போர்ட்டை மீண்டும் எப்போது பாதுகாப்பாகப் பயன்படுத்தலாம் என்பதைப் பற்றி உங்களுக்குத் தெரிவிக்கப்படும்." - - - - + "சார்ஜர்களையும் துணைக்கருவிகளையும் கண்டறிவதற்காக USB போர்ட் இயக்கப்பட்டுள்ளது" + "USBயை இயக்கு" "திரையை நிரப்ப அளவை மாற்று" "திரையை நிரப்ப இழு" "ஸ்கிரீன்ஷாட்" @@ -114,8 +111,7 @@ "உங்கள் கைரேகையைப் பயன்படுத்தாமல் திறக்கவும்" "முகத்தை ஸ்கேன் செய்கிறது" "அனுப்பு" - - + "அறிவிப்புகளை நிர்வகிக்கும் பட்டன்" "திற" "ஃபோனைத் திற" "குரல் உதவியைத் திற" @@ -127,7 +123,7 @@ "கைரேகை ஐகான்" "உங்கள் முகத்தைத் தேடுகிறது…" "முக ஐகான்" - "பொருந்துமாறு அளவை மாற்றும் பொத்தான்." + "பொருந்துமாறு அளவை மாற்றும் பட்டன்." "சிறியதிலிருந்து பெரிய திரைக்கு அளவை மாற்றும்." "புளூடூத் இணைக்கப்பட்டது." "புளூடூத் துண்டிக்கப்பட்டது." @@ -176,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -188,8 +183,7 @@ "மொபைல் டேட்டா" "மொபைல் டேட்டா இயக்கப்பட்டது" "மொபைல் டேட்டா ஆஃப் செய்யப்பட்டது" - - + "தரவை உபயோகிக்க அமைக்கப்படவில்லை" "ஆஃப்" "புளூடூத் டெதெரிங்." "விமானப் பயன்முறை." @@ -231,12 +225,9 @@ "விமானப் பயன்முறை இயக்கப்பட்டது." "முழு அமைதி" "அலாரங்கள் மட்டும்" - - - - - - + "தொந்தரவு செய்ய வேண்டாம்." + "’தொந்தரவு செய்ய வேண்டாம்’ அம்சம் முடக்கப்பட்டது." + "’தொந்தரவு செய்ய வேண்டாம்’ அம்சம் இயக்கப்பட்டது." "புளூடூத்." "புளூடூத் முடக்கத்தில்." "புளூடூத் இயக்கத்தில்." @@ -300,8 +291,7 @@ "ஸ்கிரீன் சேவர்" "ஈதர்நெட்" "மேலும் விருப்பங்களைக் காண, ஐகான்களைத் தொட்டுப் பிடிக்கவும்" - - + "தொந்தரவு செய்ய வேண்டாம்" "முதன்மை மட்டும்" "அலாரங்கள் மட்டும்" "அறிவிப்புகள் வேண்டாம்" @@ -378,6 +368,7 @@ "காலை வரை" "%sக்கு ஆன் செய்" "%s வரை" + "டார்க் தீம்" "NFC" "NFC முடக்கப்பட்டது" "NFC இயக்கப்பட்டது" @@ -452,10 +443,8 @@ "பேட்டரி சேமிப்பான் ஆன் செய்யப்பட்டுள்ளது" "செயல்திறனையும் பின்புல டேட்டா உபயோகத்தையும் குறைக்கிறது" "பேட்டரி சேமிப்பானை ஆஃப் செய்" - - - - + "ரெக்கார்டிங் செய்யும்போதோ அலைபரப்பும்போதோ நீங்கள் இயக்கும் ஆடியோ, கடவுச்சொற்கள், கட்டணத் தகவல், படங்கள் மற்றும் மெசேஜ்கள் போன்றவற்றை %s ஆப்ஸால் படமெடுக்க இயலும்." + "அலைபரப்பும்போதோ ரெக்கார்டிங் செய்யும்போதோ தனிப்பட்ட விவரங்கள் அறியப்படும் வாய்ப்புள்ளது" "மீண்டும் காட்டாதே" "எல்லாவற்றையும் அழி" "அறிவிப்புகளை நிர்வகி" @@ -530,10 +519,8 @@ "ஒலி அமைப்புகள்" "விரிவாக்கு" "சுருக்கு" - - - - + "வசன உரைகளைத் தானாக எழுதும்" + "விரிவான வசனங்களுக்கான உதவிக்குறிப்பு" "வெளியீட்டுச் சாதனத்தை மாற்றுதல்" "திரை பொருத்தப்பட்டது" "பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்." @@ -647,10 +634,8 @@ "தொடர்ந்து விழிப்பூட்டு" "அறிவிப்புகளை முடக்கு" "இந்தப் பயன்பாட்டின் அறிவிப்புகளைத் தொடர்ந்து காட்டவா?" - - - - + "தடுக்கப்பட்ட அறிவிப்புகள் எங்கும் தோன்றாது, ஒலியும் எழுப்பாது. அமைப்புகளில் இதை மாற்றிக் கொள்ளலாம்." + "ஒலியில்லாத அறிவிப்புகள் பின்னணியில் காட்டப்படுகின்றன, இவை பூட்டுத் திரையிலோ பேனரிலோ காட்டப்படுவதில்லை. அவை ஒலியும் எழுப்பாது." "அறிவிப்பு டிராயரிலும், நிலைப் பட்டியிலும், பூட்டுத் திரையிலும் ஒலியுடன் அறிவிக்கப்படும்" "இந்த அறிவிப்புகளை ஆஃப் செய்ய முடியாது" "இந்த அறிவுப்புக் குழுக்களை இங்கே உள்ளமைக்க இயலாது" @@ -689,7 +674,7 @@ "சார்ஜ் செய்யும் போது பேட்டரி சேமிப்பானைப் பயன்படுத்த முடியாது" "பேட்டரி சேமிப்பான்" "செயல்திறனையும் பின்புலத்தில் தரவு செயலாக்கப்படுவதையும் குறைக்கும்" - "%1$s பொத்தான்" + "%1$s பட்டன்" "ஹோம்" "பேக்" "மேலே" @@ -732,11 +717,9 @@ "YouTube" "கேலெண்டர்" "ஒலிக் கட்டுப்பாடுகளுடன் காட்டு" - - + "தொந்தரவு செய்ய வேண்டாம்" "ஒலியளவுப் பொத்தான்களுக்கான ஷார்ட்கட்" - - + "ஒலியளவை அதிகரிப்பதன் மூலம் DND அம்சத்திலிருந்து வெளியேறு" "பேட்டரி" "கடிகாரம்" "ஹெட்செட்" @@ -750,8 +733,8 @@ "ஆஃப்" "வழிசெலுத்தல் பட்டி" "தளவமைப்பு" - "கூடுதல் இடப்புறப் பொத்தான் வகை" - "கூடுதல் வலப்புறப் பொத்தான் வகை" + "கூடுதல் இடப்புற பட்டன் வகை" + "கூடுதல் வலப்புற பட்டன் வகை" "(இயல்பு)" "கிளிப்போர்டு" @@ -768,9 +751,9 @@ "விசைப்பலகை மாற்றி" "சேமி" "மீட்டமை" - "பொத்தானின் அகலத்தை மாற்று" + "பட்டனின் அகலத்தை மாற்று" "கிளிப்போர்டு" - "தனிப்பயன் வழிசெலுத்தல் பொத்தான்" + "தனிப்பயன் வழிசெலுத்தல் பட்டன்" "இடப்புற விசைக்குறியீடு" "வலப்புற விசைக்குறியீடு" "இடப்புற ஐகான்" @@ -877,8 +860,7 @@ "உலாவிக்குச் செல்" "மொபைல் டேட்டா" "%1$s%2$s" - - + "%1$s, %2$s" "வைஃபை முடக்கத்தில் உள்ளது" "புளூடூத் முடக்கத்தில் உள்ளது" "\"தொந்தரவு செய்ய வேண்டாம்\" முடக்கத்தில் உள்ளது" @@ -918,30 +900,18 @@ "சென்சார்களை ஆஃப் செய்தல்" "சாதன சேவைகள்" "தலைப்பு இல்லை" - - + "தட்டுவதன் மூலம் இந்த ஆப்ஸை மீண்டும் தொடங்கலாம், முழுத்திரையில் பார்க்கலாம்." "%1$s ஆப்ஸைத் திறக்கும்" - - - - - - + "%1$s குமிழ்களுக்கான அமைப்புகள்" + "%1$s ஆப்ஸிலிருந்து குமிழ்களை அனுமதிக்கவா?" + "நிராகரி" "அனுமதி" - - - - - - - - - - - - - - - - + "பிறகு கேள்" + "%2$s இலிருந்து %1$s" + "%2$s மற்றும் மேலும் %3$d ஆப்ஸிலிருந்து வந்துள்ள அறிவிப்பு: %1$s" + "நகர்த்து" + "மேலே இடப்புறமாக நகர்த்து" + "மேலே வலப்புறமாக நகர்த்து" + "கீழே இடப்புறமாக நகர்த்து" + "கீழே வலதுபுறமாக நகர்த்து" diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index d87f11b7f1c..85893e725e2 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -307,7 +306,7 @@ "వినికిడి పరికరాలు" "ఆన్ చేస్తోంది…" "ప్రకాశం" - "స్వయంచాలకంగా తిప్పడం" + "ఆటో-రొటేట్‌" "స్క్రీన్ ఆటో-రొటేట్‌" "%s మోడ్" "తిప్పడం లాక్ చేయబడింది" @@ -339,7 +338,7 @@ "Wi‑Fi కనెక్ట్ కాలేదు" "ప్రకాశం" "ఆటోమేటిక్" - "రంగులను తారుమారు చేయి" + "రంగుల‌ను అటుఇటు మార్చు" "రంగు సవరణ మోడ్" "మరిన్ని సెట్టింగ్‌లు" "పూర్తయింది" @@ -369,6 +368,7 @@ "సూర్యోదయం వరకు" "%sకి" "%s వరకు" + "ముదురు రంగు థీమ్" "NFC" "NFC నిలిపివేయబడింది" "NFC ప్రారంభించబడింది" diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 98d45a19ebd..999348f12b4 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -368,6 +368,7 @@ "จนพระอาทิตย์ขึ้น" "เปิดเวลา %s" "จนถึง %s" + "ธีมสีเข้ม" "NFC" "NFC ถูกปิดใช้งาน" "เปิดใช้งาน NFC แล้ว" @@ -757,8 +758,8 @@ "Keycode ทางขวา" "ไอคอนทางซ้าย" "ไอคอนทางขวา" - "กดชิ้นส่วนค้างไว้แล้วลากไปเพื่อเพิ่ม" - "กดชิ้นส่วนค้างไว้แล้วลากไปเพื่อจัดลำดับใหม่" + "กดค้างแล้วลากเพื่อเพิ่มไทล์" + "กดไทล์ค้างไว้แล้วลากเพื่อจัดเรียงใหม่" "ลากมาที่นี่เพื่อนำออก" "คุณต้องมีชิ้นส่วนอย่างน้อย 6 ชิ้น" "แก้ไข" diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 5c5180c601b..608f439c394 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -368,6 +368,7 @@ "Hanggang sunrise" "Mao-on sa ganap na %s" "Hanggang %s" + "Madilim na Tema" "NFC" "Naka-disable ang NFC" "Naka-enable ang NFC" @@ -508,7 +509,7 @@ "Pinamamahalaan ng %1$s ang iyong profile sa trabaho. Nakakonekta ang profile sa %2$s, na maaaring sumubaybay sa aktibidad sa iyong network sa trabaho, kasama ang mga email, app, at website.\n\nNakakonekta ka rin sa %3$s, na maaaring sumubaybay sa aktibidad sa iyong personal na network." "Na-unlock para kay %1$s" "Gumagana ang %1$s" - "Mananatiling naka-lock ang device hanggang sa manu-mano mong i-unlock" + "Mananatiling naka-lock ang device hanggang sa manual mong i-unlock" "Kunin ang notification nang mas mabilis" "Tingnan ang mga ito bago ka mag-unlock" "Hindi" diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 3e39588b924..1876c2b8546 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -172,8 +172,7 @@ "4G+" "LTE" "LTE+" - - + "5Ge" "5G" "5G+" "1X" @@ -369,6 +368,7 @@ "Gün doğumuna kadar" "Şu saatte açılacak: %s" "Şu saate kadar: %s" + "Koyu Tema" "NFC" "NFC devre dışı" "NFC etkin" diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 5b66836daa5..75ff2b66447 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -372,6 +372,7 @@ "До сходу сонця" "Вмикається о %s" "До %s" + "Темна тема" "NFC" "NFC вимкнено" "NFC ввімкнено" diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 5205250397c..cd672724580 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -63,10 +63,8 @@ "‏اس آلہ پر فی الحال سائن ان کردہ صارف USB ڈیبگنگ آن نہیں کر سکتا۔ اس خصوصیت کا استعمال کرنے کیلئے، ابتدائی صارف پر سوئچ کریں۔" "‏USB پورٹ غیر فعال ہو گیا" "‏آپ کے آلے کی سیال یا دھول سے حفاظت کرنے کیلئے، USB پورٹ کو غیر فعال کر دیا گیا ہے اور یہ کسی لوازم کا پتہ نہیں لگا پائے گا۔\n\nUSB پورٹ کا دوبارہ استعمال کرنا محفوظ ہونے پر آپ کو مطلع کیا جائے گا۔" - - - - + "‏چارجرز اور لوازمات کا پتا لگانے کے لیے USB پورٹ فعال ہے" + "‏USB پورٹ فعال کریں" "پوری سکرین پر زوم کریں" "پوری سکرین پر پھیلائیں" "اسکرین شاٹ" @@ -113,8 +111,7 @@ "فنگر پرنٹ استعمال کیے بغیرغیر مقفل کریں" "اسکیننگ چہرہ" "بھیجیں" - - + "اطلاعات کا نظم کریں" "غیر مقفل کریں" "فون کھولیں" "صوتی معاون کھولیں" @@ -175,8 +172,7 @@ "4G+‎" "LTE" "LTE+‎" - - + "5Ge" "5G" "5G+‎" "1X‎" @@ -187,8 +183,7 @@ "موبائل ڈیٹا" "موبائل ڈیٹا آن ہے" "موبائل ڈیٹا آف ہے" - - + "ڈیٹا استعمال کرنے کے لیے سیٹ نہیں ہے" "آف ہے" "بلوٹوتھ ٹیدرنگ۔" "ہوائی جہاز وضع۔" @@ -230,12 +225,9 @@ "ہوائی جہاز وضع کو آن کر دیا گیا۔" "مکمل خاموشی" "صرف الارمز" - - - - - - + "\'ڈسٹرب نہ کریں\'۔" + "\'ڈسٹرب نہ کریں\' کو آف کر دیا گیا۔" + "\'ڈسٹرب نہ کریں\' کو آن کر دیا گیا۔" "بلوٹوتھ۔" "بلوٹوتھ آف ہے۔" "بلوٹوتھ آن ہے۔" @@ -299,8 +291,7 @@ "اسکرین سیور" "ایتھرنیٹ" "مزید اختیارات کے لیے آئیکنز کو ٹچ کریں اور دبائیں رکھیں" - - + "\'ڈسٹرب نہ کریں\'" "صرف ترجیحی" "صرف الارمز" "مکمل خاموشی" @@ -377,6 +368,7 @@ "طلوع آفتاب تک" "آن ہوگی بوقت %s" "%s تک" + "گہری تھیم" "NFC" "‏NFC غیر فعال ہے" "‏NFC فعال ہے" @@ -451,10 +443,8 @@ "بیٹری سیور آن ہے" "کارکردگی اور پس منظر کا ڈیٹا کم کر دیتا ہے" "بیٹری سیور آف کریں" - - - - + "ریکارڈ یا کاسٹ کرنے کے دوران، %s کوئی بھی حساس معلومات، جیسے کہ وہ آڈیو جسے آپ چلاتے ہیں اور آپ کے پاس ورڈز، ادائیگی کی معلومات، تصاویر اور پیغامات کو کیپچر کر سکتی ہے۔" + "کاسٹ/ریکارڈ کرنے کے دوران حساس معلومات کا افشاء کیا جا رہا ہے" "دوبارہ نہ دکھائیں" "سبھی کو صاف کریں" "نظم کریں" @@ -529,10 +519,8 @@ "صوتی ترتیبات" "پھیلائیں" "سکیڑیں" - - - - + "خودکار طور پر کیپشن میڈیا" + "کیپشنز کی تجویز بند کریں" "آؤٹ پٹ آلہ سوئچ کریں" "اسکرین پن کردہ ہے" "یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے پیچھے اور مجموعی جائزہ بٹنز کو ٹچ کریں اور دبائے رکھیں۔" @@ -646,10 +634,8 @@ "متنبہ کرنا جاری رکھیں" "اطلاعات کو آف کریں" "اس ایپ کی طرف سے اطلاعات دکھانا جاری رکھیں؟" - - - - + "مسدود کردہ اطلاعات کہیں دکھائی نہیں دیتی یا آواز نہیں چلاتی ہیں۔ آپ ترتیبات میں اطلاعات کو غیر مسدود کر سکتے ہیں۔" + "خاموش اطلاعات شیڈ میں ظاہر ہوتی ہیں، لیکن مقفل اسکرین پر ظاہر نہیں ہوتی ہیں، نہ بینر پیش کرتی ہیں یا نہ ہی آواز چلاتی ہیں۔" "یہ اطلاعات آواز پیدا کریں گی اور اطلاعاتی دراز، اسٹیٹس بار میں اور مقفل اسکرین پر ظاہر ہوں گی" "ان اطلاعات کو آف نہیں کیا جا سکتا" "اطلاعات کے اس گروپ کو یہاں کنفیگر نہیں کیا جا سکتا" @@ -731,11 +717,9 @@ "YouTube" "کیلنڈر" "والیوم کنٹرولز کے ساتھ دکھائیں" - - + "\'ڈسٹرب نہ کریں\'" "والیوم بٹنز کے شارٹ کٹ" - - + "والیوم بڑھانے پر \'ڈسٹرب نہ کریں\' سے باہر نکلیں" "بیٹری" "گھڑی" "ہیڈ سیٹ" @@ -766,7 +750,7 @@ "کی بورڈ سوئچر" "محفوظ کریں" - "دوبارہ ترتیب دیں" + "ری سیٹ کریں" "بٹن کی چوڑائی ایڈجسٹ کریں" "کلپ بورڈ" "حسب ضرورت نیویگیشن بٹن" @@ -876,8 +860,7 @@ "براؤزر پر جائیں" "موبائل ڈیٹا" "%1$s%2$s" - - + "%1$s، %2$s" "‏Wi-Fi آف ہے" "بلوٹوتھ آف ہے" "\'ڈسٹرب نہ کریں\' آف ہے" @@ -917,30 +900,18 @@ "سینسرز آف ہیں" "آلہ کی سروس" "کوئی عنوان نہیں ہے" - - + "یہ ایپ دوبارہ شروع کرنے کے لیے تھپتھپائیں اور پوری اسکرین پر جائیں۔" "%1$s کھولیں" - - - - - - + "%1$s بلبلوں کے لیے ترتیبات" + "%1$s کی جانب سے بلبلوں کو اجازت دیں؟" + "مسترد کریں" "اجازت دیں" - - - - - - - - - - - - - - - - + "مجھ سے بعد میں پوچھیں" + "%2$s کی جانب سے %1$s" + "%2$s اور %3$d مزید سے %1$s" + "منتقل کریں" + "اوپر بائیں جانب لے جائیں" + "اوپر دائیں جانب لے جائيں" + "نیچے بائیں جانب لے جائیں" + "نیچے دائیں جانب لے جائیں" diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 52253058468..c0f67b72f36 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -368,6 +368,7 @@ "Quyosh chiqqunicha" "%s da yoqish" "%s gacha" + "Tungi mavzu" "NFC" "NFC o‘chiq" "NFC yoniq" @@ -418,7 +419,7 @@ "Mehmon rejimini o‘chirish" "Mehmon hisobi o‘chirib tashlansinmi?" "Ushbu seansdagi barcha ilovalar va ma’lumotlar o‘chirib tashlanadi." - "O‘chirish" + "Olib tashlash" "Xush kelibsiz, mehmon!" "Seansni davom ettirmoqchimisiz?" "Boshidan boshlansin" @@ -682,7 +683,7 @@ "O‘ngga qaragan ko‘rsatkichli chiziq" "Markaziy ko‘rsatkichli chiziq" "Tab" - "Bo‘sh joy" + "Probel" "Enter" "Backspace" "Ijro/Pauza" @@ -705,12 +706,12 @@ "Orqaga" "Bildirishnomalar" "Tezkor tugmalar" - "Klaviatura sxemasini almashtirish" + "Klaviatura terilmasini almashtirish" "Ilovalar" "Yordamchi" "Brauzer" "Kontaktlar" - "E-pochta" + "Email" "SMS" "Musiqa" "YouTube" @@ -731,7 +732,7 @@ "Yoniq" "Yoqilmagan" "Navigatsiya paneli" - "Sxema" + "Tugmalar joylashuvi" "Qo‘shimcha Chapga tugmasi turi" "Qo‘shimcha O‘ngga tugmasi turi" "(standart)" @@ -789,7 +790,7 @@ "%1$d-joy, “%2$s” tugmasi. Tahrirlash uchun ustiga ikki marta bosing." "“%1$s” tugmasi. Qo‘shish uchun ustiga ikki marta bosing." "“%1$s” tugmasini ko‘chirish" - "“%1$s” tugmasini o‘chirish" + "%1$s tugmasini olib tashlash" "%2$d-joyga buni qo‘shish: %1$s" "%2$d-joyga buni ko‘chirish: %1$s" "Tezkor sozlamalar muharriri" @@ -871,7 +872,7 @@ "Almashtirish" "Fonda ishlayotgan ilovalar" "Batareya va trafik sarfi tafsilotlari uchun ustiga bosing" - "Mobil internet faolsizlantirilsinmi?" + "Mobil internet uzilsinmi?" "%s orqali internetdan foydalana olmaysiz. Internet faqat Wi-Fi orqali ishlaydi." "aloqa operatoringiz" "Ilova ruxsatnoma so‘roviga xalaqit qilayotgani tufayli, “Sozlamalar” ilovasi javobingizni tekshira olmaydi." diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 7c95e4e995a..3609932d333 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -45,7 +45,7 @@ "Thông báo" "Bluetooth được dùng làm điểm truy cập Internet" "Thiết lập phương thức nhập" - "Bàn phím thực" + "Bàn phím vật lý" "Cho phép %1$s truy cập %2$s?" "Cho phép %1$s truy cập %2$s?" "Mở %1$s để điều khiển %2$s?" @@ -368,6 +368,7 @@ "Cho đến khi trời sáng" "Bật vào lúc %s" "Cho đến %s" + "Giao diện tối" "NFC" "NFC đã được tắt" "NFC đã được bật" @@ -430,7 +431,7 @@ "Đăng xuất người dùng hiện tại" "ĐĂNG XUẤT NGƯỜI DÙNG" "Thêm người dùng mới?" - "Khi bạn thêm người dùng mới, người dùng đó cần thiết lập dung lượng lưu trữ của mình.\n\nMọi người dùng đều có thể cập nhật ứng dụng cho tất cả người dùng khác." + "Khi bạn thêm người dùng mới, họ cần thiết lập không gian của mình.\n\nMọi người dùng đều có thể cập nhật ứng dụng cho tất cả người dùng khác." "Đã đạt đến giới hạn người dùng" Bạn có thể thêm tối đa %d người dùng. diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 8f014d2a3f2..cc34f48bc71 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -368,6 +368,7 @@ "在日出时关闭" "在%s 开启" "直到%s" + "深色主题背景" "NFC" "NFC 已停用" "NFC 已启用" @@ -707,7 +708,7 @@ "键盘快捷键" "切换键盘布局" "应用" - "助手应用" + "助理" "浏览器" "通讯录" "电子邮件" diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index cdbea3d44b3..d235f6d2948 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -368,6 +368,7 @@ "在日出時關閉" "在%s開啟" "在%s關閉" + "深色主題背景" "NFC" "NFC 已停用" "NFC 已啟用" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index e0a4a50e1ad..b85d839c039 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -368,6 +368,7 @@ "於日出時關閉" "%s 開啟" "%s 關閉" + "深色主題" "NFC" "NFC 已停用" "NFC 已啟用" diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index c587f314b35..c77c5cd4879 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -368,6 +368,7 @@ "Kuze kube sekuphumeni kwelanga" "Kuvulwe ngo-%s" "Kuze kube ngu-%s" + "Itimu emnyama" "I-NFC" "I-NFC ikhutshaziwe" "I-NFC inikwe amandla" -- GitLab From 7e3b5255ef029cc3c27959050a47d04cf71d02c7 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 17 Apr 2019 16:19:49 -0700 Subject: [PATCH 058/473] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I4210f70423d97a8a3d8749056c94234e6376690b --- packages/VpnDialogs/res/values-iw/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/VpnDialogs/res/values-iw/strings.xml b/packages/VpnDialogs/res/values-iw/strings.xml index 55ac85f2c76..ebabd4e71ae 100644 --- a/packages/VpnDialogs/res/values-iw/strings.xml +++ b/packages/VpnDialogs/res/values-iw/strings.xml @@ -29,7 +29,7 @@ "‏%1$s מוגדרת כך שהיא לא מתנתקת אף פעם, אבל כרגע לא ניתן להתחבר. החיבור לאינטרנט יחזור רק כשהמכשיר יתחבר מחדש ל-VPN." " " "‏לשינוי של הגדרות ה-VPN" - "הגדר" + "הגדרה" "נתק" "לאפליקציה" "סגירה" -- GitLab From 3daa9f56b5c9a0005963f8cc8e8d68f507dfca39 Mon Sep 17 00:00:00 2001 From: Tarandeep Singh Date: Wed, 17 Apr 2019 15:31:51 -0700 Subject: [PATCH 059/473] Fix: Allow system IME to be disabled when another IME is available In P, pre-installed system IME could be disabled if an ASCII non-aux IME was available. With I1352bf42dcb9219a370a16a381ea39c43c57637a, system-IMEs could no longer be disabled. This was unintentional as the method name isValidSystemNonAuxAsciiCapableIme was incorrect and it wasn't checking isSystem() earlier. This change renames it to isValidNonAuxAsciiCapableIme and removes the system check in order to revert to original P behavior. Change-Id: If40de88ca0536a4446135047b6ccab64681675ec Fix: 124536147 Test: atest InputMethodPreferenceTest Test: atest InputMethodAndSubtypeUtilTest Test: Manually verified using steps in bug. --- .../InputMethodAndSubtypeUtil.java | 4 +- .../inputmethod/InputMethodPreference.java | 2 +- .../InputMethodSettingValuesWrapper.java | 16 +++---- .../InputMethodAndSubtypeUtilTest.java | 46 ++++++++----------- 4 files changed, 31 insertions(+), 37 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java index 057123bcd22..1712a6b67e2 100644 --- a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java +++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java @@ -419,8 +419,8 @@ public class InputMethodAndSubtypeUtil { return configurationLocale; } - public static boolean isValidSystemNonAuxAsciiCapableIme(InputMethodInfo imi) { - if (imi.isAuxiliaryIme() || !imi.isSystem()) { + public static boolean isValidNonAuxAsciiCapableIme(InputMethodInfo imi) { + if (imi.isAuxiliaryIme()) { return false; } final int subtypeCount = imi.getSubtypeCount(); diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java index 120acd3bcc5..55b6cda5548 100644 --- a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java @@ -125,7 +125,7 @@ public class InputMethodPreference extends RestrictedSwitchPreference implements } mInputMethodSettingValues = InputMethodSettingValuesWrapper.getInstance(context); mHasPriorityInSorting = imi.isSystem() - && InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(imi); + && InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(imi); setOnPreferenceClickListener(this); setOnPreferenceChangeListener(this); } diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java index b6786d424e6..13c1b823cb8 100644 --- a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java +++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java @@ -77,25 +77,25 @@ public class InputMethodSettingValuesWrapper { return true; } - final int enabledValidSystemNonAuxAsciiCapableImeCount = - getEnabledValidSystemNonAuxAsciiCapableImeCount(); + final int enabledValidNonAuxAsciiCapableImeCount = + getEnabledValidNonAuxAsciiCapableImeCount(); - return enabledValidSystemNonAuxAsciiCapableImeCount <= 1 - && !(enabledValidSystemNonAuxAsciiCapableImeCount == 1 && !isEnabled) + return enabledValidNonAuxAsciiCapableImeCount <= 1 + && !(enabledValidNonAuxAsciiCapableImeCount == 1 && !isEnabled) && imi.isSystem() - && InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(imi); + && InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(imi); } - private int getEnabledValidSystemNonAuxAsciiCapableImeCount() { + private int getEnabledValidNonAuxAsciiCapableImeCount() { int count = 0; final List enabledImis = getEnabledInputMethodList(); for (final InputMethodInfo imi : enabledImis) { - if (InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(imi)) { + if (InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(imi)) { ++count; } } if (count == 0) { - Log.w(TAG, "No \"enabledValidSystemNonAuxAsciiCapableIme\"s found."); + Log.w(TAG, "No \"enabledValidNonAuxAsciiCapableIme\"s found."); } return count; } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java index 84606b4e450..5171dda9bff 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java @@ -192,53 +192,47 @@ public class InputMethodAndSubtypeUtilTest { } @Test - public void isValidSystemNonAuxAsciiCapableIme() { - // System IME w/ no subtype - assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme( - createDummyIme(true, false))) + public void isValidNonAuxAsciiCapableIme() { + // IME w/ no subtype + assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme( + createDummyIme(false))) .isFalse(); - // System IME w/ non-Aux and non-ASCII-capable "keyboard" subtype - assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme( - createDummyIme(true, false, createDummySubtype("keyboard", false, false)))) + // IME w/ non-Aux and non-ASCII-capable "keyboard" subtype + assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme( + createDummyIme(false, createDummySubtype("keyboard", false, false)))) .isFalse(); - // System IME w/ non-Aux and ASCII-capable "keyboard" subtype - assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme( - createDummyIme(true, false, createDummySubtype("keyboard", false, true)))) + // IME w/ non-Aux and ASCII-capable "keyboard" subtype + assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme( + createDummyIme(false, createDummySubtype("keyboard", false, true)))) .isTrue(); - // System IME w/ Aux and ASCII-capable "keyboard" subtype - assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme( - createDummyIme(true, true, createDummySubtype("keyboard", true, true)))) + // IME w/ Aux and ASCII-capable "keyboard" subtype + assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme( + createDummyIme(true, createDummySubtype("keyboard", true, true)))) .isFalse(); - // System IME w/ non-Aux and ASCII-capable "voice" subtype - assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme( - createDummyIme(true, false, createDummySubtype("voice", false, true)))) + // IME w/ non-Aux and ASCII-capable "voice" subtype + assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme( + createDummyIme(false, createDummySubtype("voice", false, true)))) .isFalse(); - // System IME w/ non-Aux and non-ASCII-capable subtype + Non-Aux and ASCII-capable subtype - assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme( - createDummyIme(true, false, + // IME w/ non-Aux and non-ASCII-capable subtype + Non-Aux and ASCII-capable subtype + assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme( + createDummyIme(false, createDummySubtype("keyboard", false, true), createDummySubtype("keyboard", false, false)))) .isTrue(); - - // Non-system IME w/ non-Aux and ASCII-capable "keyboard" subtype - assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme( - createDummyIme(false, false, createDummySubtype("keyboard", false, true)))) - .isFalse(); } - private static InputMethodInfo createDummyIme(boolean isSystem, boolean isAuxIme, + private static InputMethodInfo createDummyIme(boolean isAuxIme, InputMethodSubtype... subtypes) { final ResolveInfo ri = new ResolveInfo(); final ServiceInfo si = new ServiceInfo(); final ApplicationInfo ai = new ApplicationInfo(); ai.packageName = "com.example.android.dummyime"; ai.enabled = true; - ai.flags |= (isSystem ? ApplicationInfo.FLAG_SYSTEM : 0); si.applicationInfo = ai; si.enabled = true; si.packageName = "com.example.android.dummyime"; -- GitLab From 6378402da1bb98de4fb6e140b0f5b0d42d25bd99 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 17 Apr 2019 10:39:42 -0600 Subject: [PATCH 060/473] Canonicalize default ringtones. Bug: 130445562 Test: atest --test-mapping packages/providers/MediaProvider Change-Id: Ia4dee2f5596147ac50b2393fccb8516cc43b0102 --- core/java/android/content/ContentResolver.java | 6 ++++++ media/java/android/media/RingtoneManager.java | 3 +-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 00f1e43c849..5f34f1b2bc0 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -981,6 +981,12 @@ public abstract class ContentResolver implements ContentInterface { } } + /** {@hide} */ + public final @NonNull Uri canonicalizeOrElse(@NonNull Uri uri) { + final Uri res = canonicalize(uri); + return (res != null) ? res : uri; + } + /** * Transform the given url to a canonical representation of * its referenced resource, which can be used across devices, persisted, diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java index e207721f191..77f756baa1f 100644 --- a/media/java/android/media/RingtoneManager.java +++ b/media/java/android/media/RingtoneManager.java @@ -502,8 +502,7 @@ public class RingtoneManager { private static Uri getUriFromCursor(Context context, Cursor cursor) { final Uri uri = ContentUris.withAppendedId(Uri.parse(cursor.getString(URI_COLUMN_INDEX)), cursor.getLong(ID_COLUMN_INDEX)); - final Uri canonicalized = context.getContentResolver().canonicalize(uri); - return (canonicalized != null) ? canonicalized : uri; + return context.getContentResolver().canonicalizeOrElse(uri); } /** -- GitLab From 0a069df47fae4f52158de20e4c44a96023a5e618 Mon Sep 17 00:00:00 2001 From: Tim Murray Date: Wed, 10 Apr 2019 15:48:37 -0700 Subject: [PATCH 061/473] DO NOT MERGE: disable iorap in q iorap is not shipping in Q. Test: boots, works bug 72170747 Change-Id: Iabc63f880df24781fa9c6e0f4532a8f37c8d89d5 --- services/java/com/android/server/SystemServer.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 0cd730b68c7..2b86046f3b3 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -32,7 +32,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; -import android.content.pm.PackageManagerInternal; import android.content.res.Configuration; import android.content.res.Resources.Theme; import android.database.sqlite.SQLiteCompatibilityWalFlags; @@ -159,8 +158,6 @@ import com.android.server.wm.WindowManagerService; import dalvik.system.VMRuntime; -import com.google.android.startop.iorap.IorapForwardingService; - import java.io.File; import java.io.IOException; import java.util.Locale; @@ -1073,10 +1070,6 @@ public final class SystemServer { mSystemServiceManager.startService(PinnerService.class); traceEnd(); - traceBeginAndSlog("IorapForwardingService"); - mSystemServiceManager.startService(IorapForwardingService.class); - traceEnd(); - traceBeginAndSlog("SignedConfigService"); SignedConfigService.registerUpdateReceiver(mSystemContext); traceEnd(); -- GitLab From 676d42d9832b91ad064fdce3fcc0b277e42c5c7d Mon Sep 17 00:00:00 2001 From: Tim Murray Date: Wed, 13 Feb 2019 20:47:46 -0800 Subject: [PATCH 062/473] psi support for low memory detection inside ActivityManagerService Add LowMemDetector class and use it in ActivityManagerService to detect memory conditions based on in-kernel psi monitors. Test: boots, detects low memory Bug: 129476847 Change-Id: I7a05ba36196d24ce5147b97c076e38b92dc71e2e Signed-off-by: Tim Murray Signed-off-by: Suren Baghdasaryan --- .../server/am/ActivityManagerService.java | 37 +++-- .../com/android/server/am/LowMemDetector.java | 92 +++++++++++ services/core/jni/Android.bp | 2 + .../com_android_server_am_LowMemDetector.cpp | 156 ++++++++++++++++++ services/core/jni/onload.cpp | 2 + .../tests/mockingservicestests/Android.bp | 1 + services/tests/servicestests/Android.bp | 1 + 7 files changed, 276 insertions(+), 15 deletions(-) create mode 100644 services/core/java/com/android/server/am/LowMemDetector.java create mode 100644 services/core/jni/com_android_server_am_LowMemDetector.cpp diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 3b6b404170c..9bc5c59dd35 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -544,6 +544,7 @@ public class ActivityManagerService extends IActivityManager.Stub private static final int NATIVE_DUMP_TIMEOUT_MS = 2000; // 2 seconds; final OomAdjuster mOomAdjuster; + final LowMemDetector mLowMemDetector; /** All system services */ SystemServiceManager mSystemServiceManager; @@ -2296,6 +2297,7 @@ public class ActivityManagerService extends IActivityManager.Stub ? new ActivityManagerConstants(mContext, this, mHandler) : null; final ActiveUids activeUids = new ActiveUids(this, false /* postChangesToAtm */); mProcessList.init(this, activeUids); + mLowMemDetector = null; mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids); mIntentFirewall = hasHandlerThread @@ -2344,6 +2346,7 @@ public class ActivityManagerService extends IActivityManager.Stub mConstants = new ActivityManagerConstants(mContext, this, mHandler); final ActiveUids activeUids = new ActiveUids(this, true /* postChangesToAtm */); mProcessList.init(this, activeUids); + mLowMemDetector = new LowMemDetector(this); mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids); // Broadcast policy parameters @@ -16523,25 +16526,29 @@ public class ActivityManagerService extends IActivityManager.Stub final boolean updateLowMemStateLocked(int numCached, int numEmpty, int numTrimming) { final int N = mProcessList.getLruSizeLocked(); final long now = SystemClock.uptimeMillis(); - // Now determine the memory trimming level of background processes. - // Unfortunately we need to start at the back of the list to do this - // properly. We only do this if the number of background apps we - // are managing to keep around is less than half the maximum we desire; - // if we are keeping a good number around, we'll let them use whatever - // memory they want. - final int numCachedAndEmpty = numCached + numEmpty; int memFactor; - if (numCached <= mConstants.CUR_TRIM_CACHED_PROCESSES + if (mLowMemDetector != null && mLowMemDetector.isAvailable()) { + memFactor = mLowMemDetector.getMemFactor(); + } else { + // Now determine the memory trimming level of background processes. + // Unfortunately we need to start at the back of the list to do this + // properly. We only do this if the number of background apps we + // are managing to keep around is less than half the maximum we desire; + // if we are keeping a good number around, we'll let them use whatever + // memory they want. + if (numCached <= mConstants.CUR_TRIM_CACHED_PROCESSES && numEmpty <= mConstants.CUR_TRIM_EMPTY_PROCESSES) { - if (numCachedAndEmpty <= ProcessList.TRIM_CRITICAL_THRESHOLD) { - memFactor = ProcessStats.ADJ_MEM_FACTOR_CRITICAL; - } else if (numCachedAndEmpty <= ProcessList.TRIM_LOW_THRESHOLD) { - memFactor = ProcessStats.ADJ_MEM_FACTOR_LOW; + final int numCachedAndEmpty = numCached + numEmpty; + if (numCachedAndEmpty <= ProcessList.TRIM_CRITICAL_THRESHOLD) { + memFactor = ProcessStats.ADJ_MEM_FACTOR_CRITICAL; + } else if (numCachedAndEmpty <= ProcessList.TRIM_LOW_THRESHOLD) { + memFactor = ProcessStats.ADJ_MEM_FACTOR_LOW; + } else { + memFactor = ProcessStats.ADJ_MEM_FACTOR_MODERATE; + } } else { - memFactor = ProcessStats.ADJ_MEM_FACTOR_MODERATE; + memFactor = ProcessStats.ADJ_MEM_FACTOR_NORMAL; } - } else { - memFactor = ProcessStats.ADJ_MEM_FACTOR_NORMAL; } // We always allow the memory level to go up (better). We only allow it to go // down if we are in a state where that is allowed, *and* the total number of processes diff --git a/services/core/java/com/android/server/am/LowMemDetector.java b/services/core/java/com/android/server/am/LowMemDetector.java new file mode 100644 index 00000000000..e82a207cdd5 --- /dev/null +++ b/services/core/java/com/android/server/am/LowMemDetector.java @@ -0,0 +1,92 @@ +/* + * 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.am; + +import com.android.internal.annotations.GuardedBy; + +/** + * Detects low memory using PSI. + * + * If the kernel doesn't support PSI, then this class is not available. + */ +public final class LowMemDetector { + private static final String TAG = "LowMemDetector"; + private final ActivityManagerService mAm; + private final LowMemThread mLowMemThread; + private boolean mAvailable; + + private final Object mPressureStateLock = new Object(); + + @GuardedBy("mPressureStateLock") + private int mPressureState = MEM_PRESSURE_NONE; + + /* getPressureState return values */ + public static final int MEM_PRESSURE_NONE = 0; + public static final int MEM_PRESSURE_LOW = 1; + public static final int MEM_PRESSURE_MEDIUM = 2; + public static final int MEM_PRESSURE_HIGH = 3; + + LowMemDetector(ActivityManagerService am) { + mAm = am; + mLowMemThread = new LowMemThread(); + if (init() != 0) { + mAvailable = false; + } else { + mAvailable = true; + mLowMemThread.start(); + } + } + + public boolean isAvailable() { + return mAvailable; + } + + /** + * Returns the current mem factor. + * Note that getMemFactor returns LowMemDetector.MEM_PRESSURE_XXX + * which match ProcessStats.ADJ_MEM_FACTOR_XXX values. If they deviate + * there should be conversion performed here to translate pressure state + * into memFactor. + */ + public int getMemFactor() { + synchronized (mPressureStateLock) { + return mPressureState; + } + } + + private native int init(); + private native int waitForPressure(); + + private final class LowMemThread extends Thread { + public void run() { + + while (true) { + // sleep waiting for a PSI event + int newPressureState = waitForPressure(); + if (newPressureState == -1) { + // epoll broke, tear this down + mAvailable = false; + break; + } + // got a PSI event? let's update lowmem info + synchronized (mPressureStateLock) { + mPressureState = newPressureState; + } + } + } + } +} diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index e1318af3230..62184986959 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -51,6 +51,7 @@ cc_library_static { "com_android_server_PersistentDataBlockService.cpp", "com_android_server_GraphicsStatsService.cpp", "com_android_server_am_AppCompactor.cpp", + "com_android_server_am_LowMemDetector.cpp", "onload.cpp", ":lib_networkStatsFactory_native", ], @@ -104,6 +105,7 @@ cc_defaults { "libbpf_android", "libnetdbpf", "libnetdutils", + "libpsi", "android.hardware.audio.common@2.0", "android.hardware.broadcastradio@1.0", "android.hardware.broadcastradio@1.1", diff --git a/services/core/jni/com_android_server_am_LowMemDetector.cpp b/services/core/jni/com_android_server_am_LowMemDetector.cpp new file mode 100644 index 00000000000..e41de4d5d3c --- /dev/null +++ b/services/core/jni/com_android_server_am_LowMemDetector.cpp @@ -0,0 +1,156 @@ +/** +** Copyright 2019, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +#define LOG_TAG "LowMemDetector" + +#include +#include +#include +#include + +#include +#include +#include + +namespace android { + +enum pressure_levels { + PRESSURE_NONE, + PRESSURE_LOW, + PRESSURE_MEDIUM, + PRESSURE_HIGH, + PRESSURE_LEVEL_COUNT = PRESSURE_HIGH +}; + +// amount of stall in us for each level +static constexpr int PSI_LOW_STALL_US = 15000; +static constexpr int PSI_MEDIUM_STALL_US = 30000; +static constexpr int PSI_HIGH_STALL_US = 50000; + +// stall tracking window size in us +static constexpr int PSI_WINDOW_SIZE_US = 1000000; + +static int psi_epollfd = -1; + +static jint android_server_am_LowMemDetector_init(JNIEnv*, jobject) { + int epollfd; + int low_psi_fd; + int medium_psi_fd; + int high_psi_fd; + + epollfd = epoll_create(PRESSURE_LEVEL_COUNT); + if (epollfd == -1) { + ALOGE("epoll_create failed: %s", strerror(errno)); + return -1; + } + + low_psi_fd = init_psi_monitor(PSI_SOME, PSI_LOW_STALL_US, PSI_WINDOW_SIZE_US); + if (low_psi_fd < 0 || + register_psi_monitor(epollfd, low_psi_fd, (void*)PRESSURE_LOW) != 0) { + goto low_fail; + } + + medium_psi_fd = + init_psi_monitor(PSI_FULL, PSI_MEDIUM_STALL_US, PSI_WINDOW_SIZE_US); + if (medium_psi_fd < 0 || register_psi_monitor(epollfd, medium_psi_fd, + (void*)PRESSURE_MEDIUM) != 0) { + goto medium_fail; + } + + high_psi_fd = + init_psi_monitor(PSI_FULL, PSI_HIGH_STALL_US, PSI_WINDOW_SIZE_US); + if (high_psi_fd < 0 || + register_psi_monitor(epollfd, high_psi_fd, (void*)PRESSURE_HIGH) != 0) { + goto high_fail; + } + + psi_epollfd = epollfd; + return 0; + +high_fail: + unregister_psi_monitor(epollfd, medium_psi_fd); +medium_fail: + unregister_psi_monitor(epollfd, low_psi_fd); +low_fail: + ALOGE("Failed to register psi trigger"); + close(epollfd); + return -1; +} + +static jint android_server_am_LowMemDetector_waitForPressure(JNIEnv*, jobject) { + static uint32_t pressure_level = PRESSURE_NONE; + struct epoll_event events[PRESSURE_LEVEL_COUNT]; + int nevents = 0; + + if (psi_epollfd < 0) { + ALOGE("Memory pressure detector is not initialized"); + return -1; + } + + do { + if (pressure_level == PRESSURE_NONE) { + /* Wait for events with no timeout */ + nevents = epoll_wait(psi_epollfd, events, PRESSURE_LEVEL_COUNT, -1); + } else { + // This is simpler than lmkd. Assume that the memory pressure + // state will stay high for at least 1s. Within that 1s window, + // the memory pressure state can go up due to a different FD + // becoming available or it can go down when that window expires. + // Accordingly, there's no polling: just epoll_wait with a 1s timeout. + nevents = epoll_wait(psi_epollfd, events, PRESSURE_LEVEL_COUNT, 1000); + if (nevents == 0) { + pressure_level = PRESSURE_NONE; + return pressure_level; + } + } + // keep waiting if interrupted + } while (nevents == -1 && errno == EINTR); + + if (nevents == -1) { + ALOGE("epoll_wait failed while waiting for psi events: %s", strerror(errno)); + return -1; + } + + // reset pressure_level and raise it based on received events + pressure_level = PRESSURE_NONE; + for (int i = 0; i < nevents; i++) { + if (events[i].events & (EPOLLERR | EPOLLHUP)) { + // should never happen unless psi got disabled in kernel + ALOGE("Memory pressure events are not available anymore"); + return -1; + } + // record the highest reported level + if (events[i].data.u32 > pressure_level) { + pressure_level = events[i].data.u32; + } + } + + return pressure_level; +} + +static const JNINativeMethod sMethods[] = { + /* name, signature, funcPtr */ + {"init", "()I", (void*)android_server_am_LowMemDetector_init}, + {"waitForPressure", "()I", + (void*)android_server_am_LowMemDetector_waitForPressure}, +}; + +int register_android_server_am_LowMemDetector(JNIEnv* env) { + return jniRegisterNativeMethods(env, "com/android/server/am/LowMemDetector", + sMethods, NELEM(sMethods)); +} + +} // namespace android diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp index cce96ff5f43..efffa6ca735 100644 --- a/services/core/jni/onload.cpp +++ b/services/core/jni/onload.cpp @@ -56,6 +56,7 @@ int register_android_server_net_NetworkStatsFactory(JNIEnv* env); int register_android_server_net_NetworkStatsService(JNIEnv* env); int register_android_server_security_VerityUtils(JNIEnv* env); int register_android_server_am_AppCompactor(JNIEnv* env); +int register_android_server_am_LowMemDetector(JNIEnv* env); }; using namespace android; @@ -105,5 +106,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) register_android_server_net_NetworkStatsService(env); register_android_server_security_VerityUtils(env); register_android_server_am_AppCompactor(env); + register_android_server_am_LowMemDetector(env); return JNI_VERSION_1_4; } diff --git a/services/tests/mockingservicestests/Android.bp b/services/tests/mockingservicestests/Android.bp index 782196dc004..2baa4d81515 100644 --- a/services/tests/mockingservicestests/Android.bp +++ b/services/tests/mockingservicestests/Android.bp @@ -34,6 +34,7 @@ android_test { jni_libs: [ "libdexmakerjvmtiagent", + "libpsi", "libstaticjvmtiagent", ], diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp index 4ee9551542b..1522a60850a 100644 --- a/services/tests/servicestests/Android.bp +++ b/services/tests/servicestests/Android.bp @@ -69,6 +69,7 @@ android_test { "liblog", "liblzma", "libnativehelper", + "libpsi", "libui", "libunwindstack", "libutils", -- GitLab From 79c9767d4170451a2d7acef04357bee4e083cf89 Mon Sep 17 00:00:00 2001 From: "yj81.kwon" Date: Tue, 16 Apr 2019 19:44:48 -0700 Subject: [PATCH 063/473] [wm]: ensure task positioner controller is always cleaned up If freeform windowing app is killed while moving, future touch action does not work. TaskPositioner state is not reset properly. So InputChannel for positioning a task consumes all touch event. Finish task positioning when calling session process is killed. Test: manual - Kill freefrom windowing task process while dragging it Test: atest WmTests:TaskPositionerTests Bug: 129492888 Change-Id: I7eb392d6d87a118dd85e7d752eaabfe600920794 (cherry picked from commit 70fe14b649461d9632f24db844b6054879df60b9) --- .../com/android/server/wm/TaskPositioner.java | 21 +++++++++++++++++-- .../server/wm/TaskPositionerTests.java | 15 +++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java index 7714458bb16..7f1b4c0d0dd 100644 --- a/services/core/java/com/android/server/wm/TaskPositioner.java +++ b/services/core/java/com/android/server/wm/TaskPositioner.java @@ -34,6 +34,7 @@ import android.app.IActivityTaskManager; import android.graphics.Point; import android.graphics.Rect; import android.os.Binder; +import android.os.IBinder; import android.os.Looper; import android.os.Process; import android.os.RemoteException; @@ -56,7 +57,7 @@ import com.android.internal.annotations.VisibleForTesting; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -class TaskPositioner { +class TaskPositioner implements IBinder.DeathRecipient { private static final boolean DEBUG_ORIENTATION_VIOLATIONS = false; private static final String TAG_LOCAL = "TaskPositioner"; private static final String TAG = TAG_WITH_CLASS_NAME ? TAG_LOCAL : TAG_WM; @@ -116,7 +117,9 @@ class TaskPositioner { private float mStartDragY; @CtrlType private int mCtrlType = CTRL_NONE; - private boolean mDragEnded = false; + @VisibleForTesting + boolean mDragEnded; + private IBinder mClientCallback; InputChannel mServerChannel; InputChannel mClientChannel; @@ -346,6 +349,7 @@ class TaskPositioner { } mDisplayContent.resumeRotationLocked(); mDisplayContent = null; + mClientCallback.unlinkToDeath(this, 0 /* flags */); } void startDrag(WindowState win, boolean resize, boolean preserveOrientation, float startX, @@ -355,6 +359,14 @@ class TaskPositioner { + ", preserveOrientation=" + preserveOrientation + ", {" + startX + ", " + startY + "}"); } + try { + mClientCallback = win.mClient.asBinder(); + mClientCallback.linkToDeath(this, 0 /* flags */); + } catch (RemoteException e) { + // The caller has died, so clean up TaskPositioningController. + mService.mTaskPositioningController.finishTaskPositioning(); + return; + } mTask = win.getTask(); // Use the bounds of the task which accounts for // multiple app windows. Don't use any bounds from win itself as it @@ -651,6 +663,11 @@ class TaskPositioner { return sFactory.create(service); } + @Override + public void binderDied() { + mService.mTaskPositioningController.finishTaskPositioning(); + } + interface Factory { default TaskPositioner create(WindowManagerService service) { return new TaskPositioner(service); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java index 9cdb465dc44..df55b39b081 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java @@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wm.TaskPositioner.MIN_ASPECT; import static com.android.server.wm.WindowManagerService.dipToPixel; import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_HEIGHT_IN_DP; @@ -29,6 +30,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import android.app.IActivityTaskManager; import android.graphics.Rect; @@ -37,6 +40,7 @@ import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; +import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; import org.junit.After; @@ -494,4 +498,15 @@ public class TaskPositionerTests extends WindowTestsBase { assertEquals("top", expected.top, actual.top); assertEquals("bottom", expected.bottom, actual.bottom); } + + @FlakyTest(bugId = 129492888) + @Test + public void testFinishingMovingWhenBinderDied() { + spyOn(mWm.mTaskPositioningController); + + mPositioner.startDrag(mWindow, false, false, 0 /* startX */, 0 /* startY */); + verify(mWm.mTaskPositioningController, never()).finishTaskPositioning(); + mPositioner.binderDied(); + verify(mWm.mTaskPositioningController).finishTaskPositioning(); + } } -- GitLab From 859f2c84af4f20ac6083de30353b3ace41af87b0 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 17 Apr 2019 18:30:00 -0700 Subject: [PATCH 064/473] Indicate that a TrustAgent kept the phone unlocked Fixes: 130326679 Test: manual with SmartLock Change-Id: Ic5bb8608313498f2608890eac5c226db06c20ac7 --- packages/SystemUI/res/values/strings.xml | 5 +---- .../systemui/statusbar/KeyguardIndicationController.java | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 444cabfcc50..ab096527d21 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1290,10 +1290,7 @@ activity. - Unlocked for %1$s - - - %1$s is running + Kept unlocked by TrustAgent Device will stay locked until you manually unlock diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 3441591e03f..25436a9ad45 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -236,8 +236,8 @@ public class KeyguardIndicationController implements StateListener { * * @return {@code null} or an empty string if a trust indication text should not be shown. */ - protected String getTrustGrantedIndication() { - return null; + private String getTrustGrantedIndication() { + return mContext.getString(R.string.keyguard_indication_trust_unlocked); } /** @@ -245,7 +245,7 @@ public class KeyguardIndicationController implements StateListener { * * @return {@code null} or an empty string if a trust managed text should not be shown. */ - protected String getTrustManagedIndication() { + private String getTrustManagedIndication() { return null; } -- GitLab From 26874a2af1ddd3f7dd2b2c01cc405871b88aa300 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 17 Apr 2019 21:30:47 -0600 Subject: [PATCH 065/473] Start bringing back legacy storage tests. When APKs ask for the legacy storage world, we need the old tests to verify they get the access they've been granted. (For example, an app only granted READ_EXTERNAL_STORAGE, etc.) Bug: 130619210, 130566083 Test: atest android.appsecurity.cts.ExternalStorageHostTest Change-Id: I943a7ea7ed6cb6728ec3bceb16edf1b2a7ad9b36 --- .../android/server/StorageManagerService.java | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 6c57b6504fb..ce1d33a06f8 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -25,10 +25,6 @@ import static android.app.AppOpsManager.OP_LEGACY_STORAGE; import static android.app.AppOpsManager.OP_READ_EXTERNAL_STORAGE; import static android.app.AppOpsManager.OP_REQUEST_INSTALL_PACKAGES; import static android.app.AppOpsManager.OP_WRITE_EXTERNAL_STORAGE; -import static android.content.pm.PackageManager.GET_PERMISSIONS; -import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; -import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; -import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.ParcelFileDescriptor.MODE_READ_WRITE; import static android.os.storage.OnObbStateChangeListener.ERROR_ALREADY_MOUNTED; @@ -40,11 +36,9 @@ import static android.os.storage.OnObbStateChangeListener.ERROR_PERMISSION_DENIE import static android.os.storage.OnObbStateChangeListener.MOUNTED; import static android.os.storage.OnObbStateChangeListener.UNMOUNTED; -import static com.android.internal.util.XmlUtils.readBooleanAttribute; import static com.android.internal.util.XmlUtils.readIntAttribute; import static com.android.internal.util.XmlUtils.readLongAttribute; import static com.android.internal.util.XmlUtils.readStringAttribute; -import static com.android.internal.util.XmlUtils.writeBooleanAttribute; import static com.android.internal.util.XmlUtils.writeIntAttribute; import static com.android.internal.util.XmlUtils.writeLongAttribute; import static com.android.internal.util.XmlUtils.writeStringAttribute; @@ -69,7 +63,6 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.IPackageMoveObserver; -import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.ProviderInfo; @@ -3733,15 +3726,12 @@ class StorageManagerService extends IStorageManager.Stub uid, packageName, READ_EXTERNAL_STORAGE, OP_READ_EXTERNAL_STORAGE); final boolean hasWrite = StorageManager.checkPermissionAndCheckOp(mContext, false, 0, uid, packageName, WRITE_EXTERNAL_STORAGE, OP_WRITE_EXTERNAL_STORAGE); - // STOPSHIP: remove this temporary hack once we have dynamic runtime - // permissions fully enabled again - final boolean hasStorage = hasRead || hasWrite || true; // We're only willing to give out broad access if they also hold // runtime permission; this is a firm CDD requirement final boolean hasFull = mIPackageManager.checkUidPermission(WRITE_MEDIA_STORAGE, uid) == PERMISSION_GRANTED; - if (hasFull && hasStorage) { + if (hasFull && hasWrite) { return Zygote.MOUNT_EXTERNAL_FULL; } @@ -3751,16 +3741,18 @@ class StorageManagerService extends IStorageManager.Stub uid) == PERMISSION_GRANTED; final boolean hasInstallOp = mIAppOpsService.checkOperation(OP_REQUEST_INSTALL_PACKAGES, uid, packageName) == MODE_ALLOWED; - if ((hasInstall || hasInstallOp) && hasStorage) { - return Zygote.MOUNT_EXTERNAL_INSTALLER; + if ((hasInstall || hasInstallOp) && hasWrite) { + return Zygote.MOUNT_EXTERNAL_WRITE; } // Otherwise we're willing to give out sandboxed or non-sandboxed if // they hold the runtime permission final boolean hasLegacy = mIAppOpsService.checkOperation(OP_LEGACY_STORAGE, uid, packageName) == MODE_ALLOWED; - if (hasLegacy && hasStorage) { - return Zygote.MOUNT_EXTERNAL_LEGACY; + if (hasLegacy && hasWrite) { + return Zygote.MOUNT_EXTERNAL_WRITE; + } else if (hasLegacy && hasRead) { + return Zygote.MOUNT_EXTERNAL_READ; } else { return Zygote.MOUNT_EXTERNAL_DEFAULT; } -- GitLab From 22ce5e5d83e619837fe7db7bba8380b656a73805 Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Thu, 18 Apr 2019 12:08:30 +0800 Subject: [PATCH 066/473] Run performInitialGrantsIfNecessaryAsync() on main thread. performInitialGrantsIfNecessaryAsync() is already made asynchronous, so it is no longer necessary to post it to a thread pool. After this change both this method and onRemoveUser() can run on the main thread, so that we won't run into a race condition with a destroyed user state. Bug: 130738316 Test: presubmit Change-Id: I9f6e4d9badddf5396c5a9aee683b67739c82884a --- .../core/java/com/android/server/role/RoleManagerService.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java index 654c47780f4..0e20905db32 100644 --- a/services/core/java/com/android/server/role/RoleManagerService.java +++ b/services/core/java/com/android/server/role/RoleManagerService.java @@ -39,7 +39,6 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManagerInternal; import android.content.pm.Signature; import android.database.CursorWindow; -import android.os.AsyncTask; import android.os.Binder; import android.os.Bundle; import android.os.Handler; @@ -201,8 +200,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C // Package is being upgraded - we're about to get ACTION_PACKAGE_ADDED return; } - AsyncTask.THREAD_POOL_EXECUTOR.execute( - () -> performInitialGrantsIfNecessaryAsync(userId)); + performInitialGrantsIfNecessaryAsync(userId); } }, UserHandle.ALL, intentFilter, null, null); } -- GitLab From 6371ac33ddff0c4045bba3df6ea512a0eae8364a Mon Sep 17 00:00:00 2001 From: Jin Seok Park Date: Thu, 18 Apr 2019 12:52:46 +0900 Subject: [PATCH 067/473] Rename MediaSession2/MediaController2 methods Bug: 130769139 Test: atest CtsMediaTestCases:android.media.cts.MediaSession2Test atest CtsMediaTestCases:android.media.cts.MediaController2Test Change-Id: Ia6dc5e1b6f723f5827b693748111c6ae556cbe60 --- api/current.txt | 6 +++--- media/apex/java/android/media/MediaController2.java | 2 +- media/apex/java/android/media/MediaSession2.java | 6 +++--- .../apex/java/android/media/MediaSession2Service.java | 10 +++++----- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/api/current.txt b/api/current.txt index 69571612472..eaae11f13c5 100644 --- a/api/current.txt +++ b/api/current.txt @@ -24656,7 +24656,7 @@ package android.media { public class MediaController2 implements java.lang.AutoCloseable { method public void cancelSessionCommand(@NonNull Object); method public void close(); - method @Nullable public android.media.Session2Token getConnectedSessionToken(); + method @Nullable public android.media.Session2Token getConnectedToken(); method public boolean isPlaybackActive(); method @NonNull public Object sendSessionCommand(@NonNull android.media.Session2Command, @Nullable android.os.Bundle); } @@ -25821,8 +25821,8 @@ package android.media { method public void cancelSessionCommand(@NonNull android.media.MediaSession2.ControllerInfo, @NonNull Object); method public void close(); method @NonNull public java.util.List getConnectedControllers(); - method @NonNull public String getSessionId(); - method @NonNull public android.media.Session2Token getSessionToken(); + method @NonNull public String getId(); + method @NonNull public android.media.Session2Token getToken(); method public boolean isPlaybackActive(); method @NonNull public Object sendSessionCommand(@NonNull android.media.MediaSession2.ControllerInfo, @NonNull android.media.Session2Command, @Nullable android.os.Bundle); method public void setPlaybackActive(boolean); diff --git a/media/apex/java/android/media/MediaController2.java b/media/apex/java/android/media/MediaController2.java index fb4e6ac2393..9848f1a10a5 100644 --- a/media/apex/java/android/media/MediaController2.java +++ b/media/apex/java/android/media/MediaController2.java @@ -175,7 +175,7 @@ public class MediaController2 implements AutoCloseable { * @return Session2Token of the connected session, or {@code null} if not connected */ @Nullable - public Session2Token getConnectedSessionToken() { + public Session2Token getConnectedToken() { synchronized (mLock) { return mConnectedToken; } diff --git a/media/apex/java/android/media/MediaSession2.java b/media/apex/java/android/media/MediaSession2.java index 6b56ae086a0..0a1edb8d771 100644 --- a/media/apex/java/android/media/MediaSession2.java +++ b/media/apex/java/android/media/MediaSession2.java @@ -153,7 +153,7 @@ public class MediaSession2 implements AutoCloseable { * Returns the session ID */ @NonNull - public String getSessionId() { + public String getId() { return mSessionId; } @@ -161,7 +161,7 @@ public class MediaSession2 implements AutoCloseable { * Returns the {@link Session2Token} for creating {@link MediaController2}. */ @NonNull - public Session2Token getSessionToken() { + public Session2Token getToken() { return mSessionToken; } @@ -553,7 +553,7 @@ public class MediaSession2 implements AutoCloseable { try { MediaSessionManager manager = (MediaSessionManager) mContext.getSystemService( Context.MEDIA_SESSION_SERVICE); - manager.notifySession2Created(session2.getSessionToken()); + manager.notifySession2Created(session2.getToken()); } catch (Exception e) { session2.close(); throw e; diff --git a/media/apex/java/android/media/MediaSession2Service.java b/media/apex/java/android/media/MediaSession2Service.java index 3f392d28fa1..b8bf3842aae 100644 --- a/media/apex/java/android/media/MediaSession2Service.java +++ b/media/apex/java/android/media/MediaSession2Service.java @@ -195,15 +195,15 @@ public abstract class MediaSession2Service extends Service { throw new IllegalArgumentException("session is already closed"); } synchronized (mLock) { - MediaSession2 previousSession = mSessions.get(session.getSessionId()); + MediaSession2 previousSession = mSessions.get(session.getId()); if (previousSession != null) { if (previousSession != session) { - Log.w(TAG, "Session ID should be unique, ID=" + session.getSessionId() + Log.w(TAG, "Session ID should be unique, ID=" + session.getId() + ", previous=" + previousSession + ", session=" + session); } return; } - mSessions.put(session.getSessionId(), session); + mSessions.put(session.getId(), session); session.setForegroundServiceEventCallback(mForegroundServiceEventCallback); } } @@ -220,11 +220,11 @@ public abstract class MediaSession2Service extends Service { } MediaNotification notification; synchronized (mLock) { - if (mSessions.get(session.getSessionId()) != session) { + if (mSessions.get(session.getId()) != session) { // Session isn't added or removed already. return; } - mSessions.remove(session.getSessionId()); + mSessions.remove(session.getId()); notification = mNotifications.remove(session); } session.setForegroundServiceEventCallback(null); -- GitLab From c30a91702d1459c27af15ba99e67b2a4a21b9174 Mon Sep 17 00:00:00 2001 From: Tony Mak Date: Wed, 17 Apr 2019 15:16:43 +0100 Subject: [PATCH 068/473] Move locale from LanguageDetectionEvent to base class A follow up change of ag/7058048. Also fixed a wrong nullability annotation, ConversationActions.getHints should be @NonNull. Bug: 129344540 Test: atest cts/tests/tests/view/src/android/view/textclassifier/cts/ Change-Id: Iae734b4b27dd3dd8294684330bec198072693a57 --- api/current.txt | 6 +- .../textclassifier/ConversationActions.java | 2 +- .../textclassifier/TextClassifierEvent.java | 60 +++++++++---------- 3 files changed, 31 insertions(+), 37 deletions(-) diff --git a/api/current.txt b/api/current.txt index f602c9ad113..78b7b842aa9 100644 --- a/api/current.txt +++ b/api/current.txt @@ -53407,7 +53407,7 @@ package android.view.textclassifier { method @Nullable public String getCallingPackageName(); method @NonNull public java.util.List getConversation(); method @NonNull public android.os.Bundle getExtras(); - method @Nullable public java.util.List getHints(); + method @NonNull public java.util.List getHints(); method @IntRange(from=0xffffffff) public int getMaxSuggestions(); method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig getTypeConfig(); method public void writeToParcel(android.os.Parcel, int); @@ -53625,6 +53625,7 @@ package android.view.textclassifier { method public int getEventIndex(); method public int getEventType(); method @NonNull public android.os.Bundle getExtras(); + method @Nullable public android.icu.util.ULocale getLocale(); method @Nullable public String getModelName(); method @Nullable public String getResultId(); method @NonNull public float[] getScores(); @@ -53662,6 +53663,7 @@ package android.view.textclassifier { method @NonNull public T setEventContext(@Nullable android.view.textclassifier.TextClassificationContext); method @NonNull public T setEventIndex(int); method @NonNull public T setExtras(@NonNull android.os.Bundle); + method @NonNull public T setLocale(@Nullable android.icu.util.ULocale); method @NonNull public T setModelName(@Nullable String); method @NonNull public T setResultId(@Nullable String); method @NonNull public T setScores(@NonNull float...); @@ -53677,14 +53679,12 @@ package android.view.textclassifier { } public static final class TextClassifierEvent.LanguageDetectionEvent extends android.view.textclassifier.TextClassifierEvent implements android.os.Parcelable { - method @Nullable public android.icu.util.ULocale getLocale(); field @NonNull public static final android.os.Parcelable.Creator CREATOR; } public static final class TextClassifierEvent.LanguageDetectionEvent.Builder extends android.view.textclassifier.TextClassifierEvent.Builder { ctor public TextClassifierEvent.LanguageDetectionEvent.Builder(int); method @NonNull public android.view.textclassifier.TextClassifierEvent.LanguageDetectionEvent build(); - method @NonNull public android.view.textclassifier.TextClassifierEvent.LanguageDetectionEvent.Builder setLocale(@Nullable android.icu.util.ULocale); } public static final class TextClassifierEvent.TextLinkifyEvent extends android.view.textclassifier.TextClassifierEvent implements android.os.Parcelable { diff --git a/core/java/android/view/textclassifier/ConversationActions.java b/core/java/android/view/textclassifier/ConversationActions.java index f2fa67d5883..aeb99b896b1 100644 --- a/core/java/android/view/textclassifier/ConversationActions.java +++ b/core/java/android/view/textclassifier/ConversationActions.java @@ -401,7 +401,7 @@ public final class ConversationActions implements Parcelable { } /** Returns an immutable list of hints */ - @Nullable + @NonNull @Hint public List getHints() { return mHints; diff --git a/core/java/android/view/textclassifier/TextClassifierEvent.java b/core/java/android/view/textclassifier/TextClassifierEvent.java index d3d61a7460c..7b623e9b639 100644 --- a/core/java/android/view/textclassifier/TextClassifierEvent.java +++ b/core/java/android/view/textclassifier/TextClassifierEvent.java @@ -35,8 +35,8 @@ import java.util.Arrays; * something of note that relates to a feature powered by the TextClassifier. The TextClassifier may * log these events or use them to improve future responses to queries. *

- * Each categories of the events have their own subclass. Events of each types has an associated - * set of related properties. You can find the specification of them in the subclasses. + * Each category of events has its their own subclass. Events of each type have an associated + * set of related properties. You can find their specification in the subclasses. */ public abstract class TextClassifierEvent implements Parcelable { @@ -146,6 +146,8 @@ public abstract class TextClassifierEvent implements Parcelable { @Nullable private final String mModelName; private final int[] mActionIndices; + @Nullable + private final ULocale mLocale; private final Bundle mExtras; private TextClassifierEvent(Builder builder) { @@ -158,6 +160,7 @@ public abstract class TextClassifierEvent implements Parcelable { mScores = builder.mScores; mModelName = builder.mModelName; mActionIndices = builder.mActionIndices; + mLocale = builder.mLocale; mExtras = builder.mExtras == null ? Bundle.EMPTY : builder.mExtras; } @@ -173,6 +176,8 @@ public abstract class TextClassifierEvent implements Parcelable { in.readFloatArray(mScores); mModelName = in.readString(); mActionIndices = in.createIntArray(); + final String languageTag = in.readString(); + mLocale = languageTag == null ? null : ULocale.forLanguageTag(languageTag); mExtras = in.readBundle(); } @@ -220,6 +225,7 @@ public abstract class TextClassifierEvent implements Parcelable { dest.writeFloatArray(mScores); dest.writeString(mModelName); dest.writeIntArray(mActionIndices); + dest.writeString(mLocale == null ? null : mLocale.toLanguageTag()); dest.writeBundle(mExtras); } @@ -317,6 +323,14 @@ public abstract class TextClassifierEvent implements Parcelable { return mActionIndices; } + /** + * Returns the detected locale. + */ + @Nullable + public ULocale getLocale() { + return mLocale; + } + /** * Returns a bundle containing non-structured extra information about this event. * @@ -365,6 +379,8 @@ public abstract class TextClassifierEvent implements Parcelable { private String mModelName; private int[] mActionIndices = new int[0]; @Nullable + private ULocale mLocale; + @Nullable private Bundle mExtras; /** @@ -472,6 +488,15 @@ public abstract class TextClassifierEvent implements Parcelable { return self(); } + /** + * Sets the detected locale. + */ + @NonNull + public T setLocale(@Nullable ULocale locale) { + mLocale = locale; + return self(); + } + /** * Sets a bundle containing non-structured extra information about the event. * @@ -858,26 +883,12 @@ public abstract class TextClassifierEvent implements Parcelable { } }; - @Nullable - private final ULocale mLocale; - private LanguageDetectionEvent(Parcel in) { super(in); - final String languageTag = in.readString(); - mLocale = languageTag == null ? null : ULocale.forLanguageTag(languageTag); } private LanguageDetectionEvent(LanguageDetectionEvent.Builder builder) { super(builder); - mLocale = builder.mLocale; - } - - /** - * Returns the detected locale. - */ - @Nullable - public ULocale getLocale() { - return mLocale; } /** @@ -885,8 +896,6 @@ public abstract class TextClassifierEvent implements Parcelable { */ public static final class Builder extends TextClassifierEvent.Builder { - @Nullable - private ULocale mLocale; /** * Creates a builder for building {@link TextSelectionEvent}s. @@ -897,15 +906,6 @@ public abstract class TextClassifierEvent implements Parcelable { super(TextClassifierEvent.CATEGORY_LANGUAGE_DETECTION, eventType); } - /** - * Sets the detected locale. - */ - @NonNull - public Builder setLocale(@Nullable ULocale locale) { - mLocale = locale; - return this; - } - @Override Builder self() { return this; @@ -919,12 +919,6 @@ public abstract class TextClassifierEvent implements Parcelable { return new LanguageDetectionEvent(this); } } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeString(mLocale == null ? null : mLocale.toLanguageTag()); - } } /** -- GitLab From 28417f4982159d579888d5e2aacf0e101c05fb89 Mon Sep 17 00:00:00 2001 From: Wayne Ma Date: Wed, 17 Apr 2019 08:03:59 -0700 Subject: [PATCH 069/473] Backwards-incompatible resolv module API change for making setResolverConfiguration take a parcelable. Test: built, flashed, booted atest FrameworksNetTests Bug: 130788363 Change-Id: I3b4e8672f5273c3baa9378025bfaef2e6514df64 Merged-In: I6dc9029af0df0d3b391210bd315516bdf1b5e4c9 (cherry picked from commit 9e9fda7558a924feb86869fca7dc7fd7dd01a78c) --- .../server/connectivity/DnsManager.java | 39 +++++--- .../server/ConnectivityServiceTest.java | 93 +++++++++---------- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/DnsManager.java b/services/core/java/com/android/server/connectivity/DnsManager.java index 1913635f80e..e33392d359d 100644 --- a/services/core/java/com/android/server/connectivity/DnsManager.java +++ b/services/core/java/com/android/server/connectivity/DnsManager.java @@ -34,6 +34,7 @@ import android.net.IDnsResolver; import android.net.LinkProperties; import android.net.Network; import android.net.NetworkUtils; +import android.net.ResolverParamsParcel; import android.net.Uri; import android.net.shared.PrivateDnsConfig; import android.os.Binder; @@ -311,11 +312,9 @@ public class DnsManager { public void setDnsConfigurationForNetwork( int netId, LinkProperties lp, boolean isDefaultNetwork) { - final String[] assignedServers = NetworkUtils.makeStrings(lp.getDnsServers()); - final String[] domainStrs = getDomainStrings(lp.getDomains()); updateParametersSettings(); - final int[] params = { mSampleValidity, mSuccessThreshold, mMinSamples, mMaxSamples }; + final ResolverParamsParcel paramsParcel = new ResolverParamsParcel(); // We only use the PrivateDnsConfig data pushed to this class instance // from ConnectivityService because it works in coordination with @@ -329,34 +328,44 @@ public class DnsManager { final boolean useTls = privateDnsCfg.useTls; final boolean strictMode = privateDnsCfg.inStrictMode(); - final String tlsHostname = strictMode ? privateDnsCfg.hostname : ""; - final String[] tlsServers = + paramsParcel.netId = netId; + paramsParcel.sampleValiditySeconds = mSampleValidity; + paramsParcel.successThreshold = mSuccessThreshold; + paramsParcel.minSamples = mMinSamples; + paramsParcel.maxSamples = mMaxSamples; + paramsParcel.servers = NetworkUtils.makeStrings(lp.getDnsServers()); + paramsParcel.domains = getDomainStrings(lp.getDomains()); + paramsParcel.tlsName = strictMode ? privateDnsCfg.hostname : ""; + paramsParcel.tlsServers = strictMode ? NetworkUtils.makeStrings( Arrays.stream(privateDnsCfg.ips) .filter((ip) -> lp.isReachable(ip)) .collect(Collectors.toList())) - : useTls ? assignedServers // Opportunistic + : useTls ? paramsParcel.servers // Opportunistic : new String[0]; // Off - + paramsParcel.tlsFingerprints = new String[0]; // Prepare to track the validation status of the DNS servers in the // resolver config when private DNS is in opportunistic or strict mode. if (useTls) { if (!mPrivateDnsValidationMap.containsKey(netId)) { mPrivateDnsValidationMap.put(netId, new PrivateDnsValidationStatuses()); } - mPrivateDnsValidationMap.get(netId).updateTrackedDnses(tlsServers, tlsHostname); + mPrivateDnsValidationMap.get(netId).updateTrackedDnses(paramsParcel.tlsServers, + paramsParcel.tlsName); } else { mPrivateDnsValidationMap.remove(netId); } - Slog.d(TAG, String.format("setDnsConfigurationForNetwork(%d, %s, %s, %s, %s, %s)", - netId, Arrays.toString(assignedServers), Arrays.toString(domainStrs), - Arrays.toString(params), tlsHostname, Arrays.toString(tlsServers))); - final String[] tlsFingerprints = new String[0]; + Slog.d(TAG, String.format("setDnsConfigurationForNetwork(%d, %s, %s, %d, %d, %d, %d, " + + "%d, %d, %s, %s)", paramsParcel.netId, Arrays.toString(paramsParcel.servers), + Arrays.toString(paramsParcel.domains), paramsParcel.sampleValiditySeconds, + paramsParcel.successThreshold, paramsParcel.minSamples, + paramsParcel.maxSamples, paramsParcel.baseTimeoutMsec, + paramsParcel.retryCount, paramsParcel.tlsName, + Arrays.toString(paramsParcel.tlsServers))); + try { - mDnsResolver.setResolverConfiguration( - netId, assignedServers, domainStrs, params, - tlsHostname, tlsServers, tlsFingerprints); + mDnsResolver.setResolverConfiguration(paramsParcel); } catch (RemoteException | ServiceSpecificException e) { Slog.e(TAG, "Error setting DNS configuration: " + e); return; diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 44380cce1c7..5f08a347eef 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -131,6 +131,7 @@ import android.net.NetworkStackClient; import android.net.NetworkState; import android.net.NetworkUtils; import android.net.ProxyInfo; +import android.net.ResolverParamsParcel; import android.net.RouteInfo; import android.net.SocketKeepalive; import android.net.UidRange; @@ -262,7 +263,8 @@ public class ConnectivityServiceTest { @Mock INetd mMockNetd; @Mock NetworkStackClient mNetworkStack; - private ArgumentCaptor mStringArrayCaptor = ArgumentCaptor.forClass(String[].class); + private ArgumentCaptor mResolverParamsParcelCaptor = + ArgumentCaptor.forClass(ResolverParamsParcel.class); // This class exists to test bindProcessToNetwork and getBoundNetworkForProcess. These methods // do not go through ConnectivityService but talk to netd directly, so they don't automatically @@ -4819,16 +4821,13 @@ public class ConnectivityServiceTest { @Test public void testBasicDnsConfigurationPushed() throws Exception { setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com"); - ArgumentCaptor tlsServers = ArgumentCaptor.forClass(String[].class); // Clear any interactions that occur as a result of CS starting up. reset(mMockDnsResolver); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); waitForIdle(); - verify(mMockDnsResolver, never()).setResolverConfiguration( - anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""), - eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY)); + verify(mMockDnsResolver, never()).setResolverConfiguration(any()); verifyNoMoreInteractions(mMockDnsResolver); final LinkProperties cellLp = new LinkProperties(); @@ -4846,35 +4845,33 @@ public class ConnectivityServiceTest { mCellNetworkAgent.connect(false); waitForIdle(); // CS tells netd about the empty DNS config for this network. - verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration( - anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""), - eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY)); + verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(any()); reset(mMockDnsResolver); cellLp.addDnsServer(InetAddress.getByName("2001:db8::1")); mCellNetworkAgent.sendLinkProperties(cellLp); waitForIdle(); verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration( - anyInt(), mStringArrayCaptor.capture(), any(), any(), - eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY)); - assertEquals(1, mStringArrayCaptor.getValue().length); - assertTrue(ArrayUtils.contains(mStringArrayCaptor.getValue(), "2001:db8::1")); + mResolverParamsParcelCaptor.capture()); + ResolverParamsParcel resolvrParams = mResolverParamsParcelCaptor.getValue(); + assertEquals(1, resolvrParams.servers.length); + assertTrue(ArrayUtils.contains(resolvrParams.servers, "2001:db8::1")); // Opportunistic mode. - assertTrue(ArrayUtils.contains(tlsServers.getValue(), "2001:db8::1")); + assertTrue(ArrayUtils.contains(resolvrParams.tlsServers, "2001:db8::1")); reset(mMockDnsResolver); cellLp.addDnsServer(InetAddress.getByName("192.0.2.1")); mCellNetworkAgent.sendLinkProperties(cellLp); waitForIdle(); verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration( - anyInt(), mStringArrayCaptor.capture(), any(), any(), - eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY)); - assertEquals(2, mStringArrayCaptor.getValue().length); - assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(), + mResolverParamsParcelCaptor.capture()); + resolvrParams = mResolverParamsParcelCaptor.getValue(); + assertEquals(2, resolvrParams.servers.length); + assertTrue(ArrayUtils.containsAll(resolvrParams.servers, new String[]{"2001:db8::1", "192.0.2.1"})); // Opportunistic mode. - assertEquals(2, tlsServers.getValue().length); - assertTrue(ArrayUtils.containsAll(tlsServers.getValue(), + assertEquals(2, resolvrParams.tlsServers.length); + assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers, new String[]{"2001:db8::1", "192.0.2.1"})); reset(mMockDnsResolver); @@ -4887,18 +4884,16 @@ public class ConnectivityServiceTest { waitForIdle(); verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration( - anyInt(), mStringArrayCaptor.capture(), any(), any(), - eq(TLS_SPECIFIER), eq(TLS_SERVERS), eq(EMPTY_STRING_ARRAY)); - assertEquals(2, mStringArrayCaptor.getValue().length); - assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(), + mResolverParamsParcelCaptor.capture()); + resolvrParams = mResolverParamsParcelCaptor.getValue(); + assertEquals(2, resolvrParams.servers.length); + assertTrue(ArrayUtils.containsAll(resolvrParams.servers, new String[]{"2001:db8::1", "192.0.2.1"})); reset(mMockDnsResolver); } @Test public void testPrivateDnsSettingsChange() throws Exception { - ArgumentCaptor tlsServers = ArgumentCaptor.forClass(String[].class); - // Clear any interactions that occur as a result of CS starting up. reset(mMockDnsResolver); @@ -4913,9 +4908,7 @@ public class ConnectivityServiceTest { mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); waitForIdle(); // CS tells netd about the empty DNS config for this network. - verify(mMockDnsResolver, never()).setResolverConfiguration( - anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""), - eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY)); + verify(mMockDnsResolver, never()).setResolverConfiguration(any()); verifyNoMoreInteractions(mMockDnsResolver); final LinkProperties cellLp = new LinkProperties(); @@ -4936,14 +4929,14 @@ public class ConnectivityServiceTest { mCellNetworkAgent.connect(false); waitForIdle(); verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration( - anyInt(), mStringArrayCaptor.capture(), any(), any(), - eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY)); - assertEquals(2, mStringArrayCaptor.getValue().length); - assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(), + mResolverParamsParcelCaptor.capture()); + ResolverParamsParcel resolvrParams = mResolverParamsParcelCaptor.getValue(); + assertEquals(2, resolvrParams.tlsServers.length); + assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers, new String[]{"2001:db8::1", "192.0.2.1"})); // Opportunistic mode. - assertEquals(2, tlsServers.getValue().length); - assertTrue(ArrayUtils.containsAll(tlsServers.getValue(), + assertEquals(2, resolvrParams.tlsServers.length); + assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers, new String[]{"2001:db8::1", "192.0.2.1"})); reset(mMockDnsResolver); cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); @@ -4958,23 +4951,23 @@ public class ConnectivityServiceTest { setPrivateDnsSettings(PRIVATE_DNS_MODE_OFF, "ignored.example.com"); verify(mMockDnsResolver, times(1)).setResolverConfiguration( - anyInt(), mStringArrayCaptor.capture(), any(), any(), - eq(""), eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY)); - assertEquals(2, mStringArrayCaptor.getValue().length); - assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(), + mResolverParamsParcelCaptor.capture()); + resolvrParams = mResolverParamsParcelCaptor.getValue(); + assertEquals(2, resolvrParams.servers.length); + assertTrue(ArrayUtils.containsAll(resolvrParams.servers, new String[]{"2001:db8::1", "192.0.2.1"})); reset(mMockDnsResolver); cellNetworkCallback.assertNoCallback(); setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com"); verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration( - anyInt(), mStringArrayCaptor.capture(), any(), any(), - eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY)); - assertEquals(2, mStringArrayCaptor.getValue().length); - assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(), + mResolverParamsParcelCaptor.capture()); + resolvrParams = mResolverParamsParcelCaptor.getValue(); + assertEquals(2, resolvrParams.servers.length); + assertTrue(ArrayUtils.containsAll(resolvrParams.servers, new String[]{"2001:db8::1", "192.0.2.1"})); - assertEquals(2, tlsServers.getValue().length); - assertTrue(ArrayUtils.containsAll(tlsServers.getValue(), + assertEquals(2, resolvrParams.tlsServers.length); + assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers, new String[]{"2001:db8::1", "192.0.2.1"})); reset(mMockDnsResolver); cellNetworkCallback.assertNoCallback(); @@ -5826,9 +5819,7 @@ public class ConnectivityServiceTest { mCellNetworkAgent.sendLinkProperties(cellLp); networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); verify(mMockDnsResolver, times(1)).stopPrefix64Discovery(cellNetId); - verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration( - eq(cellNetId), eq(EMPTY_STRING_ARRAY), any(), any(), - eq(""), eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY)); + verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(any()); verifyNoMoreInteractions(mMockNetd); verifyNoMoreInteractions(mMockDnsResolver); @@ -5871,10 +5862,10 @@ public class ConnectivityServiceTest { assertEquals(makeClatLinkProperties(myIpv4), stackedLpsAfterChange.get(0)); verify(mMockDnsResolver, times(1)).setResolverConfiguration( - eq(cellNetId), mStringArrayCaptor.capture(), any(), any(), - eq(""), eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY)); - assertEquals(1, mStringArrayCaptor.getValue().length); - assertTrue(ArrayUtils.contains(mStringArrayCaptor.getValue(), "8.8.8.8")); + mResolverParamsParcelCaptor.capture()); + ResolverParamsParcel resolvrParams = mResolverParamsParcelCaptor.getValue(); + assertEquals(1, resolvrParams.servers.length); + assertTrue(ArrayUtils.contains(resolvrParams.servers, "8.8.8.8")); // Add ipv4 address, expect that clatd and prefix discovery are stopped and stacked // linkproperties are cleaned up. -- GitLab From b10fac728e81bdf9a5d7e5612abe5417ab6f7ec2 Mon Sep 17 00:00:00 2001 From: Jeff Chang Date: Tue, 9 Apr 2019 17:28:30 +0800 Subject: [PATCH 070/473] Adjust toast window parameters to support FLAG_SHOW_WHEN_LOCKED Toast can not show on display when screen is locked.Adjust rule to support it with conditions.The calling activity initiate toast and is visible with FLAG_SHOW_WHEN_LOCKED. Bug: 129434562 Test: 1. atest DisplayPolicyTests 2. Launch an activity with the flag. Make sure toast be shown when screen is locked. Change-Id: I7092f2d1c35cb6b8afb85576b54540f59e4f1c2f --- .../com/android/server/wm/DisplayPolicy.java | 14 +++++++ .../android/server/wm/DisplayPolicyTests.java | 41 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index bd874ba786e..a57dd6d7c5a 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -822,6 +822,10 @@ public class DisplayPolicy { (int) attrs.hideTimeoutMilliseconds, AccessibilityManager.FLAG_CONTENT_TEXT); attrs.windowAnimations = com.android.internal.R.style.Animation_Toast; + // Toast can show with below conditions when the screen is locked. + if (canToastShowWhenLocked(callingPid)) { + attrs.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; + } break; } @@ -831,6 +835,16 @@ public class DisplayPolicy { } } + /** + * @return {@code true} if the calling activity initiate toast and is visible with + * {@link WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED} flag. + */ + boolean canToastShowWhenLocked(int callingPid) { + return mDisplayContent.forAllWindows(w -> { + return callingPid == w.mSession.mPid && w.isVisible() && w.canShowWhenLocked(); + }, true /* traverseTopToBottom */); + } + /** * Preflight adding a window to the system. * diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java index 07dd93c948d..1684f97d28e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java @@ -22,13 +22,17 @@ import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND; import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; +import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; +import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; +import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; +import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; @@ -38,6 +42,7 @@ import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_RIGHT; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.spy; @@ -232,4 +237,40 @@ public class DisplayPolicyTests extends WindowTestsBase { displayRotation, Surface.ROTATION_0, Surface.ROTATION_90)); } } + + @Test + public void testShouldShowToastWhenScreenLocked() { + final DisplayPolicy policy = mDisplayContent.getDisplayPolicy(); + final WindowState activity = createApplicationWindow(); + final WindowState toast = createToastWindow(); + + synchronized (mWm.mGlobalLock) { + policy.adjustWindowParamsLw( + toast, toast.mAttrs, 0 /* callingPid */, 0 /* callingUid */); + + assertTrue(policy.canToastShowWhenLocked(0 /* callingUid */)); + assertNotEquals(0, toast.getAttrs().flags & FLAG_SHOW_WHEN_LOCKED); + } + } + + private WindowState createToastWindow() { + final WindowState win = createWindow(null, TYPE_TOAST, "Toast"); + final WindowManager.LayoutParams attrs = win.mAttrs; + attrs.width = WRAP_CONTENT; + attrs.height = WRAP_CONTENT; + attrs.flags = FLAG_KEEP_SCREEN_ON | FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCHABLE; + attrs.format = PixelFormat.TRANSLUCENT; + return win; + } + + private WindowState createApplicationWindow() { + final WindowState win = createWindow(null, TYPE_APPLICATION, "Application"); + final WindowManager.LayoutParams attrs = win.mAttrs; + attrs.width = MATCH_PARENT; + attrs.height = MATCH_PARENT; + attrs.flags = FLAG_SHOW_WHEN_LOCKED | FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR; + attrs.format = PixelFormat.OPAQUE; + win.mHasSurface = true; + return win; + } } -- GitLab From 34a27c4c455d490116572c02f7d8443842164fd3 Mon Sep 17 00:00:00 2001 From: Irina Dumitrescu Date: Mon, 15 Apr 2019 19:20:38 +0100 Subject: [PATCH 071/473] Don't call ConnectivityService when holding ActivityManagerService lock. Exclude system server thread from the threads on which we call updateHttpProxy() from the Activity Manager. Test: atest HostsideVpnTests Bug: 128465980 Change-Id: Ia2b2c6de8a01a264bfb09393144641d91ee2c164 --- core/java/android/app/ActivityThread.java | 8 +++-- .../server/am/ActivityManagerService.java | 6 ++-- .../com/android/server/am/ProcessList.java | 29 +++++++++++-------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 5e5611bcf05..474f25bd553 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -1073,9 +1073,8 @@ public final class ActivityThread extends ClientTransactionHandler { } public void updateHttpProxy() { - final ConnectivityManager cm = ConnectivityManager.from( + ActivityThread.updateHttpProxy( getApplication() != null ? getApplication() : getSystemContext()); - Proxy.setHttpProxySystemProperty(cm.getDefaultProxy()); } public void processInBackground() { @@ -6948,6 +6947,11 @@ public final class ActivityThread extends ClientTransactionHandler { return thread; } + public static void updateHttpProxy(@NonNull Context context) { + final ConnectivityManager cm = ConnectivityManager.from(context); + Proxy.setHttpProxySystemProperty(cm.getDefaultProxy()); + } + @UnsupportedAppUsage public final void installSystemProviders(List providers) { if (providers != null) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 3b6b404170c..da428af300e 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1635,9 +1635,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } break; case UPDATE_HTTP_PROXY_MSG: { - synchronized (ActivityManagerService.this) { - mProcessList.setAllHttpProxyLocked(); - } + mProcessList.setAllHttpProxy(); } break; case PROC_START_TIMEOUT_MSG: { ProcessRecord app = (ProcessRecord)msg.obj; @@ -1826,7 +1824,7 @@ public class ActivityManagerService extends IActivityManager.Stub } break; } } - }; + } static final int COLLECT_PSS_BG_MSG = 1; diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 0a926f9a801..b4919ff0e41 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -46,6 +46,7 @@ import static com.android.server.am.ActivityManagerService.TAG_PSS; import static com.android.server.am.ActivityManagerService.TAG_UID_OBSERVERS; import android.app.ActivityManager; +import android.app.ActivityThread; import android.app.AppGlobals; import android.app.AppProtoEnums; import android.app.IApplicationThread; @@ -2485,21 +2486,25 @@ public final class ProcessList { } } - @GuardedBy("mService") - void setAllHttpProxyLocked() { - for (int i = mLruProcesses.size() - 1; i >= 0; i--) { - ProcessRecord r = mLruProcesses.get(i); - // Don't dispatch to isolated processes as they can't access - // ConnectivityManager and don't have network privileges anyway. - if (r.thread != null && !r.isolated) { - try { - r.thread.updateHttpProxy(); - } catch (RemoteException ex) { - Slog.w(TAG, "Failed to update http proxy for: " + - r.info.processName); + void setAllHttpProxy() { + // Update the HTTP proxy for each application thread. + synchronized (mService) { + for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) { + ProcessRecord r = mLruProcesses.get(i); + // Don't dispatch to isolated processes as they can't access ConnectivityManager and + // don't have network privileges anyway. Exclude system server and update it + // separately outside the AMS lock, to avoid deadlock with Connectivity Service. + if (r.pid != ActivityManagerService.MY_PID && r.thread != null && !r.isolated) { + try { + r.thread.updateHttpProxy(); + } catch (RemoteException ex) { + Slog.w(TAG, "Failed to update http proxy for: " + + r.info.processName); + } } } } + ActivityThread.updateHttpProxy(mService.mContext); } @GuardedBy("mService") -- GitLab From 1cc502fe20dbb120e4eed14e1017dc3d4486de69 Mon Sep 17 00:00:00 2001 From: Beverly Date: Mon, 15 Apr 2019 11:21:25 -0400 Subject: [PATCH 072/473] Check zen modes+manual rule for in consol zen pol When creating the consolidated zen policy: - Check the zen mode of the automatic zen rules. These will take precendence over the ZenPolicy. - Check the manual zen rule. Test: atest SystemUITests Bug: 130152926 Change-Id: Ie7604d8f4fd625ea0e0c2fc701c5b903402f8494 --- .../server/notification/ZenModeHelper.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index 1f5b99cb334..981e0f58ef2 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -940,13 +940,34 @@ public class ZenModeHelper { } } + private void applyCustomPolicy(ZenPolicy policy, ZenRule rule) { + if (rule.zenMode == NotificationManager.INTERRUPTION_FILTER_NONE) { + policy.apply(new ZenPolicy.Builder() + .disallowAllSounds() + .build()); + } else if (rule.zenMode + == NotificationManager.INTERRUPTION_FILTER_ALARMS) { + policy.apply(new ZenPolicy.Builder() + .disallowAllSounds() + .allowAlarms(true) + .allowMedia(true) + .build()); + } else { + policy.apply(rule.zenPolicy); + } + } + private void updateConsolidatedPolicy(String reason) { if (mConfig == null) return; synchronized (mConfig) { ZenPolicy policy = new ZenPolicy(); + if (mConfig.manualRule != null) { + applyCustomPolicy(policy, mConfig.manualRule); + } + for (ZenRule automaticRule : mConfig.automaticRules.values()) { if (automaticRule.isAutomaticActive()) { - policy.apply(automaticRule.zenPolicy); + applyCustomPolicy(policy, automaticRule); } } Policy newPolicy = mConfig.toNotificationPolicy(policy); -- GitLab From 49614c7578fb5ba08d7ad01c88276e6be147821f Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Thu, 18 Apr 2019 09:05:15 -0400 Subject: [PATCH 073/473] Remove ripple from Dark mode tile As when enabling Battery saver and entering Dark Mode, the ripple animation is interrupted due to QS recreating. This disables the animation from the Dark mode tile. Fixes: 130745997 Test: visual Change-Id: I5c44c1408efe70f46a3ac301b86e01c77bc0e98d --- .../src/com/android/systemui/qs/tiles/UiModeNightTile.java | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java index 8d2f8952cc6..f26a94fed8a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java @@ -81,6 +81,7 @@ public class UiModeNightTile extends QSTileImpl implements state.icon = mIcon; state.expandedAccessibilityClassName = Switch.class.getName(); state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; + state.showRippleEffect = false; } @Override -- GitLab From 7035b7949cbb5ba0c2c3e0165ef84292fcc8169f Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Fri, 12 Apr 2019 05:54:46 -0700 Subject: [PATCH 074/473] Change the validation URL for Chinese SIMs The default HTTPS and fallback validation URLs are not accessible from China, so users in China never get a validated network on WiFi with the default AOSP settings. OEMs selling devices targeting China typically change the check URLs for that reason. When the device uses a Chinese SIM card, change the default validation URLs to URLs accessible accessible from China as of now. Test: inserted China SIM, WiFi off/on, dumpsys network_stack shows new URL used Bug: 111819230 Change-Id: Ib7f41f470ef1a9c7712f2477ebfab44e915cf1b9 Merged-In: Ib7f41f470ef1a9c7712f2477ebfab44e915cf1b9 (cherry picked from commit 990ea84d2d60256d8c752a4a582de0f5a28932c9) --- packages/NetworkStack/res/values-mcc460/config.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 packages/NetworkStack/res/values-mcc460/config.xml diff --git a/packages/NetworkStack/res/values-mcc460/config.xml b/packages/NetworkStack/res/values-mcc460/config.xml new file mode 100644 index 00000000000..fd4a8481ab2 --- /dev/null +++ b/packages/NetworkStack/res/values-mcc460/config.xml @@ -0,0 +1,12 @@ + + + + https://connectivitycheck.gstatic.com/generate_204 + + http://www.googleapis.cn/generate_204 + + -- GitLab From 8a52dc3af4069e51f5b40553c2b027781d678963 Mon Sep 17 00:00:00 2001 From: Gustav Sennton Date: Mon, 15 Apr 2019 12:48:23 +0100 Subject: [PATCH 075/473] Block clicks on smart actions and replies just after creation/update. To avoid accidental clicks on smart actions and replies we here block clicks on those buttons just after they are created. We block clicks on those buttons when a notification is updated - but only if the buttons are new, or different from previous buttons shown in the notification. I.e. if the notification is updated but the smart suggestion buttons stay the same we don't block clicks on them. Bug: 128683184 Test: manually ensure clicks are blocked within the initialization delay (for new / changed buttons), and ensure the delay changes when calling adb shell device_config put systemui ssin_onclick_init_delay X where X is the delay in ms. Test: SmartReplyConstantsTest, SmartReplyViewTest Change-Id: I9a44eb6ade6579a42e35b36cce4bd5863332c60e --- .../sysui/SystemUiDeviceConfigFlags.java | 6 + packages/SystemUI/res/values/config.xml | 4 + .../row/ExpandableNotificationRow.java | 8 ++ .../row/NotificationContentInflater.java | 13 +- .../row/NotificationContentView.java | 20 ++- .../policy/InflatedSmartReplies.java | 55 ++++++-- .../statusbar/policy/SmartReplyConstants.java | 16 +++ .../statusbar/policy/SmartReplyView.java | 60 ++++++-- .../policy/BlockingQueueIntentReceiver.java | 4 + .../policy/InflatedSmartRepliesTest.java | 69 ++++++++++ .../policy/SmartReplyConstantsTest.java | 14 ++ .../statusbar/policy/SmartReplyViewTest.java | 129 ++++++++++++++++-- 12 files changed, 352 insertions(+), 46 deletions(-) diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 495a5fbb666..6d0a8646b3a 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -81,6 +81,12 @@ public final class SystemUiDeviceConfigFlags { */ public static final String SSIN_MAX_NUM_ACTIONS = "ssin_max_num_actions"; + /** + * (int) The amount of time (ms) before smart suggestions are clickable, since the suggestions + * were added. + */ + public static final String SSIN_ONCLICK_INIT_DELAY = "ssin_onclick_init_delay"; + /** * The default component of * {@link android.service.notification.NotificationAssistantService}. diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index e02be38d32e..99a75d228f5 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -469,6 +469,10 @@ --> -1 + + 200 + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index efdcd053bc5..6b2efaab0a6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -100,6 +100,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -3194,6 +3195,13 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mAmbientGoingAway = goingAway; } + /** + * Returns the Smart Suggestions backing the smart suggestion buttons in the notification. + */ + public SmartRepliesAndActions getExistingSmartRepliesAndActions() { + return mPrivateLayout.getCurrentSmartRepliesAndActions(); + } + @VisibleForTesting protected void setChildrenContainer(NotificationChildrenContainer childrenContainer) { mChildrenContainer = childrenContainer; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java index 09f513dc157..f095b907e8e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java @@ -44,6 +44,7 @@ import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewW import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.InflatedSmartReplies; +import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions; import com.android.systemui.statusbar.policy.SmartReplyConstants; import com.android.systemui.util.Assert; @@ -284,7 +285,8 @@ public class NotificationContentInflater { mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, mRedactAmbient, packageContext); result = inflateSmartReplyViews(result, reInflateFlags, mRow.getEntry(), - mRow.getContext(), mRow.getHeadsUpManager()); + mRow.getContext(), mRow.getHeadsUpManager(), + mRow.getExistingSmartRepliesAndActions()); apply( inflateSynchronously, result, @@ -346,20 +348,20 @@ public class NotificationContentInflater { private static InflationProgress inflateSmartReplyViews(InflationProgress result, @InflationFlag int reInflateFlags, NotificationEntry entry, Context context, - HeadsUpManager headsUpManager) { + HeadsUpManager headsUpManager, SmartRepliesAndActions previousSmartRepliesAndActions) { SmartReplyConstants smartReplyConstants = Dependency.get(SmartReplyConstants.class); SmartReplyController smartReplyController = Dependency.get(SmartReplyController.class); if ((reInflateFlags & FLAG_CONTENT_VIEW_EXPANDED) != 0 && result.newExpandedView != null) { result.expandedInflatedSmartReplies = InflatedSmartReplies.inflate( context, entry, smartReplyConstants, smartReplyController, - headsUpManager); + headsUpManager, previousSmartRepliesAndActions); } if ((reInflateFlags & FLAG_CONTENT_VIEW_HEADS_UP) != 0 && result.newHeadsUpView != null) { result.headsUpInflatedSmartReplies = InflatedSmartReplies.inflate( context, entry, smartReplyConstants, smartReplyController, - headsUpManager); + headsUpManager, previousSmartRepliesAndActions); } return result; } @@ -907,7 +909,8 @@ public class NotificationContentInflater { mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, mRedactAmbient, packageContext); return inflateSmartReplyViews(inflationProgress, mReInflateFlags, mRow.getEntry(), - mRow.getContext(), mRow.getHeadsUpManager()); + mRow.getContext(), mRow.getHeadsUpManager(), + mRow.getExistingSmartRepliesAndActions()); } catch (Exception e) { mError = e; return null; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 78500357f41..b81d81438ea 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -93,6 +93,7 @@ public class NotificationContentView extends FrameLayout { private SmartReplyController mSmartReplyController; private InflatedSmartReplies mExpandedInflatedSmartReplies; private InflatedSmartReplies mHeadsUpInflatedSmartReplies; + private SmartRepliesAndActions mCurrentSmartRepliesAndActions; private NotificationViewWrapper mContractedWrapper; private NotificationViewWrapper mExpandedWrapper; @@ -1259,18 +1260,18 @@ public class NotificationContentView extends FrameLayout { // the same SmartRepliesAndActions to avoid discrepancies between the two views. We here // reuse that object for our local SmartRepliesAndActions to avoid discrepancies between // this class and the InflatedSmartReplies classes. - SmartRepliesAndActions smartRepliesAndActions = mExpandedInflatedSmartReplies != null + mCurrentSmartRepliesAndActions = mExpandedInflatedSmartReplies != null ? mExpandedInflatedSmartReplies.getSmartRepliesAndActions() : mHeadsUpInflatedSmartReplies.getSmartRepliesAndActions(); if (DEBUG) { Log.d(TAG, String.format("Adding suggestions for %s, %d actions, and %d replies.", entry.notification.getKey(), - smartRepliesAndActions.smartActions == null ? 0 : - smartRepliesAndActions.smartActions.actions.size(), - smartRepliesAndActions.smartReplies == null ? 0 : - smartRepliesAndActions.smartReplies.choices.length)); + mCurrentSmartRepliesAndActions.smartActions == null ? 0 : + mCurrentSmartRepliesAndActions.smartActions.actions.size(), + mCurrentSmartRepliesAndActions.smartReplies == null ? 0 : + mCurrentSmartRepliesAndActions.smartReplies.choices.length)); } - applySmartReplyView(smartRepliesAndActions, entry); + applySmartReplyView(mCurrentSmartRepliesAndActions, entry); } private void applyRemoteInput(NotificationEntry entry, boolean hasFreeformRemoteInput) { @@ -1472,6 +1473,13 @@ public class NotificationContentView extends FrameLayout { } } + /** + * Returns the smart replies and actions currently shown in the notification. + */ + @Nullable public SmartRepliesAndActions getCurrentSmartRepliesAndActions() { + return mCurrentSmartRepliesAndActions; + } + public void closeRemoteInput() { if (mHeadsUpRemoteInput != null) { mHeadsUpRemoteInput.close(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java index 5b2e398b66e..ee78a723a49 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java @@ -28,15 +28,19 @@ import android.util.Log; import android.util.Pair; import android.widget.Button; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.systemui.Dependency; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.DevicePolicyManagerWrapper; import com.android.systemui.shared.system.PackageManagerWrapper; +import com.android.systemui.statusbar.NotificationUiAdjustment; import com.android.systemui.statusbar.SmartReplyController; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -79,29 +83,52 @@ public class InflatedSmartReplies { NotificationEntry entry, SmartReplyConstants smartReplyConstants, SmartReplyController smartReplyController, - HeadsUpManager headsUpManager) { - SmartRepliesAndActions smartRepliesAndActions = + HeadsUpManager headsUpManager, + SmartRepliesAndActions existingSmartRepliesAndActions) { + SmartRepliesAndActions newSmartRepliesAndActions = chooseSmartRepliesAndActions(smartReplyConstants, entry); - if (!shouldShowSmartReplyView(entry, smartRepliesAndActions)) { + if (!shouldShowSmartReplyView(entry, newSmartRepliesAndActions)) { return new InflatedSmartReplies(null /* smartReplyView */, - null /* smartSuggestionButtons */, smartRepliesAndActions); + null /* smartSuggestionButtons */, newSmartRepliesAndActions); } + // Only block clicks if the smart buttons are different from the previous set - to avoid + // scenarios where a user incorrectly cannot click smart buttons because the notification is + // updated. + boolean delayOnClickListener = + !areSuggestionsSimilar(existingSmartRepliesAndActions, newSmartRepliesAndActions); + SmartReplyView smartReplyView = SmartReplyView.inflate(context); List