From be12b81b86034af14614d2ecf44fc3ff9f51d156 Mon Sep 17 00:00:00 2001 From: Tetsutoki Shiozawa Date: Fri, 27 Oct 2017 14:03:00 +0900 Subject: [PATCH 001/386] Definitely abort reconnecting to native daemon during shutdown Symptom: System_server crashed due to unsolved "netd" service. Root cause: My previous patch was not enough for avoiding this crash. e83724e Abort connecting to native daemon during shutdown listenToSocket loop can be finished without throwing exception. Solution: It's better to test shutdown condition before reconnection even though listenToSocket is finished without exception. Bug: 68742327 Change-Id: Ifdfe43d52bef891f55bd7b07cc1aa0fa248a6030 --- .../com/android/server/NativeDaemonConnector.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/NativeDaemonConnector.java b/services/core/java/com/android/server/NativeDaemonConnector.java index b5a8332375f..ad02aad6e4c 100644 --- a/services/core/java/com/android/server/NativeDaemonConnector.java +++ b/services/core/java/com/android/server/NativeDaemonConnector.java @@ -134,21 +134,23 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo mCallbackHandler = new Handler(mLooper, this); while (true) { + if (isShuttingDown()) break; try { listenToSocket(); } catch (Exception e) { loge("Error in NativeDaemonConnector: " + e); - String shutdownAct = SystemProperties.get( - ShutdownThread.SHUTDOWN_ACTION_PROPERTY, ""); - if (shutdownAct != null && shutdownAct.length() > 0) { - // The device is in middle of shutdown. - break; - } + if (isShuttingDown()) break; SystemClock.sleep(5000); } } } + private static boolean isShuttingDown() { + String shutdownAct = SystemProperties.get( + ShutdownThread.SHUTDOWN_ACTION_PROPERTY, ""); + return shutdownAct != null && shutdownAct.length() > 0; + } + @Override public boolean handleMessage(Message msg) { final String event = (String) msg.obj; -- GitLab From 5fb337ff8590bd1c66a603a39551e12d4e84bd6d Mon Sep 17 00:00:00 2001 From: Hall Liu Date: Wed, 22 Nov 2017 17:38:15 -0800 Subject: [PATCH 002/386] Check for location access on TelephonyRegistry When sending outbound callbacks on CELL_INFO and CELL_LOCATION, check to make sure that the user has authorized us and the receiving app to get information on their location. Bug: 69637693 Test: manual: telephony testapp Change-Id: Iacfc894428b11a7ec973567d7a797eedb281355f --- data/etc/privapp-permissions-platform.xml | 1 + .../com/android/server/TelephonyRegistry.java | 55 ++++-- .../soundtrigger/SoundTriggerHelper.java | 34 ++-- .../telephony/LocationAccessPolicy.java | 160 ++++++++++++++++++ .../telephony/SubscriptionManager.java | 6 +- .../android/telephony/TelephonyManager.java | 3 + 6 files changed, 229 insertions(+), 30 deletions(-) create mode 100644 telephony/java/android/telephony/LocationAccessPolicy.java diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 6974bbb08cc..5b6577fd98a 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -147,6 +147,7 @@ applications that come with the platform + diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 6747be340d4..6743484b91c 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -35,6 +35,7 @@ import android.os.UserHandle; import android.telephony.CellInfo; import android.telephony.CellLocation; import android.telephony.DisconnectCause; +import android.telephony.LocationAccessPolicy; import android.telephony.PhoneStateListener; import android.telephony.PreciseCallState; import android.telephony.PreciseDataConnectionState; @@ -93,7 +94,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { IPhoneStateListener callback; IOnSubscriptionsChangedListener onSubscriptionsChangedListenerCallback; - int callerUserId; + int callerUid; + int callerPid; int events; @@ -117,7 +119,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { + " callback=" + callback + " onSubscriptionsChangedListenererCallback=" + onSubscriptionsChangedListenerCallback - + " callerUserId=" + callerUserId + " subId=" + subId + " phoneId=" + phoneId + + " callerUid=" + callerUid + " subId=" + subId + " phoneId=" + phoneId + " events=" + Integer.toHexString(events) + " canReadPhoneState=" + canReadPhoneState + "}"; } @@ -356,6 +358,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { public void addOnSubscriptionsChangedListener(String callingPackage, IOnSubscriptionsChangedListener callback) { int callerUserId = UserHandle.getCallingUserId(); + mContext.getSystemService(AppOpsManager.class) + .checkPackage(Binder.getCallingUid(), callingPackage); if (VDBG) { log("listen oscl: E pkg=" + callingPackage + " myUserId=" + UserHandle.myUserId() + " callerUserId=" + callerUserId + " callback=" + callback @@ -399,7 +403,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { r.onSubscriptionsChangedListenerCallback = callback; r.callingPackage = callingPackage; - r.callerUserId = callerUserId; + r.callerUid = Binder.getCallingUid(); + r.callerPid = Binder.getCallingPid(); r.events = 0; r.canReadPhoneState = true; // permission has been enforced above if (DBG) { @@ -470,6 +475,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { private void listen(String callingPackage, IPhoneStateListener callback, int events, boolean notifyNow, int subId) { int callerUserId = UserHandle.getCallingUserId(); + mContext.getSystemService(AppOpsManager.class) + .checkPackage(Binder.getCallingUid(), callingPackage); if (VDBG) { log("listen: E pkg=" + callingPackage + " events=0x" + Integer.toHexString(events) + " notifyNow=" + notifyNow + " subId=" + subId + " myUserId=" @@ -514,7 +521,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { r.callback = callback; r.callingPackage = callingPackage; - r.callerUserId = callerUserId; + r.callerUid = Binder.getCallingUid(); + r.callerPid = Binder.getCallingPid(); boolean isPhoneStateEvent = (events & (CHECK_PHONE_STATE_PERMISSION_MASK | ENFORCE_PHONE_STATE_PERMISSION_MASK)) != 0; r.canReadPhoneState = isPhoneStateEvent && canReadPhoneState(callingPackage); @@ -572,8 +580,10 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { try { if (DBG_LOC) log("listen: mCellLocation = " + mCellLocation[phoneId]); - r.callback.onCellLocationChanged( - new Bundle(mCellLocation[phoneId])); + if (checkLocationAccess(r)) { + r.callback.onCellLocationChanged( + new Bundle(mCellLocation[phoneId])); + } } catch (RemoteException ex) { remove(r.binder); } @@ -619,7 +629,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { try { if (DBG_LOC) log("listen: mCellInfo[" + phoneId + "] = " + mCellInfo.get(phoneId)); - r.callback.onCellInfoChanged(mCellInfo.get(phoneId)); + if (checkLocationAccess(r)) { + r.callback.onCellInfoChanged(mCellInfo.get(phoneId)); + } } catch (RemoteException ex) { remove(r.binder); } @@ -979,7 +991,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mCellInfo.set(phoneId, cellInfo); for (Record r : mRecords) { if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO) && - idMatch(r.subId, subId, phoneId)) { + idMatch(r.subId, subId, phoneId) && + checkLocationAccess(r)) { try { if (DBG_LOC) { log("notifyCellInfo: mCellInfo=" + cellInfo + " r=" + r); @@ -1262,7 +1275,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mCellLocation[phoneId] = cellLocation; for (Record r : mRecords) { if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION) && - idMatch(r.subId, subId, phoneId)) { + idMatch(r.subId, subId, phoneId) && + checkLocationAccess(r)) { try { if (DBG_LOC) { log("notifyCellLocation: cellLocation=" + cellLocation @@ -1706,10 +1720,11 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { boolean valid = false; try { foregroundUser = ActivityManager.getCurrentUser(); - valid = r.callerUserId == foregroundUser && r.matchPhoneStateListenerEvent(events); + valid = UserHandle.getUserId(r.callerUid) == foregroundUser + && r.matchPhoneStateListenerEvent(events); if (DBG | DBG_LOC) { log("validateEventsAndUserLocked: valid=" + valid - + " r.callerUserId=" + r.callerUserId + " foregroundUser=" + foregroundUser + + " r.callerUid=" + r.callerUid + " foregroundUser=" + foregroundUser + " r.events=" + r.events + " events=" + events); } } finally { @@ -1741,6 +1756,16 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + private boolean checkLocationAccess(Record r) { + long token = Binder.clearCallingIdentity(); + try { + return LocationAccessPolicy.canAccessCellLocation(mContext, + r.callingPackage, r.callerUid, r.callerPid); + } finally { + Binder.restoreCallingIdentity(token); + } + } + private void checkPossibleMissNotify(Record r, int phoneId) { int events = r.events; @@ -1788,7 +1813,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { log("checkPossibleMissNotify: onCellInfoChanged[" + phoneId + "] = " + mCellInfo.get(phoneId)); } - r.callback.onCellInfoChanged(mCellInfo.get(phoneId)); + if (checkLocationAccess(r)) { + r.callback.onCellInfoChanged(mCellInfo.get(phoneId)); + } } catch (RemoteException ex) { mRemoveList.add(r.binder); } @@ -1836,7 +1863,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { try { if (DBG_LOC) log("checkPossibleMissNotify: onCellLocationChanged mCellLocation = " + mCellLocation[phoneId]); - r.callback.onCellLocationChanged(new Bundle(mCellLocation[phoneId])); + if (checkLocationAccess(r)) { + r.callback.onCellLocationChanged(new Bundle(mCellLocation[phoneId])); + } } catch (RemoteException ex) { mRemoveList.add(r.binder); } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java index f53eb15d482..763dffbb129 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java @@ -34,6 +34,7 @@ import android.hardware.soundtrigger.SoundTrigger.RecognitionEvent; import android.hardware.soundtrigger.SoundTrigger.SoundModel; import android.hardware.soundtrigger.SoundTrigger.SoundModelEvent; import android.hardware.soundtrigger.SoundTriggerModule; +import android.os.Binder; import android.os.DeadObjectException; import android.os.PowerManager; import android.os.RemoteException; @@ -880,21 +881,26 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } private void initializeTelephonyAndPowerStateListeners() { - // Get the current call state synchronously for the first recognition. - mCallActive = mTelephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE; - - // Register for call state changes when the first call to start recognition occurs. - mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); - - // Register for power saver mode changes when the first call to start recognition - // occurs. - if (mPowerSaveModeListener == null) { - mPowerSaveModeListener = new PowerSaveModeListener(); - mContext.registerReceiver(mPowerSaveModeListener, - new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)); + long token = Binder.clearCallingIdentity(); + try { + // Get the current call state synchronously for the first recognition. + mCallActive = mTelephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE; + + // Register for call state changes when the first call to start recognition occurs. + mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); + + // Register for power saver mode changes when the first call to start recognition + // occurs. + if (mPowerSaveModeListener == null) { + mPowerSaveModeListener = new PowerSaveModeListener(); + mContext.registerReceiver(mPowerSaveModeListener, + new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)); + } + mIsPowerSaveMode = mPowerManager.getPowerSaveState(ServiceType.SOUND) + .batterySaverEnabled; + } finally { + Binder.restoreCallingIdentity(token); } - mIsPowerSaveMode = mPowerManager.getPowerSaveState(ServiceType.SOUND) - .batterySaverEnabled; } // Sends an error callback to all models with a valid registered callback. diff --git a/telephony/java/android/telephony/LocationAccessPolicy.java b/telephony/java/android/telephony/LocationAccessPolicy.java new file mode 100644 index 00000000000..b362df9ff67 --- /dev/null +++ b/telephony/java/android/telephony/LocationAccessPolicy.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.telephony; + +import android.Manifest; +import android.annotation.NonNull; +import android.annotation.UserIdInt; +import android.app.ActivityManager; +import android.app.AppOpsManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.content.pm.UserInfo; +import android.location.LocationManager; +import android.os.Binder; +import android.os.Build; +import android.os.Process; +import android.os.Trace; +import android.os.UserHandle; +import android.os.UserManager; +import android.provider.Settings; +import android.util.SparseBooleanArray; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Helper for performing location access checks. + * @hide + */ +public final class LocationAccessPolicy { + /** + * API to determine if the caller has permissions to get cell location. + * + * @param pkgName Package name of the application requesting access + * @param uid The uid of the package + * @param pid The pid of the package + * @return boolean true or false if permissions is granted + */ + public static boolean canAccessCellLocation(@NonNull Context context, @NonNull String pkgName, + int uid, int pid) throws SecurityException { + Trace.beginSection("TelephonyLocationCheck"); + try { + // Always allow the phone process to access location. This avoid breaking legacy code + // that rely on public-facing APIs to access cell location, and it doesn't create a + // info leak risk because the cell location is stored in the phone process anyway. + if (uid == Process.PHONE_UID) { + return true; + } + + // We always require the location permission and also require the + // location mode to be on for non-legacy apps. Legacy apps are + // required to be in the foreground to at least mitigate the case + // where a legacy app the user is not using tracks their location. + // Granting ACCESS_FINE_LOCATION to an app automatically grants it + // ACCESS_COARSE_LOCATION. + + if (context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION, pid, uid) == + PackageManager.PERMISSION_DENIED) { + return false; + } + final int opCode = AppOpsManager.permissionToOpCode( + Manifest.permission.ACCESS_COARSE_LOCATION); + if (opCode != AppOpsManager.OP_NONE && context.getSystemService(AppOpsManager.class) + .noteOpNoThrow(opCode, uid, pkgName) != AppOpsManager.MODE_ALLOWED) { + return false; + } + if (!isLocationModeEnabled(context, UserHandle.getUserId(uid)) + && !isLegacyForeground(context, pkgName, uid)) { + return false; + } + // If the user or profile is current, permission is granted. + // Otherwise, uid must have INTERACT_ACROSS_USERS_FULL permission. + return isCurrentProfile(context, uid) || checkInteractAcrossUsersFull(context); + } finally { + Trace.endSection(); + } + } + + private static boolean isLocationModeEnabled(@NonNull Context context, @UserIdInt int userId) { + int locationMode = Settings.Secure.getIntForUser(context.getContentResolver(), + Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF, userId); + return locationMode != Settings.Secure.LOCATION_MODE_OFF + && locationMode != Settings.Secure.LOCATION_MODE_SENSORS_ONLY; + } + + private static boolean isLegacyForeground(@NonNull Context context, @NonNull String pkgName, + int uid) { + long token = Binder.clearCallingIdentity(); + try { + return isLegacyVersion(context, pkgName) && isForegroundApp(context, uid); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + private static boolean isLegacyVersion(@NonNull Context context, @NonNull String pkgName) { + try { + if (context.getPackageManager().getApplicationInfo(pkgName, 0) + .targetSdkVersion <= Build.VERSION_CODES.O) { + return true; + } + } catch (PackageManager.NameNotFoundException e) { + // In case of exception, assume known app (more strict checking) + // Note: This case will never happen since checkPackage is + // called to verify validity before checking app's version. + } + return false; + } + + private static boolean isForegroundApp(@NonNull Context context, int uid) { + final ActivityManager am = context.getSystemService(ActivityManager.class); + return am.getUidImportance(uid) <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE; + } + + private static boolean checkInteractAcrossUsersFull(@NonNull Context context) { + return context.checkCallingOrSelfPermission( + android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) + == PackageManager.PERMISSION_GRANTED; + } + + private static boolean isCurrentProfile(@NonNull Context context, int uid) { + long token = Binder.clearCallingIdentity(); + try { + final int currentUser = ActivityManager.getCurrentUser(); + final int callingUserId = UserHandle.getUserId(uid); + if (callingUserId == currentUser) { + return true; + } else { + List userProfiles = context.getSystemService( + UserManager.class).getProfiles(currentUser); + for (UserInfo user : userProfiles) { + if (user.id == callingUserId) { + return true; + } + } + } + return false; + } finally { + Binder.restoreCallingIdentity(token); + } + } +} diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 1fae04b17d0..137f491b3e0 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -541,9 +541,9 @@ public class SubscriptionManager { * onSubscriptionsChanged overridden. */ public void addOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) { - String pkgForDebug = mContext != null ? mContext.getOpPackageName() : ""; + String pkgName = mContext != null ? mContext.getOpPackageName() : ""; if (DBG) { - logd("register OnSubscriptionsChangedListener pkgForDebug=" + pkgForDebug + logd("register OnSubscriptionsChangedListener pkgName=" + pkgName + " listener=" + listener); } try { @@ -552,7 +552,7 @@ public class SubscriptionManager { ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService( "telephony.registry")); if (tr != null) { - tr.addOnSubscriptionsChangedListener(pkgForDebug, listener.callback); + tr.addOnSubscriptionsChangedListener(pkgName, listener.callback); } } catch (RemoteException ex) { // Should not happen diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 96ed20b841b..aa9f75df758 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -3815,6 +3815,9 @@ public class TelephonyManager { * To unregister a listener, pass the listener object and set the * events argument to * {@link PhoneStateListener#LISTEN_NONE LISTEN_NONE} (0). + * Note: if you call this method while in the middle of a binder transaction, you must + * call {@link android.os.Binder#clearCallingIdentity()} before calling this method. A + * {@link SecurityException} will be thrown otherwise. * * @param listener The {@link PhoneStateListener} object to register * (or unregister) -- GitLab From 8ed124d57ee4a5c0cbc7b7b1b67f1f6496630396 Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Tue, 30 Jan 2018 17:16:52 -0500 Subject: [PATCH 003/386] Implement AnimatedImageDrawable.getColorFilter Test: CTS: Ie9766f24164d6b035944b1fe82c2d285482ad1d2 Change-Id: I7f2cb0da918ae67c7a5906a478012fa25678294c --- .../drawable/AnimatedImageDrawable.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java index 86e6fa8c2fc..598807d0309 100644 --- a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java @@ -83,6 +83,8 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { private Runnable mRunnable; + private ColorFilter mColorFilter; + /** * Pass this to {@link #setLoopCount} to loop infinitely. * @@ -276,9 +278,18 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { throw new IllegalStateException("called setColorFilter on empty AnimatedImageDrawable"); } - long nativeFilter = colorFilter == null ? 0 : colorFilter.getNativeInstance(); - nSetColorFilter(mState.mNativePtr, nativeFilter); - invalidateSelf(); + if (colorFilter != mColorFilter) { + mColorFilter = colorFilter; + long nativeFilter = colorFilter == null ? 0 : colorFilter.getNativeInstance(); + nSetColorFilter(mState.mNativePtr, nativeFilter); + invalidateSelf(); + } + } + + @Override + @Nullable + public ColorFilter getColorFilter() { + return mColorFilter; } @Override -- GitLab From 3ffc6e7e0f3f473e9d9bf2d0e32d4948c809b8b8 Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Wed, 7 Feb 2018 17:00:15 -0800 Subject: [PATCH 004/386] Add 90th and 95th percentile to ManualBenchmarkState Test: m ActivityManagerPerfTestsTestApp ActivityManagerPerfTests Test: adb install \ $OUT/data/app/ActivityManagerPerfTestsTestApp/ActivityManagerPerfTestsTestApp.apk Test: adb install \ $OUT/data/app/ActivityManagerPerfTests/ActivityManagerPerfTests.apk Test: adb shell am instrument -w -e class \ com.android.frameworks.perftests.am.tests.BroadcastPerfTest \ com.android.frameworks.perftests.amtests/android.support.test.runner.AndroidJUnitRunner BUG: 67460485 Change-Id: I3da7079758b0f8c123d354780f310f357886543c --- .../perftests/utils/ManualBenchmarkState.java | 2 ++ .../src/android/perftests/utils/Stats.java | 27 ++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java b/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java index 2c84db18ce5..40778de4e52 100644 --- a/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java +++ b/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java @@ -150,6 +150,8 @@ public final class ManualBenchmarkState { final Bundle status = new Bundle(); status.putLong(key + "_median", mStats.getMedian()); status.putLong(key + "_mean", (long) mStats.getMean()); + status.putLong(key + "_percentile90", mStats.getPercentile90()); + status.putLong(key + "_percentile95", mStats.getPercentile95()); status.putLong(key + "_stddev", (long) mStats.getStandardDeviation()); instrumentation.sendStatus(Activity.RESULT_OK, status); } diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/Stats.java b/apct-tests/perftests/utils/src/android/perftests/utils/Stats.java index acc44a8febf..5e50073c067 100644 --- a/apct-tests/perftests/utils/src/android/perftests/utils/Stats.java +++ b/apct-tests/perftests/utils/src/android/perftests/utils/Stats.java @@ -21,7 +21,7 @@ import java.util.Collections; import java.util.List; public class Stats { - private long mMedian, mMin, mMax; + private long mMedian, mMin, mMax, mPercentile90, mPercentile95; private double mMean, mStandardDeviation; /* Calculate stats in constructor. */ @@ -35,12 +35,14 @@ public class Stats { Collections.sort(values); - mMedian = size % 2 == 0 ? (values.get(size / 2) + values.get(size / 2 - 1)) / 2 : - values.get(size / 2); - mMin = values.get(0); mMax = values.get(values.size() - 1); + mMedian = size % 2 == 0 ? (values.get(size / 2) + values.get(size / 2 - 1)) / 2 : + values.get(size / 2); + mPercentile90 = getPercentile(values, 90); + mPercentile95 = getPercentile(values, 95); + for (int i = 0; i < size; ++i) { long result = values.get(i); mMean += result; @@ -73,4 +75,21 @@ public class Stats { public double getStandardDeviation() { return mStandardDeviation; } + + public long getPercentile90() { + return mPercentile90; + } + + public long getPercentile95() { + return mPercentile95; + } + + private static long getPercentile(List values, int percentile) { + if (percentile < 0 || percentile > 100) { + throw new IllegalArgumentException( + "invalid percentile " + percentile + ", should be 0-100"); + } + int idx = (values.size() - 1) * percentile / 100; + return values.get(idx); + } } -- GitLab From 690b36903ce89e692ca73ff75621ad15077fabbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?tiansiming=20=5B=E7=94=B0=E6=80=9D=E6=98=8E=5D?= Date: Sat, 10 Feb 2018 15:53:53 +0800 Subject: [PATCH 005/386] Let sendShowMessage called from hide to show MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dialog's onShow callback is not called from hide to show. Detailed information is written in the bug link. Bug: 73147112 Test: Manual test with the demo Change-Id: I1d32d9695c18a206b661a1bd7c0dba25dbfbf28b Signed-off-by: tiansiming [田思明] --- core/java/android/app/Dialog.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index b162cb165fb..2eabd86c5da 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -291,7 +291,10 @@ public class Dialog implements DialogInterface, Window.Callback, if (mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) { mWindow.invalidatePanelMenu(Window.FEATURE_ACTION_BAR); } - mDecor.setVisibility(View.VISIBLE); + if (mDecor.getVisibility() != View.VISIBLE) { + mDecor.setVisibility(View.VISIBLE); + sendShowMessage(); + } } return; } -- GitLab From b214bc44f1942b957f60dad75517e07cede77f18 Mon Sep 17 00:00:00 2001 From: Neil Fuller Date: Mon, 18 Dec 2017 16:57:22 +0000 Subject: [PATCH 006/386] Split query permission from update permission Split time zone rules query permission from update permission. This would allow an app like Settings to determine the current rules update state, which would enable it to show the version of rules the device came with, if there have been any updates and whether a reboot is needed for changes to take effect. Test: PTS: run -m PtsTimeZoneTestCases Test: atest FrameworksServicesTests:RulesManagerServiceTest Bug: 69443060 Change-Id: Ia5d31814d7caee842f5e28870fab61f7c7129386 --- api/system-current.txt | 1 + .../java/android/app/timezone/RulesManager.java | 11 +++++++---- core/res/AndroidManifest.xml | 6 ++++++ .../server/timezone/RulesManagerService.java | 5 ++++- .../timezone/RulesManagerServiceTest.java | 17 ++++++++++++----- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index 3dbb333ef78..5ec8ad34190 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -123,6 +123,7 @@ package android { field public static final java.lang.String PERFORM_SIM_ACTIVATION = "android.permission.PERFORM_SIM_ACTIVATION"; field public static final java.lang.String PROVIDE_RESOLVER_RANKER_SERVICE = "android.permission.PROVIDE_RESOLVER_RANKER_SERVICE"; field public static final java.lang.String PROVIDE_TRUST_AGENT = "android.permission.PROVIDE_TRUST_AGENT"; + field public static final java.lang.String QUERY_TIME_ZONE_RULES = "android.permission.QUERY_TIME_ZONE_RULES"; field public static final java.lang.String READ_CONTENT_RATING_SYSTEMS = "android.permission.READ_CONTENT_RATING_SYSTEMS"; field public static final java.lang.String READ_DREAM_STATE = "android.permission.READ_DREAM_STATE"; field public static final java.lang.String READ_FRAME_BUFFER = "android.permission.READ_FRAME_BUFFER"; diff --git a/core/java/android/app/timezone/RulesManager.java b/core/java/android/app/timezone/RulesManager.java index dc792569417..fe83113b5d5 100644 --- a/core/java/android/app/timezone/RulesManager.java +++ b/core/java/android/app/timezone/RulesManager.java @@ -36,7 +36,7 @@ import java.util.Arrays; *

This interface is intended for use with the default APK-based time zone rules update * application but it can also be used by OEMs if that mechanism is turned off using configuration. * All callers must possess the {@link android.Manifest.permission#UPDATE_TIME_ZONE_RULES} system - * permission. + * permission unless otherwise stated. * *

When using the default mechanism, when properly configured the Android system will send a * {@link RulesUpdaterContract#ACTION_TRIGGER_RULES_UPDATE_CHECK} intent with a @@ -120,9 +120,12 @@ public final class RulesManager { /** * Returns information about the current time zone rules state such as the IANA version of - * the system and any currently installed distro. This method is intended to allow clients to - * determine if the current state can be improved; for example by passing the information to a - * server that may provide a new distro for download. + * the system and any currently installed distro. This method allows clients to determine the + * current device state, perhaps to see if it can be improved; for example by passing the + * information to a server that may provide a new distro for download. + * + *

Callers must possess the {@link android.Manifest.permission#QUERY_TIME_ZONE_RULES} system + * permission. */ public RulesState getRulesState() { try { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 022cf229f48..9dc6d7112bd 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2397,6 +2397,12 @@ + + + + + - - @@ -61,33 +60,16 @@ android:textAppearance="?android:attr/textAppearanceMedium" android:textStyle="bold" android:singleLine="true" - android:layout_marginBottom="2dip" - android:duplicateParentState="true" /> - - - @@ -109,10 +91,10 @@ android:textAppearance="?android:attr/textAppearanceMedium" android:textStyle="bold" android:singleLine="true" - android:layout_marginBottom="2dip" + android:layout_marginBottom="2dp" android:duplicateParentState="true" /> - - - - diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 2b7b056cdf4..d1cc5d540fe 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2954,20 +2954,20 @@ %1$s running - Tap to switch to app + Tap to return to game - Switch apps? + Choose game - Another app is already running - that must be stopped before you can start a new one. + For better performance, only one of these + games can be open at a time. - Return to %1$s - Don\'t start the new app. + Go back to %1$s - Start %1$s - Stop the old app without saving. + Open %1$s + %1$s will close + without saving %1$s exceeded memory diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index f7b6f06a680..fc5dbb11711 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -109,7 +109,6 @@ - -- GitLab From d31bc123a06d2ffc2ca1b76a591a07865744ae12 Mon Sep 17 00:00:00 2001 From: Izabela Orlowska Date: Mon, 12 Feb 2018 11:03:42 +0000 Subject: [PATCH 008/386] AAPT2: normalize Manifest java identifiers. Currently AAPT2 does not allow permissions which last piece contains the "-" symbol (since it is an illegal character for a java identifier). AAPT1 would normalize the last piece, therefore creating a valid java identifier. This CL makes AAPT2 behave in a similar way to AAPT1, but instead of modifying the original value of the permission string, modifies only the java identifier part, leaving the permission string unchanged. Fixes: 72980877 Test: updated Change-Id: Ie44317e07407341ba3e91a84d9b06980547b3448 --- tools/aapt2/java/ManifestClassGenerator.cpp | 6 ++++++ tools/aapt2/java/ManifestClassGenerator_test.cpp | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/tools/aapt2/java/ManifestClassGenerator.cpp b/tools/aapt2/java/ManifestClassGenerator.cpp index c4b36176aa7..be67c9c8c03 100644 --- a/tools/aapt2/java/ManifestClassGenerator.cpp +++ b/tools/aapt2/java/ManifestClassGenerator.cpp @@ -21,6 +21,7 @@ #include "Source.h" #include "java/AnnotationProcessor.h" #include "java/ClassDefinition.h" +#include "java/JavaClassGenerator.h" #include "text/Unicode.h" #include "util/Maybe.h" #include "xml/XmlDom.h" @@ -38,6 +39,11 @@ static Maybe ExtractJavaIdentifier(IDiagnostics* diag, const Source result = result.substr(pos + 1); } + // Normalize only the java identifier, leave the original value unchanged. + if (result.contains("-")) { + result = JavaClassGenerator::TransformToFieldName(result); + } + if (result.empty()) { diag->Error(DiagMessage(source) << "empty symbol"); return {}; diff --git a/tools/aapt2/java/ManifestClassGenerator_test.cpp b/tools/aapt2/java/ManifestClassGenerator_test.cpp index f4e10ab2e58..ab7f9a11d97 100644 --- a/tools/aapt2/java/ManifestClassGenerator_test.cpp +++ b/tools/aapt2/java/ManifestClassGenerator_test.cpp @@ -141,6 +141,18 @@ TEST(ManifestClassGeneratorTest, LastSeenPermissionWithSameLeafNameTakesPreceden EXPECT_THAT(actual, Not(HasSubstr("ACCESS_INTERNET=\"com.android.sample.ACCESS_INTERNET\";"))); } +TEST(ManifestClassGeneratorTest, NormalizePermissionNames) { + std::unique_ptr context = test::ContextBuilder().Build(); + std::unique_ptr manifest = test::BuildXmlDom(R"( + + + )"); + + std::string actual; + ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); + EXPECT_THAT(actual, HasSubstr("access_internet=\"android.permission.access-internet\";")); +} + static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xml::XmlResource* res, std::string* out_str) { std::unique_ptr manifest_class = -- GitLab From e59145a12ba688148c6f845fa1c8c3fac5b13eba Mon Sep 17 00:00:00 2001 From: Alexey Kuzmin Date: Sat, 10 Feb 2018 15:19:03 +0000 Subject: [PATCH 009/386] Add tracing tags to vibrator Now all somewhat time-consuming methods of the VibratorService are surrounded by traceBegin/traceEnd blocks. The vibration itself is surrounded with asyncTrace block. Test: Run "systrace vibrator" and see the time consumption report. Bug: 73000045 Change-Id: Ie6347d179cf3e0dd13dc3daf76917f3fbb870d2b --- core/java/android/os/Trace.java | 2 + .../com/android/server/VibratorService.java | 595 ++++++++++-------- 2 files changed, 333 insertions(+), 264 deletions(-) diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java index fa96dd355e0..f93b39f518c 100644 --- a/core/java/android/os/Trace.java +++ b/core/java/android/os/Trace.java @@ -89,6 +89,8 @@ public final class Trace { public static final long TRACE_TAG_NETWORK = 1L << 21; /** @hide */ public static final long TRACE_TAG_ADB = 1L << 22; + /** @hide */ + public static final long TRACE_TAG_VIBRATOR = 1L << 23; private static final long TRACE_TAG_NOT_READY = 1L << 63; private static final int MAX_SECTION_NAME_LEN = 127; diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 7fe5d7cdafc..14c99b22996 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -44,6 +44,7 @@ import android.os.ServiceManager; import android.os.ShellCallback; import android.os.ShellCommand; import android.os.SystemClock; +import android.os.Trace; import android.os.UserHandle; import android.os.Vibrator; import android.os.VibrationEffect; @@ -288,13 +289,12 @@ public class VibratorService extends IVibratorService.Stub com.android.internal.R.array.config_virtualKeyVibePattern); VibrationEffect clickEffect = createEffect(clickEffectTimings); VibrationEffect doubleClickEffect = VibrationEffect.createWaveform( - DOUBLE_CLICK_EFFECT_FALLBACK_TIMINGS, -1 /*repeatIndex*/); + DOUBLE_CLICK_EFFECT_FALLBACK_TIMINGS, -1 /*repeatIndex*/); long[] tickEffectTimings = getLongIntArray(context.getResources(), com.android.internal.R.array.config_clockTickVibePattern); VibrationEffect tickEffect = createEffect(tickEffectTimings); mFallbackEffects = new VibrationEffect[] { clickEffect, doubleClickEffect, tickEffect }; - } private static VibrationEffect createEffect(long[] timings) { @@ -308,44 +308,49 @@ public class VibratorService extends IVibratorService.Stub } public void systemReady() { - mIm = mContext.getSystemService(InputManager.class); - mVibrator = mContext.getSystemService(Vibrator.class); - mSettingObserver = new SettingsObserver(mH); - - mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); - mPowerManagerInternal.registerLowPowerModeObserver( - new PowerManagerInternal.LowPowerModeListener() { - @Override - public int getServiceType() { - return ServiceType.VIBRATION; - } + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorService#systemReady"); + try { + mIm = mContext.getSystemService(InputManager.class); + mVibrator = mContext.getSystemService(Vibrator.class); + mSettingObserver = new SettingsObserver(mH); + + mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); + mPowerManagerInternal.registerLowPowerModeObserver( + new PowerManagerInternal.LowPowerModeListener() { + @Override + public int getServiceType() { + return ServiceType.VIBRATION; + } - @Override - public void onLowPowerModeChanged(PowerSaveState result) { - updateVibrators(); - } - }); + @Override + public void onLowPowerModeChanged(PowerSaveState result) { + updateVibrators(); + } + }); - mContext.getContentResolver().registerContentObserver( - Settings.System.getUriFor(Settings.System.VIBRATE_INPUT_DEVICES), - true, mSettingObserver, UserHandle.USER_ALL); + mContext.getContentResolver().registerContentObserver( + Settings.System.getUriFor(Settings.System.VIBRATE_INPUT_DEVICES), + true, mSettingObserver, UserHandle.USER_ALL); - mContext.getContentResolver().registerContentObserver( - Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_INTENSITY), - true, mSettingObserver, UserHandle.USER_ALL); + mContext.getContentResolver().registerContentObserver( + Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_INTENSITY), + true, mSettingObserver, UserHandle.USER_ALL); - mContext.getContentResolver().registerContentObserver( - Settings.System.getUriFor(Settings.System.NOTIFICATION_VIBRATION_INTENSITY), - true, mSettingObserver, UserHandle.USER_ALL); + mContext.getContentResolver().registerContentObserver( + Settings.System.getUriFor(Settings.System.NOTIFICATION_VIBRATION_INTENSITY), + true, mSettingObserver, UserHandle.USER_ALL); - mContext.registerReceiver(new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - updateVibrators(); - } - }, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mH); + mContext.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + updateVibrators(); + } + }, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mH); - updateVibrators(); + updateVibrators(); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); + } } private final class SettingsObserver extends ContentObserver { @@ -422,60 +427,66 @@ public class VibratorService extends IVibratorService.Stub @Override // Binder call public void vibrate(int uid, String opPkg, VibrationEffect effect, int usageHint, IBinder token) { - if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE) - != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("Requires VIBRATE permission"); - } - if (token == null) { - Slog.e(TAG, "token must not be null"); - return; - } - verifyIncomingUid(uid); - if (!verifyVibrationEffect(effect)) { - return; - } + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "vibrate"); + try { + if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Requires VIBRATE permission"); + } + if (token == null) { + Slog.e(TAG, "token must not be null"); + return; + } + verifyIncomingUid(uid); + if (!verifyVibrationEffect(effect)) { + return; + } - // If our current vibration is longer than the new vibration and is the same amplitude, - // then just let the current one finish. - synchronized (mLock) { - if (effect instanceof VibrationEffect.OneShot - && mCurrentVibration != null - && mCurrentVibration.effect instanceof VibrationEffect.OneShot) { - VibrationEffect.OneShot newOneShot = (VibrationEffect.OneShot) effect; - VibrationEffect.OneShot currentOneShot = - (VibrationEffect.OneShot) mCurrentVibration.effect; - if (mCurrentVibration.hasTimeoutLongerThan(newOneShot.getDuration()) - && newOneShot.getAmplitude() == currentOneShot.getAmplitude()) { + // If our current vibration is longer than the new vibration and is the same amplitude, + // then just let the current one finish. + synchronized (mLock) { + if (effect instanceof VibrationEffect.OneShot + && mCurrentVibration != null + && mCurrentVibration.effect instanceof VibrationEffect.OneShot) { + VibrationEffect.OneShot newOneShot = (VibrationEffect.OneShot) effect; + VibrationEffect.OneShot currentOneShot = + (VibrationEffect.OneShot) mCurrentVibration.effect; + if (mCurrentVibration.hasTimeoutLongerThan(newOneShot.getDuration()) + && newOneShot.getAmplitude() == currentOneShot.getAmplitude()) { + if (DEBUG) { + Slog.d(TAG, + "Ignoring incoming vibration in favor of current vibration"); + } + return; + } + } + + // If the current vibration is repeating and the incoming one is non-repeating, + // then ignore the non-repeating vibration. This is so that we don't cancel + // vibrations that are meant to grab the attention of the user, like ringtones and + // alarms, in favor of one-shot vibrations that are likely quite short. + if (!isRepeatingVibration(effect) + && mCurrentVibration != null + && isRepeatingVibration(mCurrentVibration.effect)) { if (DEBUG) { - Slog.d(TAG, "Ignoring incoming vibration in favor of current vibration"); + Slog.d(TAG, "Ignoring incoming vibration in favor of alarm vibration"); } return; } - } - // If the current vibration is repeating and the incoming one is non-repeating, then - // ignore the non-repeating vibration. This is so that we don't cancel vibrations that - // are meant to grab the attention of the user, like ringtones and alarms, in favor of - // one-shot vibrations that are likely quite short. - if (!isRepeatingVibration(effect) - && mCurrentVibration != null - && isRepeatingVibration(mCurrentVibration.effect)) { - if (DEBUG) { - Slog.d(TAG, "Ignoring incoming vibration in favor of alarm vibration"); + Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg); + linkVibration(vib); + long ident = Binder.clearCallingIdentity(); + try { + doCancelVibrateLocked(); + startVibrationLocked(vib); + addToPreviousVibrationsLocked(vib); + } finally { + Binder.restoreCallingIdentity(ident); } - return; - } - - Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg); - linkVibration(vib); - long ident = Binder.clearCallingIdentity(); - try { - doCancelVibrateLocked(); - startVibrationLocked(vib); - addToPreviousVibrationsLocked(vib); - } finally { - Binder.restoreCallingIdentity(ident); } + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); } } @@ -520,13 +531,19 @@ public class VibratorService extends IVibratorService.Stub @GuardedBy("mLock") private void doCancelVibrateLocked() { - mH.removeCallbacks(mVibrationEndRunnable); - if (mThread != null) { - mThread.cancel(); - mThread = null; + Trace.asyncTraceEnd(Trace.TRACE_TAG_VIBRATOR, "vibration", 0); + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "doCancelVibrateLocked"); + try { + mH.removeCallbacks(mVibrationEndRunnable); + if (mThread != null) { + mThread.cancel(); + mThread = null; + } + doVibratorOff(); + reportFinishVibrationLocked(); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); } - doVibratorOff(); - reportFinishVibrationLocked(); } // Callback for whenever the current vibration has finished played out @@ -543,55 +560,68 @@ public class VibratorService extends IVibratorService.Stub @GuardedBy("mLock") private void startVibrationLocked(final Vibration vib) { - if (!isAllowedToVibrateLocked(vib)) { - return; - } + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "startVibrationLocked"); + try { + if (!isAllowedToVibrateLocked(vib)) { + return; + } - final int intensity = getCurrentIntensityLocked(vib); - if (intensity == Vibrator.VIBRATION_INTENSITY_OFF) { - return; - } + final int intensity = getCurrentIntensityLocked(vib); + if (intensity == Vibrator.VIBRATION_INTENSITY_OFF) { + return; + } - if (vib.isRingtone() && !shouldVibrateForRingtone()) { - if (DEBUG) { - Slog.e(TAG, "Vibrate ignored, not vibrating for ringtones"); + if (vib.isRingtone() && !shouldVibrateForRingtone()) { + if (DEBUG) { + Slog.e(TAG, "Vibrate ignored, not vibrating for ringtones"); + } + return; } - return; - } - final int mode = getAppOpMode(vib); - if (mode != AppOpsManager.MODE_ALLOWED) { - if (mode == AppOpsManager.MODE_ERRORED) { - // We might be getting calls from within system_server, so we don't actually want - // to throw a SecurityException here. - Slog.w(TAG, "Would be an error: vibrate from uid " + vib.uid); + final int mode = getAppOpMode(vib); + if (mode != AppOpsManager.MODE_ALLOWED) { + if (mode == AppOpsManager.MODE_ERRORED) { + // We might be getting calls from within system_server, so we don't actually + // want to throw a SecurityException here. + Slog.w(TAG, "Would be an error: vibrate from uid " + vib.uid); + } + return; } - return; + applyVibrationIntensityScalingLocked(vib, intensity); + startVibrationInnerLocked(vib); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); } - applyVibrationIntensityScalingLocked(vib, intensity); - startVibrationInnerLocked(vib); } @GuardedBy("mLock") private void startVibrationInnerLocked(Vibration vib) { - mCurrentVibration = vib; - if (vib.effect instanceof VibrationEffect.OneShot) { - VibrationEffect.OneShot oneShot = (VibrationEffect.OneShot) vib.effect; - doVibratorOn(oneShot.getDuration(), oneShot.getAmplitude(), vib.uid, vib.usageHint); - mH.postDelayed(mVibrationEndRunnable, oneShot.getDuration()); - } else if (vib.effect instanceof VibrationEffect.Waveform) { - // mThread better be null here. doCancelVibrate should always be - // called before startNextVibrationLocked or startVibrationLocked. - VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) vib.effect; - mThread = new VibrateThread(waveform, vib.uid, vib.usageHint); - mThread.start(); - } else if (vib.effect instanceof VibrationEffect.Prebaked) { - long timeout = doVibratorPrebakedEffectLocked(vib); - if (timeout > 0) { - mH.postDelayed(mVibrationEndRunnable, timeout); + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "startVibrationInnerLocked"); + try { + mCurrentVibration = vib; + if (vib.effect instanceof VibrationEffect.OneShot) { + Trace.asyncTraceBegin(Trace.TRACE_TAG_VIBRATOR, "vibration", 0); + VibrationEffect.OneShot oneShot = (VibrationEffect.OneShot) vib.effect; + doVibratorOn(oneShot.getDuration(), oneShot.getAmplitude(), vib.uid, vib.usageHint); + mH.postDelayed(mVibrationEndRunnable, oneShot.getDuration()); + } else if (vib.effect instanceof VibrationEffect.Waveform) { + // mThread better be null here. doCancelVibrate should always be + // called before startNextVibrationLocked or startVibrationLocked. + Trace.asyncTraceBegin(Trace.TRACE_TAG_VIBRATOR, "vibration", 0); + VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) vib.effect; + mThread = new VibrateThread(waveform, vib.uid, vib.usageHint); + mThread.start(); + } else if (vib.effect instanceof VibrationEffect.Prebaked) { + Trace.asyncTraceBegin(Trace.TRACE_TAG_VIBRATOR, "vibration", 0); + long timeout = doVibratorPrebakedEffectLocked(vib); + if (timeout > 0) { + mH.postDelayed(mVibrationEndRunnable, timeout); + } + } else { + Slog.e(TAG, "Unknown vibration type, ignoring"); } - } else { - Slog.e(TAG, "Unknown vibration type, ignoring"); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); } } @@ -708,14 +738,19 @@ public class VibratorService extends IVibratorService.Stub @GuardedBy("mLock") private void reportFinishVibrationLocked() { - if (mCurrentVibration != null) { - try { - mAppOpsService.finishOperation(AppOpsManager.getToken(mAppOpsService), - AppOpsManager.OP_VIBRATE, mCurrentVibration.uid, - mCurrentVibration.opPkg); - } catch (RemoteException e) { } - unlinkVibration(mCurrentVibration); - mCurrentVibration = null; + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "reportFinishVibrationLocked"); + try { + if (mCurrentVibration != null) { + try { + mAppOpsService.finishOperation(AppOpsManager.getToken(mAppOpsService), + AppOpsManager.OP_VIBRATE, mCurrentVibration.uid, + mCurrentVibration.opPkg); + } catch (RemoteException e) { } + unlinkVibration(mCurrentVibration); + mCurrentVibration = null; + } + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); } } @@ -838,28 +873,34 @@ public class VibratorService extends IVibratorService.Stub } private void doVibratorOn(long millis, int amplitude, int uid, int usageHint) { - synchronized (mInputDeviceVibrators) { - if (amplitude == VibrationEffect.DEFAULT_AMPLITUDE) { - amplitude = mDefaultVibrationAmplitude; - } - if (DEBUG) { - Slog.d(TAG, "Turning vibrator on for " + millis + " ms" + - " with amplitude " + amplitude + "."); - } - noteVibratorOnLocked(uid, millis); - final int vibratorCount = mInputDeviceVibrators.size(); - if (vibratorCount != 0) { - final AudioAttributes attributes = - new AudioAttributes.Builder().setUsage(usageHint).build(); - for (int i = 0; i < vibratorCount; i++) { - mInputDeviceVibrators.get(i).vibrate(millis, attributes); + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "doVibratorOn"); + try { + synchronized (mInputDeviceVibrators) { + if (amplitude == VibrationEffect.DEFAULT_AMPLITUDE) { + amplitude = mDefaultVibrationAmplitude; + } + if (DEBUG) { + Slog.d(TAG, "Turning vibrator on for " + millis + " ms" + + " with amplitude " + amplitude + "."); + } + noteVibratorOnLocked(uid, millis); + final int vibratorCount = mInputDeviceVibrators.size(); + if (vibratorCount != 0) { + final AudioAttributes attributes = + new AudioAttributes.Builder().setUsage(usageHint).build(); + for (int i = 0; i < vibratorCount; i++) { + mInputDeviceVibrators.get(i).vibrate(millis, attributes); + } + } else { + // Note: ordering is important here! Many haptic drivers will reset their + // amplitude when enabled, so we always have to enable frst, then set the + // amplitude. + vibratorOn(millis); + doVibratorSetAmplitude(amplitude); } - } else { - // Note: ordering is important here! Many haptic drivers will reset their amplitude - // when enabled, so we always have to enable frst, then set the amplitude. - vibratorOn(millis); - doVibratorSetAmplitude(amplitude); } + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); } } @@ -870,52 +911,63 @@ public class VibratorService extends IVibratorService.Stub } private void doVibratorOff() { - synchronized (mInputDeviceVibrators) { - if (DEBUG) { - Slog.d(TAG, "Turning vibrator off."); - } - noteVibratorOffLocked(); - final int vibratorCount = mInputDeviceVibrators.size(); - if (vibratorCount != 0) { - for (int i = 0; i < vibratorCount; i++) { - mInputDeviceVibrators.get(i).cancel(); + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "doVibratorOff"); + try { + synchronized (mInputDeviceVibrators) { + if (DEBUG) { + Slog.d(TAG, "Turning vibrator off."); + } + noteVibratorOffLocked(); + final int vibratorCount = mInputDeviceVibrators.size(); + if (vibratorCount != 0) { + for (int i = 0; i < vibratorCount; i++) { + mInputDeviceVibrators.get(i).cancel(); + } + } else { + vibratorOff(); } - } else { - vibratorOff(); } + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); } } @GuardedBy("mLock") private long doVibratorPrebakedEffectLocked(Vibration vib) { - final VibrationEffect.Prebaked prebaked = (VibrationEffect.Prebaked) vib.effect; - final boolean usingInputDeviceVibrators; - synchronized (mInputDeviceVibrators) { - usingInputDeviceVibrators = !mInputDeviceVibrators.isEmpty(); - } - // Input devices don't support prebaked effect, so skip trying it with them. - if (!usingInputDeviceVibrators) { - long timeout = vibratorPerformEffect(prebaked.getId(), prebaked.getEffectStrength()); - if (timeout > 0) { - noteVibratorOnLocked(vib.uid, timeout); - return timeout; + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "doVibratorPrebakedEffectLocked"); + try { + final VibrationEffect.Prebaked prebaked = (VibrationEffect.Prebaked) vib.effect; + final boolean usingInputDeviceVibrators; + synchronized (mInputDeviceVibrators) { + usingInputDeviceVibrators = !mInputDeviceVibrators.isEmpty(); } - } - if (!prebaked.shouldFallback()) { - return 0; - } - VibrationEffect effect = getFallbackEffect(prebaked.getId()); - if (effect == null) { - Slog.w(TAG, "Failed to play prebaked effect, no fallback"); + // Input devices don't support prebaked effect, so skip trying it with them. + if (!usingInputDeviceVibrators) { + long timeout = vibratorPerformEffect(prebaked.getId(), + prebaked.getEffectStrength()); + if (timeout > 0) { + noteVibratorOnLocked(vib.uid, timeout); + return timeout; + } + } + if (!prebaked.shouldFallback()) { + return 0; + } + VibrationEffect effect = getFallbackEffect(prebaked.getId()); + if (effect == null) { + Slog.w(TAG, "Failed to play prebaked effect, no fallback"); + return 0; + } + Vibration fallbackVib = + new Vibration(vib.token, effect, vib.usageHint, vib.uid, vib.opPkg); + final int intensity = getCurrentIntensityLocked(fallbackVib); + linkVibration(fallbackVib); + applyVibrationIntensityScalingLocked(fallbackVib, intensity); + startVibrationInnerLocked(fallbackVib); return 0; + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); } - Vibration fallbackVib = - new Vibration(vib.token, effect, vib.usageHint, vib.uid, vib.opPkg); - final int intensity = getCurrentIntensityLocked(fallbackVib); - linkVibration(fallbackVib); - applyVibrationIntensityScalingLocked(fallbackVib, intensity); - startVibrationInnerLocked(fallbackVib); - return 0; } private VibrationEffect getFallbackEffect(int effectId) { @@ -977,22 +1029,27 @@ public class VibratorService extends IVibratorService.Stub } private long delayLocked(long duration) { - long durationRemaining = duration; - if (duration > 0) { - final long bedtime = duration + SystemClock.uptimeMillis(); - do { - try { - this.wait(durationRemaining); - } - catch (InterruptedException e) { } - if (mForceStop) { - break; - } - durationRemaining = bedtime - SystemClock.uptimeMillis(); - } while (durationRemaining > 0); - return duration - durationRemaining; + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "delayLocked"); + try { + long durationRemaining = duration; + if (duration > 0) { + final long bedtime = duration + SystemClock.uptimeMillis(); + do { + try { + this.wait(durationRemaining); + } + catch (InterruptedException e) { } + if (mForceStop) { + break; + } + durationRemaining = bedtime - SystemClock.uptimeMillis(); + } while (durationRemaining > 0); + return duration - durationRemaining; + } + return 0; + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); } - return 0; } public void run() { @@ -1014,48 +1071,53 @@ public class VibratorService extends IVibratorService.Stub * @return true if it finished naturally, false otherwise (e.g. it was canceled). */ public boolean playWaveform() { - synchronized (this) { - final long[] timings = mWaveform.getTimings(); - final int[] amplitudes = mWaveform.getAmplitudes(); - final int len = timings.length; - final int repeat = mWaveform.getRepeatIndex(); - - int index = 0; - long onDuration = 0; - while (!mForceStop) { - if (index < len) { - final int amplitude = amplitudes[index]; - final long duration = timings[index++]; - if (duration <= 0) { - continue; - } - if (amplitude != 0) { - if (onDuration <= 0) { - // Telling the vibrator to start multiple times usually causes - // effects to feel "choppy" because the motor resets at every on - // command. Instead we figure out how long our next "on" period is - // going to be, tell the motor to stay on for the full duration, - // and then wake up to change the amplitude at the appropriate - // intervals. - onDuration = - getTotalOnDuration(timings, amplitudes, index - 1, repeat); - doVibratorOn(onDuration, amplitude, mUid, mUsageHint); - } else { - doVibratorSetAmplitude(amplitude); + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "playWaveform"); + try { + synchronized (this) { + final long[] timings = mWaveform.getTimings(); + final int[] amplitudes = mWaveform.getAmplitudes(); + final int len = timings.length; + final int repeat = mWaveform.getRepeatIndex(); + + int index = 0; + long onDuration = 0; + while (!mForceStop) { + if (index < len) { + final int amplitude = amplitudes[index]; + final long duration = timings[index++]; + if (duration <= 0) { + continue; + } + if (amplitude != 0) { + if (onDuration <= 0) { + // Telling the vibrator to start multiple times usually causes + // effects to feel "choppy" because the motor resets at every on + // command. Instead we figure out how long our next "on" period + // is going to be, tell the motor to stay on for the full + // duration, and then wake up to change the amplitude at the + // appropriate intervals. + onDuration = getTotalOnDuration(timings, amplitudes, index - 1, + repeat); + doVibratorOn(onDuration, amplitude, mUid, mUsageHint); + } else { + doVibratorSetAmplitude(amplitude); + } } - } - long waitTime = delayLocked(duration); - if (amplitude != 0) { - onDuration -= waitTime; + long waitTime = delayLocked(duration); + if (amplitude != 0) { + onDuration -= waitTime; + } + } else if (repeat < 0) { + break; + } else { + index = repeat; } - } else if (repeat < 0) { - break; - } else { - index = repeat; } + return !mForceStop; } - return !mForceStop; + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); } } @@ -1161,35 +1223,40 @@ public class VibratorService extends IVibratorService.Stub } private int runVibrate() { + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "runVibrate"); try { - final int zenMode = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.ZEN_MODE); - if (zenMode != Settings.Global.ZEN_MODE_OFF) { - try (PrintWriter pw = getOutPrintWriter();) { - pw.print("Ignoring because device is on DND mode "); - pw.println(DebugUtils.flagsToString(Settings.Global.class, "ZEN_MODE_", - zenMode)); - return 0; + try { + final int zenMode = Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.ZEN_MODE); + if (zenMode != Settings.Global.ZEN_MODE_OFF) { + try (PrintWriter pw = getOutPrintWriter();) { + pw.print("Ignoring because device is on DND mode "); + pw.println(DebugUtils.flagsToString(Settings.Global.class, "ZEN_MODE_", + zenMode)); + return 0; + } } + } catch (SettingNotFoundException e) { + // ignore } - } catch (SettingNotFoundException e) { - // ignore - } - final long duration = Long.parseLong(getNextArgRequired()); - if (duration > MAX_VIBRATION_MS) { - throw new IllegalArgumentException("maximum duration is " + MAX_VIBRATION_MS); - } - String description = getNextArg(); - if (description == null) { - description = "Shell command"; - } + final long duration = Long.parseLong(getNextArgRequired()); + if (duration > MAX_VIBRATION_MS) { + throw new IllegalArgumentException("maximum duration is " + MAX_VIBRATION_MS); + } + String description = getNextArg(); + if (description == null) { + description = "Shell command"; + } - VibrationEffect effect = - VibrationEffect.createOneShot(duration, VibrationEffect.DEFAULT_AMPLITUDE); - vibrate(Binder.getCallingUid(), description, effect, AudioAttributes.USAGE_UNKNOWN, - mToken); - return 0; + VibrationEffect effect = + VibrationEffect.createOneShot(duration, VibrationEffect.DEFAULT_AMPLITUDE); + vibrate(Binder.getCallingUid(), description, effect, AudioAttributes.USAGE_UNKNOWN, + mToken); + return 0; + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); + } } @Override -- GitLab From a147486adc8a22ab65956e7de6ba187a06c8638c Mon Sep 17 00:00:00 2001 From: Holly Jiuyu Sun Date: Tue, 6 Feb 2018 20:33:00 -0800 Subject: [PATCH 010/386] Add device capabilities. Bug: 72223709 Test: Unit test Change-Id: I35a74e88767f772f764734d1f535848ba43629b9 --- core/res/res/values/config.xml | 26 ++++++++++++++++++++++++++ core/res/res/values/symbols.xml | 1 + 2 files changed, 27 insertions(+) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 0218750d0f8..4416ff0e8be 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2507,6 +2507,32 @@ in the display pipeline plus some slack just to be sure. --> 120 + + + + + + + + diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 5c8d7451627..d919d6ac9d2 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -143,6 +143,7 @@ android:name="android.permission.MANAGE_BLUETOOTH_WHEN_PERMISSION_REVIEW_REQUIRED" /> + + + + > mOpModeWatchers = new SparseArray<>(); - final ArrayMap> mPackageModeWatchers = new ArrayMap<>(); - final ArrayMap mModeWatchers = new ArrayMap<>(); + final SparseArray> mOpModeWatchers = new SparseArray<>(); + final ArrayMap> mPackageModeWatchers = new ArrayMap<>(); + final ArrayMap mModeWatchers = new ArrayMap<>(); + final ArrayMap> mActiveWatchers = new ArrayMap<>(); final SparseArray> mAudioRestrictions = new SparseArray<>(); - public final class Callback implements DeathRecipient { + public final class ModeCallback implements DeathRecipient { final IAppOpsCallback mCallback; + final int mUid; - public Callback(IAppOpsCallback callback) { + public ModeCallback(IAppOpsCallback callback, int uid) { mCallback = callback; + mUid = uid; try { mCallback.asBinder().linkToDeath(this, 0); } catch (RemoteException e) { @@ -206,6 +209,27 @@ public class AppOpsService extends IAppOpsService.Stub { } } + public final class ActiveCallback implements DeathRecipient { + final IAppOpsActiveCallback mCallback; + + public ActiveCallback(IAppOpsActiveCallback callback) { + mCallback = callback; + try { + mCallback.asBinder().linkToDeath(this, 0); + } catch (RemoteException e) { + } + } + + public void destroy() { + mCallback.asBinder().unlinkToDeath(this, 0); + } + + @Override + public void binderDied() { + stopWatchingActive(mCallback); + } + } + final ArrayMap mClients = new ArrayMap(); public final class ClientState extends Binder implements DeathRecipient { @@ -360,21 +384,30 @@ public class AppOpsService extends IAppOpsService.Stub { return; } - boolean changed = false; + Ops ops = null; // Remove any package state if such. - if (uidState.pkgOps != null && uidState.pkgOps.remove(packageName) != null) { - changed = true; + if (uidState.pkgOps != null) { + ops = uidState.pkgOps.remove(packageName); } // If we just nuked the last package state check if the UID is valid. - if (changed && uidState.pkgOps.isEmpty() + if (ops != null && uidState.pkgOps.isEmpty() && getPackagesForUid(uid).length <= 0) { mUidStates.remove(uid); } - if (changed) { + if (ops != null) { scheduleFastWriteLocked(); + + final int opCount = ops.size(); + for (int i = 0; i < opCount; i++) { + final Op op = ops.valueAt(i); + if (op.duration == -1) { + scheduleOpActiveChangedIfNeededLocked( + op.op, op.uid, op.packageName, false); + } + } } } } @@ -598,14 +631,14 @@ public class AppOpsService extends IAppOpsService.Stub { } String[] uidPackageNames = getPackagesForUid(uid); - ArrayMap> callbackSpecs = null; + ArrayMap> callbackSpecs = null; synchronized (this) { - ArraySet callbacks = mOpModeWatchers.get(code); + ArraySet callbacks = mOpModeWatchers.get(code); if (callbacks != null) { final int callbackCount = callbacks.size(); for (int i = 0; i < callbackCount; i++) { - Callback callback = callbacks.valueAt(i); + ModeCallback callback = callbacks.valueAt(i); ArraySet changedPackages = new ArraySet<>(); Collections.addAll(changedPackages, uidPackageNames); callbackSpecs = new ArrayMap<>(); @@ -621,7 +654,7 @@ public class AppOpsService extends IAppOpsService.Stub { } final int callbackCount = callbacks.size(); for (int i = 0; i < callbackCount; i++) { - Callback callback = callbacks.valueAt(i); + ModeCallback callback = callbacks.valueAt(i); ArraySet changedPackages = callbackSpecs.get(callback); if (changedPackages == null) { changedPackages = new ArraySet<>(); @@ -637,30 +670,23 @@ public class AppOpsService extends IAppOpsService.Stub { return; } - // There are components watching for mode changes such as window manager - // and location manager which are in our process. The callbacks in these - // components may require permissions our remote caller does not have. - final long identity = Binder.clearCallingIdentity(); - try { - for (int i = 0; i < callbackSpecs.size(); i++) { - Callback callback = callbackSpecs.keyAt(i); - ArraySet reportedPackageNames = callbackSpecs.valueAt(i); - try { - if (reportedPackageNames == null) { - callback.mCallback.opChanged(code, uid, null); - } else { - final int reportedPackageCount = reportedPackageNames.size(); - for (int j = 0; j < reportedPackageCount; j++) { - String reportedPackageName = reportedPackageNames.valueAt(j); - callback.mCallback.opChanged(code, uid, reportedPackageName); - } - } - } catch (RemoteException e) { - Log.w(TAG, "Error dispatching op op change", e); + for (int i = 0; i < callbackSpecs.size(); i++) { + final ModeCallback callback = callbackSpecs.keyAt(i); + final ArraySet reportedPackageNames = callbackSpecs.valueAt(i); + if (reportedPackageNames == null) { + mHandler.sendMessage(PooledLambda.obtainMessage( + AppOpsService::notifyOpChanged, + this, callback, code, uid, (String) null)); + + } else { + final int reportedPackageCount = reportedPackageNames.size(); + for (int j = 0; j < reportedPackageCount; j++) { + final String reportedPackageName = reportedPackageNames.valueAt(j); + mHandler.sendMessage(PooledLambda.obtainMessage( + AppOpsService::notifyOpChanged, + this, callback, code, uid, reportedPackageName)); } } - } finally { - Binder.restoreCallingIdentity(identity); } } @@ -671,7 +697,7 @@ public class AppOpsService extends IAppOpsService.Stub { Binder.getCallingPid(), Binder.getCallingUid(), null); } verifyIncomingOp(code); - ArrayList repCbs = null; + ArraySet repCbs = null; code = AppOpsManager.opToSwitch(code); synchronized (this) { UidState uidState = getUidStateLocked(uid, false); @@ -679,17 +705,17 @@ public class AppOpsService extends IAppOpsService.Stub { if (op != null) { if (op.mode != mode) { op.mode = mode; - ArraySet cbs = mOpModeWatchers.get(code); + ArraySet cbs = mOpModeWatchers.get(code); if (cbs != null) { if (repCbs == null) { - repCbs = new ArrayList<>(); + repCbs = new ArraySet<>(); } repCbs.addAll(cbs); } cbs = mPackageModeWatchers.get(packageName); if (cbs != null) { if (repCbs == null) { - repCbs = new ArrayList<>(); + repCbs = new ArraySet<>(); } repCbs.addAll(cbs); } @@ -703,26 +729,41 @@ public class AppOpsService extends IAppOpsService.Stub { } } if (repCbs != null) { - // There are components watching for mode changes such as window manager - // and location manager which are in our process. The callbacks in these - // components may require permissions our remote caller does not have. - final long identity = Binder.clearCallingIdentity(); - try { - for (int i = 0; i < repCbs.size(); i++) { - try { - repCbs.get(i).mCallback.opChanged(code, uid, packageName); - } catch (RemoteException e) { - } - } - } finally { - Binder.restoreCallingIdentity(identity); - } + mHandler.sendMessage(PooledLambda.obtainMessage( + AppOpsService::notifyOpChanged, + this, repCbs, code, uid, packageName)); + } + } + + private void notifyOpChanged(ArraySet callbacks, int code, + int uid, String packageName) { + for (int i = 0; i < callbacks.size(); i++) { + final ModeCallback callback = callbacks.valueAt(i); + notifyOpChanged(callback, code, uid, packageName); + } + } + + private void notifyOpChanged(ModeCallback callback, int code, + int uid, String packageName) { + if (callback.mUid >= 0 && callback.mUid != uid) { + return; + } + // There are components watching for mode changes such as window manager + // and location manager which are in our process. The callbacks in these + // components may require permissions our remote caller does not have. + final long identity = Binder.clearCallingIdentity(); + try { + callback.mCallback.opChanged(code, uid, packageName); + } catch (RemoteException e) { + /* ignore */ + } finally { + Binder.restoreCallingIdentity(identity); } } - private static HashMap> addCallbacks( - HashMap> callbacks, - int op, int uid, String packageName, ArraySet cbs) { + private static HashMap> addCallbacks( + HashMap> callbacks, + int op, int uid, String packageName, ArraySet cbs) { if (cbs == null) { return callbacks; } @@ -732,7 +773,7 @@ public class AppOpsService extends IAppOpsService.Stub { boolean duplicate = false; final int N = cbs.size(); for (int i=0; i reports = callbacks.get(cb); if (reports == null) { reports = new ArrayList<>(); @@ -785,7 +826,7 @@ public class AppOpsService extends IAppOpsService.Stub { } } - HashMap> callbacks = null; + HashMap> callbacks = null; synchronized (this) { boolean changed = false; for (int i = mUidStates.size() - 1; i >= 0; i--) { @@ -860,15 +901,14 @@ public class AppOpsService extends IAppOpsService.Stub { } } if (callbacks != null) { - for (Map.Entry> ent : callbacks.entrySet()) { - Callback cb = ent.getKey(); + for (Map.Entry> ent : callbacks.entrySet()) { + ModeCallback cb = ent.getKey(); ArrayList reports = ent.getValue(); for (int i=0; i cbs = mOpModeWatchers.get(op); + ArraySet cbs = mOpModeWatchers.get(op); if (cbs == null) { cbs = new ArraySet<>(); mOpModeWatchers.put(op, cbs); @@ -895,7 +942,7 @@ public class AppOpsService extends IAppOpsService.Stub { cbs.add(cb); } if (packageName != null) { - ArraySet cbs = mPackageModeWatchers.get(packageName); + ArraySet cbs = mPackageModeWatchers.get(packageName); if (cbs == null) { cbs = new ArraySet<>(); mPackageModeWatchers.put(packageName, cbs); @@ -911,18 +958,18 @@ public class AppOpsService extends IAppOpsService.Stub { return; } synchronized (this) { - Callback cb = mModeWatchers.remove(callback.asBinder()); + ModeCallback cb = mModeWatchers.remove(callback.asBinder()); if (cb != null) { cb.unlinkToDeath(); for (int i=mOpModeWatchers.size()-1; i>=0; i--) { - ArraySet cbs = mOpModeWatchers.valueAt(i); + ArraySet cbs = mOpModeWatchers.valueAt(i); cbs.remove(cb); if (cbs.size() <= 0) { mOpModeWatchers.removeAt(i); } } for (int i=mPackageModeWatchers.size()-1; i>=0; i--) { - ArraySet cbs = mPackageModeWatchers.valueAt(i); + ArraySet cbs = mPackageModeWatchers.valueAt(i); cbs.remove(cb); if (cbs.size() <= 0) { mPackageModeWatchers.removeAt(i); @@ -981,7 +1028,7 @@ public class AppOpsService extends IAppOpsService.Stub { } if (suspended) { - Log.i(TAG, "Audio disabled for suspended package=" + packageName + " for uid=" + uid); + Slog.i(TAG, "Audio disabled for suspended package=" + packageName + " for uid=" + uid); return AppOpsManager.MODE_IGNORED; } @@ -1042,7 +1089,9 @@ public class AppOpsService extends IAppOpsService.Stub { usageRestrictions.put(usage, r); } } - notifyWatchersOfChange(code); + + mHandler.sendMessage(PooledLambda.obtainMessage( + AppOpsService::notifyWatchersOfChange, this, code)); } @Override @@ -1098,7 +1147,7 @@ public class AppOpsService extends IAppOpsService.Stub { Ops ops = getOpsRawLocked(uid, packageName, true /* edit */, false /* uidMismatchExpected */); if (ops == null) { - if (DEBUG) Log.d(TAG, "noteOperation: no op for code " + code + " uid " + uid + if (DEBUG) Slog.d(TAG, "noteOperation: no op for code " + code + " uid " + uid + " package " + packageName); return AppOpsManager.MODE_ERRORED; } @@ -1118,7 +1167,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) { final int uidMode = uidState.opModes.get(switchCode); if (uidMode != AppOpsManager.MODE_ALLOWED) { - if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code " + if (DEBUG) Slog.d(TAG, "noteOperation: reject #" + op.mode + " for code " + switchCode + " (" + code + ") uid " + uid + " package " + packageName); op.rejectTime = System.currentTimeMillis(); @@ -1127,14 +1176,14 @@ public class AppOpsService extends IAppOpsService.Stub { } else { final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op; if (switchOp.mode != AppOpsManager.MODE_ALLOWED) { - if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code " + if (DEBUG) Slog.d(TAG, "noteOperation: reject #" + op.mode + " for code " + switchCode + " (" + code + ") uid " + uid + " package " + packageName); op.rejectTime = System.currentTimeMillis(); return switchOp.mode; } } - if (DEBUG) Log.d(TAG, "noteOperation: allowing code " + code + " uid " + uid + if (DEBUG) Slog.d(TAG, "noteOperation: allowing code " + code + " uid " + uid + " package " + packageName); op.time = System.currentTimeMillis(); op.rejectTime = 0; @@ -1144,6 +1193,51 @@ public class AppOpsService extends IAppOpsService.Stub { } } + @Override + public void startWatchingActive(int[] ops, IAppOpsActiveCallback callback) { + mContext.enforceCallingOrSelfPermission(Manifest.permission.WATCH_APPOPS, + "startWatchingActive"); + if (ops != null) { + Preconditions.checkArrayElementsInRange(ops, 0, + AppOpsManager._NUM_OP - 1, "Invalid op code in: " + Arrays.toString(ops)); + } + if (callback == null) { + return; + } + synchronized (this) { + SparseArray callbacks = mActiveWatchers.get(callback.asBinder()); + if (callbacks == null) { + callbacks = new SparseArray<>(); + mActiveWatchers.put(callback.asBinder(), callbacks); + } + final ActiveCallback activeCallback = new ActiveCallback(callback); + for (int op : ops) { + callbacks.put(op, activeCallback); + } + } + } + + @Override + public void stopWatchingActive(IAppOpsActiveCallback callback) { + if (callback == null) { + return; + } + synchronized (this) { + final SparseArray activeCallbacks = + mActiveWatchers.remove(callback.asBinder()); + if (activeCallbacks == null) { + return; + } + final int callbackCount = activeCallbacks.size(); + for (int i = 0; i < callbackCount; i++) { + // Apps ops are mapped to a singleton + if (i == 0) { + activeCallbacks.valueAt(i).destroy(); + } + } + } + } + @Override public int startOperation(IBinder token, int code, int uid, String packageName) { verifyIncomingUid(uid); @@ -1157,7 +1251,7 @@ public class AppOpsService extends IAppOpsService.Stub { Ops ops = getOpsRawLocked(uid, resolvedPackageName, true /* edit */, false /* uidMismatchExpected */); if (ops == null) { - if (DEBUG) Log.d(TAG, "startOperation: no op for code " + code + " uid " + uid + if (DEBUG) Slog.d(TAG, "startOperation: no op for code " + code + " uid " + uid + " package " + resolvedPackageName); return AppOpsManager.MODE_ERRORED; } @@ -1167,37 +1261,42 @@ public class AppOpsService extends IAppOpsService.Stub { } final int switchCode = AppOpsManager.opToSwitch(code); UidState uidState = ops.uidState; - if (uidState.opModes != null) { + // If there is a non-default per UID policy (we set UID op mode only if + // non-default) it takes over, otherwise use the per package policy. + if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) { final int uidMode = uidState.opModes.get(switchCode); if (uidMode != AppOpsManager.MODE_ALLOWED) { - if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code " + if (DEBUG) Slog.d(TAG, "noteOperation: reject #" + op.mode + " for code " + switchCode + " (" + code + ") uid " + uid + " package " + resolvedPackageName); op.rejectTime = System.currentTimeMillis(); return uidMode; } + } else { + final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op; + if (switchOp.mode != AppOpsManager.MODE_ALLOWED) { + if (DEBUG) Slog.d(TAG, "startOperation: reject #" + op.mode + " for code " + + switchCode + " (" + code + ") uid " + uid + " package " + + resolvedPackageName); + op.rejectTime = System.currentTimeMillis(); + return switchOp.mode; + } } - final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op; - if (switchOp.mode != AppOpsManager.MODE_ALLOWED) { - if (DEBUG) Log.d(TAG, "startOperation: reject #" + op.mode + " for code " - + switchCode + " (" + code + ") uid " + uid + " package " - + resolvedPackageName); - op.rejectTime = System.currentTimeMillis(); - return switchOp.mode; - } - if (DEBUG) Log.d(TAG, "startOperation: allowing code " + code + " uid " + uid + if (DEBUG) Slog.d(TAG, "startOperation: allowing code " + code + " uid " + uid + " package " + resolvedPackageName); if (op.nesting == 0) { op.time = System.currentTimeMillis(); op.rejectTime = 0; op.duration = -1; + scheduleOpActiveChangedIfNeededLocked(code, uid, packageName, true); } op.nesting++; if (client.mStartedOps != null) { client.mStartedOps.add(op); } - return AppOpsManager.MODE_ALLOWED; } + + return AppOpsManager.MODE_ALLOWED; } @Override @@ -1224,6 +1323,52 @@ public class AppOpsService extends IAppOpsService.Stub { } } finishOperationLocked(op); + if (op.nesting <= 0) { + scheduleOpActiveChangedIfNeededLocked(code, uid, packageName, false); + } + } + } + + private void scheduleOpActiveChangedIfNeededLocked(int code, int uid, String packageName, + boolean active) { + ArraySet dispatchedCallbacks = null; + final int callbackListCount = mActiveWatchers.size(); + for (int i = 0; i < callbackListCount; i++) { + final SparseArray callbacks = mActiveWatchers.valueAt(i); + ActiveCallback callback = callbacks.get(code); + if (callback != null) { + if (dispatchedCallbacks == null) { + dispatchedCallbacks = new ArraySet<>(); + } + dispatchedCallbacks.add(callback); + } + } + if (dispatchedCallbacks == null) { + return; + } + mHandler.sendMessage(PooledLambda.obtainMessage( + AppOpsService::notifyOpActiveChanged, + this, dispatchedCallbacks, code, uid, packageName, active)); + } + + private void notifyOpActiveChanged(ArraySet callbacks, + int code, int uid, String packageName, boolean active) { + // There are components watching for mode changes such as window manager + // and location manager which are in our process. The callbacks in these + // components may require permissions our remote caller does not have. + final long identity = Binder.clearCallingIdentity(); + try { + final int callbackCount = callbacks.size(); + for (int i = 0; i < callbackCount; i++) { + final ActiveCallback callback = callbacks.valueAt(i); + try { + callback.mCallback.opActiveChanged(code, uid, packageName, active); + } catch (RemoteException e) { + /* do nothing */ + } + } + } finally { + Binder.restoreCallingIdentity(identity); } } @@ -2220,7 +2365,7 @@ public class AppOpsService extends IAppOpsService.Stub { for (int i=0; i callbacks = mOpModeWatchers.valueAt(i); + ArraySet callbacks = mOpModeWatchers.valueAt(i); for (int j=0; j callbacks = mPackageModeWatchers.valueAt(i); + ArraySet callbacks = mPackageModeWatchers.valueAt(i); for (int j=0; j 0) { needSep = true; - pw.println(" All mode watchers:"); + pw.println(" All op mode watchers:"); for (int i=0; i "); pw.println(mModeWatchers.valueAt(i)); } } + if (mActiveWatchers.size() > 0) { + needSep = true; + pw.println(" All op active watchers:"); + for (int i = 0; i < mActiveWatchers.size(); i++) { + final SparseArray activeWatchers = mActiveWatchers.valueAt(i); + if (activeWatchers.size() <= 0) { + continue; + } + pw.print(" "); pw.print(mActiveWatchers.keyAt(i)); + pw.print(" -> ["); + final int opCount = activeWatchers.size(); + for (i = 0; i < opCount; i++) { + pw.print(AppOpsManager.opToName(activeWatchers.keyAt(i))); + if (i < opCount - 1) { + pw.print(','); + } + } + pw.print("]" ); pw.println(activeWatchers.valueAt(0)); + } + } if (mClients.size() > 0) { needSep = true; pw.println(" Clients:"); @@ -2434,8 +2599,6 @@ public class AppOpsService extends IAppOpsService.Stub { private void setUserRestrictionNoCheck(int code, boolean restricted, IBinder token, int userHandle, String[] exceptionPackages) { - boolean notifyChange = false; - synchronized (AppOpsService.this) { ClientRestrictionState restrictionState = mOpUserRestrictions.get(token); @@ -2449,7 +2612,8 @@ public class AppOpsService extends IAppOpsService.Stub { } if (restrictionState.setRestriction(code, restricted, exceptionPackages, userHandle)) { - notifyChange = true; + mHandler.sendMessage(PooledLambda.obtainMessage( + AppOpsService::notifyWatchersOfChange, this, code)); } if (restrictionState.isDefault()) { @@ -2457,39 +2621,19 @@ public class AppOpsService extends IAppOpsService.Stub { restrictionState.destroy(); } } - - if (notifyChange) { - notifyWatchersOfChange(code); - } } private void notifyWatchersOfChange(int code) { - final ArraySet clonedCallbacks; + final ArraySet clonedCallbacks; synchronized (this) { - ArraySet callbacks = mOpModeWatchers.get(code); + ArraySet callbacks = mOpModeWatchers.get(code); if (callbacks == null) { return; } clonedCallbacks = new ArraySet<>(callbacks); } - // There are components watching for mode changes such as window manager - // and location manager which are in our process. The callbacks in these - // components may require permissions our remote caller does not have. - final long identity = Binder.clearCallingIdentity(); - try { - final int callbackCount = clonedCallbacks.size(); - for (int i = 0; i < callbackCount; i++) { - Callback callback = clonedCallbacks.valueAt(i); - try { - callback.mCallback.opChanged(code, -1, null); - } catch (RemoteException e) { - Log.w(TAG, "Error dispatching op op change", e); - } - } - } finally { - Binder.restoreCallingIdentity(identity); - } + notifyOpChanged(clonedCallbacks, code, -1, null); } @Override @@ -2507,13 +2651,14 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public boolean isOperationActive(int code, int uid, String packageName) { - verifyIncomingUid(uid); + mContext.enforceCallingOrSelfPermission(Manifest.permission.WATCH_APPOPS, + "isOperationActive"); verifyIncomingOp(code); - String resolvedPackageName = resolvePackageName(uid, packageName); + final String resolvedPackageName = resolvePackageName(uid, packageName); if (resolvedPackageName == null) { return false; } - synchronized (this) { + synchronized (AppOpsService.this) { for (int i = mClients.size() - 1; i >= 0; i--) { final ClientState client = mClients.valueAt(i); if (client.mStartedOps == null) continue; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5f8a5abf956..96c024f38aa 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2693,6 +2693,19 @@ public class ActivityManagerService extends IActivityManager.Stub throw new RuntimeException( "Unable to find android system package", e); } + + // Start watching app ops after we and the package manager are up and running. + mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null, + new IAppOpsCallback.Stub() { + @Override public void opChanged(int op, int uid, String packageName) { + if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) { + if (mAppOpsService.checkOperation(op, uid, packageName) + != AppOpsManager.MODE_ALLOWED) { + runInBackgroundDisabled(uid); + } + } + } + }); } public void setWindowManager(WindowManagerService wm) { @@ -2969,17 +2982,6 @@ public class ActivityManagerService extends IActivityManager.Stub mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats")); mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler); - mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null, - new IAppOpsCallback.Stub() { - @Override public void opChanged(int op, int uid, String packageName) { - if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) { - if (mAppOpsService.checkOperation(op, uid, packageName) - != AppOpsManager.MODE_ALLOWED) { - runInBackgroundDisabled(uid); - } - } - } - }); mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml"), "uri-grants"); diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml index 5d8aca195ef..568d7a733a1 100644 --- a/services/tests/servicestests/AndroidManifest.xml +++ b/services/tests/servicestests/AndroidManifest.xml @@ -60,6 +60,7 @@ + Date: Thu, 1 Feb 2018 21:39:24 -0800 Subject: [PATCH 038/386] Reorganize MeasuredText API (2nd) This is 2nd attempt of I7db9e2ca4db68a16648cfb8fcf63555f501304c2 This CL changes the MeasuredText API: - Rename MeasuredText to PrecomputedText. - Introduce PrecomputedText.Param which holds all text layout parameters. - Add API to get PrecomputedText.Param from TextView. - Remove MeasuredText.Builder and add PrecomputedText.create method instead. - Remove setRange from MeasuredText since it is not for normal use case. (It can not be used for TextView) Bug: 67504091 Bug: 72861572 Test: bit FrameworksCoreTests:android.text. Test: atest CtsWidgetTestCases:EditTextTest \ CtsWidgetTestCases:TextViewFadingEdgeTest \ FrameworksCoreTests:TextViewFallbackLineSpacingTest \ FrameworksCoreTests:TextViewTest FrameworksCoreTests:TypefaceTest \ CtsGraphicsTestCases:TypefaceTest CtsWidgetTestCases:TextViewTest \ CtsTextTestCases Change-Id: Ie73bce52c6c673cda58973ddad04627a7cf2e5e9 --- ...va => PrecomputedTextMemoryUsageTest.java} | 56 +- ...Test.java => PrecomputedTextPerfTest.java} | 84 +-- .../android/text/StaticLayoutPerfTest.java | 86 +-- api/current.txt | 51 +- core/java/android/text/BoringLayout.java | 4 +- core/java/android/text/MeasuredText.java | 427 --------------- core/java/android/text/PrecomputedText.java | 501 ++++++++++++++++++ core/java/android/text/StaticLayout.java | 39 +- core/java/android/text/TextLine.java | 17 +- core/java/android/view/RecordingCanvas.java | 8 +- core/java/android/widget/TextView.java | 36 +- core/jni/android/graphics/Paint.cpp | 20 +- .../java/android/graphics/BaseCanvas.java | 8 +- graphics/java/android/graphics/Paint.java | 12 + 14 files changed, 750 insertions(+), 599 deletions(-) rename apct-tests/perftests/core/src/android/text/{MeasuredTextMemoryUsageTest.java => PrecomputedTextMemoryUsageTest.java} (73%) rename apct-tests/perftests/core/src/android/text/{MeasuredTextPerfTest.java => PrecomputedTextPerfTest.java} (66%) delete mode 100644 core/java/android/text/MeasuredText.java create mode 100644 core/java/android/text/PrecomputedText.java diff --git a/apct-tests/perftests/core/src/android/text/MeasuredTextMemoryUsageTest.java b/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java similarity index 73% rename from apct-tests/perftests/core/src/android/text/MeasuredTextMemoryUsageTest.java rename to apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java index fc6302ea939..73e17242ae7 100644 --- a/apct-tests/perftests/core/src/android/text/MeasuredTextMemoryUsageTest.java +++ b/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java @@ -45,7 +45,7 @@ import java.util.Random; @LargeTest @RunWith(AndroidJUnit4.class) -public class MeasuredTextMemoryUsageTest { +public class PrecomputedTextMemoryUsageTest { private static final int WORD_LENGTH = 9; // Random word has 9 characters. private static final boolean NO_STYLE_TEXT = false; @@ -53,7 +53,7 @@ public class MeasuredTextMemoryUsageTest { private static int TRIAL_COUNT = 100; - public MeasuredTextMemoryUsageTest() {} + public PrecomputedTextMemoryUsageTest() {} private TextPerfUtils mTextUtil = new TextPerfUtils(); @@ -77,13 +77,16 @@ public class MeasuredTextMemoryUsageTest { @Test public void testMemoryUsage_NoHyphenation() { int[] memories = new int[TRIAL_COUNT]; - // Report median of randomly generated MeasuredText. - for (int i = 0; i < TRIAL_COUNT; ++i) { - memories[i] = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT) + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) - .build().getMemoryUsage(); + .build(); + + // Report median of randomly generated PrecomputedText. + for (int i = 0; i < TRIAL_COUNT; ++i) { + memories[i] = PrecomputedText.create( + mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), param) + .getMemoryUsage(); } reportMemoryUsage(median(memories), "MemoryUsage_NoHyphenation"); } @@ -91,13 +94,16 @@ public class MeasuredTextMemoryUsageTest { @Test public void testMemoryUsage_Hyphenation() { int[] memories = new int[TRIAL_COUNT]; - // Report median of randomly generated MeasuredText. - for (int i = 0; i < TRIAL_COUNT; ++i) { - memories[i] = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT) + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) - .build().getMemoryUsage(); + .build(); + + // Report median of randomly generated PrecomputedText. + for (int i = 0; i < TRIAL_COUNT; ++i) { + memories[i] = PrecomputedText.create( + mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), param) + .getMemoryUsage(); } reportMemoryUsage(median(memories), "MemoryUsage_Hyphenation"); } @@ -105,13 +111,16 @@ public class MeasuredTextMemoryUsageTest { @Test public void testMemoryUsage_NoHyphenation_WidthOnly() { int[] memories = new int[TRIAL_COUNT]; - // Report median of randomly generated MeasuredText. - for (int i = 0; i < TRIAL_COUNT; ++i) { - memories[i] = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT) + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) - .build(false /* width only */).getMemoryUsage(); + .build(); + + // Report median of randomly generated PrecomputedText. + for (int i = 0; i < TRIAL_COUNT; ++i) { + CharSequence cs = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT); + memories[i] = PrecomputedText.createWidthOnly(cs, param, 0, cs.length()) + .getMemoryUsage(); } reportMemoryUsage(median(memories), "MemoryUsage_NoHyphenation_WidthOnly"); } @@ -119,13 +128,16 @@ public class MeasuredTextMemoryUsageTest { @Test public void testMemoryUsage_Hyphenatation_WidthOnly() { int[] memories = new int[TRIAL_COUNT]; - // Report median of randomly generated MeasuredText. - for (int i = 0; i < TRIAL_COUNT; ++i) { - memories[i] = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT) + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) - .build(false /* width only */).getMemoryUsage(); + .build(); + + // Report median of randomly generated PrecomputedText. + for (int i = 0; i < TRIAL_COUNT; ++i) { + CharSequence cs = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT); + memories[i] = PrecomputedText.createWidthOnly(cs, param, 0, cs.length()) + .getMemoryUsage(); } reportMemoryUsage(median(memories), "MemoryUsage_Hyphenation_WidthOnly"); } diff --git a/apct-tests/perftests/core/src/android/text/MeasuredTextPerfTest.java b/apct-tests/perftests/core/src/android/text/PrecomputedTextPerfTest.java similarity index 66% rename from apct-tests/perftests/core/src/android/text/MeasuredTextPerfTest.java rename to apct-tests/perftests/core/src/android/text/PrecomputedTextPerfTest.java index 98f2bd5e573..1cd0ae13069 100644 --- a/apct-tests/perftests/core/src/android/text/MeasuredTextPerfTest.java +++ b/apct-tests/perftests/core/src/android/text/PrecomputedTextPerfTest.java @@ -42,7 +42,7 @@ import java.util.Random; @LargeTest @RunWith(AndroidJUnit4.class) -public class MeasuredTextPerfTest { +public class PrecomputedTextPerfTest { private static final int WORD_LENGTH = 9; // Random word has 9 characters. private static final int WORDS_IN_LINE = 8; // Roughly, 8 words in a line. private static final boolean NO_STYLE_TEXT = false; @@ -51,7 +51,7 @@ public class MeasuredTextPerfTest { private static TextPaint PAINT = new TextPaint(); private static final int TEXT_WIDTH = WORDS_IN_LINE * WORD_LENGTH * (int) PAINT.getTextSize(); - public MeasuredTextPerfTest() {} + public PrecomputedTextPerfTest() {} @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); @@ -66,120 +66,136 @@ public class MeasuredTextPerfTest { @Test public void testCreate_NoStyled_Hyphenation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) + .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) + .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) + .build(); + while (state.keepRunning()) { state.pauseTiming(); final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT); state.resumeTiming(); - new MeasuredText.Builder(text, PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) - .build(true /* do full layout */); + PrecomputedText.create(text, param); } } @Test public void testCreate_NoStyled_NoHyphenation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) + .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) + .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) + .build(); + while (state.keepRunning()) { state.pauseTiming(); final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT); state.resumeTiming(); - new MeasuredText.Builder(text, PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) - .build(true /* do full layout */); + PrecomputedText.create(text, param); } } @Test public void testCreate_NoStyled_Hyphenation_WidthOnly() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) + .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) + .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) + .build(); + while (state.keepRunning()) { state.pauseTiming(); final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT); state.resumeTiming(); - new MeasuredText.Builder(text, PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) - .build(false /* width only */); + PrecomputedText.create(text, param); } } @Test public void testCreate_NoStyled_NoHyphenation_WidthOnly() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) + .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) + .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) + .build(); + while (state.keepRunning()) { state.pauseTiming(); final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT); state.resumeTiming(); - new MeasuredText.Builder(text, PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) - .build(false /* width only */); + PrecomputedText.create(text, param); } } @Test public void testCreate_Styled_Hyphenation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) + .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) + .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) + .build(); + while (state.keepRunning()) { state.pauseTiming(); final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT); state.resumeTiming(); - new MeasuredText.Builder(text, PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) - .build(true /* do full layout */); + PrecomputedText.create(text, param); } } @Test public void testCreate_Styled_NoHyphenation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) + .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) + .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) + .build(); + while (state.keepRunning()) { state.pauseTiming(); final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT); state.resumeTiming(); - new MeasuredText.Builder(text, PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) - .build(true /* do full layout */); + PrecomputedText.create(text, param); } } @Test public void testCreate_Styled_Hyphenation_WidthOnly() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) + .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) + .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) + .build(); + while (state.keepRunning()) { state.pauseTiming(); final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT); state.resumeTiming(); - new MeasuredText.Builder(text, PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) - .build(false /* width only */); + PrecomputedText.create(text, param); } } @Test public void testCreate_Styled_NoHyphenation_WidthOnly() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT) + .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) + .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) + .build(); + while (state.keepRunning()) { state.pauseTiming(); final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT); state.resumeTiming(); - new MeasuredText.Builder(text, PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) - .build(false /* width only */); + PrecomputedText.create(text, param); } } } diff --git a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java index 231aaf2ca07..e1a38a0956d 100644 --- a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java +++ b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java @@ -63,6 +63,18 @@ public class StaticLayoutPerfTest { mTextUtil.resetRandom(0 /* seed */); } + private PrecomputedText makeMeasured(CharSequence text, TextPaint paint) { + PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint).build(); + return PrecomputedText.create(text, param); + } + + private PrecomputedText makeMeasured(CharSequence text, TextPaint paint, int strategy, + int frequency) { + PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint) + .setHyphenationFrequency(frequency).setBreakStrategy(strategy).build(); + return PrecomputedText.create(text, param); + } + @Test public void testCreate_FixedText_NoStyle_Greedy_NoHyphenation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); @@ -151,15 +163,13 @@ public class StaticLayoutPerfTest { } @Test - public void testCreate_MeasuredText_NoStyled_Greedy_NoHyphenation() { + public void testCreate_PrecomputedText_NoStyled_Greedy_NoHyphenation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); while (state.keepRunning()) { state.pauseTiming(); - final MeasuredText text = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) - .build(); + final PrecomputedText text = makeMeasured( + mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT, + Layout.BREAK_STRATEGY_SIMPLE, Layout.HYPHENATION_FREQUENCY_NONE); state.resumeTiming(); StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH) @@ -170,15 +180,13 @@ public class StaticLayoutPerfTest { } @Test - public void testCreate_MeasuredText_NoStyled_Greedy_Hyphenation() { + public void testCreate_PrecomputedText_NoStyled_Greedy_Hyphenation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); while (state.keepRunning()) { state.pauseTiming(); - final MeasuredText text = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) - .build(); + final PrecomputedText text = makeMeasured( + mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT, + Layout.BREAK_STRATEGY_SIMPLE, Layout.HYPHENATION_FREQUENCY_NORMAL); state.resumeTiming(); StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH) @@ -189,15 +197,13 @@ public class StaticLayoutPerfTest { } @Test - public void testCreate_MeasuredText_NoStyled_Balanced_NoHyphenation() { + public void testCreate_PrecomputedText_NoStyled_Balanced_NoHyphenation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); while (state.keepRunning()) { state.pauseTiming(); - final MeasuredText text = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) - .build(); + final PrecomputedText text = makeMeasured( + mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT, + Layout.BREAK_STRATEGY_BALANCED, Layout.HYPHENATION_FREQUENCY_NONE); state.resumeTiming(); StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH) @@ -208,15 +214,13 @@ public class StaticLayoutPerfTest { } @Test - public void testCreate_MeasuredText_NoStyled_Balanced_Hyphenation() { + public void testCreate_PrecomputedText_NoStyled_Balanced_Hyphenation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); while (state.keepRunning()) { state.pauseTiming(); - final MeasuredText text = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL) - .build(); + final PrecomputedText text = makeMeasured( + mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT, + Layout.BREAK_STRATEGY_BALANCED, Layout.HYPHENATION_FREQUENCY_NORMAL); state.resumeTiming(); StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH) @@ -227,15 +231,13 @@ public class StaticLayoutPerfTest { } @Test - public void testCreate_MeasuredText_Styled_Greedy_NoHyphenation() { + public void testCreate_PrecomputedText_Styled_Greedy_NoHyphenation() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); while (state.keepRunning()) { state.pauseTiming(); - final MeasuredText text = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT) - .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) - .build(); + final PrecomputedText text = makeMeasured( + mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT, + Layout.BREAK_STRATEGY_SIMPLE, Layout.HYPHENATION_FREQUENCY_NONE); state.resumeTiming(); StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH) @@ -328,13 +330,13 @@ public class StaticLayoutPerfTest { } @Test - public void testDraw_MeasuredText_Styled() { + public void testDraw_PrecomputedText_Styled() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); final RenderNode node = RenderNode.create("benchmark", null); while (state.keepRunning()) { state.pauseTiming(); - final MeasuredText text = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT).build(); + final PrecomputedText text = makeMeasured( + mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT); final StaticLayout layout = StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build(); final DisplayListCanvas c = node.start(1200, 200); @@ -345,13 +347,13 @@ public class StaticLayoutPerfTest { } @Test - public void testDraw_MeasuredText_NoStyled() { + public void testDraw_PrecomputedText_NoStyled() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); final RenderNode node = RenderNode.create("benchmark", null); while (state.keepRunning()) { state.pauseTiming(); - final MeasuredText text = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT).build(); + final PrecomputedText text = makeMeasured( + mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT); final StaticLayout layout = StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build(); final DisplayListCanvas c = node.start(1200, 200); @@ -362,13 +364,13 @@ public class StaticLayoutPerfTest { } @Test - public void testDraw_MeasuredText_Styled_WithoutCache() { + public void testDraw_PrecomputedText_Styled_WithoutCache() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); final RenderNode node = RenderNode.create("benchmark", null); while (state.keepRunning()) { state.pauseTiming(); - final MeasuredText text = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT).build(); + final PrecomputedText text = makeMeasured( + mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT); final StaticLayout layout = StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build(); final DisplayListCanvas c = node.start(1200, 200); @@ -380,13 +382,13 @@ public class StaticLayoutPerfTest { } @Test - public void testDraw_MeasuredText_NoStyled_WithoutCache() { + public void testDraw_PrecomputedText_NoStyled_WithoutCache() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); final RenderNode node = RenderNode.create("benchmark", null); while (state.keepRunning()) { state.pauseTiming(); - final MeasuredText text = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT).build(); + final PrecomputedText text = makeMeasured( + mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT); final StaticLayout layout = StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build(); final DisplayListCanvas c = node.start(1200, 200); diff --git a/api/current.txt b/api/current.txt index a70363d89c1..5f48f960fea 100644 --- a/api/current.txt +++ b/api/current.txt @@ -13839,6 +13839,7 @@ package android.graphics { method public int breakText(java.lang.String, boolean, float, float[]); method public void clearShadowLayer(); method public float descent(); + method public boolean equalsForTextMeasurement(android.graphics.Paint); method public int getAlpha(); method public int getColor(); method public android.graphics.ColorFilter getColorFilter(); @@ -43241,45 +43242,47 @@ package android.text { method public boolean isAllowed(char); } - public class MeasuredText implements android.text.Spanned { + public abstract interface NoCopySpan { + } + + public static class NoCopySpan.Concrete implements android.text.NoCopySpan { + ctor public NoCopySpan.Concrete(); + } + + public abstract interface ParcelableSpan implements android.os.Parcelable { + method public abstract int getSpanTypeId(); + } + + public class PrecomputedText implements android.text.Spanned { method public char charAt(int); - method public int getBreakStrategy(); - method public int getEnd(); - method public int getHyphenationFrequency(); - method public android.text.TextPaint getPaint(); + method public static android.text.PrecomputedText create(java.lang.CharSequence, android.text.PrecomputedText.Params); method public int getParagraphCount(); method public int getParagraphEnd(int); method public int getParagraphStart(int); + method public android.text.PrecomputedText.Params getParams(); method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); method public T[] getSpans(int, int, java.lang.Class); - method public int getStart(); method public java.lang.CharSequence getText(); - method public android.text.TextDirectionHeuristic getTextDir(); method public int length(); method public int nextSpanTransition(int, int, java.lang.Class); method public java.lang.CharSequence subSequence(int, int); } - public static final class MeasuredText.Builder { - ctor public MeasuredText.Builder(java.lang.CharSequence, android.text.TextPaint); - method public android.text.MeasuredText build(); - method public android.text.MeasuredText.Builder setBreakStrategy(int); - method public android.text.MeasuredText.Builder setHyphenationFrequency(int); - method public android.text.MeasuredText.Builder setRange(int, int); - method public android.text.MeasuredText.Builder setTextDirection(android.text.TextDirectionHeuristic); - } - - public abstract interface NoCopySpan { - } - - public static class NoCopySpan.Concrete implements android.text.NoCopySpan { - ctor public NoCopySpan.Concrete(); + public static final class PrecomputedText.Params { + method public int getBreakStrategy(); + method public int getHyphenationFrequency(); + method public android.text.TextDirectionHeuristic getTextDirection(); + method public android.text.TextPaint getTextPaint(); } - public abstract interface ParcelableSpan implements android.os.Parcelable { - method public abstract int getSpanTypeId(); + public static class PrecomputedText.Params.Builder { + ctor public PrecomputedText.Params.Builder(android.text.TextPaint); + method public android.text.PrecomputedText.Params build(); + method public android.text.PrecomputedText.Params.Builder setBreakStrategy(int); + method public android.text.PrecomputedText.Params.Builder setHyphenationFrequency(int); + method public android.text.PrecomputedText.Params.Builder setTextDirection(android.text.TextDirectionHeuristic); } public class Selection { @@ -53665,6 +53668,7 @@ package android.widget { method public final android.content.res.ColorStateList getTextColors(); method public java.util.Locale getTextLocale(); method public android.os.LocaleList getTextLocales(); + method public android.text.PrecomputedText.Params getTextMetricsParams(); method public float getTextScaleX(); method public float getTextSize(); method public int getTotalPaddingBottom(); @@ -53794,6 +53798,7 @@ package android.widget { method public final void setTextKeepState(java.lang.CharSequence, android.widget.TextView.BufferType); method public void setTextLocale(java.util.Locale); method public void setTextLocales(android.os.LocaleList); + method public void setTextMetricsParams(android.text.PrecomputedText.Params); method public void setTextScaleX(float); method public void setTextSize(float); method public void setTextSize(int, float); diff --git a/core/java/android/text/BoringLayout.java b/core/java/android/text/BoringLayout.java index 6fa5312be5c..ae59bfaf896 100644 --- a/core/java/android/text/BoringLayout.java +++ b/core/java/android/text/BoringLayout.java @@ -347,8 +347,8 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback TextLine line = TextLine.obtain(); line.set(paint, text, 0, textLength, Layout.DIR_LEFT_TO_RIGHT, Layout.DIRS_ALL_LEFT_TO_RIGHT, false, null); - if (text instanceof MeasuredText) { - MeasuredText mt = (MeasuredText) text; + if (text instanceof PrecomputedText) { + PrecomputedText mt = (PrecomputedText) text; // Reaching here means there is only one paragraph. MeasuredParagraph mp = mt.getMeasuredParagraph(0); fm.width = (int) Math.ceil(mp.getWidth(0, mp.getTextLength())); diff --git a/core/java/android/text/MeasuredText.java b/core/java/android/text/MeasuredText.java deleted file mode 100644 index bb7a9e0b790..00000000000 --- a/core/java/android/text/MeasuredText.java +++ /dev/null @@ -1,427 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.text; - -import android.annotation.IntRange; -import android.annotation.NonNull; -import android.util.IntArray; - -import com.android.internal.util.ArrayUtils; -import com.android.internal.util.Preconditions; - -import java.util.ArrayList; - -/** - * A text which has already been measured. - */ -public class MeasuredText implements Spanned { - private static final char LINE_FEED = '\n'; - - // The original text. - private final @NonNull CharSequence mText; - - // The inclusive start offset of the measuring target. - private final @IntRange(from = 0) int mStart; - - // The exclusive end offset of the measuring target. - private final @IntRange(from = 0) int mEnd; - - // The TextPaint used for measurement. - private final @NonNull TextPaint mPaint; - - // The requested text direction. - private final @NonNull TextDirectionHeuristic mTextDir; - - // The measured paragraph texts. - private final @NonNull MeasuredParagraph[] mMeasuredParagraphs; - - // The sorted paragraph end offsets. - private final @NonNull int[] mParagraphBreakPoints; - - // The break strategy for this measured text. - private final @Layout.BreakStrategy int mBreakStrategy; - - // The hyphenation frequency for this measured text. - private final @Layout.HyphenationFrequency int mHyphenationFrequency; - - /** - * A Builder for MeasuredText - */ - public static final class Builder { - // Mandatory parameters. - private final @NonNull CharSequence mText; - private final @NonNull TextPaint mPaint; - - // Members to be updated by setters. - private @IntRange(from = 0) int mStart; - private @IntRange(from = 0) int mEnd; - private TextDirectionHeuristic mTextDir = TextDirectionHeuristics.FIRSTSTRONG_LTR; - private @Layout.BreakStrategy int mBreakStrategy = Layout.BREAK_STRATEGY_HIGH_QUALITY; - private @Layout.HyphenationFrequency int mHyphenationFrequency = - Layout.HYPHENATION_FREQUENCY_NORMAL; - - - /** - * Builder constructor - * - * @param text The text to be measured. - * @param paint The paint to be used for drawing. - */ - public Builder(@NonNull CharSequence text, @NonNull TextPaint paint) { - Preconditions.checkNotNull(text); - Preconditions.checkNotNull(paint); - - mText = text; - mPaint = paint; - mStart = 0; - mEnd = text.length(); - } - - /** - * Set the range of measuring target. - * - * @param start The measuring target start offset in the text. - * @param end The measuring target end offset in the text. - */ - public @NonNull Builder setRange(@IntRange(from = 0) int start, - @IntRange(from = 0) int end) { - Preconditions.checkArgumentInRange(start, 0, mText.length(), "start"); - Preconditions.checkArgumentInRange(end, 0, mText.length(), "end"); - Preconditions.checkArgument(start <= end, "The range is reversed."); - - mStart = start; - mEnd = end; - return this; - } - - /** - * Set the text direction heuristic - * - * The default value is {@link TextDirectionHeuristics#FIRSTSTRONG_LTR}. - * - * @param textDir The text direction heuristic for resolving bidi behavior. - * @return this builder, useful for chaining. - */ - public @NonNull Builder setTextDirection(@NonNull TextDirectionHeuristic textDir) { - Preconditions.checkNotNull(textDir); - mTextDir = textDir; - return this; - } - - /** - * Set the break strategy - * - * The default value is {@link Layout#BREAK_STRATEGY_HIGH_QUALITY}. - * - * @param breakStrategy The break strategy. - * @return this builder, useful for chaining. - */ - public @NonNull Builder setBreakStrategy(@Layout.BreakStrategy int breakStrategy) { - mBreakStrategy = breakStrategy; - return this; - } - - /** - * Set the hyphenation frequency - * - * The default value is {@link Layout#HYPHENATION_FREQUENCY_NORMAL}. - * - * @param hyphenationFrequency The hyphenation frequency. - * @return this builder, useful for chaining. - */ - public @NonNull Builder setHyphenationFrequency( - @Layout.HyphenationFrequency int hyphenationFrequency) { - mHyphenationFrequency = hyphenationFrequency; - return this; - } - - /** - * Build the measured text - * - * @return the measured text. - */ - public @NonNull MeasuredText build() { - return build(true /* build full layout result */); - } - - /** @hide */ - public @NonNull MeasuredText build(boolean computeLayout) { - final boolean needHyphenation = mBreakStrategy != Layout.BREAK_STRATEGY_SIMPLE - && mHyphenationFrequency != Layout.HYPHENATION_FREQUENCY_NONE; - - final IntArray paragraphEnds = new IntArray(); - final ArrayList measuredTexts = new ArrayList<>(); - - int paraEnd = 0; - for (int paraStart = mStart; paraStart < mEnd; paraStart = paraEnd) { - paraEnd = TextUtils.indexOf(mText, LINE_FEED, paraStart, mEnd); - if (paraEnd < 0) { - // No LINE_FEED(U+000A) character found. Use end of the text as the paragraph - // end. - paraEnd = mEnd; - } else { - paraEnd++; // Includes LINE_FEED(U+000A) to the prev paragraph. - } - - paragraphEnds.add(paraEnd); - measuredTexts.add(MeasuredParagraph.buildForStaticLayout( - mPaint, mText, paraStart, paraEnd, mTextDir, needHyphenation, - computeLayout, null /* no recycle */)); - } - - return new MeasuredText(mText, mStart, mEnd, mPaint, mTextDir, mBreakStrategy, - mHyphenationFrequency, measuredTexts.toArray( - new MeasuredParagraph[measuredTexts.size()]), - paragraphEnds.toArray()); - } - }; - - // Use MeasuredText.Builder instead. - private MeasuredText(@NonNull CharSequence text, - @IntRange(from = 0) int start, - @IntRange(from = 0) int end, - @NonNull TextPaint paint, - @NonNull TextDirectionHeuristic textDir, - @Layout.BreakStrategy int breakStrategy, - @Layout.HyphenationFrequency int frequency, - @NonNull MeasuredParagraph[] measuredTexts, - @NonNull int[] paragraphBreakPoints) { - mText = text; - mStart = start; - mEnd = end; - // Copy the paint so that we can keep the reference of typeface in native layout result. - mPaint = new TextPaint(paint); - mMeasuredParagraphs = measuredTexts; - mParagraphBreakPoints = paragraphBreakPoints; - mTextDir = textDir; - mBreakStrategy = breakStrategy; - mHyphenationFrequency = frequency; - } - - /** - * Return the underlying text. - */ - public @NonNull CharSequence getText() { - return mText; - } - - /** - * Returns the inclusive start offset of measured region. - */ - public @IntRange(from = 0) int getStart() { - return mStart; - } - - /** - * Returns the exclusive end offset of measured region. - */ - public @IntRange(from = 0) int getEnd() { - return mEnd; - } - - /** - * Returns the text direction associated with char sequence. - */ - public @NonNull TextDirectionHeuristic getTextDir() { - return mTextDir; - } - - /** - * Returns the paint used to measure this text. - */ - public @NonNull TextPaint getPaint() { - return mPaint; - } - - /** - * Returns the length of the paragraph of this text. - */ - public @IntRange(from = 0) int getParagraphCount() { - return mParagraphBreakPoints.length; - } - - /** - * Returns the paragraph start offset of the text. - */ - public @IntRange(from = 0) int getParagraphStart(@IntRange(from = 0) int paraIndex) { - Preconditions.checkArgumentInRange(paraIndex, 0, getParagraphCount(), "paraIndex"); - return paraIndex == 0 ? mStart : mParagraphBreakPoints[paraIndex - 1]; - } - - /** - * Returns the paragraph end offset of the text. - */ - public @IntRange(from = 0) int getParagraphEnd(@IntRange(from = 0) int paraIndex) { - Preconditions.checkArgumentInRange(paraIndex, 0, getParagraphCount(), "paraIndex"); - return mParagraphBreakPoints[paraIndex]; - } - - /** @hide */ - public @NonNull MeasuredParagraph getMeasuredParagraph(@IntRange(from = 0) int paraIndex) { - return mMeasuredParagraphs[paraIndex]; - } - - /** - * Returns the break strategy for this text. - */ - public @Layout.BreakStrategy int getBreakStrategy() { - return mBreakStrategy; - } - - /** - * Returns the hyphenation frequency for this text. - */ - public @Layout.HyphenationFrequency int getHyphenationFrequency() { - return mHyphenationFrequency; - } - - /** - * Returns true if the given TextPaint gives the same result of text layout for this text. - * @hide - */ - public boolean canUseMeasuredResult(@NonNull TextPaint paint) { - return mPaint.getTextSize() == paint.getTextSize() - && mPaint.getTextSkewX() == paint.getTextSkewX() - && mPaint.getTextScaleX() == paint.getTextScaleX() - && mPaint.getLetterSpacing() == paint.getLetterSpacing() - && mPaint.getWordSpacing() == paint.getWordSpacing() - && mPaint.getFlags() == paint.getFlags() // Maybe not all flag affects text layout. - && mPaint.getTextLocales() == paint.getTextLocales() // need to be equals? - && mPaint.getFontVariationSettings() == paint.getFontVariationSettings() - && mPaint.getTypeface() == paint.getTypeface() - && TextUtils.equals(mPaint.getFontFeatureSettings(), paint.getFontFeatureSettings()); - } - - /** @hide */ - public int findParaIndex(@IntRange(from = 0) int pos) { - // TODO: Maybe good to remove paragraph concept from MeasuredText and add substring layout - // support to StaticLayout. - for (int i = 0; i < mParagraphBreakPoints.length; ++i) { - if (pos < mParagraphBreakPoints[i]) { - return i; - } - } - throw new IndexOutOfBoundsException( - "pos must be less than " + mParagraphBreakPoints[mParagraphBreakPoints.length - 1] - + ", gave " + pos); - } - - /** @hide */ - public float getWidth(@IntRange(from = 0) int start, @IntRange(from = 0) int end) { - final int paraIndex = findParaIndex(start); - final int paraStart = getParagraphStart(paraIndex); - final int paraEnd = getParagraphEnd(paraIndex); - if (start < paraStart || paraEnd < end) { - throw new RuntimeException("Cannot measured across the paragraph:" - + "para: (" + paraStart + ", " + paraEnd + "), " - + "request: (" + start + ", " + end + ")"); - } - return getMeasuredParagraph(paraIndex).getWidth(start - paraStart, end - paraStart); - } - - /** - * Returns the size of native MeasuredText memory usage - * - * Note that this may not be aculate. Must be used only for testing purposes. - * @hide - */ - public int getMemoryUsage() { - int r = 0; - for (int i = 0; i < getParagraphCount(); ++i) { - r += getMeasuredParagraph(i).getMemoryUsage(); - } - return r; - } - - /////////////////////////////////////////////////////////////////////////////////////////////// - // Spanned overrides - // - // Just proxy for underlying mText if appropriate. - - @Override - public T[] getSpans(int start, int end, Class type) { - if (mText instanceof Spanned) { - return ((Spanned) mText).getSpans(start, end, type); - } else { - return ArrayUtils.emptyArray(type); - } - } - - @Override - public int getSpanStart(Object tag) { - if (mText instanceof Spanned) { - return ((Spanned) mText).getSpanStart(tag); - } else { - return -1; - } - } - - @Override - public int getSpanEnd(Object tag) { - if (mText instanceof Spanned) { - return ((Spanned) mText).getSpanEnd(tag); - } else { - return -1; - } - } - - @Override - public int getSpanFlags(Object tag) { - if (mText instanceof Spanned) { - return ((Spanned) mText).getSpanFlags(tag); - } else { - return 0; - } - } - - @Override - public int nextSpanTransition(int start, int limit, Class type) { - if (mText instanceof Spanned) { - return ((Spanned) mText).nextSpanTransition(start, limit, type); - } else { - return mText.length(); - } - } - - /////////////////////////////////////////////////////////////////////////////////////////////// - // CharSequence overrides. - // - // Just proxy for underlying mText. - - @Override - public int length() { - return mText.length(); - } - - @Override - public char charAt(int index) { - // TODO: Should this be index + mStart ? - return mText.charAt(index); - } - - @Override - public CharSequence subSequence(int start, int end) { - // TODO: return MeasuredText. - // TODO: Should this be index + mStart, end + mStart ? - return mText.subSequence(start, end); - } - - @Override - public String toString() { - return mText.toString(); - } -} diff --git a/core/java/android/text/PrecomputedText.java b/core/java/android/text/PrecomputedText.java new file mode 100644 index 00000000000..c211e2dba3c --- /dev/null +++ b/core/java/android/text/PrecomputedText.java @@ -0,0 +1,501 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.text; + +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.util.IntArray; + +import com.android.internal.util.Preconditions; + +import java.util.ArrayList; +import java.util.Objects; + +/** + * A text which has the character metrics data. + * + * A text object that contains the character metrics data and can be used to improve the performance + * of text layout operations. When a PrecomputedText is created with a given {@link CharSequence}, + * it will measure the text metrics during the creation. This PrecomputedText instance can be set on + * {@link android.widget.TextView} or {@link StaticLayout}. Since the text layout information will + * be included in this instance, {@link android.widget.TextView} or {@link StaticLayout} will not + * have to recalculate this information. + * + * Note that the {@link PrecomputedText} created from different parameters of the target {@link + * android.widget.TextView} will be rejected internally and compute the text layout again with the + * current {@link android.widget.TextView} parameters. + * + *

+ * An example usage is:
+ * 
+ *  void asyncSetText(final TextView textView, final String longString, Handler bgThreadHandler) {
+ *      // construct precompute related parameters using the TextView that we will set the text on.
+ *      final PrecomputedText.Params params = textView.getTextParams();
+ *      bgThreadHandler.post(() -> {
+ *          final PrecomputedText precomputedText =
+ *                  PrecomputedText.create(expensiveLongString, params);
+ *          textView.post(() -> {
+ *              textView.setText(precomputedText);
+ *          });
+ *      });
+ *  }
+ * 
+ * 
+ * + * Note that the {@link PrecomputedText} created from different parameters of the target + * {@link android.widget.TextView} will be rejected internally and compute the text layout again + * with the current {@link android.widget.TextView} parameters. + */ +public class PrecomputedText implements Spanned { + private static final char LINE_FEED = '\n'; + + /** + * The information required for building {@link PrecomputedText}. + * + * Contains information required for precomputing text measurement metadata, so it can be done + * in isolation of a {@link android.widget.TextView} or {@link StaticLayout}, when final layout + * constraints are not known. + */ + public static final class Params { + // The TextPaint used for measurement. + private final @NonNull TextPaint mPaint; + + // The requested text direction. + private final @NonNull TextDirectionHeuristic mTextDir; + + // The break strategy for this measured text. + private final @Layout.BreakStrategy int mBreakStrategy; + + // The hyphenation frequency for this measured text. + private final @Layout.HyphenationFrequency int mHyphenationFrequency; + + /** + * A builder for creating {@link Params}. + */ + public static class Builder { + // The TextPaint used for measurement. + private final @NonNull TextPaint mPaint; + + // The requested text direction. + private TextDirectionHeuristic mTextDir = TextDirectionHeuristics.FIRSTSTRONG_LTR; + + // The break strategy for this measured text. + private @Layout.BreakStrategy int mBreakStrategy = Layout.BREAK_STRATEGY_HIGH_QUALITY; + + // The hyphenation frequency for this measured text. + private @Layout.HyphenationFrequency int mHyphenationFrequency = + Layout.HYPHENATION_FREQUENCY_NORMAL; + + /** + * Builder constructor. + * + * @param paint the paint to be used for drawing + */ + public Builder(@NonNull TextPaint paint) { + mPaint = paint; + } + + /** + * Set the line break strategy. + * + * The default value is {@link Layout#BREAK_STRATEGY_HIGH_QUALITY}. + * + * @param strategy the break strategy + * @return this builder, useful for chaining + * @see StaticLayout.Builder#setBreakStrategy + * @see android.widget.TextView#setBreakStrategy + */ + public Builder setBreakStrategy(@Layout.BreakStrategy int strategy) { + mBreakStrategy = strategy; + return this; + } + + /** + * Set the hyphenation frequency. + * + * The default value is {@link Layout#HYPHENATION_FREQUENCY_NORMAL}. + * + * @param frequency the hyphenation frequency + * @return this builder, useful for chaining + * @see StaticLayout.Builder#setHyphenationFrequency + * @see android.widget.TextView#setHyphenationFrequency + */ + public Builder setHyphenationFrequency(@Layout.HyphenationFrequency int frequency) { + mHyphenationFrequency = frequency; + return this; + } + + /** + * Set the text direction heuristic. + * + * The default value is {@link TextDirectionHeuristics#FIRSTSTRONG_LTR}. + * + * @param textDir the text direction heuristic for resolving bidi behavior + * @return this builder, useful for chaining + * @see StaticLayout.Builder#setTextDirection + */ + public Builder setTextDirection(@NonNull TextDirectionHeuristic textDir) { + mTextDir = textDir; + return this; + } + + /** + * Build the {@link Params}. + * + * @return the layout parameter + */ + public @NonNull Params build() { + return new Params(mPaint, mTextDir, mBreakStrategy, mHyphenationFrequency); + } + } + + // This is public hidden for internal use. + // For the external developers, use Builder instead. + /** @hide */ + public Params(@NonNull TextPaint paint, @NonNull TextDirectionHeuristic textDir, + @Layout.BreakStrategy int strategy, @Layout.HyphenationFrequency int frequency) { + mPaint = paint; + mTextDir = textDir; + mBreakStrategy = strategy; + mHyphenationFrequency = frequency; + } + + /** + * Returns the {@link TextPaint} for this text. + * + * @return A {@link TextPaint} + */ + public @NonNull TextPaint getTextPaint() { + return mPaint; + } + + /** + * Returns the {@link TextDirectionHeuristic} for this text. + * + * @return A {@link TextDirectionHeuristic} + */ + public @NonNull TextDirectionHeuristic getTextDirection() { + return mTextDir; + } + + /** + * Returns the break strategy for this text. + * + * @return A line break strategy + */ + public @Layout.BreakStrategy int getBreakStrategy() { + return mBreakStrategy; + } + + /** + * Returns the hyphenation frequency for this text. + * + * @return A hyphenation frequency + */ + public @Layout.HyphenationFrequency int getHyphenationFrequency() { + return mHyphenationFrequency; + } + + private boolean isSameTextMetricsInternal(@NonNull TextPaint paint, + @NonNull TextDirectionHeuristic textDir, @Layout.BreakStrategy int strategy, + @Layout.HyphenationFrequency int frequency) { + return mTextDir == textDir + && mBreakStrategy == strategy + && mHyphenationFrequency == frequency + && mPaint.equalsForTextMeasurement(paint); + } + + /** + * Check if the same text layout. + * + * @return true if this and the given param result in the same text layout + */ + @Override + public boolean equals(@Nullable Object o) { + if (o == this) { + return true; + } + if (o == null || !(o instanceof Params)) { + return false; + } + Params param = (Params) o; + return isSameTextMetricsInternal(param.mPaint, param.mTextDir, param.mBreakStrategy, + param.mHyphenationFrequency); + } + + @Override + public int hashCode() { + // TODO: implement MinikinPaint::hashCode and use it to keep consistency with equals. + return Objects.hash(mPaint.getTextSize(), mPaint.getTextScaleX(), mPaint.getTextSkewX(), + mPaint.getLetterSpacing(), mPaint.getWordSpacing(), mPaint.getFlags(), + mPaint.getTextLocales(), mPaint.getTypeface(), + mPaint.getFontVariationSettings(), mPaint.isElegantTextHeight(), mTextDir, + mBreakStrategy, mHyphenationFrequency); + } + }; + + // The original text. + private final @NonNull SpannedString mText; + + // The inclusive start offset of the measuring target. + private final @IntRange(from = 0) int mStart; + + // The exclusive end offset of the measuring target. + private final @IntRange(from = 0) int mEnd; + + private final @NonNull Params mParams; + + // The measured paragraph texts. + private final @NonNull MeasuredParagraph[] mMeasuredParagraphs; + + // The sorted paragraph end offsets. + private final @NonNull int[] mParagraphBreakPoints; + + /** + * Create a new {@link PrecomputedText} which will pre-compute text measurement and glyph + * positioning information. + *

+ * This can be expensive, so computing this on a background thread before your text will be + * presented can save work on the UI thread. + *

+ * + * @param text the text to be measured + * @param param parameters that define how text will be precomputed + * @return A {@link PrecomputedText} + */ + public static PrecomputedText create(@NonNull CharSequence text, @NonNull Params param) { + return createInternal(text, param, 0, text.length(), true /* compute full Layout */); + } + + /** @hide */ + public static PrecomputedText createWidthOnly(@NonNull CharSequence text, @NonNull Params param, + @IntRange(from = 0) int start, @IntRange(from = 0) int end) { + return createInternal(text, param, start, end, false /* compute width only */); + } + + private static PrecomputedText createInternal(@NonNull CharSequence text, @NonNull Params param, + @IntRange(from = 0) int start, @IntRange(from = 0) int end, boolean computeLayout) { + Preconditions.checkNotNull(text); + Preconditions.checkNotNull(param); + final boolean needHyphenation = param.getBreakStrategy() != Layout.BREAK_STRATEGY_SIMPLE + && param.getHyphenationFrequency() != Layout.HYPHENATION_FREQUENCY_NONE; + + final IntArray paragraphEnds = new IntArray(); + final ArrayList measuredTexts = new ArrayList<>(); + + int paraEnd = 0; + for (int paraStart = start; paraStart < end; paraStart = paraEnd) { + paraEnd = TextUtils.indexOf(text, LINE_FEED, paraStart, end); + if (paraEnd < 0) { + // No LINE_FEED(U+000A) character found. Use end of the text as the paragraph + // end. + paraEnd = end; + } else { + paraEnd++; // Includes LINE_FEED(U+000A) to the prev paragraph. + } + + paragraphEnds.add(paraEnd); + measuredTexts.add(MeasuredParagraph.buildForStaticLayout( + param.getTextPaint(), text, paraStart, paraEnd, param.getTextDirection(), + needHyphenation, computeLayout, null /* no recycle */)); + } + + return new PrecomputedText(text, start, end, param, + measuredTexts.toArray(new MeasuredParagraph[measuredTexts.size()]), + paragraphEnds.toArray()); + } + + // Use PrecomputedText.create instead. + private PrecomputedText(@NonNull CharSequence text, @IntRange(from = 0) int start, + @IntRange(from = 0) int end, @NonNull Params param, + @NonNull MeasuredParagraph[] measuredTexts, @NonNull int[] paragraphBreakPoints) { + mText = new SpannedString(text); + mStart = start; + mEnd = end; + mParams = param; + mMeasuredParagraphs = measuredTexts; + mParagraphBreakPoints = paragraphBreakPoints; + } + + /** + * Return the underlying text. + */ + public @NonNull CharSequence getText() { + return mText; + } + + /** + * Returns the inclusive start offset of measured region. + * @hide + */ + public @IntRange(from = 0) int getStart() { + return mStart; + } + + /** + * Returns the exclusive end offset of measured region. + * @hide + */ + public @IntRange(from = 0) int getEnd() { + return mEnd; + } + + /** + * Returns the layout parameters used to measure this text. + */ + public @NonNull Params getParams() { + return mParams; + } + + /** + * Returns the count of paragraphs. + */ + public @IntRange(from = 0) int getParagraphCount() { + return mParagraphBreakPoints.length; + } + + /** + * Returns the paragraph start offset of the text. + */ + public @IntRange(from = 0) int getParagraphStart(@IntRange(from = 0) int paraIndex) { + Preconditions.checkArgumentInRange(paraIndex, 0, getParagraphCount(), "paraIndex"); + return paraIndex == 0 ? mStart : mParagraphBreakPoints[paraIndex - 1]; + } + + /** + * Returns the paragraph end offset of the text. + */ + public @IntRange(from = 0) int getParagraphEnd(@IntRange(from = 0) int paraIndex) { + Preconditions.checkArgumentInRange(paraIndex, 0, getParagraphCount(), "paraIndex"); + return mParagraphBreakPoints[paraIndex]; + } + + /** @hide */ + public @NonNull MeasuredParagraph getMeasuredParagraph(@IntRange(from = 0) int paraIndex) { + return mMeasuredParagraphs[paraIndex]; + } + + /** + * Returns true if the given TextPaint gives the same result of text layout for this text. + * @hide + */ + public boolean canUseMeasuredResult(@IntRange(from = 0) int start, @IntRange(from = 0) int end, + @NonNull TextDirectionHeuristic textDir, @NonNull TextPaint paint, + @Layout.BreakStrategy int strategy, @Layout.HyphenationFrequency int frequency) { + final TextPaint mtPaint = mParams.getTextPaint(); + return mStart == start + && mEnd == end + && mParams.isSameTextMetricsInternal(paint, textDir, strategy, frequency); + } + + /** @hide */ + public int findParaIndex(@IntRange(from = 0) int pos) { + // TODO: Maybe good to remove paragraph concept from PrecomputedText and add substring + // layout support to StaticLayout. + for (int i = 0; i < mParagraphBreakPoints.length; ++i) { + if (pos < mParagraphBreakPoints[i]) { + return i; + } + } + throw new IndexOutOfBoundsException( + "pos must be less than " + mParagraphBreakPoints[mParagraphBreakPoints.length - 1] + + ", gave " + pos); + } + + /** @hide */ + public float getWidth(@IntRange(from = 0) int start, @IntRange(from = 0) int end) { + final int paraIndex = findParaIndex(start); + final int paraStart = getParagraphStart(paraIndex); + final int paraEnd = getParagraphEnd(paraIndex); + if (start < paraStart || paraEnd < end) { + throw new RuntimeException("Cannot measured across the paragraph:" + + "para: (" + paraStart + ", " + paraEnd + "), " + + "request: (" + start + ", " + end + ")"); + } + return getMeasuredParagraph(paraIndex).getWidth(start - paraStart, end - paraStart); + } + + /** + * Returns the size of native PrecomputedText memory usage. + * + * Note that this is not guaranteed to be accurate. Must be used only for testing purposes. + * @hide + */ + public int getMemoryUsage() { + int r = 0; + for (int i = 0; i < getParagraphCount(); ++i) { + r += getMeasuredParagraph(i).getMemoryUsage(); + } + return r; + } + + /////////////////////////////////////////////////////////////////////////////////////////////// + // Spanned overrides + // + // Just proxy for underlying mText if appropriate. + + @Override + public T[] getSpans(int start, int end, Class type) { + return mText.getSpans(start, end, type); + } + + @Override + public int getSpanStart(Object tag) { + return mText.getSpanStart(tag); + } + + @Override + public int getSpanEnd(Object tag) { + return mText.getSpanEnd(tag); + } + + @Override + public int getSpanFlags(Object tag) { + return mText.getSpanFlags(tag); + } + + @Override + public int nextSpanTransition(int start, int limit, Class type) { + return mText.nextSpanTransition(start, limit, type); + } + + /////////////////////////////////////////////////////////////////////////////////////////////// + // CharSequence overrides. + // + // Just proxy for underlying mText. + + @Override + public int length() { + return mText.length(); + } + + @Override + public char charAt(int index) { + return mText.charAt(index); + } + + @Override + public CharSequence subSequence(int start, int end) { + return PrecomputedText.create(mText.subSequence(start, end), mParams); + } + + @Override + public String toString() { + return mText.toString(); + } +} diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index e62f4216f33..299bde239fc 100644 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -651,42 +651,25 @@ public class StaticLayout extends Layout { b.mJustificationMode != Layout.JUSTIFICATION_MODE_NONE, indents, mLeftPaddings, mRightPaddings); - MeasuredText measured = null; + PrecomputedText measured = null; final Spanned spanned; - final boolean canUseMeasuredText; - if (source instanceof MeasuredText) { - measured = (MeasuredText) source; - - if (bufStart != measured.getStart() || bufEnd != measured.getEnd()) { - // The buffer position has changed. Re-measure here. - canUseMeasuredText = false; - } else if (b.mBreakStrategy != measured.getBreakStrategy() - || b.mHyphenationFrequency != measured.getHyphenationFrequency()) { - // The computed hyphenation pieces may not be able to used. Re-measure it. - canUseMeasuredText = false; - } else { - // We can use measured information. - canUseMeasuredText = true; + if (source instanceof PrecomputedText) { + measured = (PrecomputedText) source; + if (!measured.canUseMeasuredResult(bufStart, bufEnd, textDir, paint, b.mBreakStrategy, + b.mHyphenationFrequency)) { + // Some parameters are different from the ones when measured text is created. + measured = null; } - } else { - canUseMeasuredText = false; } - if (!canUseMeasuredText) { - measured = new MeasuredText.Builder(source, paint) - .setRange(bufStart, bufEnd) - .setTextDirection(textDir) - .setBreakStrategy(b.mBreakStrategy) - .setHyphenationFrequency(b.mHyphenationFrequency) - .build(false /* full layout is not necessary for line breaking */); + if (measured == null) { + final PrecomputedText.Params param = new PrecomputedText.Params(paint, textDir, + b.mBreakStrategy, b.mHyphenationFrequency); + measured = PrecomputedText.createWidthOnly(source, param, bufStart, bufEnd); spanned = (source instanceof Spanned) ? (Spanned) source : null; } else { final CharSequence original = measured.getText(); spanned = (original instanceof Spanned) ? (Spanned) original : null; - // Overwrite with the one when measured. - // TODO: Give an option for developer not to overwrite and measure again here? - textDir = measured.getTextDir(); - paint = measured.getPaint(); } try { diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java index 55367dcce47..117a77d3299 100644 --- a/core/java/android/text/TextLine.java +++ b/core/java/android/text/TextLine.java @@ -60,7 +60,7 @@ public class TextLine { private char[] mChars; private boolean mCharsValid; private Spanned mSpanned; - private MeasuredText mMeasured; + private PrecomputedText mComputed; // Additional width of whitespace for justification. This value is per whitespace, thus // the line width will increase by mAddedWidth x (number of stretchable whitespaces). @@ -119,7 +119,7 @@ public class TextLine { tl.mSpanned = null; tl.mTabs = null; tl.mChars = null; - tl.mMeasured = null; + tl.mComputed = null; tl.mMetricAffectingSpanSpanSet.recycle(); tl.mCharacterStyleSpanSet.recycle(); @@ -170,12 +170,9 @@ public class TextLine { hasReplacement = mReplacementSpanSpanSet.numberOfSpans > 0; } - mMeasured = null; - if (text instanceof MeasuredText) { - MeasuredText mt = (MeasuredText) text; - if (mt.canUseMeasuredResult(paint)) { - mMeasured = mt; - } + mComputed = null; + if (text instanceof PrecomputedText) { + mComputed = (PrecomputedText) text; } mCharsValid = hasReplacement || hasTabs || directions != Layout.DIRS_ALL_LEFT_TO_RIGHT; @@ -746,12 +743,12 @@ public class TextLine { return wp.getRunAdvance(mChars, start, end, contextStart, contextEnd, runIsRtl, offset); } else { final int delta = mStart; - if (mMeasured == null) { + if (mComputed == null) { // TODO: Enable measured getRunAdvance for ReplacementSpan and RTL text. return wp.getRunAdvance(mText, delta + start, delta + end, delta + contextStart, delta + contextEnd, runIsRtl, delta + offset); } else { - return mMeasured.getWidth(start + delta, end + delta); + return mComputed.getWidth(start + delta, end + delta); } } } diff --git a/core/java/android/view/RecordingCanvas.java b/core/java/android/view/RecordingCanvas.java index fbb862be54e..fc7d828de12 100644 --- a/core/java/android/view/RecordingCanvas.java +++ b/core/java/android/view/RecordingCanvas.java @@ -34,7 +34,7 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.TemporaryBuffer; import android.text.GraphicsOperations; -import android.text.MeasuredText; +import android.text.PrecomputedText; import android.text.SpannableString; import android.text.SpannedString; import android.text.TextUtils; @@ -507,8 +507,8 @@ public class RecordingCanvas extends Canvas { TextUtils.getChars(text, contextStart, contextEnd, buf, 0); long measuredTextPtr = 0; int measuredTextOffset = 0; - if (text instanceof MeasuredText) { - MeasuredText mt = (MeasuredText) text; + if (text instanceof PrecomputedText) { + PrecomputedText mt = (PrecomputedText) text; int paraIndex = mt.findParaIndex(start); if (end <= mt.getParagraphEnd(paraIndex)) { // Only support if the target is in the same paragraph. @@ -641,7 +641,7 @@ public class RecordingCanvas extends Canvas { @FastNative private static native void nDrawTextRun(long nativeCanvas, char[] text, int start, int count, int contextStart, int contextCount, float x, float y, boolean isRtl, long nativePaint, - long nativeMeasuredText, int measuredTextOffset); + long nativePrecomputedText, int measuredTextOffset); @FastNative private static native void nDrawTextOnPath(long nativeCanvas, char[] text, int index, int count, diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 1e02c3062d9..8aae0d865cd 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -80,8 +80,8 @@ import android.text.GraphicsOperations; import android.text.InputFilter; import android.text.InputType; import android.text.Layout; -import android.text.MeasuredText; import android.text.ParcelableSpan; +import android.text.PrecomputedText; import android.text.Selection; import android.text.SpanWatcher; import android.text.Spannable; @@ -4091,6 +4091,35 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return mHyphenationFrequency; } + /** + * Gets the parameters for text layout precomputation, for use with {@link PrecomputedText}. + * + * @return a current {@link PrecomputedText.Params} + * @see PrecomputedText + */ + public @NonNull PrecomputedText.Params getTextMetricsParams() { + return new PrecomputedText.Params(new TextPaint(mTextPaint), getTextDirectionHeuristic(), + mBreakStrategy, mHyphenationFrequency); + } + + /** + * Apply the text layout parameter. + * + * Update the TextView parameters to be compatible with {@link PrecomputedText.Params}. + * @see PrecomputedText + */ + public void setTextMetricsParams(@NonNull PrecomputedText.Params params) { + mTextPaint.set(params.getTextPaint()); + mTextDir = params.getTextDirection(); + mBreakStrategy = params.getBreakStrategy(); + mHyphenationFrequency = params.getHyphenationFrequency(); + if (mLayout != null) { + nullLayouts(); + requestLayout(); + invalidate(); + } + } + /** * Set justification mode. The default value is {@link Layout#JUSTIFICATION_MODE_NONE}. If the * last line is too short for justification, the last line will be displayed with the @@ -5584,7 +5613,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (imm != null) imm.restartInput(this); } else if (type == BufferType.SPANNABLE || mMovement != null) { text = mSpannableFactory.newSpannable(text); - } else if (!(text instanceof MeasuredText || text instanceof CharWrapper)) { + } else if (!(text instanceof PrecomputedText || text instanceof CharWrapper)) { text = TextUtils.stringOrSpannedString(text); } @@ -11712,6 +11741,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } /** + * Returns the current {@link TextDirectionHeuristic}. + * + * @return the current {@link TextDirectionHeuristic}. * @hide */ protected TextDirectionHeuristic getTextDirectionHeuristic() { diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp index 482d028a67f..2c05d0b976f 100644 --- a/core/jni/android/graphics/Paint.cpp +++ b/core/jni/android/graphics/Paint.cpp @@ -1008,6 +1008,23 @@ namespace PaintGlue { return paint->getLooper() && paint->getLooper()->asABlurShadow(nullptr); } + static jboolean equalsForTextMeasurement(jlong lPaint, jlong rPaint) { + if (lPaint == rPaint) { + return true; + } + Paint* leftPaint = reinterpret_cast(lPaint); + Paint* rightPaint = reinterpret_cast(rPaint); + + const Typeface* leftTypeface = Typeface::resolveDefault(leftPaint->getAndroidTypeface()); + const Typeface* rightTypeface = Typeface::resolveDefault(rightPaint->getAndroidTypeface()); + minikin::MinikinPaint leftMinikinPaint + = MinikinUtils::prepareMinikinPaint(leftPaint, leftTypeface); + minikin::MinikinPaint rightMinikinPaint + = MinikinUtils::prepareMinikinPaint(rightPaint, rightTypeface); + + return leftMinikinPaint == rightMinikinPaint; + } + }; // namespace PaintGlue static const JNINativeMethod methods[] = { @@ -1107,7 +1124,8 @@ static const JNINativeMethod methods[] = { {"nGetStrikeThruPosition","(J)F", (void*) PaintGlue::getStrikeThruPosition}, {"nGetStrikeThruThickness","(J)F", (void*) PaintGlue::getStrikeThruThickness}, {"nSetShadowLayer", "(JFFFI)V", (void*)PaintGlue::setShadowLayer}, - {"nHasShadowLayer", "(J)Z", (void*)PaintGlue::hasShadowLayer} + {"nHasShadowLayer", "(J)Z", (void*)PaintGlue::hasShadowLayer}, + {"nEqualsForTextMeasurement", "(JJ)Z", (void*)PaintGlue::equalsForTextMeasurement}, }; int register_android_graphics_Paint(JNIEnv* env) { diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java index eacb727099e..07df0454362 100644 --- a/graphics/java/android/graphics/BaseCanvas.java +++ b/graphics/java/android/graphics/BaseCanvas.java @@ -22,7 +22,7 @@ import android.annotation.Nullable; import android.annotation.Size; import android.graphics.Canvas.VertexMode; import android.text.GraphicsOperations; -import android.text.MeasuredText; +import android.text.PrecomputedText; import android.text.SpannableString; import android.text.SpannedString; import android.text.TextUtils; @@ -487,8 +487,8 @@ public abstract class BaseCanvas { TextUtils.getChars(text, contextStart, contextEnd, buf, 0); long measuredTextPtr = 0; int measuredTextOffset = 0; - if (text instanceof MeasuredText) { - MeasuredText mt = (MeasuredText) text; + if (text instanceof PrecomputedText) { + PrecomputedText mt = (PrecomputedText) text; int paraIndex = mt.findParaIndex(start); if (end <= mt.getParagraphEnd(paraIndex)) { // Only suppor the same paragraph. @@ -647,7 +647,7 @@ public abstract class BaseCanvas { private static native void nDrawTextRun(long nativeCanvas, char[] text, int start, int count, int contextStart, int contextCount, float x, float y, boolean isRtl, long nativePaint, - long nativeMeasuredText, int measuredTextOffset); + long nativePrecomputedText, int measuredTextOffset); private static native void nDrawTextOnPath(long nativeCanvas, char[] text, int index, int count, long nativePath, float hOffset, float vOffset, int bidiFlags, long nativePaint); diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index ed147e9e2ec..42dac38affb 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -2835,6 +2835,16 @@ public class Paint { return result; } + /** + * Returns true of the passed {@link Paint} will have the same effect on text measurement + * + * @param other A {@link Paint} object. + * @return true if the other {@link Paint} has the same effect on text measurement. + */ + public boolean equalsForTextMeasurement(@NonNull Paint other) { + return nEqualsForTextMeasurement(mNativePaint, other.mNativePaint); + } + // regular JNI private static native long nGetNativeFinalizer(); private static native long nInit(); @@ -3002,4 +3012,6 @@ public class Paint { private static native float nGetStrikeThruThickness(long paintPtr); @CriticalNative private static native void nSetTextSize(long paintPtr, float textSize); + @CriticalNative + private static native boolean nEqualsForTextMeasurement(long leftPaintPtr, long rightPaintPtr); } -- GitLab From bba1e9f24db90c77fa3426638cd6103430b3f41d Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Fri, 16 Feb 2018 21:04:48 -0800 Subject: [PATCH 039/386] MediaFormat: declare key for AAC decoder DRC effect type Bug: 71430241 Test: CTS AAC decoder test Change-Id: I077bdccf2b3ce935feaa6f14c75640d2f20affb7 --- api/current.txt | 1 + media/java/android/media/MediaFormat.java | 26 +++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/api/current.txt b/api/current.txt index 63bc2ecaca1..66a1af1a644 100644 --- a/api/current.txt +++ b/api/current.txt @@ -23615,6 +23615,7 @@ package android.media { field public static final int COLOR_TRANSFER_ST2084 = 6; // 0x6 field public static final java.lang.String KEY_AAC_DRC_ATTENUATION_FACTOR = "aac-drc-cut-level"; field public static final java.lang.String KEY_AAC_DRC_BOOST_FACTOR = "aac-drc-boost-level"; + field public static final java.lang.String KEY_AAC_DRC_EFFECT_TYPE = "aac-drc-effect-type"; field public static final java.lang.String KEY_AAC_DRC_HEAVY_COMPRESSION = "aac-drc-heavy-compression"; field public static final java.lang.String KEY_AAC_DRC_TARGET_REFERENCE_LEVEL = "aac-target-ref-level"; field public static final java.lang.String KEY_AAC_ENCODED_TARGET_LEVEL = "aac-encoded-target-level"; diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java index e9128e4c827..b50aa477d51 100644 --- a/media/java/android/media/MediaFormat.java +++ b/media/java/android/media/MediaFormat.java @@ -87,6 +87,7 @@ import java.util.Map; * {@link #KEY_AAC_DRC_ATTENUATION_FACTOR}Integerdecoder-only, optional, if content is AAC audio, specifies the DRC attenuation factor. * {@link #KEY_AAC_DRC_HEAVY_COMPRESSION}Integerdecoder-only, optional, if content is AAC audio, specifies whether to use heavy compression. * {@link #KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT}Integerdecoder-only, optional, if content is AAC audio, specifies the maximum number of channels the decoder outputs. + * {@link #KEY_AAC_DRC_EFFECT_TYPE}Integerdecoder-only, optional, if content is AAC audio, specifies the DRC effect type to use. * {@link #KEY_CHANNEL_MASK}Integeroptional, a mask of audio channel assignments * {@link #KEY_FLAC_COMPRESSION_LEVEL}Integerencoder-only, optional, if content is FLAC audio, specifies the desired compression level. * @@ -511,6 +512,31 @@ public final class MediaFormat { */ public static final String KEY_AAC_DRC_TARGET_REFERENCE_LEVEL = "aac-target-ref-level"; + /** + * A key describing for selecting the DRC effect type for MPEG-D DRC. + * The supported values are defined in ISO/IEC 23003-4:2015 and are described as follows: + * + * + * + * + * + * + * + * + * + * + *
ValueEffect
-1Off
0None
1Late night
2Noisy environment
3Limited playback range
4Low playback level
5Dialog enhancement
6General compression
+ *

The value -1 (Off) disables DRC processing, while loudness normalization may still be + * active and dependent on KEY_AAC_DRC_TARGET_REFERENCE_LEVEL.
+ * The value 0 (None) automatically enables DRC processing if necessary to prevent signal + * clipping
+ * The value 6 (General compression) can be used for enabling MPEG-D DRC without particular + * DRC effect type request.
+ * The default is DRC effect type "None". + *

This key is only used during decoding. + */ + public static final String KEY_AAC_DRC_EFFECT_TYPE = "aac-drc-effect-type"; + /** * A key describing the target reference level that was assumed at the encoder for * calculation of attenuation gains for clipping prevention. This information can be provided -- GitLab From 12c1270f8bec36f208daab5c5ca650a8c3130a69 Mon Sep 17 00:00:00 2001 From: Bookatz Date: Fri, 16 Feb 2018 15:14:42 -0800 Subject: [PATCH 040/386] Statsd alerts can inform subscribers probabilistically The config can specify that when an alarm fires the relevant subscriber is only informed with some probability. This allows only a fraction of firings to trigger the subscriber's action. Bug: 73287237 Test: none yet Change-Id: I365faad8ffd1b40b01782c1d761b1c0e09c7c299 --- cmds/statsd/src/anomaly/AnomalyTracker.cpp | 10 +++++++++- cmds/statsd/src/statsd_config.proto | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/cmds/statsd/src/anomaly/AnomalyTracker.cpp b/cmds/statsd/src/anomaly/AnomalyTracker.cpp index 443d33d3991..22d775a3b4b 100644 --- a/cmds/statsd/src/anomaly/AnomalyTracker.cpp +++ b/cmds/statsd/src/anomaly/AnomalyTracker.cpp @@ -229,11 +229,19 @@ bool AnomalyTracker::isInRefractoryPeriod(const uint64_t& timestampNs, void AnomalyTracker::informSubscribers(const MetricDimensionKey& key) { VLOG("informSubscribers called."); if (mSubscriptions.empty()) { - ALOGE("Attempt to call with no subscribers."); + // The config just wanted to log the anomaly. That's fine. + VLOG("No Subscriptions were associated with the alert."); return; } for (const Subscription& subscription : mSubscriptions) { + if (subscription.probability_of_informing() < 1 + && ((float)rand() / RAND_MAX) >= subscription.probability_of_informing()) { + // Note that due to float imprecision, 0.0 and 1.0 might not truly mean never/always. + // The config writer was advised to use -0.1 and 1.1 for never/always. + ALOGI("Fate decided that a subscriber would not be informed."); + continue; + } switch (subscription.subscriber_information_case()) { case Subscription::SubscriberInformationCase::kIncidentdDetails: if (!GenerateIncidentReport(subscription.incidentd_details(), mAlert, mConfigKey)) { diff --git a/cmds/statsd/src/statsd_config.proto b/cmds/statsd/src/statsd_config.proto index 5a326a47eb2..a19df75c5e9 100644 --- a/cmds/statsd/src/statsd_config.proto +++ b/cmds/statsd/src/statsd_config.proto @@ -308,6 +308,8 @@ message Subscription { PerfettoDetails perfetto_details = 5; BroadcastSubscriberDetails broadcast_subscriber_details = 6; } + + optional float probability_of_informing = 7 [default = 1.1]; } message StatsdConfig { -- GitLab From d5c356214fabec1ad9d5d16d673f000deb49ea30 Mon Sep 17 00:00:00 2001 From: Yangster-mac Date: Fri, 2 Feb 2018 10:33:25 -0800 Subject: [PATCH 041/386] Timestamp Truncating whitelist. Test: manually tested. Change-Id: I46da375b6c0773ffc611bc06fff12cb4f9a7fc18 --- .../src/metrics/EventMetricProducer.cpp | 19 +++++++++++++++---- .../src/metrics/GaugeMetricProducer.cpp | 8 ++++++-- cmds/statsd/src/stats_log_util.cpp | 4 ++++ cmds/statsd/src/stats_log_util.h | 3 +++ tools/stats_log_api_gen/main.cpp | 12 ++++++++++++ 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp index 2585aa3bdbf..fddfd93f694 100644 --- a/cmds/statsd/src/metrics/EventMetricProducer.cpp +++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp @@ -129,12 +129,23 @@ void EventMetricProducer::onMatchedLogEventInternalLocked( long long wrapperToken = mProto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_DATA); - mProto->write(FIELD_TYPE_INT64 | FIELD_ID_ELAPSED_TIMESTAMP_NANOS, - (long long)event.GetElapsedTimestampNs()); + long long eventToken = mProto->start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOMS); + const bool truncateTimestamp = + android::util::kNotTruncatingTimestampAtomWhiteList.find(event.GetTagId()) == + android::util::kNotTruncatingTimestampAtomWhiteList.end(); + if (truncateTimestamp) { + mProto->write(FIELD_TYPE_INT64 | FIELD_ID_ELAPSED_TIMESTAMP_NANOS, + (long long)truncateTimestampNsToFiveMinutes(event.GetElapsedTimestampNs())); + mProto->write(FIELD_TYPE_INT64 | FIELD_ID_WALL_CLOCK_TIMESTAMP_NANOS, + (long long)truncateTimestampNsToFiveMinutes(getWallClockNs())); + } else { + mProto->write(FIELD_TYPE_INT64 | FIELD_ID_ELAPSED_TIMESTAMP_NANOS, + (long long)event.GetElapsedTimestampNs()); + mProto->write(FIELD_TYPE_INT64 | FIELD_ID_WALL_CLOCK_TIMESTAMP_NANOS, + (long long)getWallClockNs()); + } event.ToProto(*mProto); - mProto->write(FIELD_TYPE_INT64 | FIELD_ID_WALL_CLOCK_TIMESTAMP_NANOS, - (long long)getWallClockNs()); mProto->end(eventToken); mProto->end(wrapperToken); } diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp index 0daa506ba42..7d09ff9ffc8 100644 --- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp +++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp @@ -173,11 +173,15 @@ void GaugeMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs, writeFieldValueTreeToStream(mTagId, *(atom.mFields), protoOutput); } protoOutput->end(atomsToken); - for (const auto& atom : bucket.mGaugeAtoms) { + const bool truncateTimestamp = + android::util::kNotTruncatingTimestampAtomWhiteList.find(mTagId) == + android::util::kNotTruncatingTimestampAtomWhiteList.end(); + int64_t timestampNs = truncateTimestamp ? + truncateTimestampNsToFiveMinutes(atom.mTimestamps) : atom.mTimestamps; protoOutput->write( FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED | FIELD_ID_ELAPSED_ATOM_TIMESTAMP, - (long long)atom.mTimestamps); + (long long)timestampNs); } } protoOutput->end(bucketInfoToken); diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp index 30eef4fef16..2c7b9190f9d 100644 --- a/cmds/statsd/src/stats_log_util.cpp +++ b/cmds/statsd/src/stats_log_util.cpp @@ -290,6 +290,10 @@ int64_t getWallClockMillis() { return time(nullptr) * MS_PER_SEC; } +int64_t truncateTimestampNsToFiveMinutes(int64_t timestampNs) { + return timestampNs / NS_PER_SEC / (5 * 60) * NS_PER_SEC * (5 * 60); +} + } // namespace statsd } // namespace os } // namespace android diff --git a/cmds/statsd/src/stats_log_util.h b/cmds/statsd/src/stats_log_util.h index 6a5123d8c84..59226423431 100644 --- a/cmds/statsd/src/stats_log_util.h +++ b/cmds/statsd/src/stats_log_util.h @@ -73,6 +73,9 @@ bool parseProtoOutputStream(util::ProtoOutputStream& protoOutput, T* message) { return message->ParseFromArray(pbBytes.c_str(), pbBytes.size()); } +// Returns the truncated timestamp. +int64_t truncateTimestampNsToFiveMinutes(int64_t timestampNs); + } // namespace statsd } // namespace os } // namespace android diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp index f0628c099e2..a50fd1670c3 100644 --- a/tools/stats_log_api_gen/main.cpp +++ b/tools/stats_log_api_gen/main.cpp @@ -365,6 +365,18 @@ write_stats_log_header(FILE* out, const Atoms& atoms, const AtomDecl &attributio fprintf(out, "};\n"); fprintf(out, "\n"); + std::set kFuzzingAtomNames = { "mobile_radio_power_state_changed" }; + fprintf(out, "const static std::set kNotTruncatingTimestampAtomWhiteList = {\n"); + for (set::const_iterator atom = atoms.decls.begin(); + atom != atoms.decls.end(); atom++) { + if (kFuzzingAtomNames.find(atom->name) == kFuzzingAtomNames.end()) { + string constant = make_constant_name(atom->name); + fprintf(out, " %s,\n", constant.c_str()); + } + } + fprintf(out, "};\n"); + fprintf(out, "\n"); + fprintf(out, "const static std::set kAtomsWithUidField = {\n"); for (set::const_iterator atom = atoms.decls.begin(); atom != atoms.decls.end(); atom++) { -- GitLab From ae9fdf0403fdb24acc2c1d7e33ec96834d154dcf Mon Sep 17 00:00:00 2001 From: Chenjie Yu Date: Thu, 15 Feb 2018 10:19:32 -0800 Subject: [PATCH 042/386] fix picture-in-picture logging + log uid and activity name Test: manual test. Will add cts test Change-Id: I3d3e77b24779e439eacc06007fae62c037a19fd6 --- cmds/statsd/src/atoms.proto | 9 +-- .../os/logging/MetricsLoggerWrapper.java | 70 ++++++++++--------- .../systemui/pip/phone/PipTouchHandler.java | 13 ++-- .../server/am/ActivityManagerService.java | 4 +- .../server/am/ActivityStackSupervisor.java | 5 +- 5 files changed, 53 insertions(+), 48 deletions(-) diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 85e209be641..d9094dd1d86 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -993,21 +993,18 @@ message AppStartFullyDrawnChanged { * frameworks/base/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java */ message PictureInPictureStateChanged { + // -1 if it is not available optional int32 uid = 1; - optional string package_name = 2; - - optional string class_name = 3; + optional string short_name = 2; - // Picture-in-Picture action occurred, similar to - // frameworks/base/proto/src/metrics_constants.proto enum State { ENTERED = 1; EXPANDED_TO_FULL_SCREEN = 2; MINIMIZED = 3; DISMISSED = 4; } - optional State state = 4; + optional State state = 3; } /** diff --git a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java index 1376687be01..adad0362eca 100644 --- a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java +++ b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java @@ -16,7 +16,10 @@ package com.android.internal.os.logging; +import android.content.ComponentName; import android.content.Context; +import android.content.pm.PackageManager.NameNotFoundException; +import android.util.Pair; import android.util.StatsLog; import com.android.internal.logging.MetricsLogger; @@ -31,43 +34,49 @@ public class MetricsLoggerWrapper { private static final int METRIC_VALUE_DISMISSED_BY_TAP = 0; private static final int METRIC_VALUE_DISMISSED_BY_DRAG = 1; - public static void logPictureInPictureDismissByTap(Context context) { + public static void logPictureInPictureDismissByTap(Context context, + Pair topActivityInfo) { MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED, METRIC_VALUE_DISMISSED_BY_TAP); StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, - context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, + getUid(context, topActivityInfo.first, topActivityInfo.second), + topActivityInfo.first.flattenToString(), StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__DISMISSED); } - public static void logPictureInPictureDismissByDrag(Context context) { + public static void logPictureInPictureDismissByDrag(Context context, + Pair topActivityInfo) { MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED, METRIC_VALUE_DISMISSED_BY_DRAG); StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, - context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, + getUid(context, topActivityInfo.first, topActivityInfo.second), + topActivityInfo.first.flattenToString(), StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__DISMISSED); } - public static void logPictureInPictureMinimize(Context context, boolean isMinimized) { + public static void logPictureInPictureMinimize(Context context, boolean isMinimized, + Pair topActivityInfo) { MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_MINIMIZED, isMinimized); - if (isMinimized) { - StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, - context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, - StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__MINIMIZED); - } else { - StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, - context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, - StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__EXPANDED_TO_FULL_SCREEN); + StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, + getUid(context, topActivityInfo.first, topActivityInfo.second), + topActivityInfo.first.flattenToString(), + StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__MINIMIZED); + } + + /** + * Get uid from component name and user Id + * @return uid. -1 if not found. + */ + private static int getUid(Context context, ComponentName componentName, int userId) { + int uid = -1; + try { + uid = context.getPackageManager().getApplicationInfoAsUser( + componentName.getPackageName(), 0, userId).uid; + } catch (NameNotFoundException e) { } + return uid; } public static void logPictureInPictureMenuVisible(Context context, boolean menuStateFull) { @@ -76,24 +85,21 @@ public class MetricsLoggerWrapper { } public static void logPictureInPictureEnter(Context context, - boolean supportsEnterPipOnTaskSwitch) { + int uid, String shortComponentName, boolean supportsEnterPipOnTaskSwitch) { MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_ENTERED, supportsEnterPipOnTaskSwitch); - if (supportsEnterPipOnTaskSwitch) { - StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, - StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__ENTERED); - } + StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, uid, + shortComponentName, + StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__ENTERED); } - public static void logPictureInPictureFullScreen(Context context) { + public static void logPictureInPictureFullScreen(Context context, int uid, + String shortComponentName) { MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_EXPANDED_TO_FULLSCREEN); StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, - context.getUserId(), - context.getApplicationInfo().packageName, - context.getApplicationInfo().className, + uid, + shortComponentName, StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__EXPANDED_TO_FULL_SCREEN); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java index b25351731a3..77931e447e1 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java @@ -16,9 +16,9 @@ package com.android.systemui.pip.phone; -import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_NONE; import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_CLOSE; import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_FULL; +import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_NONE; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -42,7 +42,7 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityWindowInfo; -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; + import com.android.internal.os.logging.MetricsLoggerWrapper; import com.android.internal.policy.PipSnapAlgorithm; import com.android.systemui.R; @@ -158,8 +158,9 @@ public class PipTouchHandler { @Override public void onPipDismiss() { + MetricsLoggerWrapper.logPictureInPictureDismissByTap(mContext, + PipUtils.getTopPinnedActivity(mContext, mActivityManager)); mMotionHelper.dismissPip(); - MetricsLoggerWrapper.logPictureInPictureDismissByTap(mContext); } @Override @@ -458,7 +459,8 @@ public class PipTouchHandler { return; } if (mIsMinimized != isMinimized) { - MetricsLoggerWrapper.logPictureInPictureMinimize(mContext, isMinimized); + MetricsLoggerWrapper.logPictureInPictureMinimize(mContext, + isMinimized, PipUtils.getTopPinnedActivity(mContext, mActivityManager)); } mIsMinimized = isMinimized; mSnapAlgorithm.setMinimized(isMinimized); @@ -661,9 +663,10 @@ public class PipTouchHandler { if (ENABLE_DISMISS_DRAG_TO_EDGE) { // Check if the user dragged or flung the PiP offscreen to dismiss it if (mMotionHelper.shouldDismissPip() || isFlingToBot) { + MetricsLoggerWrapper.logPictureInPictureDismissByDrag(mContext, + PipUtils.getTopPinnedActivity(mContext, mActivityManager)); mMotionHelper.animateDismiss(mMotionHelper.getBounds(), vel.x, vel.y, mUpdateScrimListener); - MetricsLoggerWrapper.logPictureInPictureDismissByDrag(mContext); return true; } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 2af284c1228..59c894be95f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -8655,8 +8655,8 @@ public class ActivityManagerService extends IActivityManager.Stub final PinnedActivityStack stack = r.getStack(); stack.setPictureInPictureAspectRatio(aspectRatio); stack.setPictureInPictureActions(actions); - - MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.supportsEnterPipOnTaskSwitch); + MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.appInfo.uid, + r.shortComponentName, r.supportsEnterPipOnTaskSwitch); logPictureInPictureArgs(params); }; diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index f4f60c2c43a..a82facd174a 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -2599,9 +2599,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // resize when we remove task from it below and it is detached from the // display because it no longer contains any tasks. mAllowDockedStackResize = false; - } else if (inPinnedWindowingMode && onTop) { - // Log if we are expanding the PiP to fullscreen - MetricsLoggerWrapper.logPictureInPictureFullScreen(mService.mContext); } // If we are moving from the pinned stack, then the animation takes care of updating @@ -2624,6 +2621,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D isTopTask /* animate */, DEFER_RESUME, schedulePictureInPictureModeChange, "moveTasksToFullscreenStack - onTop"); + MetricsLoggerWrapper.logPictureInPictureFullScreen(mService.mContext, + task.effectiveUid, task.realActivity.flattenToString()); } else { // Position the tasks in the fullscreen stack in order at the bottom of the // stack. Also defer resume until all the tasks have been moved to the -- GitLab From d89c7790e1664c42d5986d4954a113d3fd1b675e Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Tue, 19 Dec 2017 15:11:47 +0000 Subject: [PATCH 043/386] Fix visibility issues with android.test.mock.stubs This ensures that the API definitions for the android.test.mock package matches the definitions in the api/current.txt file. Bug: 30188076 Test: make update-api (cherry-picked from commit bd97e3dd4e5d395f336114016b000ef3cfb26053) Merged-In: Id325b8cf2f189117ac4cfe7634095ab710eee004 Change-Id: Id325b8cf2f189117ac4cfe7634095ab710eee004 --- test-mock/Android.mk | 9 +- test-mock/api/android-test-mock-current.txt | 122 -------------------- test-mock/api/android-test-mock-removed.txt | 1 + 3 files changed, 9 insertions(+), 123 deletions(-) diff --git a/test-mock/Android.mk b/test-mock/Android.mk index d81ca013ec7..05794a7615c 100644 --- a/test-mock/Android.mk +++ b/test-mock/Android.mk @@ -16,7 +16,12 @@ LOCAL_PATH:= $(call my-dir) -android_test_mock_source_files := $(call all-java-files-under, src/android/test/mock) +# Includes the main framework source to ensure that doclava has access to the +# visibility information for the base classes of the mock classes. Without it +# otherwise hidden methods could be visible. +android_test_mock_source_files := \ + $(call all-java-files-under, src/android/test/mock) \ + $(call all-java-files-under, ../core/java) \ # Generate the stub source files for android.test.mock.stubs # ========================================================== @@ -63,6 +68,8 @@ LOCAL_SOURCE_FILES_ALL_GENERATED := true # Make sure to run droiddoc first to generate the stub source files. LOCAL_ADDITIONAL_DEPENDENCIES := $(android_test_mock_gen_stamp) +LOCAL_SDK_VERSION := current + include $(BUILD_STATIC_JAVA_LIBRARY) # Archive a copy of the classes.jar in SDK build. diff --git a/test-mock/api/android-test-mock-current.txt b/test-mock/api/android-test-mock-current.txt index 10286c29715..07acfef7ce6 100644 --- a/test-mock/api/android-test-mock-current.txt +++ b/test-mock/api/android-test-mock-current.txt @@ -15,7 +15,6 @@ package android.test.mock { method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList); method public static deprecated void attachInfoForTesting(android.content.ContentProvider, android.content.Context, android.content.pm.ProviderInfo); method public int delete(android.net.Uri, java.lang.String, java.lang.String[]); - method public final android.content.IContentProvider getIContentProvider(); method public java.lang.String getType(android.net.Uri); method public android.net.Uri insert(android.net.Uri, android.content.ContentValues); method public boolean onCreate(); @@ -27,37 +26,26 @@ package android.test.mock { public class MockContentResolver extends android.content.ContentResolver { ctor public MockContentResolver(); ctor public MockContentResolver(android.content.Context); - method protected android.content.IContentProvider acquireProvider(android.content.Context, java.lang.String); - method protected android.content.IContentProvider acquireUnstableProvider(android.content.Context, java.lang.String); method public void addProvider(java.lang.String, android.content.ContentProvider); - method public boolean releaseProvider(android.content.IContentProvider); - method public boolean releaseUnstableProvider(android.content.IContentProvider); - method public void unstableProviderDied(android.content.IContentProvider); } public class MockContext extends android.content.Context { ctor public MockContext(); method public boolean bindService(android.content.Intent, android.content.ServiceConnection, int); - method public boolean canLoadUnsafeResources(); method public int checkCallingOrSelfPermission(java.lang.String); method public int checkCallingOrSelfUriPermission(android.net.Uri, int); method public int checkCallingPermission(java.lang.String); method public int checkCallingUriPermission(android.net.Uri, int); method public int checkPermission(java.lang.String, int, int); - method public int checkPermission(java.lang.String, int, int, android.os.IBinder); method public int checkSelfPermission(java.lang.String); method public int checkUriPermission(android.net.Uri, int, int, int); - method public int checkUriPermission(android.net.Uri, int, int, int, android.os.IBinder); method public int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int); method public void clearWallpaper(); - method public android.content.Context createApplicationContext(android.content.pm.ApplicationInfo, int) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.Context createConfigurationContext(android.content.res.Configuration); method public android.content.Context createContextForSplit(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; - method public android.content.Context createCredentialProtectedStorageContext(); method public android.content.Context createDeviceProtectedStorageContext(); method public android.content.Context createDisplayContext(android.view.Display); method public android.content.Context createPackageContext(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; - method public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException; method public java.lang.String[] databaseList(); method public boolean deleteDatabase(java.lang.String); method public boolean deleteFile(java.lang.String); @@ -73,7 +61,6 @@ package android.test.mock { method public android.content.Context getApplicationContext(); method public android.content.pm.ApplicationInfo getApplicationInfo(); method public android.content.res.AssetManager getAssets(); - method public java.lang.String getBasePackageName(); method public java.io.File getCacheDir(); method public java.lang.ClassLoader getClassLoader(); method public java.io.File getCodeCacheDir(); @@ -81,8 +68,6 @@ package android.test.mock { method public java.io.File getDataDir(); method public java.io.File getDatabasePath(java.lang.String); method public java.io.File getDir(java.lang.String, int); - method public android.view.Display getDisplay(); - method public android.view.DisplayAdjustments getDisplayAdjustments(int); method public java.io.File getExternalCacheDir(); method public java.io.File[] getExternalCacheDirs(); method public java.io.File getExternalFilesDir(java.lang.String); @@ -94,25 +79,19 @@ package android.test.mock { method public java.io.File getNoBackupFilesDir(); method public java.io.File getObbDir(); method public java.io.File[] getObbDirs(); - method public java.lang.String getOpPackageName(); method public java.lang.String getPackageCodePath(); method public android.content.pm.PackageManager getPackageManager(); method public java.lang.String getPackageName(); method public java.lang.String getPackageResourcePath(); - method public java.io.File getPreloadsFileCache(); method public android.content.res.Resources getResources(); method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int); - method public android.content.SharedPreferences getSharedPreferences(java.io.File, int); - method public java.io.File getSharedPreferencesPath(java.lang.String); method public java.lang.Object getSystemService(java.lang.String); method public java.lang.String getSystemServiceName(java.lang.Class); method public android.content.res.Resources.Theme getTheme(); - method public int getUserId(); method public android.graphics.drawable.Drawable getWallpaper(); method public int getWallpaperDesiredMinimumHeight(); method public int getWallpaperDesiredMinimumWidth(); method public void grantUriPermission(java.lang.String, android.net.Uri, int); - method public boolean isCredentialProtectedStorage(); method public boolean isDeviceProtectedStorage(); method public boolean moveDatabaseFrom(android.content.Context, java.lang.String); method public boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String); @@ -125,31 +104,19 @@ package android.test.mock { method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int); method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler); method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int); - method public android.content.Intent registerReceiverAsUser(android.content.BroadcastReceiver, android.os.UserHandle, android.content.IntentFilter, java.lang.String, android.os.Handler); - method public void reloadSharedPreferences(); method public void removeStickyBroadcast(android.content.Intent); method public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle); method public void revokeUriPermission(android.net.Uri, int); method public void revokeUriPermission(java.lang.String, android.net.Uri, int); method public void sendBroadcast(android.content.Intent); method public void sendBroadcast(android.content.Intent, java.lang.String); - method public void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle); - method public void sendBroadcast(android.content.Intent, java.lang.String, int); method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle); method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String); - method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle); - method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int); - method public void sendBroadcastMultiplePermissions(android.content.Intent, java.lang.String[]); method public void sendOrderedBroadcast(android.content.Intent, java.lang.String); method public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle); - method public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle); - method public void sendOrderedBroadcast(android.content.Intent, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle); method public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle); - method public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle); - method public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle); method public void sendStickyBroadcast(android.content.Intent); method public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle); - method public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.os.Bundle); method public void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle); method public void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle); method public void setTheme(int); @@ -160,17 +127,13 @@ package android.test.mock { method public void startActivity(android.content.Intent); method public void startActivity(android.content.Intent, android.os.Bundle); method public android.content.ComponentName startForegroundService(android.content.Intent); - method public android.content.ComponentName startForegroundServiceAsUser(android.content.Intent, android.os.UserHandle); method public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle); method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException; method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException; method public android.content.ComponentName startService(android.content.Intent); - method public android.content.ComponentName startServiceAsUser(android.content.Intent, android.os.UserHandle); method public boolean stopService(android.content.Intent); - method public boolean stopServiceAsUser(android.content.Intent, android.os.UserHandle); method public void unbindService(android.content.ServiceConnection); method public void unregisterReceiver(android.content.BroadcastReceiver); - method public void updateDisplay(int); } public deprecated class MockCursor implements android.database.Cursor { @@ -226,8 +189,6 @@ package android.test.mock { public deprecated class MockPackageManager extends android.content.pm.PackageManager { ctor public MockPackageManager(); - method public void addCrossProfileIntentFilter(android.content.IntentFilter, int, int, int); - method public void addOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener); method public void addPackageToPreferred(java.lang.String); method public boolean addPermission(android.content.pm.PermissionInfo); method public boolean addPermissionAsync(android.content.pm.PermissionInfo); @@ -237,19 +198,10 @@ package android.test.mock { method public int checkPermission(java.lang.String, java.lang.String); method public int checkSignatures(java.lang.String, java.lang.String); method public int checkSignatures(int, int); - method public void clearApplicationUserData(java.lang.String, android.content.pm.IPackageDataObserver); - method public void clearCrossProfileIntentFilters(int); method public void clearInstantAppCookie(); method public void clearPackagePreferredActivities(java.lang.String); method public java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]); - method public void deleteApplicationCacheFiles(java.lang.String, android.content.pm.IPackageDataObserver); - method public void deleteApplicationCacheFilesAsUser(java.lang.String, int, android.content.pm.IPackageDataObserver); - method public void deletePackage(java.lang.String, android.content.pm.IPackageDeleteObserver, int); - method public void deletePackageAsUser(java.lang.String, android.content.pm.IPackageDeleteObserver, int, int); method public void extendVerificationTimeout(int, int, long); - method public void flushPackageRestrictionsAsUser(int); - method public void freeStorage(java.lang.String, long, android.content.IntentSender); - method public void freeStorageAndNotify(java.lang.String, long, android.content.pm.IPackageDataObserver); method public android.graphics.drawable.Drawable getActivityBanner(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException; method public android.graphics.drawable.Drawable getActivityBanner(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException; method public android.graphics.drawable.Drawable getActivityIcon(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException; @@ -262,149 +214,75 @@ package android.test.mock { method public android.graphics.drawable.Drawable getApplicationBanner(android.content.pm.ApplicationInfo); method public android.graphics.drawable.Drawable getApplicationBanner(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public int getApplicationEnabledSetting(java.lang.String); - method public boolean getApplicationHiddenSettingAsUser(java.lang.String, android.os.UserHandle); method public android.graphics.drawable.Drawable getApplicationIcon(android.content.pm.ApplicationInfo); method public android.graphics.drawable.Drawable getApplicationIcon(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; - method public android.content.pm.ApplicationInfo getApplicationInfoAsUser(java.lang.String, int, int) throws android.content.pm.PackageManager.NameNotFoundException; method public java.lang.CharSequence getApplicationLabel(android.content.pm.ApplicationInfo); method public android.graphics.drawable.Drawable getApplicationLogo(android.content.pm.ApplicationInfo); method public android.graphics.drawable.Drawable getApplicationLogo(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.pm.ChangedPackages getChangedPackages(int); method public int getComponentEnabledSetting(android.content.ComponentName); method public android.graphics.drawable.Drawable getDefaultActivityIcon(); - method public java.lang.String getDefaultBrowserPackageNameAsUser(int); method public android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo); - method public android.content.ComponentName getHomeActivities(java.util.List); - method public int getInstallReason(java.lang.String, android.os.UserHandle); method public java.util.List getInstalledApplications(int); - method public java.util.List getInstalledApplicationsAsUser(int, int); method public java.util.List getInstalledPackages(int); - method public java.util.List getInstalledPackagesAsUser(int, int); method public java.lang.String getInstallerPackageName(java.lang.String); - method public java.lang.String getInstantAppAndroidId(java.lang.String, android.os.UserHandle); method public byte[] getInstantAppCookie(); method public int getInstantAppCookieMaxBytes(); - method public int getInstantAppCookieMaxSize(); - method public android.graphics.drawable.Drawable getInstantAppIcon(java.lang.String); - method public android.content.ComponentName getInstantAppInstallerComponent(); - method public android.content.ComponentName getInstantAppResolverSettingsComponent(); - method public java.util.List getInstantApps(); method public android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException; - method public java.util.List getIntentFilterVerifications(java.lang.String); - method public int getIntentVerificationStatusAsUser(java.lang.String, int); - method public android.content.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String); method public android.content.Intent getLaunchIntentForPackage(java.lang.String); method public android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String); - method public int getMoveStatus(int); method public java.lang.String getNameForUid(int); - method public java.lang.String[] getNamesForUids(int[]); - method public java.util.List getPackageCandidateVolumes(android.content.pm.ApplicationInfo); - method public android.os.storage.VolumeInfo getPackageCurrentVolume(android.content.pm.ApplicationInfo); method public int[] getPackageGids(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public int[] getPackageGids(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.pm.PackageInfo getPackageInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.pm.PackageInfo getPackageInfo(android.content.pm.VersionedPackage, int) throws android.content.pm.PackageManager.NameNotFoundException; - method public android.content.pm.PackageInfo getPackageInfoAsUser(java.lang.String, int, int) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.pm.PackageInstaller getPackageInstaller(); - method public void getPackageSizeInfoAsUser(java.lang.String, int, android.content.pm.IPackageStatsObserver); method public int getPackageUid(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; - method public int getPackageUidAsUser(java.lang.String, int, int) throws android.content.pm.PackageManager.NameNotFoundException; - method public int getPackageUidAsUser(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; method public java.lang.String[] getPackagesForUid(int); method public java.util.List getPackagesHoldingPermissions(java.lang.String[], int); - method public java.lang.String getPermissionControllerPackageName(); - method public int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle); method public android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; method public int getPreferredActivities(java.util.List, java.util.List, java.lang.String); method public java.util.List getPreferredPackages(int); - method public java.util.List getPrimaryStorageCandidateVolumes(); - method public android.os.storage.VolumeInfo getPrimaryStorageCurrentVolume(); method public android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.res.Resources getResourcesForActivity(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.res.Resources getResourcesForApplication(android.content.pm.ApplicationInfo); method public android.content.res.Resources getResourcesForApplication(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; - method public android.content.res.Resources getResourcesForApplicationAsUser(java.lang.String, int); method public android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException; - method public java.lang.String getServicesSystemSharedLibraryPackageName(); method public java.util.List getSharedLibraries(int); - method public java.util.List getSharedLibrariesAsUser(int, int); - method public java.lang.String getSharedSystemSharedLibraryPackageName(); - method public android.content.pm.KeySet getSigningKeySet(java.lang.String); method public android.content.pm.FeatureInfo[] getSystemAvailableFeatures(); method public java.lang.String[] getSystemSharedLibraryNames(); method public java.lang.CharSequence getText(java.lang.String, int, android.content.pm.ApplicationInfo); - method public int getUidForSharedUser(java.lang.String); - method public android.graphics.drawable.Drawable getUserBadgeForDensity(android.os.UserHandle, int); - method public android.graphics.drawable.Drawable getUserBadgeForDensityNoBackground(android.os.UserHandle, int); method public android.graphics.drawable.Drawable getUserBadgedDrawableForDensity(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int); method public android.graphics.drawable.Drawable getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle); method public java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle); - method public android.content.pm.VerifierDeviceIdentity getVerifierDeviceIdentity(); method public android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo); - method public void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle); method public boolean hasSystemFeature(java.lang.String); method public boolean hasSystemFeature(java.lang.String, int); - method public int installExistingPackage(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; - method public int installExistingPackage(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; - method public int installExistingPackageAsUser(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; - method public void installPackage(android.net.Uri, android.content.pm.IPackageInstallObserver, int, java.lang.String); - method public void installPackage(android.net.Uri, android.app.PackageInstallObserver, int, java.lang.String); method public boolean isInstantApp(); method public boolean isInstantApp(java.lang.String); - method public boolean isPackageAvailable(java.lang.String); - method public boolean isPackageSuspendedForUser(java.lang.String, int); - method public boolean isPermissionReviewModeEnabled(); method public boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String); method public boolean isSafeMode(); - method public boolean isSignedBy(java.lang.String, android.content.pm.KeySet); - method public boolean isSignedByExactly(java.lang.String, android.content.pm.KeySet); - method public boolean isUpgrade(); - method public android.graphics.drawable.Drawable loadItemIcon(android.content.pm.PackageItemInfo, android.content.pm.ApplicationInfo); - method public android.graphics.drawable.Drawable loadUnbadgedItemIcon(android.content.pm.PackageItemInfo, android.content.pm.ApplicationInfo); - method public int movePackage(java.lang.String, android.os.storage.VolumeInfo); - method public int movePrimaryStorage(android.os.storage.VolumeInfo); method public java.util.List queryBroadcastReceivers(android.content.Intent, int); - method public java.util.List queryBroadcastReceiversAsUser(android.content.Intent, int, int); method public java.util.List queryContentProviders(java.lang.String, int, int); method public java.util.List queryInstrumentation(java.lang.String, int); method public java.util.List queryIntentActivities(android.content.Intent, int); - method public java.util.List queryIntentActivitiesAsUser(android.content.Intent, int, int); method public java.util.List queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int); method public java.util.List queryIntentContentProviders(android.content.Intent, int); - method public java.util.List queryIntentContentProvidersAsUser(android.content.Intent, int, int); method public java.util.List queryIntentServices(android.content.Intent, int); - method public java.util.List queryIntentServicesAsUser(android.content.Intent, int, int); method public java.util.List queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; - method public void registerDexModule(java.lang.String, android.content.pm.PackageManager.DexModuleRegisterCallback); - method public void registerMoveCallback(android.content.pm.PackageManager.MoveCallback, android.os.Handler); - method public void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener); method public void removePackageFromPreferred(java.lang.String); method public void removePermission(java.lang.String); - method public void replacePreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName); method public android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int); - method public android.content.pm.ResolveInfo resolveActivityAsUser(android.content.Intent, int, int); method public android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int); - method public android.content.pm.ProviderInfo resolveContentProviderAsUser(java.lang.String, int, int); method public android.content.pm.ResolveInfo resolveService(android.content.Intent, int); - method public void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle); method public void setApplicationCategoryHint(java.lang.String, int); method public void setApplicationEnabledSetting(java.lang.String, int, int); - method public boolean setApplicationHiddenSettingAsUser(java.lang.String, boolean, android.os.UserHandle); method public void setComponentEnabledSetting(android.content.ComponentName, int, int); - method public boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int); method public void setInstallerPackageName(java.lang.String, java.lang.String); - method public boolean setInstantAppCookie(byte[]); - method public java.lang.String[] setPackagesSuspendedAsUser(java.lang.String[], boolean, int); - method public void setUpdateAvailable(java.lang.String, boolean); - method public boolean shouldShowRequestPermissionRationale(java.lang.String); - method public void unregisterMoveCallback(android.content.pm.PackageManager.MoveCallback); method public void updateInstantAppCookie(byte[]); - method public boolean updateIntentVerificationStatusAsUser(java.lang.String, int, int); - method public void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle); - method public void verifyIntentFilter(int, int, java.util.List); method public void verifyPendingInstall(int, int); } diff --git a/test-mock/api/android-test-mock-removed.txt b/test-mock/api/android-test-mock-removed.txt index 5b358cfdbf5..bd109a88793 100644 --- a/test-mock/api/android-test-mock-removed.txt +++ b/test-mock/api/android-test-mock-removed.txt @@ -8,6 +8,7 @@ package android.test.mock { public deprecated class MockPackageManager extends android.content.pm.PackageManager { method public deprecated java.lang.String getDefaultBrowserPackageName(int); method public deprecated boolean setDefaultBrowserPackageName(java.lang.String, int); + method public boolean setInstantAppCookie(byte[]); } } -- GitLab From 001d87c81f2f2dba7b0440f50d2a1368d95de5d7 Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Wed, 14 Feb 2018 10:36:16 +0000 Subject: [PATCH 044/386] Build android.test.base/legacy against SDK android.test.legacy is now build against SDK, thus available to apps build with SDK. In doing so, android.test.mock.stubs had to be built with SDK (because it is used by android.test.legacy). However, this wasn't trivial. The problem was that some classes in test-mock implemented abstract methods of platform classes. Even though they are marked as @hide, doclava automatically emit them to the stub file because otherwise the class in the stub file does not implement some abstract methods from its parent class, which in turn makes the stub file non-compilable. This CL solves the problem by introducing an adapter class in between the class in test-mock and the class in the framework. The adapter class implements abstract methods which are @hide and having reference to types that aren't available to SDK. The abstract methods are removed from the original class. Then doclava does not emit the abstract methods. Also by @hide'ing the adapter classes, they are not compiled when building the stub library. Bug: 30188076 Bug: 73339598 Test: m -j android.test.base Test: m -j android.test.legacy Test: m -j android.test.mock.stubs are successful and do not show link-check warning Change-Id: I8e432950e693ee3c6f0240852e62da6133d31571 --- test-base/Android.bp | 18 ++++-------------- test-base/Android.mk | 5 +---- test-legacy/Android.mk | 30 ++++++++++++++++++++++++++---- test-mock/Android.mk | 4 ++-- test-runner/Android.bp | 4 ++-- 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/test-base/Android.bp b/test-base/Android.bp index b65cda9302a..c008eca1692 100644 --- a/test-base/Android.bp +++ b/test-base/Android.bp @@ -27,12 +27,8 @@ java_library { // Needs to be consistent with the repackaged version of this make target. java_version: "1.8", - no_framework_libs: true, + sdk_version: "current", hostdex: true, - libs: [ - "framework", - ], - } // Build the legacy-test library @@ -42,12 +38,9 @@ java_library { // Also contains the com.android.internal.util.Predicate[s] classes. java_library { name: "legacy-test", - static_libs: ["android.test.base"], - no_framework_libs: true, - libs: [ - "framework", - ], + sdk_version: "current", + static_libs: ["android.test.base"], } // Build the repackaged.android.test.base library @@ -57,11 +50,8 @@ java_library { java_library_static { name: "repackaged.android.test.base", + sdk_version: "current", static_libs: ["android.test.base"], - no_framework_libs: true, - libs: [ - "framework", - ], jarjar_rules: "jarjar-rules.txt", // Pin java_version until jarjar is certified to support later versions. http://b/72703434 diff --git a/test-base/Android.mk b/test-base/Android.mk index 861385467a0..ebb33deb42d 100644 --- a/test-base/Android.mk +++ b/test-base/Android.mk @@ -26,10 +26,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := \ $(call all-java-files-under, src) -LOCAL_JAVA_LIBRARIES := \ - core-oj \ - core-libart \ - framework \ +LOCAL_SDK_VERSION := current LOCAL_MODULE_CLASS := JAVA_LIBRARIES LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src diff --git a/test-legacy/Android.mk b/test-legacy/Android.mk index b8c53266b9f..da47de0a3d3 100644 --- a/test-legacy/Android.mk +++ b/test-legacy/Android.mk @@ -21,16 +21,38 @@ ifeq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK))) # Build the android.test.legacy library # ===================================== +# Built against the SDK so that it can be statically included in APKs +# without breaking link type checks. +# +# This builds directly from the source rather than simply statically +# including the android.test.base-minus-junit and +# android.test.runner-minus-junit libraries because the latter library +# cannot itself be built against the SDK. That is because it uses on +# an internal method (setTestContext) on the AndroidTestCase class. +# That class is provided by both the android.test.base-minus-junit and +# the current SDK and as the latter is first on the classpath its +# version is used. Unfortunately, it does not provide the internal +# method and so compilation fails. +# +# Building from source avoids that because the compiler will use the +# source version of AndroidTestCase instead of the one from the current +# SDK. +# +# The use of the internal method does not prevent this from being +# statically included because the class that provides the method is +# also included in this library. include $(CLEAR_VARS) LOCAL_MODULE := android.test.legacy +LOCAL_SRC_FILES := \ + $(call all-java-files-under, ../test-base/src/android) \ + $(call all-java-files-under, ../test-base/src/com) \ + $(call all-java-files-under, ../test-runner/src/android) \ + LOCAL_SDK_VERSION := current -LOCAL_JAVA_LIBRARIES := junit -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.test.base-minus-junit \ - android.test.runner-minus-junit \ +LOCAL_JAVA_LIBRARIES := junit android.test.mock.stubs include $(BUILD_STATIC_JAVA_LIBRARY) diff --git a/test-mock/Android.mk b/test-mock/Android.mk index 5c586c7101a..de1b6c7f2ba 100644 --- a/test-mock/Android.mk +++ b/test-mock/Android.mk @@ -21,7 +21,7 @@ LOCAL_PATH:= $(call my-dir) # otherwise hidden methods could be visible. android_test_mock_source_files := \ $(call all-java-files-under, src/android/test/mock) \ - $(call all-java-files-under, ../core/java) \ + $(call all-java-files-under, ../core/java/android) # For unbundled build we'll use the prebuilt jar from prebuilts/sdk. ifeq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK))) @@ -30,7 +30,6 @@ ifeq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK))) # ========================================================== include $(CLEAR_VARS) LOCAL_SRC_FILES := $(android_test_mock_source_files) - LOCAL_JAVA_LIBRARIES := core-oj core-libart framework conscrypt okhttp bouncycastle LOCAL_MODULE_CLASS := JAVA_LIBRARIES LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src/android/test/mock @@ -42,6 +41,7 @@ ANDROID_TEST_MOCK_API_FILE := $(LOCAL_PATH)/api/android-test-mock-current.txt ANDROID_TEST_MOCK_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-mock-removed.txt LOCAL_DROIDDOC_OPTIONS:= \ + -hide 111 -hide 113 -hide 125 -hide 126 -hide 127 -hide 128 \ -stubpackages android.test.mock \ -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs_intermediates/src \ -nodocs \ diff --git a/test-runner/Android.bp b/test-runner/Android.bp index 66b95271ee0..938bb4efe7b 100644 --- a/test-runner/Android.bp +++ b/test-runner/Android.bp @@ -33,8 +33,8 @@ java_library { // Build the android.test.runner-minus-junit library // ================================================= -// This is only intended for inclusion in the android.test.legacy and -// legacy-android-test static libraries and must not be used elsewhere. +// This is only intended for inclusion in the legacy-android-test static +// library and must not be used elsewhere. java_library { name: "android.test.runner-minus-junit", -- GitLab From 8b8bdddae977793b384aeb1e93281e6ced581c49 Mon Sep 17 00:00:00 2001 From: John Muir Date: Fri, 16 Feb 2018 14:29:14 -0800 Subject: [PATCH 045/386] AudioService: Allow specification of the USB safe volume. Previously the USB safe volume was hard coded to -37.0 (see explanation in AudioService.java). This volume is used to determine the volume index for a safe level. The USB index can be much lower than the similar volume index defined by config_safe_media_volume_index, even though both may meet the EN 60950 specification (according to the test engineer). Add a configuration property that allows the OEM to change the USB safe volume for their device. The new property's name is config_safe_media_volume_usb_mB. The safe volume is stored in millibel to avoid using floating point numbers in the configuration xml. Bug: 73351887 Test: Default safe volume remains at -37.0dB. Overlay can be used to modify the safe volume. Change-Id: I2a2ecfbc4277fddaf724f38aef7c531c71ee5c3b (cherry picked from commit b4b2da50c942151830643aff14d394597812cb29) --- core/res/res/values/config.xml | 4 ++++ core/res/res/values/symbols.xml | 1 + .../com/android/server/audio/AudioService.java | 15 +++++++++++---- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 09112985873..01da14f277b 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2190,6 +2190,10 @@ players. --> 10 + + -3700 + 1500 diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 9995642ba45..91ef3b4c6ec 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -453,6 +453,7 @@ + diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 76e0d8984cb..0ce4dc5260b 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -3706,6 +3706,9 @@ public class AudioService extends IAudioService.Stub int min = MIN_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]; int max = MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]; + mSafeUsbMediaVolumeDbfs = mContext.getResources().getInteger( + com.android.internal.R.integer.config_safe_media_volume_usb_mB) / 100.0f; + while (Math.abs(max-min) > 1) { int index = (max + min) / 2; float gainDB = AudioSystem.getStreamVolumeDB( @@ -3713,10 +3716,10 @@ public class AudioService extends IAudioService.Stub if (Float.isNaN(gainDB)) { //keep last min in case of read error break; - } else if (gainDB == SAFE_VOLUME_GAIN_DBFS) { + } else if (gainDB == mSafeUsbMediaVolumeDbfs) { min = index; break; - } else if (gainDB < SAFE_VOLUME_GAIN_DBFS) { + } else if (gainDB < mSafeUsbMediaVolumeDbfs) { min = index; } else { max = index; @@ -6310,14 +6313,17 @@ public class AudioService extends IAudioService.Stub private int mMcc = 0; // mSafeMediaVolumeIndex is the cached value of config_safe_media_volume_index property private int mSafeMediaVolumeIndex; + // mSafeUsbMediaVolumeDbfs is the cached value of the config_safe_media_volume_usb_mB + // property, divided by 100.0. + private float mSafeUsbMediaVolumeDbfs; // mSafeUsbMediaVolumeIndex is used for USB Headsets and is the music volume UI index - // corresponding to a gain of -30 dBFS in audio flinger mixer. + // corresponding to a gain of mSafeUsbMediaVolumeDbfs (defaulting to -37dB) in audio + // flinger mixer. // We remove -22 dBs from the theoretical -15dB to account for the EQ + bass boost // amplification when both effects are on with all band gains at maximum. // This level corresponds to a loudness of 85 dB SPL for the warning to be displayed when // the headset is compliant to EN 60950 with a max loudness of 100dB SPL. private int mSafeUsbMediaVolumeIndex; - private static final float SAFE_VOLUME_GAIN_DBFS = -37.0f; // mSafeMediaVolumeDevices lists the devices for which safe media volume is enforced, private final int mSafeMediaVolumeDevices = AudioSystem.DEVICE_OUT_WIRED_HEADSET | AudioSystem.DEVICE_OUT_WIRED_HEADPHONE | @@ -6647,6 +6653,7 @@ public class AudioService extends IAudioService.Stub pw.println(safeMediaVolumeStateToString(mSafeMediaVolumeState)); pw.print(" mSafeMediaVolumeIndex="); pw.println(mSafeMediaVolumeIndex); pw.print(" mSafeUsbMediaVolumeIndex="); pw.println(mSafeUsbMediaVolumeIndex); + pw.print(" mSafeUsbMediaVolumeDbfs="); pw.println(mSafeUsbMediaVolumeDbfs); pw.print(" sIndependentA11yVolume="); pw.println(sIndependentA11yVolume); pw.print(" mPendingVolumeCommand="); pw.println(mPendingVolumeCommand); pw.print(" mMusicActiveMs="); pw.println(mMusicActiveMs); -- GitLab From b72b62d2f7e7104f9901bc8f44d5a3c0bb9dbf7a Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Fri, 16 Feb 2018 16:08:35 +0900 Subject: [PATCH 046/386] [LT2] Fix release request while lingering. Test: runtest framework-net Change-Id: Ic28c5653d16351903b792e76ba8b199b7ed1f8d4 --- .../android/server/connectivity/NetworkAgentInfo.java | 11 +++++++---- .../com/android/server/ConnectivityServiceTest.java | 6 ++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index a24f97e5357..21f14cddd39 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -384,12 +384,15 @@ public class NetworkAgentInfo implements Comparable { /** * Returns whether the network is a background network. A network is a background network if it - * is satisfying no foreground requests and at least one background request. (If it did not have - * a background request, it would be a speculative network that is only being kept up because - * it might satisfy a request if it validated). + * does not have the NET_CAPABILITY_FOREGROUND capability, which implies it is satisfying no + * foreground request, is not lingering (i.e. kept for a while after being outscored), and is + * not a speculative network (i.e. kept pending validation when validation would have it + * outscore another foreground network). That implies it is being kept up by some background + * request (otherwise it would be torn down), maybe the mobile always-on request. */ public boolean isBackgroundNetwork() { - return !isVPN() && numForegroundNetworkRequests() == 0 && mNumBackgroundNetworkRequests > 0; + return !isVPN() && numForegroundNetworkRequests() == 0 && mNumBackgroundNetworkRequests > 0 + && !isLingering(); } /** diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 1092b09c859..39daeabac37 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -50,6 +50,7 @@ import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE; import static com.android.internal.util.TestUtils.waitForIdleHandler; +import static com.android.internal.util.TestUtils.waitForIdleLooper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -85,6 +86,7 @@ import android.net.ConnectivityManager.NetworkCallback; import android.net.ConnectivityManager.PacketKeepalive; import android.net.ConnectivityManager.PacketKeepaliveCallback; import android.net.ConnectivityManager.TooManyRequestsException; +import android.net.ConnectivityThread; import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; import android.net.IpPrefix; @@ -279,6 +281,7 @@ public class ConnectivityServiceTest { waitForIdle(mWiFiNetworkAgent, timeoutMs); waitForIdle(mEthernetNetworkAgent, timeoutMs); waitForIdleHandler(mService.mHandlerThread, timeoutMs); + waitForIdleLooper(ConnectivityThread.getInstanceLooper(), timeoutMs); } public void waitForIdle(MockNetworkAgent agent, long timeoutMs) { @@ -1875,8 +1878,7 @@ public class ConnectivityServiceTest { callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); // Let linger run its course. - // TODO : the callback should be delayed by the linger delay. Fix this. - // callback.assertNoCallback(); + callback.assertNoCallback(); final int lingerTimeoutMs = TEST_LINGER_DELAY_MS + TEST_LINGER_DELAY_MS / 4; callback.expectCapabilitiesWithout(NET_CAPABILITY_FOREGROUND, mCellNetworkAgent, lingerTimeoutMs); -- GitLab From 977e11f335ffd02d60bbefb4fd1257b40783201a Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Fri, 16 Feb 2018 11:29:54 -0800 Subject: [PATCH 047/386] Log deferred jobs metrics to batterystats Log the deferred jobs event count, number of deferred jobs, time since last job execution and break those down into different time-since buckets in case the average becomes too noisy. Bug: 70297451 Test: dumpsys batterystats --checkin Change-Id: Iafad6137989246f203a623ce1511140d4eac35b0 --- core/java/android/os/BatteryStats.java | 48 +++++ .../java/android/os/BatteryStatsInternal.java | 11 +- .../android/internal/os/BatteryStatsImpl.java | 165 +++++++++++++++++- .../server/am/BatteryStatsService.java | 13 ++ .../server/job/JobSchedulerService.java | 16 +- 5 files changed, 246 insertions(+), 7 deletions(-) diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 7cd58e8b7c3..6ecf6d5649a 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -287,6 +287,16 @@ public abstract class BatteryStats implements Parcelable { private static final String SYNC_DATA = "sy"; private static final String JOB_DATA = "jb"; private static final String JOB_COMPLETION_DATA = "jbc"; + + /** + * jbd line is: + * BATTERY_STATS_CHECKIN_VERSION, uid, which, "jbd", + * jobsDeferredEventCount, jobsDeferredCount, averageLatencyMillis, + * count at latency < 1 hr, count at latency < 2 hrs, count at latency < 6 hrs, beyond 6 hrs + *

+ * @see #JOB_FRESHNESS_BUCKETS + */ + private static final String JOBS_DEFERRED_DATA = "jbd"; private static final String KERNEL_WAKELOCK_DATA = "kwl"; private static final String WAKEUP_REASON_DATA = "wr"; private static final String NETWORK_DATA = "nt"; @@ -348,6 +358,19 @@ public abstract class BatteryStats implements Parcelable { @VisibleForTesting public static final String UID_TIMES_TYPE_ALL = "A"; + /** + * These are the thresholds for bucketing last time since a job was run for an app + * that just moved to ACTIVE due to a launch. So if the last time a job ran was less + * than 30 minutes ago, then it's reasonably fresh, 2 hours ago, not so fresh and so + * on. + */ + public static final long[] JOB_FRESHNESS_BUCKETS = { + 1 * 60 * 60 * 1000L, + 2 * 60 * 60 * 1000L, + 6 * 60 * 60 * 1000L, + Long.MAX_VALUE + }; + /** * State for keeping track of counting information. */ @@ -846,6 +869,20 @@ public abstract class BatteryStats implements Parcelable { */ public abstract long getWifiRadioApWakeupCount(int which); + /** + * Appends the deferred jobs data to the StringBuilder passed in, in checkin format + * @param sb StringBuilder that can be overwritten with the deferred jobs data + * @param which one of STATS_* + */ + public abstract void getDeferredJobsCheckinLineLocked(StringBuilder sb, int which); + + /** + * Appends the deferred jobs data to the StringBuilder passed in + * @param sb StringBuilder that can be overwritten with the deferred jobs data + * @param which one of STATS_* + */ + public abstract void getDeferredJobsLineLocked(StringBuilder sb, int which); + public static abstract class Sensor { /* * FIXME: it's not correct to use this magic value because it @@ -4070,6 +4107,12 @@ public abstract class BatteryStats implements Parcelable { } } + // Dump deferred jobs stats + u.getDeferredJobsCheckinLineLocked(sb, which); + if (sb.length() > 0) { + dumpLine(pw, uid, category, JOBS_DEFERRED_DATA, sb.toString()); + } + dumpTimer(pw, uid, category, FLASHLIGHT_DATA, u.getFlashlightTurnedOnTimer(), rawRealtime, which); dumpTimer(pw, uid, category, CAMERA_DATA, u.getCameraTurnedOnTimer(), @@ -5698,6 +5741,11 @@ public abstract class BatteryStats implements Parcelable { } } + u.getDeferredJobsLineLocked(sb, which); + if (sb.length() > 0) { + pw.print(" Jobs deferred on launch "); pw.println(sb.toString()); + } + uidActivity |= printTimer(pw, sb, u.getFlashlightTurnedOnTimer(), rawRealtime, which, prefix, "Flashlight"); uidActivity |= printTimer(pw, sb, u.getCameraTurnedOnTimer(), rawRealtime, which, diff --git a/core/java/android/os/BatteryStatsInternal.java b/core/java/android/os/BatteryStatsInternal.java index b0436eb5f8a..679f18e1e86 100644 --- a/core/java/android/os/BatteryStatsInternal.java +++ b/core/java/android/os/BatteryStatsInternal.java @@ -18,7 +18,7 @@ package android.os; /** * Battery stats local system service interface. This is used to pass internal data out of - * BatteryStatsImpl. + * BatteryStatsImpl, as well as make unchecked calls into BatteryStatsImpl. * * @hide Only for use within Android OS. */ @@ -32,4 +32,13 @@ public abstract class BatteryStatsInternal { * Returns the mobile data interfaces. */ public abstract String[] getMobileIfaces(); + + /** + * Inform battery stats how many deferred jobs existed when the app got launched and how + * long ago was the last job execution for the app. + * @param uid the uid of the app. + * @param numDeferred number of deferred jobs. + * @param sinceLast how long in millis has it been since a job was run + */ + public abstract void noteJobsDeferred(int uid, int numDeferred, long sinceLast); } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 4e515918a0c..d1932cfa6c0 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -134,7 +134,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 174 + (USE_OLD_HISTORY ? 1000 : 0); + private static final int VERSION = 175 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS; @@ -1222,7 +1222,7 @@ public class BatteryStatsImpl extends BatteryStats { * @param out the Parcel to be written to. * @param counter a Counter, or null. */ - public static void writeCounterToParcel(Parcel out, Counter counter) { + public static void writeCounterToParcel(Parcel out, @Nullable Counter counter) { if (counter == null) { out.writeInt(0); // indicates null return; @@ -1232,6 +1232,19 @@ public class BatteryStatsImpl extends BatteryStats { counter.writeToParcel(out); } + /** + * Reads a Counter that was written using {@link #writeCounterToParcel(Parcel, Counter)}. + * @param timeBase the timebase to assign to the Counter + * @param in the parcel to read from + * @return the Counter or null. + */ + public static @Nullable Counter readCounterFromParcel(TimeBase timeBase, Parcel in) { + if (in.readInt() == 0) { + return null; + } + return new Counter(timeBase, in); + } + @Override public int getCountLocked(int which) { int val = mCount.get(); @@ -4071,6 +4084,11 @@ public class BatteryStatsImpl extends BatteryStats { addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_JOB_FINISH, name, uid); } + public void noteJobsDeferredLocked(int uid, int numDeferred, long sinceLast) { + uid = mapUid(uid); + getUidStatsLocked(uid).noteJobsDeferredLocked(numDeferred, sinceLast); + } + public void noteAlarmStartLocked(String name, WorkSource workSource, int uid) { noteAlarmStartOrFinishLocked(HistoryItem.EVENT_ALARM_START, name, workSource, uid); } @@ -6748,6 +6766,29 @@ public class BatteryStatsImpl extends BatteryStats { */ final ArrayMap mJobCompletions = new ArrayMap<>(); + /** + * Count of app launch events that had associated deferred job counts or info about + * last time a job was run. + */ + Counter mJobsDeferredEventCount; + + /** + * Count of deferred jobs that were pending when the app was launched or brought to + * the foreground through a user interaction. + */ + Counter mJobsDeferredCount; + + /** + * Sum of time since the last time a job was run for this app before it was launched. + */ + LongSamplingCounter mJobsFreshnessTimeMs; + + /** + * Array of counts of instances where the time since the last job was run for the app + * fell within one of the thresholds in {@link #JOB_FRESHNESS_BUCKETS}. + */ + final Counter[] mJobsFreshnessBuckets; + /** * The statistics we have collected for this uid's sensor activations. */ @@ -6822,6 +6863,10 @@ public class BatteryStatsImpl extends BatteryStats { mWifiMulticastTimer = new StopwatchTimer(mBsi.mClocks, this, WIFI_MULTICAST_ENABLED, mBsi.mWifiMulticastTimers, mBsi.mOnBatteryTimeBase); mProcessStateTimer = new StopwatchTimer[NUM_PROCESS_STATE]; + mJobsDeferredEventCount = new Counter(mBsi.mOnBatteryTimeBase); + mJobsDeferredCount = new Counter(mBsi.mOnBatteryTimeBase); + mJobsFreshnessTimeMs = new LongSamplingCounter(mBsi.mOnBatteryTimeBase); + mJobsFreshnessBuckets = new Counter[JOB_FRESHNESS_BUCKETS.length]; } @VisibleForTesting @@ -7799,6 +7844,55 @@ public class BatteryStatsImpl extends BatteryStats { return 0; } + @Override + public void getDeferredJobsCheckinLineLocked(StringBuilder sb, int which) { + sb.setLength(0); + final int deferredEventCount = mJobsDeferredEventCount.getCountLocked(which); + if (deferredEventCount == 0) { + return; + } + final int deferredCount = mJobsDeferredCount.getCountLocked(which); + final long averageLatency = deferredEventCount != 0 + ? mJobsFreshnessTimeMs.getCountLocked(which) / deferredEventCount + : 0L; + sb.append(deferredEventCount); sb.append(','); + sb.append(deferredCount); sb.append(','); + sb.append(averageLatency); + for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) { + if (mJobsFreshnessBuckets[i] == null) { + sb.append(",0"); + } else { + sb.append(","); + sb.append(mJobsFreshnessBuckets[i].getCountLocked(which)); + } + } + } + + @Override + public void getDeferredJobsLineLocked(StringBuilder sb, int which) { + sb.setLength(0); + final int deferredEventCount = mJobsDeferredEventCount.getCountLocked(which); + if (deferredEventCount == 0) { + return; + } + final int deferredCount = mJobsDeferredCount.getCountLocked(which); + final long averageLatency = deferredEventCount != 0 + ? mJobsFreshnessTimeMs.getCountLocked(which) / deferredEventCount + : 0L; + sb.append("times="); sb.append(deferredEventCount); sb.append(", "); + sb.append("count="); sb.append(deferredCount); sb.append(", "); + sb.append("avgLatency="); sb.append(averageLatency); sb.append(", "); + for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) { + sb.append("<"); sb.append(JOB_FRESHNESS_BUCKETS[i]); sb.append("ms="); + if (mJobsFreshnessBuckets[i] == null) { + sb.append("0"); + } else { + sb.append(mJobsFreshnessBuckets[i].getCountLocked(which)); + } + sb.append(" "); + } + } + void initNetworkActivityLocked() { mNetworkByteActivityCounters = new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES]; mNetworkPacketActivityCounters = new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES]; @@ -7982,6 +8076,16 @@ public class BatteryStatsImpl extends BatteryStats { } mJobStats.cleanup(); mJobCompletions.clear(); + + mJobsDeferredEventCount.reset(false); + mJobsDeferredCount.reset(false); + mJobsFreshnessTimeMs.reset(false); + for (int ij = 0; ij < JOB_FRESHNESS_BUCKETS.length; ij++) { + if (mJobsFreshnessBuckets[ij] != null) { + mJobsFreshnessBuckets[ij].reset(false); + } + } + for (int ise=mSensorStats.size()-1; ise>=0; ise--) { Sensor s = mSensorStats.valueAt(ise); if (s.reset()) { @@ -7990,6 +8094,7 @@ public class BatteryStatsImpl extends BatteryStats { active = true; } } + for (int ip=mProcessStats.size()-1; ip>=0; ip--) { Proc proc = mProcessStats.valueAt(ip); proc.detach(); @@ -8207,6 +8312,13 @@ public class BatteryStatsImpl extends BatteryStats { writeJobCompletionsToParcelLocked(out); + mJobsDeferredEventCount.writeToParcel(out); + mJobsDeferredCount.writeToParcel(out); + mJobsFreshnessTimeMs.writeToParcel(out); + for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) { + Counter.writeCounterToParcel(out, mJobsFreshnessBuckets[i]); + } + int NSE = mSensorStats.size(); out.writeInt(NSE); for (int ise=0; ise 1000) { throw new ParcelFormatException("File corrupt: too many sensors " + NP); @@ -14419,6 +14569,17 @@ public class BatteryStatsImpl extends BatteryStats { u.writeJobCompletionsToParcelLocked(out); + u.mJobsDeferredEventCount.writeSummaryFromParcelLocked(out); + u.mJobsDeferredCount.writeSummaryFromParcelLocked(out); + u.mJobsFreshnessTimeMs.writeSummaryFromParcelLocked(out); + for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) { + if (u.mJobsFreshnessBuckets[i] != null) { + u.mJobsFreshnessBuckets[i].writeSummaryFromParcelLocked(out); + } else { + out.writeInt(0); + } + } + int NSE = u.mSensorStats.size(); out.writeInt(NSE); for (int ise=0; ise future) { @@ -456,6 +462,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } + void noteJobsDeferred(int uid, int numDeferred, long sinceLast) { + // No need to enforce calling permission, as it is called from an internal interface + synchronized (mStats) { + mStats.noteJobsDeferredLocked(uid, numDeferred, sinceLast); + } + } + public void noteWakupAlarm(String name, int uid, WorkSource workSource, String tag) { enforceCallingPermission(); synchronized (mStats) { diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index c33d7f4b445..05c7f198461 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -49,6 +49,7 @@ import android.content.pm.ServiceInfo; import android.database.ContentObserver; import android.net.Uri; import android.os.BatteryStats; +import android.os.BatteryStatsInternal; import android.os.Binder; import android.os.Handler; import android.os.Looper; @@ -62,6 +63,7 @@ import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManagerInternal; import android.provider.Settings; +import android.text.format.DateUtils; import android.util.KeyValueListParser; import android.util.Slog; import android.util.SparseArray; @@ -2282,14 +2284,20 @@ public final class JobSchedulerService extends com.android.server.SystemService return; } - final long sinceLast = sElapsedRealtimeClock.millis() - - mUsageStats.getTimeSinceLastJobRun(packageName, userId); + long sinceLast = mUsageStats.getTimeSinceLastJobRun(packageName, userId); + if (sinceLast > 2 * DateUtils.DAY_IN_MILLIS) { + // Too long ago, not worth logging + sinceLast = 0L; + } final DeferredJobCounter counter = new DeferredJobCounter(); synchronized (mLock) { mJobs.forEachJobForSourceUid(uid, counter); } - - mUsageStats.reportAppJobState(packageName, userId, counter.numDeferred(), sinceLast); + if (counter.numDeferred() > 0 || sinceLast > 0) { + BatteryStatsInternal mBatteryStatsInternal = LocalServices.getService + (BatteryStatsInternal.class); + mBatteryStatsInternal.noteJobsDeferred(uid, counter.numDeferred(), sinceLast); + } } } -- GitLab From f6328c1f76d797fc4c359357e355100f5c916ee3 Mon Sep 17 00:00:00 2001 From: Sungsoo Lim Date: Mon, 19 Feb 2018 15:57:59 +0900 Subject: [PATCH 048/386] Add sungsoo@ to OWNERS Test: no Change-Id: I0a3c3876993a4ca964c5b1a0262ca44bebab25fe --- media/OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/media/OWNERS b/media/OWNERS index 8f405e98545..287ec398ec6 100644 --- a/media/OWNERS +++ b/media/OWNERS @@ -2,3 +2,4 @@ elaurent@google.com etalvala@google.com lajos@google.com marcone@google.com +sungsoo@google.com -- GitLab From a2be62f25b8b9504c773156f062a8ae0fc02e678 Mon Sep 17 00:00:00 2001 From: Hyundo Moon Date: Mon, 19 Feb 2018 14:58:42 +0900 Subject: [PATCH 049/386] MediaController2: Implement setRating() Bug: 73146284 Test: Passed MediaController2Test Change-Id: Iaff4f5b58d0bbd7105a39763cd6fee7c6c621df8 --- media/java/android/media/MediaController2.java | 12 ++++++------ media/java/android/media/MediaSession2.java | 8 +++++--- .../media/update/MediaController2Provider.java | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java index bd6c7e6bed8..bfd1fd493b2 100644 --- a/media/java/android/media/MediaController2.java +++ b/media/java/android/media/MediaController2.java @@ -570,14 +570,14 @@ public class MediaController2 implements AutoCloseable { } /** - * Rate the current content. This will cause the rating to be set for - * the current user. The Rating type must match the type returned by - * {@link #getRatingType()}. + * Rate the media. This will cause the rating to be set for the current user. + * The Rating type must match the type returned by {@link #getRatingType()}. * - * @param rating The rating to set for the current content + * @param mediaId The id of the media + * @param rating The rating to set */ - public void setRating(Rating2 rating) { - mProvider.setRating_impl(rating); + public void setRating(String mediaId, Rating2 rating) { + mProvider.setRating_impl(mediaId, rating); } /** diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java index 943b827289f..0258dca148f 100644 --- a/media/java/android/media/MediaSession2.java +++ b/media/java/android/media/MediaSession2.java @@ -452,13 +452,15 @@ public class MediaSession2 implements AutoCloseable { } /** - * Called when a controller set rating on the currently playing contents by - * {@link MediaController2#setRating(Rating2)}. + * Called when a controller set rating of a media item through + * {@link MediaController2#setRating(String, Rating2)}. * * @param controller controller information + * @param mediaId media id from the controller * @param rating new rating from the controller */ - public void onSetRating(@NonNull ControllerInfo controller, @NonNull Rating2 rating) { } + public void onSetRating(@NonNull ControllerInfo controller, @NonNull String mediaId, + @NonNull Rating2 rating) { } /** * Called when a controller sent a custom command through diff --git a/media/java/android/media/update/MediaController2Provider.java b/media/java/android/media/update/MediaController2Provider.java index c492d3072c7..738bd0ce6cd 100644 --- a/media/java/android/media/update/MediaController2Provider.java +++ b/media/java/android/media/update/MediaController2Provider.java @@ -56,7 +56,7 @@ public interface MediaController2Provider extends TransportControlProvider { void playFromUri_impl(Uri uri, Bundle extras); void playFromMediaId_impl(String mediaId, Bundle extras); - void setRating_impl(Rating2 rating); + void setRating_impl(String mediaId, Rating2 rating); void sendCustomCommand_impl(Command command, Bundle args, ResultReceiver cb); List getPlaylist_impl(); -- GitLab From 06919216e48d3e8521c50bd9a6e2c7e363e70495 Mon Sep 17 00:00:00 2001 From: Tetsutoki Shiozawa Date: Fri, 2 Feb 2018 14:18:43 +0900 Subject: [PATCH 050/386] Explicitly restart the killed wallpaper service Symptom: Live wallpaper setting was reset when a wallpaper service was killed by Lmk. The wallpaper fell back to the default image wallpaper. It's a black bitmap. Root cause: When restarting wallpaper service takes more than 10 seconds, it's treated as a bad wallpaper. The wallpaper setting is reset to remove the bad wallpaper. This is not a suitable solution under the low memory situation. Multiple processes are killed by Lmk at one time. Killed services are automatically restarted by AMS with a few seconds interval. The restart interval is increased by a factor of the number of killed services. Sometimes, it takes more than 1 minute. Solution: When a wallpaper service is killed, WallpaperManagerService requests restarting the service immediately. It can ignore the restart interval. Bug: 73071020 Change-Id: Id5bb1cf121029a513f8773597f296b47667d1e21 --- .../wallpaper/WallpaperManagerService.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index b888ec21e70..f6e863b0aaf 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -847,6 +847,17 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } } + public void scheduleTimeoutLocked() { + // If we didn't reset it right away, do so after we couldn't connect to + // it for an extended amount of time to avoid having a black wallpaper. + final Handler fgHandler = FgThread.getHandler(); + fgHandler.removeCallbacks(mResetRunnable); + fgHandler.postDelayed(mResetRunnable, WALLPAPER_RECONNECT_TIMEOUT_MS); + if (DEBUG_LIVE) { + Slog.i(TAG, "Started wallpaper reconnect timeout for " + mWallpaper.wallpaperComponent); + } + } + private void processDisconnect(final ServiceConnection connection) { synchronized (mLock) { // The wallpaper disappeared. If this isn't a system-default one, track @@ -871,13 +882,13 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } else { mWallpaper.lastDiedTime = SystemClock.uptimeMillis(); - // If we didn't reset it right away, do so after we couldn't connect to - // it for an extended amount of time to avoid having a black wallpaper. - final Handler fgHandler = FgThread.getHandler(); - fgHandler.removeCallbacks(mResetRunnable); - fgHandler.postDelayed(mResetRunnable, WALLPAPER_RECONNECT_TIMEOUT_MS); - if (DEBUG_LIVE) { - Slog.i(TAG, "Started wallpaper reconnect timeout for " + wpService); + clearWallpaperComponentLocked(mWallpaper); + if (bindWallpaperComponentLocked( + wpService, false, false, mWallpaper, null)) { + mWallpaper.connection.scheduleTimeoutLocked(); + } else { + Slog.w(TAG, "Reverting to built-in wallpaper!"); + clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null); } } final String flattened = wpService.flattenToString(); -- GitLab From f492faf405c5e6deacce10d0380b72a10bff18fb Mon Sep 17 00:00:00 2001 From: haoyu li Date: Wed, 22 Nov 2017 12:49:49 +0900 Subject: [PATCH 051/386] Add new reason code for call failed by unobtainable number To show the "Invalid number" on the end call screen when user makes a IMS call with unobtainable number, this reason code is used. Test: manual - Checked that "Invalid number" is shown when make the IMS MO call to unobtainable number. Bug: 69940434 Change-Id: If3c54e6f55850141efad56ad7712db3c82a14f43 --- telephony/java/android/telephony/ims/ImsReasonInfo.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/telephony/java/android/telephony/ims/ImsReasonInfo.java b/telephony/java/android/telephony/ims/ImsReasonInfo.java index 7b774910259..7d654305015 100644 --- a/telephony/java/android/telephony/ims/ImsReasonInfo.java +++ b/telephony/java/android/telephony/ims/ImsReasonInfo.java @@ -393,6 +393,12 @@ public final class ImsReasonInfo implements Parcelable { */ public static final int CODE_SIP_ALTERNATE_EMERGENCY_CALL = 1514; + /** + * Call failed because of unobtainable number + * @hide + */ + public static final int CODE_UNOBTAINABLE_NUMBER = 1515; + /* OEM specific error codes. To be used by OEMs when they don't want to reveal error code which would be replaced by ERROR_UNSPECIFIED */ public static final int CODE_OEM_CAUSE_1 = 0xf001; -- GitLab From 7e9e4d99be3a3e4d15d81fb1ca93f59af5625974 Mon Sep 17 00:00:00 2001 From: Jaewan Kim Date: Tue, 13 Feb 2018 22:20:41 +0900 Subject: [PATCH 052/386] MediaSessionService: Document necessity of onSessionDestroyed() Test: Build Change-Id: I7b370b31e502a2f863d9b029426d8dc4690e27ec --- .../server/media/MediaSessionService.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index b8771849ac7..6752c641995 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -1427,6 +1427,17 @@ public class MediaSessionService extends SystemService implements Monitor { } } + /** + * Called when a {@link android.media.MediaSession2} instance is created. + *

+ * This does two things. + * 1. Keep the newly created session in the service + * 2. Do sanity check to ensure unique id per package, and return result + * + * @param sessionToken SessionToken2 object in bundled form + * @return {@code true} if the session's id isn't used by the package now. {@code false} + * otherwise. + */ @Override public boolean onSessionCreated(Bundle sessionToken) { final int uid = Binder.getCallingUid(); @@ -1453,6 +1464,19 @@ public class MediaSessionService extends SystemService implements Monitor { } } + /** + * Called when a {@link android.media.MediaSession2} instance is closed. (i.e. destroyed) + *

+ * Ideally service should know that a session is destroyed through the + * {@link android.media.MediaController2.ControllerCallback#onDisconnected()}, which is + * asynchronous call. However, we also need synchronous way together to address timing + * issue. If the package recreates the session almost immediately, which happens commonly + * for tests, service will reject the creation through {@link #onSessionCreated(Bundle)} + * if the service hasn't notified previous destroy yet. This synchronous API will address + * the issue. + * + * @param sessionToken SessionToken2 object in bundled form + */ @Override public void onSessionDestroyed(Bundle sessionToken) { final int uid = Binder.getCallingUid(); -- GitLab From eaff57ebfe3005fd8a3dc5a1d9085f40f0416b30 Mon Sep 17 00:00:00 2001 From: Jan Althaus Date: Mon, 12 Feb 2018 12:47:27 +0100 Subject: [PATCH 053/386] Fixing URL encoding of geo intent links Bug: 73106770 Test: Added test and manually verified Change-Id: Ia86450e1f6721cd50567628e4dcdcc34bca0bdf7 --- .../textclassifier/TextClassifierImpl.java | 13 +++++++++++-- .../TextClassificationManagerTest.java | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java index 795caffd04d..c9246585426 100644 --- a/core/java/android/view/textclassifier/TextClassifierImpl.java +++ b/core/java/android/view/textclassifier/TextClassifierImpl.java @@ -47,7 +47,9 @@ import com.android.internal.util.Preconditions; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.lang.ref.WeakReference; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -633,8 +635,15 @@ public final class TextClassifierImpl implements TextClassifier { @NonNull private static List createForAddress(String text) { - return Arrays.asList(new Intent(Intent.ACTION_VIEW) - .setData(Uri.parse(String.format("geo:0,0?q=%s", text)))); + final List intents = new ArrayList<>(); + try { + final String encText = URLEncoder.encode(text, "UTF-8"); + intents.add(new Intent(Intent.ACTION_VIEW) + .setData(Uri.parse(String.format("geo:0,0?q=%s", encText)))); + } catch (UnsupportedEncodingException e) { + Log.e(LOG_TAG, "Could not encode address", e); + } + return intents; } @NonNull diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java index 430b30fcbff..6440f16f015 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java @@ -147,6 +147,20 @@ public class TextClassificationManagerTest { "http://" + classifiedText)); } + @Test + public void testTextClassifyText_address() { + if (isTextClassifierDisabled()) return; + + String text = "Brandschenkestrasse 110, Zürich, Switzerland"; + TextClassification classification = mClassifier.classifyText( + text, 0, text.length(), mClassificationOptions); + assertThat(classification, + isTextClassification( + text, + TextClassifier.TYPE_ADDRESS, + "geo:0,0?q=Brandschenkestrasse+110%2C+Z%C3%BCrich%2C+Switzerland")); + } + @Test public void testTextClassifyText_url_inCaps() { if (isTextClassifierDisabled()) return; @@ -315,6 +329,10 @@ public class TextClassificationManagerTest { typeRequirementSatisfied = "http".equals(scheme) || "https".equals(scheme); break; + case TextClassifier.TYPE_ADDRESS: + scheme = result.getIntent().getData().getScheme(); + typeRequirementSatisfied = "geo".equals(scheme); + break; default: typeRequirementSatisfied = true; } -- GitLab From 32618aae9ea26e65830e34a609dd220e0f756d00 Mon Sep 17 00:00:00 2001 From: arangelov Date: Fri, 16 Feb 2018 19:13:01 +0000 Subject: [PATCH 054/386] Fix TransferOwnershipMetadataManager tests. Test: bit FrameworksServicesTests:com.android.server.devicepolicy.TransferOwnershipMetadataManagerTest Bug: 73448505 Change-Id: I06fc52b13ed27a77213cfb3b15dff3f7161f5be0 --- .../TransferOwnershipMetadataManager.java | 29 ++++++++++++------- .../TransferOwnershipMetadataManagerTest.java | 25 +++++++++++----- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java index 1addeb6bee1..dd3bfc3c4a9 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java @@ -54,10 +54,14 @@ import java.nio.charset.StandardCharsets; class TransferOwnershipMetadataManager { final static String ADMIN_TYPE_DEVICE_OWNER = "device-owner"; final static String ADMIN_TYPE_PROFILE_OWNER = "profile-owner"; - private final static String TAG_USER_ID = "user-id"; - private final static String TAG_SOURCE_COMPONENT = "source-component"; - private final static String TAG_TARGET_COMPONENT = "target-component"; - private final static String TAG_ADMIN_TYPE = "admin-type"; + @VisibleForTesting + final static String TAG_USER_ID = "user-id"; + @VisibleForTesting + final static String TAG_SOURCE_COMPONENT = "source-component"; + @VisibleForTesting + final static String TAG_TARGET_COMPONENT = "target-component"; + @VisibleForTesting + final static String TAG_ADMIN_TYPE = "admin-type"; private final static String TAG = TransferOwnershipMetadataManager.class.getName(); public static final String OWNER_TRANSFER_METADATA_XML = "owner-transfer-metadata.xml"; @@ -177,10 +181,10 @@ class TransferOwnershipMetadataManager { final ComponentName targetComponent; final String adminType; - Metadata(@NonNull String sourceComponent, @NonNull String targetComponent, + Metadata(@NonNull ComponentName sourceComponent, @NonNull ComponentName targetComponent, @NonNull int userId, @NonNull String adminType) { - this.sourceComponent = ComponentName.unflattenFromString(sourceComponent); - this.targetComponent = ComponentName.unflattenFromString(targetComponent); + this.sourceComponent = sourceComponent; + this.targetComponent = targetComponent; Preconditions.checkNotNull(sourceComponent); Preconditions.checkNotNull(targetComponent); Preconditions.checkStringNotEmpty(adminType); @@ -188,10 +192,15 @@ class TransferOwnershipMetadataManager { this.adminType = adminType; } - Metadata(@NonNull ComponentName sourceComponent, @NonNull ComponentName targetComponent, + Metadata(@NonNull String flatSourceComponent, @NonNull String flatTargetComponent, @NonNull int userId, @NonNull String adminType) { - this(sourceComponent.flattenToString(), targetComponent.flattenToString(), - userId, adminType); + this(unflattenComponentUnchecked(flatSourceComponent), + unflattenComponentUnchecked(flatTargetComponent), userId, adminType); + } + + private static ComponentName unflattenComponentUnchecked(String flatComponent) { + Preconditions.checkNotNull(flatComponent); + return ComponentName.unflattenFromString(flatComponent); } @Override diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java index 03cabb2fb30..9213268b2ec 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java @@ -21,6 +21,10 @@ import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.A import static com.android.server.devicepolicy.TransferOwnershipMetadataManager .OWNER_TRANSFER_METADATA_XML; +import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_ADMIN_TYPE; +import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_SOURCE_COMPONENT; +import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_TARGET_COMPONENT; +import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_USER_ID; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -53,11 +57,13 @@ import java.nio.file.Paths; @RunWith(AndroidJUnit4.class) public class TransferOwnershipMetadataManagerTest { - private final static String ADMIN_PACKAGE = "com.dummy.admin.package"; - private final static String TARGET_PACKAGE = "com.dummy.target.package"; + private final static String SOURCE_COMPONENT = + "com.dummy.admin.package/com.dummy.admin.package.SourceClassName"; + private final static String TARGET_COMPONENT = + "com.dummy.target.package/com.dummy.target.package.TargetClassName"; private final static int USER_ID = 123; - private final static Metadata TEST_PARAMS = new Metadata(ADMIN_PACKAGE, - TARGET_PACKAGE, USER_ID, ADMIN_TYPE_DEVICE_OWNER); + private final static Metadata TEST_PARAMS = new Metadata(SOURCE_COMPONENT, + TARGET_COMPONENT, USER_ID, ADMIN_TYPE_DEVICE_OWNER); private MockInjector mMockInjector; @@ -84,10 +90,13 @@ public class TransferOwnershipMetadataManagerTest { String contents = new String(Files.readAllBytes(path), Charset.forName("UTF-8")); assertEquals( "\n" - + "" + USER_ID + "\n" - + "" + ADMIN_PACKAGE + "\n" - + "" + TARGET_PACKAGE + "\n" - + "" + ADMIN_TYPE_DEVICE_OWNER + "\n", + + "<" + TAG_USER_ID + ">" + USER_ID + "\n" + + "<" + TAG_SOURCE_COMPONENT + ">" + SOURCE_COMPONENT + "\n" + + "<" + TAG_TARGET_COMPONENT + ">" + TARGET_COMPONENT + "\n" + + "<" + TAG_ADMIN_TYPE + ">" + ADMIN_TYPE_DEVICE_OWNER + "\n", contents); } catch (IOException e) { e.printStackTrace(); -- GitLab From 607223f3b7a1c4dc3ac995f742f8d2da50d85ffc Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Mon, 19 Feb 2018 14:09:02 +0000 Subject: [PATCH 055/386] Remove uses of libcore.util.Objects.hashCode / equals. Use public API in java.util.Objects instead. Test: make Change-Id: I413280f254743a2efa2640a2194693aeb5980605 --- .../android/hardware/display/WifiDisplay.java | 4 ++-- core/java/android/util/MapCollections.java | 9 ++++----- core/java/android/view/DisplayInfo.java | 13 ++++++------- core/java/android/widget/RemoteViews.java | 9 ++++----- core/java/com/android/internal/util/BitUtils.java | 5 ++--- .../android/internal/widget/CachingIconView.java | 4 ++-- .../android/providers/settings/SettingsState.java | 12 ++++++------ .../systemui/qs/customize/CustomizeTileView.java | 4 ++-- .../android/systemui/qs/external/CustomTile.java | 4 ++-- .../qs/external/TileLifecycleManager.java | 5 ++--- .../systemui/qs/external/TileServiceManager.java | 9 ++++----- .../android/systemui/qs/tileimpl/QSTileView.java | 6 +++--- .../systemui/tuner/RadioListPreference.java | 4 ++-- .../com/android/server/autofill/ui/FillUi.java | 5 ++--- .../android/server/display/DisplayDeviceInfo.java | 15 +++++++-------- .../android/server/display/LogicalDisplay.java | 5 ++--- .../server/display/PersistentDataStore.java | 4 ++-- .../server/display/WifiDisplayAdapter.java | 7 +++---- .../server/display/WifiDisplayController.java | 5 ++--- .../server/dreams/DreamManagerService.java | 5 ++--- .../android/server/input/InputManagerService.java | 6 +++--- .../android/server/input/PersistentDataStore.java | 6 +++--- .../server/om/OverlayManagerServiceImpl.java | 7 +++---- .../java/com/android/server/pm/ShortcutUser.java | 5 ++--- .../com/android/server/pm/UserManagerService.java | 4 ++-- .../android/server/pm/dex/PackageDexUsage.java | 6 +++--- .../android/server/power/PowerManagerService.java | 5 ++--- 27 files changed, 79 insertions(+), 94 deletions(-) diff --git a/core/java/android/hardware/display/WifiDisplay.java b/core/java/android/hardware/display/WifiDisplay.java index af5a84e6111..bb32c199993 100644 --- a/core/java/android/hardware/display/WifiDisplay.java +++ b/core/java/android/hardware/display/WifiDisplay.java @@ -19,7 +19,7 @@ package android.hardware.display; import android.os.Parcel; import android.os.Parcelable; -import libcore.util.Objects; +import java.util.Objects; /** * Describes the properties of a Wifi display. @@ -140,7 +140,7 @@ public final class WifiDisplay implements Parcelable { return other != null && mDeviceAddress.equals(other.mDeviceAddress) && mDeviceName.equals(other.mDeviceName) - && Objects.equal(mDeviceAlias, other.mDeviceAlias); + && Objects.equals(mDeviceAlias, other.mDeviceAlias); } /** diff --git a/core/java/android/util/MapCollections.java b/core/java/android/util/MapCollections.java index 80ab23c8261..a5212688c6c 100644 --- a/core/java/android/util/MapCollections.java +++ b/core/java/android/util/MapCollections.java @@ -16,13 +16,12 @@ package android.util; -import libcore.util.Objects; - import java.lang.reflect.Array; import java.util.Collection; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; +import java.util.Objects; import java.util.Set; /** @@ -143,8 +142,8 @@ abstract class MapCollections { return false; } Map.Entry e = (Map.Entry) o; - return Objects.equal(e.getKey(), colGetEntry(mIndex, 0)) - && Objects.equal(e.getValue(), colGetEntry(mIndex, 1)); + return Objects.equals(e.getKey(), colGetEntry(mIndex, 0)) + && Objects.equals(e.getValue(), colGetEntry(mIndex, 1)); } @Override @@ -195,7 +194,7 @@ abstract class MapCollections { return false; } Object foundVal = colGetEntry(index, 1); - return Objects.equal(foundVal, e.getValue()); + return Objects.equals(foundVal, e.getValue()); } @Override diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java index 7251b71ac35..913e5924c6a 100644 --- a/core/java/android/view/DisplayInfo.java +++ b/core/java/android/view/DisplayInfo.java @@ -31,9 +31,8 @@ import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.proto.ProtoOutputStream; -import libcore.util.Objects; - import java.util.Arrays; +import java.util.Objects; /** * Describes the characteristics of a particular logical display. @@ -295,8 +294,8 @@ public final class DisplayInfo implements Parcelable { && layerStack == other.layerStack && flags == other.flags && type == other.type - && Objects.equal(address, other.address) - && Objects.equal(uniqueId, other.uniqueId) + && Objects.equals(address, other.address) + && Objects.equals(uniqueId, other.uniqueId) && appWidth == other.appWidth && appHeight == other.appHeight && smallestNominalAppWidth == other.smallestNominalAppWidth @@ -309,13 +308,13 @@ public final class DisplayInfo implements Parcelable { && overscanTop == other.overscanTop && overscanRight == other.overscanRight && overscanBottom == other.overscanBottom - && Objects.equal(displayCutout, other.displayCutout) + && Objects.equals(displayCutout, other.displayCutout) && rotation == other.rotation && modeId == other.modeId && defaultModeId == other.defaultModeId && colorMode == other.colorMode && Arrays.equals(supportedColorModes, other.supportedColorModes) - && Objects.equal(hdrCapabilities, other.hdrCapabilities) + && Objects.equals(hdrCapabilities, other.hdrCapabilities) && logicalDensityDpi == other.logicalDensityDpi && physicalXDpi == other.physicalXDpi && physicalYDpi == other.physicalYDpi @@ -323,7 +322,7 @@ public final class DisplayInfo implements Parcelable { && presentationDeadlineNanos == other.presentationDeadlineNanos && state == other.state && ownerUid == other.ownerUid - && Objects.equal(ownerPackageName, other.ownerPackageName) + && Objects.equals(ownerPackageName, other.ownerPackageName) && removeMode == other.removeMode; } diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index a2c55b09186..08513aa8682 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -69,8 +69,6 @@ import com.android.internal.R; import com.android.internal.util.NotificationColorUtil; import com.android.internal.util.Preconditions; -import libcore.util.Objects; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -82,6 +80,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Stack; import java.util.concurrent.Executor; @@ -291,9 +290,9 @@ public class RemoteViews implements Parcelable, Filter { return false; } MethodKey p = (MethodKey) o; - return Objects.equal(p.targetClass, targetClass) - && Objects.equal(p.paramClass, paramClass) - && Objects.equal(p.methodName, methodName); + return Objects.equals(p.targetClass, targetClass) + && Objects.equals(p.paramClass, paramClass) + && Objects.equals(p.methodName, methodName); } @Override diff --git a/core/java/com/android/internal/util/BitUtils.java b/core/java/com/android/internal/util/BitUtils.java index ba80aeae39e..17d5a2e3697 100644 --- a/core/java/com/android/internal/util/BitUtils.java +++ b/core/java/com/android/internal/util/BitUtils.java @@ -20,10 +20,9 @@ package com.android.internal.util; import android.annotation.Nullable; import android.text.TextUtils; -import libcore.util.Objects; - import java.nio.ByteBuffer; import java.util.Arrays; +import java.util.Objects; import java.util.UUID; import java.util.function.IntFunction; @@ -56,7 +55,7 @@ public final class BitUtils { public static boolean maskedEquals(UUID a, UUID b, @Nullable UUID mask) { if (mask == null) { - return Objects.equal(a, b); + return Objects.equals(a, b); } return maskedEquals(a.getLeastSignificantBits(), b.getLeastSignificantBits(), mask.getLeastSignificantBits()) diff --git a/core/java/com/android/internal/widget/CachingIconView.java b/core/java/com/android/internal/widget/CachingIconView.java index b172dbc0d5b..f3b6552be8a 100644 --- a/core/java/com/android/internal/widget/CachingIconView.java +++ b/core/java/com/android/internal/widget/CachingIconView.java @@ -30,7 +30,7 @@ import android.view.RemotableViewMethod; import android.widget.ImageView; import android.widget.RemoteViews; -import libcore.util.Objects; +import java.util.Objects; /** * An ImageView for displaying an Icon. Avoids reloading the Icon when possible. @@ -126,7 +126,7 @@ public class CachingIconView extends ImageView { boolean isCached = mLastResId != 0 && icon.getResId() == mLastResId - && Objects.equal(iconPackage, mLastPackage); + && Objects.equals(iconPackage, mLastPackage); mLastPackage = iconPackage; mLastResId = icon.getResId(); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index f158a65663f..6d341c5607e 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -51,7 +51,6 @@ import com.android.internal.util.ArrayUtils; import com.android.server.LocalServices; import libcore.io.IoUtils; -import libcore.util.Objects; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -66,6 +65,7 @@ import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Set; /** @@ -996,7 +996,7 @@ final class SettingsState { String defaultValue = this.defaultValue; boolean defaultFromSystem = this.defaultFromSystem; if (setDefault) { - if (!Objects.equal(value, this.defaultValue) + if (!Objects.equals(value, this.defaultValue) && (!defaultFromSystem || callerSystem)) { defaultValue = value; // Default null means no default, so the tag is irrelevant @@ -1015,10 +1015,10 @@ final class SettingsState { } // Is something gonna change? - if (Objects.equal(value, this.value) - && Objects.equal(defaultValue, this.defaultValue) - && Objects.equal(packageName, this.packageName) - && Objects.equal(tag, this.tag) + if (Objects.equals(value, this.value) + && Objects.equals(defaultValue, this.defaultValue) + && Objects.equals(packageName, this.packageName) + && Objects.equals(tag, this.tag) && defaultFromSystem == this.defaultFromSystem) { return false; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java index b0806429df2..9759b6984d6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java @@ -21,7 +21,7 @@ import android.widget.TextView; import com.android.systemui.R; import com.android.systemui.plugins.qs.QSIconView; import com.android.systemui.qs.tileimpl.QSTileView; -import libcore.util.Objects; +import java.util.Objects; public class CustomizeTileView extends QSTileView { @@ -45,7 +45,7 @@ public class CustomizeTileView extends QSTileView { } public void setAppLabel(CharSequence label) { - if (!Objects.equal(label, mAppLabel.getText())) { + if (!Objects.equals(label, mAppLabel.getText())) { mAppLabel.setText(label); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java index b3244a5947d..8d99303c7d5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java @@ -44,7 +44,7 @@ import com.android.systemui.plugins.qs.QSTile.State; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener; import com.android.systemui.qs.QSTileHost; -import libcore.util.Objects; +import java.util.Objects; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG; @@ -140,7 +140,7 @@ public class CustomTile extends QSTileImpl implements TileChangeListener if (icon1.getResId() != icon2.getResId()) { return false; } - if (!Objects.equal(icon1.getResPackage(), icon2.getResPackage())) { + if (!Objects.equals(icon1.getResPackage(), icon2.getResPackage())) { return false; } return true; diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java index 867f3b43d2a..1170d7b6e8a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java @@ -39,8 +39,7 @@ import android.util.ArraySet; import android.util.Log; import com.android.systemui.qs.external.PackageManagerAdapter; -import libcore.util.Objects; - +import java.util.Objects; import java.util.Set; /** @@ -307,7 +306,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements if (!Intent.ACTION_USER_UNLOCKED.equals(intent.getAction())) { Uri data = intent.getData(); String pkgName = data.getEncodedSchemeSpecificPart(); - if (!Objects.equal(pkgName, mIntent.getComponent().getPackageName())) { + if (!Objects.equals(pkgName, mIntent.getComponent().getPackageName())) { return; } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java index 342df5eff1f..7ad5a594565 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java @@ -37,8 +37,7 @@ import com.android.systemui.qs.customize.TileQueryHelper.TileStateListener; import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener; import java.util.List; - -import libcore.util.Objects; +import java.util.Objects; /** * Manages the priority which lets {@link TileServices} make decisions about which tiles @@ -248,7 +247,7 @@ public class TileServiceManager { Uri data = intent.getData(); String pkgName = data.getEncodedSchemeSpecificPart(); final ComponentName component = mStateManager.getComponent(); - if (!Objects.equal(pkgName, component.getPackageName())) { + if (!Objects.equals(pkgName, component.getPackageName())) { return; } @@ -260,8 +259,8 @@ public class TileServiceManager { List services = pm.queryIntentServicesAsUser( queryIntent, 0, ActivityManager.getCurrentUser()); for (ResolveInfo info : services) { - if (Objects.equal(info.serviceInfo.packageName, component.getPackageName()) - && Objects.equal(info.serviceInfo.name, component.getClassName())) { + if (Objects.equals(info.serviceInfo.packageName, component.getPackageName()) + && Objects.equals(info.serviceInfo.name, component.getClassName())) { return; } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java index 9eb9906ba3b..45c20a043ac 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java @@ -32,7 +32,7 @@ import com.android.systemui.R; import com.android.systemui.plugins.qs.QSIconView; import com.android.systemui.plugins.qs.QSTile; -import libcore.util.Objects; +import java.util.Objects; /** View that represents a standard quick settings tile. **/ public class QSTileView extends QSTileBaseView { @@ -98,7 +98,7 @@ public class QSTileView extends QSTileBaseView { @Override protected void handleStateChanged(QSTile.State state) { super.handleStateChanged(state); - if (!Objects.equal(mLabel.getText(), state.label) || mState != state.state) { + if (!Objects.equals(mLabel.getText(), state.label) || mState != state.state) { if (state.state == Tile.STATE_UNAVAILABLE) { int color = QSTileImpl.getColorForState(getContext(), state.state); state.label = new SpannableStringBuilder().append(state.label, @@ -108,7 +108,7 @@ public class QSTileView extends QSTileBaseView { mState = state.state; mLabel.setText(state.label); } - if (!Objects.equal(mSecondLine.getText(), state.secondaryLabel)) { + if (!Objects.equals(mSecondLine.getText(), state.secondaryLabel)) { mSecondLine.setText(state.secondaryLabel); mSecondLine.setVisibility(TextUtils.isEmpty(state.secondaryLabel) ? View.GONE : View.VISIBLE); diff --git a/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java index dc0d8bf6e66..3a2a6c3c4b6 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java @@ -33,7 +33,7 @@ import com.android.settingslib.Utils; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.R; -import libcore.util.Objects; +import java.util.Objects; public class RadioListPreference extends CustomListPreference { @@ -124,7 +124,7 @@ public class RadioListPreference extends CustomListPreference { SelectablePreference pref = new SelectablePreference(context); getPreferenceScreen().addPreference(pref); pref.setTitle(entry); - pref.setChecked(Objects.equal(current, values[i])); + pref.setChecked(Objects.equals(current, values[i])); pref.setKey(String.valueOf(i)); } } diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java index c5044651414..d64244d8698 100644 --- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java @@ -54,12 +54,11 @@ import com.android.internal.R; import com.android.server.UiThread; import com.android.server.autofill.Helper; -import libcore.util.Objects; - import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -356,7 +355,7 @@ final class FillUi { filterText = filterText.toLowerCase(); } - if (Objects.equal(mFilterText, filterText)) { + if (Objects.equals(mFilterText, filterText)) { return; } mFilterText = filterText; diff --git a/services/core/java/com/android/server/display/DisplayDeviceInfo.java b/services/core/java/com/android/server/display/DisplayDeviceInfo.java index 6db3b44c17b..349e1c8b713 100644 --- a/services/core/java/com/android/server/display/DisplayDeviceInfo.java +++ b/services/core/java/com/android/server/display/DisplayDeviceInfo.java @@ -23,8 +23,7 @@ import android.view.DisplayCutout; import android.view.Surface; import java.util.Arrays; - -import libcore.util.Objects; +import java.util.Objects; /** * Describes the characteristics of a physical display device. @@ -312,28 +311,28 @@ final class DisplayDeviceInfo { if (colorMode != other.colorMode) { diff |= DIFF_COLOR_MODE; } - if (!Objects.equal(name, other.name) - || !Objects.equal(uniqueId, other.uniqueId) + if (!Objects.equals(name, other.name) + || !Objects.equals(uniqueId, other.uniqueId) || width != other.width || height != other.height || modeId != other.modeId || defaultModeId != other.defaultModeId || !Arrays.equals(supportedModes, other.supportedModes) || !Arrays.equals(supportedColorModes, other.supportedColorModes) - || !Objects.equal(hdrCapabilities, other.hdrCapabilities) + || !Objects.equals(hdrCapabilities, other.hdrCapabilities) || densityDpi != other.densityDpi || xDpi != other.xDpi || yDpi != other.yDpi || appVsyncOffsetNanos != other.appVsyncOffsetNanos || presentationDeadlineNanos != other.presentationDeadlineNanos || flags != other.flags - || !Objects.equal(displayCutout, other.displayCutout) + || !Objects.equals(displayCutout, other.displayCutout) || touch != other.touch || rotation != other.rotation || type != other.type - || !Objects.equal(address, other.address) + || !Objects.equals(address, other.address) || ownerUid != other.ownerUid - || !Objects.equal(ownerPackageName, other.ownerPackageName)) { + || !Objects.equals(ownerPackageName, other.ownerPackageName)) { diff |= DIFF_OTHER; } return diff; diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java index 132f083c1ad..e582fdf6347 100644 --- a/services/core/java/com/android/server/display/LogicalDisplay.java +++ b/services/core/java/com/android/server/display/LogicalDisplay.java @@ -25,8 +25,7 @@ import android.view.Surface; import java.io.PrintWriter; import java.util.Arrays; import java.util.List; - -import libcore.util.Objects; +import java.util.Objects; /** * Describes how a logical display is configured. @@ -225,7 +224,7 @@ final class LogicalDisplay { // logical display that they are sharing. (eg. Adjust size for pixel-perfect // mirroring over HDMI.) DisplayDeviceInfo deviceInfo = mPrimaryDisplayDevice.getDisplayDeviceInfoLocked(); - if (!Objects.equal(mPrimaryDisplayDeviceInfo, deviceInfo)) { + if (!Objects.equals(mPrimaryDisplayDeviceInfo, deviceInfo)) { mBaseDisplayInfo.layerStack = mLayerStack; mBaseDisplayInfo.flags = 0; if ((deviceInfo.flags & DisplayDeviceInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) { diff --git a/services/core/java/com/android/server/display/PersistentDataStore.java b/services/core/java/com/android/server/display/PersistentDataStore.java index 1af03de7de2..89cef621a55 100644 --- a/services/core/java/com/android/server/display/PersistentDataStore.java +++ b/services/core/java/com/android/server/display/PersistentDataStore.java @@ -52,9 +52,9 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import libcore.io.IoUtils; -import libcore.util.Objects; /** * Manages persistent state recorded by the display manager service as an XML file. @@ -180,7 +180,7 @@ final class PersistentDataStore { if (index >= 0) { alias = mRememberedWifiDisplays.get(index).getDeviceAlias(); } - if (!Objects.equal(display.getDeviceAlias(), alias)) { + if (!Objects.equals(display.getDeviceAlias(), alias)) { return new WifiDisplay(display.getDeviceAddress(), display.getDeviceName(), alias, display.isAvailable(), display.canConnect(), display.isRemembered()); } diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java index 08c0a1ad821..32933793395 100644 --- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java +++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java @@ -39,11 +39,10 @@ import android.view.Surface; import android.view.SurfaceControl; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.ArrayList; - -import libcore.util.Objects; +import java.util.Objects; /** * Connects to Wifi displays that implement the Miracast protocol. @@ -248,7 +247,7 @@ final class WifiDisplayAdapter extends DisplayAdapter { } WifiDisplay display = mPersistentDataStore.getRememberedWifiDisplay(address); - if (display != null && !Objects.equal(display.getDeviceAlias(), alias)) { + if (display != null && !Objects.equals(display.getDeviceAlias(), alias)) { display = new WifiDisplay(address, display.getDeviceName(), alias, false, false, false); if (mPersistentDataStore.rememberWifiDisplay(display)) { diff --git a/services/core/java/com/android/server/display/WifiDisplayController.java b/services/core/java/com/android/server/display/WifiDisplayController.java index 8932ca0cf85..fc59b5b0ffe 100644 --- a/services/core/java/com/android/server/display/WifiDisplayController.java +++ b/services/core/java/com/android/server/display/WifiDisplayController.java @@ -53,8 +53,7 @@ import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; import java.util.Enumeration; - -import libcore.util.Objects; +import java.util.Objects; /** * Manages all of the various asynchronous interactions with the {@link WifiP2pManager} @@ -944,7 +943,7 @@ final class WifiDisplayController implements DumpUtils.Dump { private void advertiseDisplay(final WifiDisplay display, final Surface surface, final int width, final int height, final int flags) { - if (!Objects.equal(mAdvertisedDisplay, display) + if (!Objects.equals(mAdvertisedDisplay, display) || mAdvertisedDisplaySurface != surface || mAdvertisedDisplayWidth != width || mAdvertisedDisplayHeight != height diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java index dbccc0765b7..5292d3e5fd3 100644 --- a/services/core/java/com/android/server/dreams/DreamManagerService.java +++ b/services/core/java/com/android/server/dreams/DreamManagerService.java @@ -58,8 +58,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; - -import libcore.util.Objects; +import java.util.Objects; /** * Service api for managing dreams. @@ -349,7 +348,7 @@ public final class DreamManagerService extends SystemService { private void startDreamLocked(final ComponentName name, final boolean isTest, final boolean canDoze, final int userId) { - if (Objects.equal(mCurrentDreamName, name) + if (Objects.equals(mCurrentDreamName, name) && mCurrentDreamIsTest == isTest && mCurrentDreamCanDoze == canDoze && mCurrentDreamUserId == userId) { diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 4050790c01e..a951d470735 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -116,10 +116,10 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Objects; import libcore.io.IoUtils; import libcore.io.Streams; -import libcore.util.Objects; /* * Wraps the C++ InputManager and provides its callbacks. @@ -1462,7 +1462,7 @@ public class InputManagerService extends IInputManager.Stub oldLayout = mDataStore.getCurrentKeyboardLayout(identifier.getDescriptor()); } if (mDataStore.addKeyboardLayout(key, keyboardLayoutDescriptor) - && !Objects.equal(oldLayout, mDataStore.getCurrentKeyboardLayout(key))) { + && !Objects.equals(oldLayout, mDataStore.getCurrentKeyboardLayout(key))) { mHandler.sendEmptyMessage(MSG_RELOAD_KEYBOARD_LAYOUTS); } } finally { @@ -1495,7 +1495,7 @@ public class InputManagerService extends IInputManager.Stub removed |= mDataStore.removeKeyboardLayout(identifier.getDescriptor(), keyboardLayoutDescriptor); } - if (removed && !Objects.equal(oldLayout, + if (removed && !Objects.equals(oldLayout, mDataStore.getCurrentKeyboardLayout(key))) { mHandler.sendEmptyMessage(MSG_RELOAD_KEYBOARD_LAYOUTS); } diff --git a/services/core/java/com/android/server/input/PersistentDataStore.java b/services/core/java/com/android/server/input/PersistentDataStore.java index 372db416e75..c9f8b208469 100644 --- a/services/core/java/com/android/server/input/PersistentDataStore.java +++ b/services/core/java/com/android/server/input/PersistentDataStore.java @@ -49,10 +49,10 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import libcore.io.IoUtils; -import libcore.util.Objects; /** * Manages persistent state recorded by the input manager service as an XML file. @@ -377,7 +377,7 @@ final class PersistentDataStore { } public boolean setCurrentKeyboardLayout(String keyboardLayout) { - if (Objects.equal(mCurrentKeyboardLayout, keyboardLayout)) { + if (Objects.equals(mCurrentKeyboardLayout, keyboardLayout)) { return false; } addKeyboardLayout(keyboardLayout); @@ -432,7 +432,7 @@ final class PersistentDataStore { private void updateCurrentKeyboardLayoutIfRemoved( String removedKeyboardLayout, int removedIndex) { - if (Objects.equal(mCurrentKeyboardLayout, removedKeyboardLayout)) { + if (Objects.equals(mCurrentKeyboardLayout, removedKeyboardLayout)) { if (!mUnassociatedKeyboardLayouts.isEmpty()) { int index = removedIndex; if (index == mUnassociatedKeyboardLayouts.size()) { diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java index a027fc6f258..43b17087953 100644 --- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java @@ -35,13 +35,12 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; -import libcore.util.Objects; - import java.io.PrintWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; /** @@ -106,7 +105,7 @@ final class OverlayManagerServiceImpl { final PackageInfo overlayPackage = overlayPackages.get(i); final OverlayInfo oi = storedOverlayInfos.get(overlayPackage.packageName); if (oi == null || !oi.targetPackageName.equals(overlayPackage.overlayTarget) - || !Objects.equal(oi.category, overlayPackage.overlayCategory)) { + || !Objects.equals(oi.category, overlayPackage.overlayCategory)) { // Update the overlay if it didn't exist or had the wrong target package. mSettings.init(overlayPackage.packageName, newUserId, overlayPackage.overlayTarget, @@ -434,7 +433,7 @@ final class OverlayManagerServiceImpl { // Don't touch static overlays. continue; } - if (withinCategory && !Objects.equal(disabledOverlayPackageInfo.overlayCategory, + if (withinCategory && !Objects.equals(disabledOverlayPackageInfo.overlayCategory, oi.category)) { // Don't touch overlays from other categories. continue; diff --git a/services/core/java/com/android/server/pm/ShortcutUser.java b/services/core/java/com/android/server/pm/ShortcutUser.java index b7247df3b2a..c044c1ce814 100644 --- a/services/core/java/com/android/server/pm/ShortcutUser.java +++ b/services/core/java/com/android/server/pm/ShortcutUser.java @@ -32,8 +32,6 @@ import com.android.internal.util.Preconditions; import com.android.server.pm.ShortcutService.DumpFilter; import com.android.server.pm.ShortcutService.InvalidFileFormatException; -import libcore.util.Objects; - import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -44,6 +42,7 @@ import org.xmlpull.v1.XmlSerializer; import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.util.Objects; import java.util.function.Consumer; /** @@ -454,7 +453,7 @@ class ShortcutUser { private void setLauncher(ComponentName launcherComponent, boolean allowPurgeLastKnown) { mCachedLauncher = launcherComponent; // Always update the in-memory cache. - if (Objects.equal(mLastKnownLauncher, launcherComponent)) { + if (Objects.equals(mLastKnownLauncher, launcherComponent)) { return; } if (!allowPurgeLastKnown && launcherComponent == null) { diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 0eeaf661635..de7e21acc52 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -101,7 +101,6 @@ import com.android.server.am.UserState; import com.android.server.storage.DeviceStorageMonitorInternal; import libcore.io.IoUtils; -import libcore.util.Objects; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -122,6 +121,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.Objects; /** * Service for {@link UserManager}. @@ -604,7 +604,7 @@ public class UserManagerService extends IUserManager.Stub { return; } String currentAccount = userData.account; - if (!Objects.equal(currentAccount, accountName)) { + if (!Objects.equals(currentAccount, accountName)) { userData.account = accountName; userToUpdate = userData; } diff --git a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java index a4a0a54b39d..e3e15907939 100644 --- a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java +++ b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java @@ -42,11 +42,11 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import dalvik.system.VMRuntime; import libcore.io.IoUtils; -import libcore.util.Objects; /** * Stat file which store usage information about dex files. @@ -830,7 +830,7 @@ public class PackageDexUsage extends AbstractStatsBase { // We detected an unsupported context. mClassLoaderContext = UNSUPPORTED_CLASS_LOADER_CONTEXT; } else if (!UNSUPPORTED_CLASS_LOADER_CONTEXT.equals(mClassLoaderContext) && - !Objects.equal(mClassLoaderContext, dexUseInfo.mClassLoaderContext)) { + !Objects.equals(mClassLoaderContext, dexUseInfo.mClassLoaderContext)) { // We detected a context change. mClassLoaderContext = VARIABLE_CLASS_LOADER_CONTEXT; } @@ -838,7 +838,7 @@ public class PackageDexUsage extends AbstractStatsBase { return updateIsas || (oldIsUsedByOtherApps != mIsUsedByOtherApps) || updateLoadingPackages - || !Objects.equal(oldClassLoaderContext, mClassLoaderContext); + || !Objects.equals(oldClassLoaderContext, mClassLoaderContext); } public boolean isUsedByOtherApps() { diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 38dc820e5b8..d67acc481ac 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -100,14 +100,13 @@ import com.android.server.lights.LightsManager; import com.android.server.policy.WindowManagerPolicy; import com.android.server.power.batterysaver.BatterySaverController; -import libcore.util.Objects; - import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; +import java.util.Objects; /** * The power manager service is responsible for coordinating power management @@ -3976,7 +3975,7 @@ public final class PowerManagerService extends SystemService } public boolean hasSameWorkSource(WorkSource workSource) { - return Objects.equal(mWorkSource, workSource); + return Objects.equals(mWorkSource, workSource); } public void updateWorkSource(WorkSource workSource) { -- GitLab From 4bcd4d40ff31a5261c9a27e1d7d9c25e0c438294 Mon Sep 17 00:00:00 2001 From: Mihai Popa Date: Wed, 7 Feb 2018 17:13:51 +0000 Subject: [PATCH 056/386] [Magnifier-20] Raw Surface instead of PopupWindow Since the movement of PopupWindows is handled by the global window manager, using one does not provide synchronization guarantees between the window movement and its view tree rendering. In the case of the magnifier this was producing a shaky-text effect, when the window was moved in one frame, but the content was only updated in the following one (although the movement and content update were issued during the same #show operation on the UI thread). This CL abandons the usage of a PopupWindow for the magnifier, in favour of a raw Surface whose movement can be controlled using the deferred transactions API. This way, we can defer the surface movement until the frame when the updated content is rendered. The allocated magnifier surface is slightly bigger than the magnifier content to have space for drawing the elevation. We obtain a native elevation by using a RenderNode to draw the content of the magnifier. Bug: 72041926 Test: atest CtsWidgetTestCases:android.widget.cts.MagnifierTest Change-Id: Icb8ecf48a2f528e06790db95d54575f2ae119747 --- core/java/android/view/ThreadedRenderer.java | 102 +++++++ core/java/android/widget/Magnifier.java | 299 +++++++++++++++---- 2 files changed, 350 insertions(+), 51 deletions(-) diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index e50d40ef098..6d42ac382a5 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -34,6 +34,7 @@ import android.os.Trace; import android.util.Log; import android.view.Surface.OutOfResourcesException; import android.view.View.AttachInfo; +import android.view.animation.AnimationUtils; import com.android.internal.R; import com.android.internal.util.VirtualRefBasePtr; @@ -943,6 +944,107 @@ public final class ThreadedRenderer { } } + /** + * Basic synchronous renderer. Currently only used to render the Magnifier, so use with care. + * TODO: deduplicate against ThreadedRenderer. + * + * @hide + */ + public static class SimpleRenderer { + private final RenderNode mRootNode; + private long mNativeProxy; + private final float mLightY, mLightZ; + private Surface mSurface; + private final FrameInfo mFrameInfo = new FrameInfo(); + + public SimpleRenderer(final Context context, final String name, final Surface surface) { + final TypedArray a = context.obtainStyledAttributes(null, R.styleable.Lighting, 0, 0); + mLightY = a.getDimension(R.styleable.Lighting_lightY, 0); + mLightZ = a.getDimension(R.styleable.Lighting_lightZ, 0); + final float lightRadius = a.getDimension(R.styleable.Lighting_lightRadius, 0); + final int ambientShadowAlpha = + (int) (255 * a.getFloat(R.styleable.Lighting_ambientShadowAlpha, 0) + 0.5f); + final int spotShadowAlpha = + (int) (255 * a.getFloat(R.styleable.Lighting_spotShadowAlpha, 0) + 0.5f); + a.recycle(); + + final long rootNodePtr = nCreateRootRenderNode(); + mRootNode = RenderNode.adopt(rootNodePtr); + mRootNode.setClipToBounds(false); + mNativeProxy = nCreateProxy(true /* translucent */, rootNodePtr); + nSetName(mNativeProxy, name); + + ProcessInitializer.sInstance.init(context, mNativeProxy); + nLoadSystemProperties(mNativeProxy); + + nSetup(mNativeProxy, lightRadius, ambientShadowAlpha, spotShadowAlpha); + + mSurface = surface; + nUpdateSurface(mNativeProxy, surface); + } + + /** + * Set the light center. + */ + public void setLightCenter(final Display display, + final int windowLeft, final int windowTop) { + // Adjust light position for window offsets. + final Point displaySize = new Point(); + display.getRealSize(displaySize); + final float lightX = displaySize.x / 2f - windowLeft; + final float lightY = mLightY - windowTop; + + nSetLightCenter(mNativeProxy, lightX, lightY, mLightZ); + } + + public RenderNode getRootNode() { + return mRootNode; + } + + /** + * Draw the surface. + */ + public void draw(final FrameDrawingCallback callback) { + final long vsync = AnimationUtils.currentAnimationTimeMillis() * 1000000L; + mFrameInfo.setVsync(vsync, vsync); + mFrameInfo.addFlags(1 << 2 /* VSYNC */); + if (callback != null) { + callback.onFrameDraw(mSurface.getNextFrameNumber()); + } + nSyncAndDrawFrame(mNativeProxy, mFrameInfo.mFrameInfo, mFrameInfo.mFrameInfo.length); + } + + /** + * Destroy the renderer. + */ + public void destroy() { + mSurface = null; + nDestroy(mNativeProxy, mRootNode.mNativeRenderNode); + } + + @Override + protected void finalize() throws Throwable { + try { + nDeleteProxy(mNativeProxy); + mNativeProxy = 0; + } finally { + super.finalize(); + } + } + } + + /** + * Interface used to receive callbacks when a frame is being drawn. + */ + public interface FrameDrawingCallback { + /** + * Invoked during a frame drawing. + * + * @param frame The id of the frame being drawn. + */ + void onFrameDraw(long frame); + } + private static class ProcessInitializer { static ProcessInitializer sInstance = new ProcessInitializer(); diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java index 88365617cd6..f6f9b2eeed0 100644 --- a/core/java/android/widget/Magnifier.java +++ b/core/java/android/widget/Magnifier.java @@ -18,21 +18,30 @@ package android.widget; import android.annotation.FloatRange; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.TestApi; import android.annotation.UiThread; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.Outline; +import android.graphics.Paint; +import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; import android.os.Handler; -import android.view.Gravity; +import android.view.Display; +import android.view.DisplayListCanvas; import android.view.LayoutInflater; import android.view.PixelCopy; +import android.view.RenderNode; import android.view.Surface; +import android.view.SurfaceControl; import android.view.SurfaceHolder; +import android.view.SurfaceSession; import android.view.SurfaceView; +import android.view.ThreadedRenderer; import android.view.View; import android.view.ViewParent; import android.view.ViewRootImpl; @@ -51,7 +60,7 @@ public final class Magnifier { // The coordinates of the view in the surface. private final int[] mViewCoordinatesInSurface; // The window containing the magnifier. - private final PopupWindow mWindow; + private InternalPopupWindow mWindow; // The center coordinates of the window containing the magnifier. private final Point mWindowCoords = new Point(); // The width of the window containing the magnifier. @@ -60,6 +69,8 @@ public final class Magnifier { private final int mWindowHeight; // The bitmap used to display the contents of the magnifier. private final Bitmap mBitmap; + // The elevation of the window containing the magnifier. + private final float mWindowElevation; // The center coordinates of the content that is to be magnified. private final Point mCenterZoomCoords = new Point(); // The callback of the pixel copy request will be invoked on this Handler when @@ -72,6 +83,7 @@ public final class Magnifier { NONEXISTENT_PREVIOUS_CONFIG_VALUE, NONEXISTENT_PREVIOUS_CONFIG_VALUE); private final PointF mPrevPosInView = new PointF( NONEXISTENT_PREVIOUS_CONFIG_VALUE, NONEXISTENT_PREVIOUS_CONFIG_VALUE); + // Rectangle defining the view surface area we pixel copy content from. private final Rect mPixelCopyRequestRect = new Rect(); /** @@ -82,8 +94,6 @@ public final class Magnifier { public Magnifier(@NonNull View view) { mView = Preconditions.checkNotNull(view); final Context context = mView.getContext(); - final float elevation = context.getResources().getDimension( - com.android.internal.R.dimen.magnifier_elevation); final View content = LayoutInflater.from(context).inflate( com.android.internal.R.layout.magnifier, null); content.findViewById(com.android.internal.R.id.magnifier_inner).setClipToOutline(true); @@ -91,23 +101,16 @@ public final class Magnifier { com.android.internal.R.dimen.magnifier_width); mWindowHeight = context.getResources().getDimensionPixelSize( com.android.internal.R.dimen.magnifier_height); + mWindowElevation = context.getResources().getDimension( + com.android.internal.R.dimen.magnifier_elevation); mZoomScale = context.getResources().getFloat( com.android.internal.R.dimen.magnifier_zoom_scale); // The view's surface coordinates will not be updated until the magnifier is first shown. mViewCoordinatesInSurface = new int[2]; - mWindow = new PopupWindow(context); - mWindow.setContentView(content); - mWindow.setWidth(mWindowWidth); - mWindow.setHeight(mWindowHeight); - mWindow.setElevation(elevation); - mWindow.setTouchable(false); - mWindow.setBackgroundDrawable(null); - final int bitmapWidth = Math.round(mWindowWidth / mZoomScale); final int bitmapHeight = Math.round(mWindowHeight / mZoomScale); mBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888); - getImageView().setImageBitmap(mBitmap); } /** @@ -160,25 +163,39 @@ public final class Magnifier { final int startY = mCenterZoomCoords.y - mBitmap.getHeight() / 2; if (xPosInView != mPrevPosInView.x || yPosInView != mPrevPosInView.y) { - performPixelCopy(startX, startY); - + if (mWindow == null) { + mWindow = new InternalPopupWindow(mView.getContext(), mView.getDisplay(), + getValidViewSurface(), mWindowWidth, mWindowHeight, mWindowElevation); + } + performPixelCopy(startX, startY, true /* update window position */); mPrevPosInView.x = xPosInView; mPrevPosInView.y = yPosInView; + } + } - if (mWindow.isShowing()) { - mWindow.update(mWindowCoords.x, mWindowCoords.y, mWindow.getWidth(), - mWindow.getHeight()); - } else { - mWindow.showAtLocation(mView, Gravity.NO_GRAVITY, mWindowCoords.x, mWindowCoords.y); - } + @Nullable + private Surface getValidViewSurface() { + // TODO: deduplicate this against the first part of #performPixelCopy + final Surface surface; + if (mView instanceof SurfaceView) { + surface = ((SurfaceView) mView).getHolder().getSurface(); + } else if (mView.getViewRootImpl() != null) { + surface = mView.getViewRootImpl().mSurface; + } else { + surface = null; } + + return (surface != null && surface.isValid()) ? surface : null; } /** * Dismisses the magnifier from the screen. Calling this on a dismissed magnifier is a no-op. */ public void dismiss() { - mWindow.dismiss(); + if (mWindow != null) { + mWindow.destroy(); + mWindow = null; + } } /** @@ -186,43 +203,40 @@ public final class Magnifier { * {@link #show(float, float)}. This only happens if the magnifier is currently showing. */ public void update() { - if (mWindow.isShowing()) { - // Update the contents shown in the magnifier. - performPixelCopy(mPrevStartCoordsInSurface.x, mPrevStartCoordsInSurface.y); + if (mWindow != null) { + // Update the content shown in the magnifier. + performPixelCopy(mPrevStartCoordsInSurface.x, mPrevStartCoordsInSurface.y, + false /* update window position */); } } private void configureCoordinates(final float xPosInView, final float yPosInView) { // Compute the coordinates of the center of the content going to be displayed in the // magnifier. These are relative to the surface the content is copied from. - final float contentPosX; - final float contentPosY; + final float posX; + final float posY; if (mView instanceof SurfaceView) { // No offset required if the backing Surface matches the size of the SurfaceView. - contentPosX = xPosInView; - contentPosY = yPosInView; + posX = xPosInView; + posY = yPosInView; } else { mView.getLocationInSurface(mViewCoordinatesInSurface); - contentPosX = xPosInView + mViewCoordinatesInSurface[0]; - contentPosY = yPosInView + mViewCoordinatesInSurface[1]; + posX = xPosInView + mViewCoordinatesInSurface[0]; + posY = yPosInView + mViewCoordinatesInSurface[1]; } - mCenterZoomCoords.x = Math.round(contentPosX); - mCenterZoomCoords.y = Math.round(contentPosY); - - // Compute the position of the magnifier window. These have to be relative to the window - // of the view the magnifier is attached to, as the magnifier popup is a panel window - // attached to that window. - final int[] viewCoordinatesInWindow = new int[2]; - mView.getLocationInWindow(viewCoordinatesInWindow); + mCenterZoomCoords.x = Math.round(posX); + mCenterZoomCoords.y = Math.round(posY); + + // Compute the position of the magnifier window. Again, this has to be relative to the + // surface of the magnified view, as this surface is the parent of the magnifier surface. final int verticalOffset = mView.getContext().getResources().getDimensionPixelSize( com.android.internal.R.dimen.magnifier_offset); - final float magnifierPosX = xPosInView + viewCoordinatesInWindow[0]; - final float magnifierPosY = yPosInView + viewCoordinatesInWindow[1] - verticalOffset; - mWindowCoords.x = Math.round(magnifierPosX - mWindowWidth / 2); - mWindowCoords.y = Math.round(magnifierPosY - mWindowHeight / 2); + mWindowCoords.x = mCenterZoomCoords.x - mWindowWidth / 2; + mWindowCoords.y = mCenterZoomCoords.y - mWindowHeight / 2 - verticalOffset; } - private void performPixelCopy(final int startXInSurface, final int startYInSurface) { + private void performPixelCopy(final int startXInSurface, final int startYInSurface, + final boolean updateWindowPosition) { // Get the view surface where the content will be copied from. final Surface surface; final int surfaceWidth; @@ -258,18 +272,201 @@ public final class Magnifier { clampedStartYInSurface, clampedStartXInSurface + mBitmap.getWidth(), clampedStartYInSurface + mBitmap.getHeight()); + final int windowCoordsX = mWindowCoords.x; + final int windowCoordsY = mWindowCoords.y; PixelCopy.request(surface, mPixelCopyRequestRect, mBitmap, result -> { - getImageView().invalidate(); - mPrevStartCoordsInSurface.x = startXInSurface; - mPrevStartCoordsInSurface.y = startYInSurface; + if (mWindow != null) { + if (updateWindowPosition) { + // TODO: pull the magnifier position update outside #performPixelCopy + mWindow.setContentPositionForNextDraw(windowCoordsX, windowCoordsY); + } + mWindow.updateContent(mBitmap); + } }, mPixelCopyHandler); + mPrevStartCoordsInSurface.x = startXInSurface; + mPrevStartCoordsInSurface.y = startYInSurface; } - private ImageView getImageView() { - return mWindow.getContentView().findViewById( - com.android.internal.R.id.magnifier_image); + /** + * Magnifier's own implementation of PopupWindow-similar floating window. + * This exists to ensure frame-synchronization between window position updates and window + * content updates. By using a PopupWindow, these events would happen in different frames, + * producing a shakiness effect for the magnifier content. + */ + private static class InternalPopupWindow { + // Display associated to the view the magnifier is attached to. + private final Display mDisplay; + // The size of the content of the magnifier. + private final int mContentWidth; + private final int mContentHeight; + // The size of the allocated surface. + private final int mSurfaceWidth; + private final int mSurfaceHeight; + // The insets of the content inside the allocated surface. + private final int mOffsetX; + private final int mOffsetY; + // Whether the next draw will be the first one for the current instance. + private boolean mFirstDraw = true; + // The window position in the parent surface. Might be applied during the next draw, + // when mPendingWindowPositionUpdate is true. + private int mWindowPositionX; + private int mWindowPositionY; + private boolean mPendingWindowPositionUpdate; + // The surface we allocate for the magnifier content + shadow. + private final SurfaceSession mSurfaceSession; + private final SurfaceControl mSurfaceControl; + private final Surface mSurface; + // The renderer used for the allocated surface. + private final ThreadedRenderer.SimpleRenderer mRenderer; + // The RenderNode used to draw the magnifier content in the surface. + private final RenderNode mBitmapRenderNode; + + InternalPopupWindow(final Context context, final Display display, + final Surface parentSurface, + final int width, final int height, final float elevation) { + mDisplay = display; + + mContentWidth = width; + mContentHeight = height; + mOffsetX = (int) (0.1f * width); + mOffsetY = (int) (0.1f * height); + // Setup the surface we will use for drawing the content and shadow. + mSurfaceWidth = mContentWidth + 2 * mOffsetX; + mSurfaceHeight = mContentHeight + 2 * mOffsetY; + mSurfaceSession = new SurfaceSession(parentSurface); + mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession) + .setFormat(PixelFormat.TRANSLUCENT) + .setSize(mSurfaceWidth, mSurfaceHeight) + .setName("magnifier surface") + .setFlags(SurfaceControl.HIDDEN) + .build(); + mSurface = new Surface(); + mSurface.copyFrom(mSurfaceControl); + + // Setup the RenderNode tree. The root has only one child, which contains the bitmap. + mRenderer = new ThreadedRenderer.SimpleRenderer( + context, + "magnifier renderer", + mSurface + ); + mBitmapRenderNode = createRenderNodeForBitmap( + "magnifier content", + elevation + ); + final DisplayListCanvas canvas = mRenderer.getRootNode().start(width, height); + try { + canvas.insertReorderBarrier(); + canvas.drawRenderNode(mBitmapRenderNode); + canvas.insertInorderBarrier(); + } finally { + mRenderer.getRootNode().end(canvas); + } + } + + private RenderNode createRenderNodeForBitmap(final String name, final float elevation) { + final RenderNode bitmapRenderNode = RenderNode.create(name, null); + + // Define the position of the bitmap in the parent render node. The surface regions + // outside the bitmap are used to draw elevation. + bitmapRenderNode.setLeftTopRightBottom(mOffsetX, mOffsetY, + mOffsetX + mContentWidth, mOffsetY + mContentHeight); + bitmapRenderNode.setElevation(elevation); + + final Outline outline = new Outline(); + outline.setRoundRect(0, 0, mContentWidth, mContentHeight, 3); + outline.setAlpha(1.0f); + bitmapRenderNode.setOutline(outline); + bitmapRenderNode.setClipToOutline(true); + + // Create a dummy draw, which will be replaced later with real drawing. + final DisplayListCanvas canvas = bitmapRenderNode.start(mContentWidth, mContentHeight); + try { + canvas.drawColor(0xFF00FF00); + } finally { + bitmapRenderNode.end(canvas); + } + + return bitmapRenderNode; + } + + /** + * Sets the position of the magnifier content relative to the parent surface. + * The position update will happen in the same frame with the next draw. + * + * @param contentX the x coordinate of the content + * @param contentY the y coordinate of the content + */ + public void setContentPositionForNextDraw(final int contentX, final int contentY) { + mWindowPositionX = contentX - mOffsetX; + mWindowPositionY = contentY - mOffsetY; + mPendingWindowPositionUpdate = true; + } + + /** + * Sets the content that should be displayed in the magnifier. + * The update happens immediately, and possibly triggers a pending window movement set + * by {@link #setContentPositionForNextDraw(int, int)}. + * + * @param bitmap the content bitmap + */ + public void updateContent(final Bitmap bitmap) { + final DisplayListCanvas canvas = mBitmapRenderNode.start(mContentWidth, mContentHeight); + try { + final Rect srcRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); + final Rect dstRect = new Rect(0, 0, mContentWidth, mContentHeight); + final Paint paint = new Paint(); + paint.setFilterBitmap(true); + canvas.drawBitmap(bitmap, srcRect, dstRect, paint); + } finally { + mBitmapRenderNode.end(canvas); + } + + doDraw(); + } + + /** + * Destroys this instance. + */ + public void destroy() { + mRenderer.destroy(); + mSurface.destroy(); + mSurfaceControl.destroy(); + mSurfaceSession.kill(); + mBitmapRenderNode.destroy(); + } + + private void doDraw() { + final ThreadedRenderer.FrameDrawingCallback callback; + if (mPendingWindowPositionUpdate || mFirstDraw) { + // If the window has to be shown or moved, defer this until the next draw. + final boolean firstDraw = mFirstDraw; + mFirstDraw = false; + final boolean updateWindowPosition = mPendingWindowPositionUpdate; + mPendingWindowPositionUpdate = false; + final int pendingX = mWindowPositionX; + final int pendingY = mWindowPositionY; + + callback = frame -> { + mRenderer.setLightCenter(mDisplay, pendingX, pendingY); + // Show or move the window at the content draw frame. + SurfaceControl.openTransaction(); + mSurfaceControl.deferTransactionUntil(mSurface, frame); + if (updateWindowPosition) { + mSurfaceControl.setPosition(pendingX, pendingY); + } + if (firstDraw) { + mSurfaceControl.show(); + } + SurfaceControl.closeTransaction(); + }; + } else { + callback = null; + } + + mRenderer.draw(callback); + } } /** @@ -296,7 +493,7 @@ public final class Magnifier { final int left = mWindowCoords.x + viewLocationOnScreen[0] - viewLocationInSurface[0]; final int top = mWindowCoords.y + viewLocationOnScreen[1] - viewLocationInSurface[1]; - return new Rect(left, top, left + mWindow.getWidth(), top + mWindow.getHeight()); + return new Rect(left, top, left + mWindowWidth, top + mWindowHeight); } /** -- GitLab From 4c87ffeae2a8ec11e2880c9ba8e3944f68cdaf3a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Feb 2018 07:08:29 -0800 Subject: [PATCH 057/386] Import translations. DO NOT MERGE Change-Id: I6076b206d8c838472c2c958d521ece8038e10206 Auto-generated-cl: translation import --- core/res/res/values-ar/strings.xml | 6 +++--- core/res/res/values-b+sr+Latn/strings.xml | 2 +- core/res/res/values-bs-rBA/strings.xml | 6 +++--- core/res/res/values-ca/strings.xml | 2 +- core/res/res/values-da/strings.xml | 2 +- core/res/res/values-de/strings.xml | 2 +- core/res/res/values-es/strings.xml | 2 +- core/res/res/values-fi/strings.xml | 2 +- core/res/res/values-hy-rAM/strings.xml | 2 +- core/res/res/values-ky-rKG/strings.xml | 4 ++-- core/res/res/values-mr-rIN/strings.xml | 2 +- core/res/res/values-my-rMM/strings.xml | 2 +- core/res/res/values-ne-rNP/strings.xml | 8 ++++---- core/res/res/values-pl/strings.xml | 16 +++++++-------- core/res/res/values-pt-rPT/strings.xml | 24 +++++++++++------------ core/res/res/values-sr/strings.xml | 2 +- core/res/res/values-uk/strings.xml | 2 +- core/res/res/values-vi/strings.xml | 2 +- core/res/res/values-zh-rCN/strings.xml | 4 ++-- core/res/res/values-zh-rTW/strings.xml | 2 +- 20 files changed, 47 insertions(+), 47 deletions(-) diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 35eb52b1a6e..0ffcaed4982 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1150,9 +1150,9 @@ "مستوى صوت المكالمة" "مستوى صوت الوسائط" "مستوى صوت الإشعار" - "نغمة الرنين الافتراضية" - "نغمة الرنين الافتراضية (%1$s)" - "لا شيء" + "نغمة الرنين التلقائية" + "نغمة الرنين التلقائية (%1$s)" + "بلا نغمة رنين" "نغمات الرنين" "نغمة رنين غير معروفة" diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 9a53bac9f6f..fd0dc876f36 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -980,7 +980,7 @@ "Nema dovoljno memorijskog prostora za sistem. Uverite se da imate 250 MB slobodnog prostora i ponovo pokrenite." "Aplikacija %1$s je pokrenuta" "Dodirnite za više informacija ili zaustavljanje aplikacije." - "Potvrdi" + "U redu" "Otkaži" "Potvrdi" "Otkaži" diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml index 05911771818..7bbf5881624 100644 --- a/core/res/res/values-bs-rBA/strings.xml +++ b/core/res/res/values-bs-rBA/strings.xml @@ -515,8 +515,8 @@ "Dozvoljava vlasniku povezivanje s interfejsom najvišeg nivoa u servisu za poruke operatera. Nije potrebno za obične aplikacije." "povezivanje na usluge operatera" "Omogućava vlasniku povezivanje sa uslugama operatera. Obično nije potrebno za obične aplikacije." - "pristup opciji Ne ometaj" - "Omogućava aplikaciji da čita i upisuje konfiguraciju opcije Ne ometaj." + "pristup načinu rada Ne ometaj" + "Omogućava aplikaciji da čita i upisuje konfiguraciju načina rada Ne ometaj." "Postavljanje pravila za lozinke" "Kontrolira dužinu i znakove koji su dozvoljeni u lozinkama za zaključavanje ekrana i PIN-ovima." "Prati pokušaje otključavanja ekrana" @@ -1644,7 +1644,7 @@ "Do %1$s" "Do %1$s (sljedeći alarm)" "Dok ovo ne isključite" - "Dok ne isključite opciju Ne ometaj" + "Dok ne isključite način rada Ne ometaj" "%1$s/%2$s" "Skupi" "Ne ometaj" diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 36def539774..4813879c874 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1568,7 +1568,7 @@ "L\'administrador ho ha instal·lat" "L\'administrador l\'ha actualitzat" "L\'administrador ho ha suprimit" - "Per tal d\'augmentar la durada de la bateria, la funció Estalvi de bateria redueix el rendiment del dispositiu i en limita la vibració, els serveis d\'ubicació i la majoria de dades en segon pla. És possible que el correu electrònic, la missatgeria i la resta d\'aplicacions que se sincronitzen amb freqüència no s\'actualitzin llevat que les obris.\n\nLa funció Estalvi de bateria es desactiva automàticament mentre el dispositiu s\'està carregant." + "Per tal d\'augmentar la durada de la bateria, el mode d\'estalvi de bateria redueix el rendiment del dispositiu i en limita la vibració, els serveis d\'ubicació i la majoria de dades en segon pla. És possible que el correu electrònic, la missatgeria i la resta d\'aplicacions que se sincronitzen amb freqüència no s\'actualitzin llevat que les obris.\n\nEl mode d\'estalvi de bateria es desactiva automàticament mentre el dispositiu s\'està carregant." "Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a dades, però potser ho farà menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis." "Activar Economitzador de dades?" "Activa" diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 907e13c030a..fb1a9048698 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1431,7 +1431,7 @@ "Du har tegnet dit oplåsningsmønster forkert %1$d gange. Efter %2$d yderligere mislykkede forsøg til vil du blive bedt om at låse din telefon op ved hjælp af en e-mailkonto.\n\n Prøv igen om %3$d sekunder." " – " "Fjern" - "Vil du skrue højere op end det anbefalede lydstyrkeniveau?\n\nDu kan skade hørelsen ved at lytte til meget højt musik over længere tid." + "Vil du skrue højere op end det anbefalede lydstyrkeniveau?\n\nDu kan skade hørelsen ved at lytte til meget høj musik over længere tid." "Bliv ved med at holde to fingre nede for at aktivere hjælpefunktioner." "Hjælpefunktioner er aktiveret." "Hjælpefunktioner er annulleret." diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 0a56f8258f0..0229779dfad 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1138,7 +1138,7 @@ "Datum festlegen" "Speichern" "Fertig" - "Neu: " + "NEU: " "Zur Verfügung gestellt von %1$s" "Keine Berechtigungen erforderlich" "Hierfür können Gebühren anfallen." diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index e6fea0c5ce2..c41010aff42 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1431,7 +1431,7 @@ "Has fallado %1$d veces al dibujar el patrón de desbloqueo. Si fallas otras %2$d veces, deberás usar una cuenta de correo electrónico para desbloquear el teléfono.\n\n Inténtalo de nuevo en %3$d segundos." " — " "Quitar" - "¿Quieres subir el volumen por encima del nivel recomendado?\n\nEscuchar sonidos a alto volumen durante largos períodos de tiempo puede dañar tus oídos." + "¿Quieres subir el volumen por encima del nivel recomendado?\n\nEscuchar sonidos fuertes durante mucho tiempo puede dañar los oídos." "Mantén la pantalla pulsada con dos dedos para habilitar las funciones de accesibilidad." "Accesibilidad habilitada" "Accesibilidad cancelada" diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 17719941f81..9960cae25aa 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -838,7 +838,7 @@ "vuonna %s" "päivä" "päivää" - "tunti" + "tunnit" "tuntia" "min" "min" diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 87778ae9278..60eccdf06a1 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -1370,7 +1370,7 @@ "Հեռուստացույց" "Հեռախոս" "Ականջակալներ" - "Համակցված բարձրախոսներ" + "Դոկ-կայանի բարձրախոսներ" "HDMI" "Համակարգ" "Bluetooth-ի աուդիո ֆայլ" diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 4892eb4843f..afd30ba33d5 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -1641,8 +1641,8 @@ "Бул эскертмелердин маанилүүлүгүн белгиледиңиз." "Булар сиз үчүн маанилүү адамдар." - "%1$s колдонмосу %2$s каттоо эсеби менен жаңы колдонуучу түзө берсинби ?" - "%1$s колдонмосу %2$s каттоо эсеби менен жаңы колдонуучу түзө берсинби (мындай каттоо эсеби бар колдонуучу мурунтан эле бар) ?" + "%1$s колдонмосу %2$s аккаунту менен жаңы колдонуучу түзө берсинби?" + "%1$s колдонмосуна %2$s аккаунту үчүн жаңы колдонуучу түзгөнгө уруксат бересизби (мындай аккаунту бар колдонуучу мурунтан эле бар)?" "Тил кошуңуз" "Чөлкөмдүк жөндөөлөр" "Тилди киргизиңиз" diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index dd24e294b56..372c794041e 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -376,7 +376,7 @@ "IMS कॉल सेवा अॅक्सेस करा" "आपल्‍या हस्तक्षेपाशिवाय अ‍ॅपला कॉल करण्‍यासाठी IMS सेवा वापरण्याची अनुमती देते." "फोन स्थिती आणि ओळख वाचा" - "डिव्हाइस च्या फोन वैशिष्ट्यांवर अॅक्सेस करण्यास अॅपला अनुमती देते. ही परवानगी कॉल अॅक्टिव्हेट असला किंवा नसला तरीही, फोन नंबर आणि डिव्हाइस आयडी आणि कॉलद्वारे कनेक्ट केलेला रीमोट नंबर निर्धारित करण्यासाठी अॅपला अनुमती देते." + "डिव्हाइस च्या फोन वैशिष्ट्यांवर अॅक्सेस करण्यास अॅपला अनुमती देते. ही परवानगी कॉल अॅक्टिव्हेट असला किंवा नसला तरीही, फोन नंबर आणि डिव्हाइस आयडी आणि कॉलद्वारे कनेक्ट केलेला रिमोट नंबर निर्धारित करण्यासाठी अॅपला अनुमती देते." "टॅबलेट निष्क्रिय होण्यापासून प्रतिबंधित करा" "निष्क्रिय होण्यापासून प्रतिबंध करा" "फोन निष्‍क्रिय होण्‍यापासून प्रतिबंधित करा" diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index 91b756206a9..2792117dacc 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -1113,7 +1113,7 @@ "စာတိုပို့စနစ်(SMS)ဖြင့် စာများ ပို့သည်" "<b>%1$s</b> မှ စာ အမြောက်အများ ပို့နေပါသည်။ ဒီအပလီကေးရှင်းကို ဆက်လက်ပြီး လုပ်ဆောင်ရန် ခွင့်ပြုပါမလား" "ခွင့်ပြုရန်" - "ငြင်းပယ်ခြင်း" + "ငြင်းပယ်ရန်" "<b>%1$s</b> မှ <b>%2$s</b> ကို စာတို ပို့ချင်ပါသည်" "ဒါက သင့် မိုဘိုင်း အကောင့် အတွက် "" ကုန်ကျမှု ရှိလာနိုင်သည်။" "ဒါက သင့် မိုဘိုင်း အကောင့် အတွက် ကုန်ကျမှု ရှိလာနိုင်သည်။" diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index 1c31c1991a9..b8665f211ac 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -232,7 +232,7 @@ "हवाइजहाज मोड" "हवाइजहाज मोड खुला छ" "हवाइजहाज मोड बन्द छ" - "सेटिङ्हरू" + "सेटिङहरू" "सहायता दिनुहोस्" "आवाज सहायता" "अब बन्द गर्नुहोस्" @@ -362,7 +362,7 @@ "अनुमानित स्थान पहुँच गराउनुहोस् (नेटवर्कमा आधारित)" "अनुप्रयोगलाई तपाईंको अनुमानित स्थान प्राप्त गर्न अनुमति दिन्छ। यो स्थान सेल टावर र वाइ-फाइजस्ता नेटवर्क स्थान स्रोतहरूको प्रोग गरी स्थान सेवाहरूबाट उत्पन्न गरिएको हो। अनुप्रयोगले यी स्थान सेवाहरूको उपयोग गर्नको लागि यी सेवाहरू तपाईंको उपकरणमा चालु र उपलब्ध हुनु आवश्यक छ। अनुप्रयोगहरूले अनुमानित रूपमा तपाईं कहाँ हुनुहुन्छ भन्ने निर्धारण गर्न यसको प्रयोग गर्न सक्छन्।" "तपाईँका अडियो सेटिङहरू परिवर्तन गर्नुहोस्" - "अनुप्रयोगलाई ग्लोबल अडियो सेटिङ्हरू परिमार्जन गर्न अनुमति दिन्छ, जस्तै आवाजको मात्रा र आउटपुटको लागि कुन स्पिकर प्रयोग गर्ने।" + "अनुप्रयोगलाई ग्लोबल अडियो सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ, जस्तै आवाजको मात्रा र आउटपुटको लागि कुन स्पिकर प्रयोग गर्ने।" "अडियो रेकर्ड गर्नुहोस्" "अनुप्रयोगलाई माइक्रोफोनको साथ अडियो रेकर्ड गर्न अनुमति दिन्छ। यस अनुमतिले तपाईंको पुष्टिकरण बिना कुनै पनि समयमा अडियो रेकर्ड गर्न अनुमति दिन्छ।" "SIM मा आदेशहरू पठाउन दिनुहोस्" @@ -970,7 +970,7 @@ "पूर्ण कारबाही" - "साथमा खोल्नुहोस्" + "निम्नमार्फत खोल्नुहोस्" @@ -1370,7 +1370,7 @@ "ब्राउजर सुरु गर्ने हो?" "कल स्वीकार गर्नुहुन्छ?" "सधैँ" - "एउटा मात्र" + "एक पटक मात्र" "%1$s कार्य प्रोफाइल समर्थन गर्दैन" "ट्याब्लेट" "TV" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 54d16b03c76..4c84b1848a1 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -179,10 +179,10 @@ "Przez nieznany podmiot zewnętrzny" "Przez administratora Twojego profilu do pracy" "Przez %s" - "Usunięto profil do pracy" - "Profil do pracy został usunięty z powodu braku aplikacji administracyjnej." - "Brakuje aplikacji administracyjnej profilu do pracy lub jest ona uszkodzona. Z tego powodu Twój profil do pracy i związane z nim dane zostały usunięte. Skontaktuj się ze swoim administratorem, by uzyskać pomoc." - "Twój profil do pracy nie jest już dostępny na tym urządzeniu." + "Usunięto profil służbowy" + "Profil służbowy został usunięty z powodu braku aplikacji administracyjnej." + "Brakuje aplikacji administracyjnej profilu do pracy lub jest ona uszkodzona. Z tego powodu Twój profil służbowy i związane z nim dane zostały usunięte. Skontaktuj się ze swoim administratorem, by uzyskać pomoc." + "Twój profil służbowy nie jest już dostępny na tym urządzeniu." "Twoje urządzenie zostanie wyczyszczone" "Aplikacja administracyjna nie ma wszystkich składników lub jest uszkodzona i nie można jej użyć. Twoje urządzenie zostanie teraz wyczyszczone. Skontaktuj się ze swoim administratorem, aby uzyskać pomoc." "Ja" @@ -248,7 +248,7 @@ "Tryb awaryjny" "System Android" "Włącz profil osobisty" - "Włącz profil do pracy" + "Włącz profil służbowy" "Kontakty" "dostęp do kontaktów" "Lokalizacja" @@ -1694,7 +1694,7 @@ "Żądanie SS zostało zmienione na żądanie DIAL." "Żądanie SS zostało zmienione na żądanie USSD." "Żądanie SS zostało zmienione na nowe żądanie SS." - "Profil do pracy" + "Profil służbowy" "Przycisk rozwijania" "przełącz rozwijanie" "Port peryferyjny USB na urządzeniu z Androidem" @@ -1723,14 +1723,14 @@ "Wszystkie kraje" "Szukaj" "Tryb pracy jest WYŁĄCZONY" - "Włącz profil do pracy, w tym aplikacje, synchronizację w tle i inne funkcje." + "Włącz profil służbowy, w tym aplikacje, synchronizację w tle i inne funkcje." "Włącz" "Masz nowe wiadomości" "Otwórz aplikację do SMS-ów, by wyświetlić wiadomość" "Niektóre funkcje mogą być niedostępne" "Kliknij, by odblokować" "Dane użytkownika zablokowane" - "Profil do pracy zablokowany" + "Profil służbowy zablokowany" "Kliknij, by odblokować profil" "Połączono z: %1$s" "Dotknij, by wyświetlić pliki" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 110aa4a6976..4fbe085734f 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -256,7 +256,7 @@ "Microfone" "gravar áudio" "Câmara" - "tirar fotografias e gravar vídeos" + "tirar fotos e gravar vídeos" "Telemóvel" "fazer e gerir chamadas" "Sensores de corpo" @@ -367,8 +367,8 @@ "Permite que a aplicação grave áudio com o microfone. Esta autorização permite que a aplicação grave áudio em qualquer altura sem a confirmação do utilizador." "enviar comandos para o SIM" "Permite que a aplicação envie comandos para o SIM. Esta ação é muito perigosa." - "tirar fotografias e vídeos" - "Permite que a aplicação tire fotografias e grave vídeos com a câmara. Esta autorização permite que a aplicação utilize a câmara sem a sua confirmação em qualquer altura." + "tirar fotos e vídeos" + "Permite que a aplicação tire fotos e grave vídeos com a câmara. Esta autorização permite que a aplicação utilize a câmara sem a sua confirmação em qualquer altura." "controlar vibração" "Permite à aplicação controlar o vibrador." "marcar números de telefone diretamente" @@ -702,12 +702,12 @@ "Consulte o Manual de utilizador ou contacte a Assistência a Clientes." "O cartão SIM está bloqueado." "A desbloquear cartão SIM..." - "Desenhou a sua sequência de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." + "Desenhou a sua padrão de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." "Escreveu a sua palavra-passe incorretamente %1$d vezes. \n\n Tente novamente dentro de %2$d segundos." "Escreveu o seu número PIN incorretamente %1$d vezes. \n\n Tente novamente dentro de %2$d segundos." - "Desenhou a sequência de desbloqueio incorretamente %1$d vezes. Após outras %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de %3$d segundos." - "O utilizador desenhou incorretamente a sua sequência de desbloqueio %1$d vezes. Após mais %2$d tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através do seu início de sessão Google.\n\n Tente novamente dentro de %3$d segundos." - "Desenhou a sequência de desbloqueio incorretamente %1$d vezes. Após outras %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de %3$d segundos." + "Desenhou o padrão de desbloqueio incorretamente %1$d vezes. Após outras %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de %3$d segundos." + "O utilizador desenhou incorretamente a sua padrão de desbloqueio %1$d vezes. Após mais %2$d tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através do seu início de sessão Google.\n\n Tente novamente dentro de %3$d segundos." + "Desenhou o padrão de desbloqueio incorretamente %1$d vezes. Após outras %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de %3$d segundos." "Tentou desbloquear o tablet %1$d vezes de forma incorreta. Após mais %2$d tentativa(s) sem êxito, as definições de origem do tablet serão repostas e todos os dados de utilizador serão perdidos." "O utilizador tentou desbloquear incorretamente a TV %1$d vezes. Após mais %2$d tentativas sem êxito, a TV é reposta para as predefinições de fábrica e todos os dados do utilizador são perdidos." "Tentou desbloquear o telemóvel %1$d vezes de forma incorreta. Após mais %2$d tentativa(s) sem êxito, as definições de origem do telemóvel serão repostas e todos os dados de utilizador serão perdidos." @@ -1419,16 +1419,16 @@ "A verificar a conta…" "Escreveu o PIN incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." "Escreveu a palavra-passe incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." - "Desenhou a sua sequência de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." + "Desenhou a sua padrão de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." "Tentou desbloquear o tablet %1$d vezes de forma incorreta. Depois de mais %2$d tentativas sem êxito, as definições de origem do telemóvel serão repostas e todos os dados do utilizador serão perdidos." "O utilizador tentou desbloquear incorretamente a TV %1$d vezes. Após mais %2$d tentativas sem êxito, a TV é reposta para as predefinições de fábrica e todos os dados do utilizador são perdidos." "Tentou desbloquear o telemóvel %1$d vezes de forma incorreta. Depois de mais %2$d tentativas sem êxito, as definições de origem do telemóvel serão repostas e todos os dados do utilizador serão perdidos." "Tentou desbloquear o tablet %d vezes de forma incorreta, pelo que será reposta a predefinição de fábrica." "O utilizador tentou desbloquear incorretamente a TV %d vezes. A TV será agora reposta para as predefinições de fábrica." "Tentou desbloquear o telemóvel %d vezes de forma incorreta, pelo que será reposta a predefinição de fábrica." - "Desenhou a sequência de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." - "O utilizador desenhou incorretamente a sua sequência de desbloqueio %1$d vezes. Após mais %2$d tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." - "Desenhou a sequência de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." + "Desenhou o padrão de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." + "O utilizador desenhou incorretamente a sua padrão de desbloqueio %1$d vezes. Após mais %2$d tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." + "Desenhou o padrão de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." " - " "Remover" "Aumentar o volume acima do nível recomendado?\n\nOuvir com um volume elevado durante longos períodos poderá ser prejudicial para a sua audição." @@ -1563,7 +1563,7 @@ "Ecrã fixo" "Ecrã solto" "Pedir PIN antes de soltar" - "Pedir sequência de desbloqueio antes de soltar" + "Pedir padrão de desbloqueio antes de soltar" "Pedir palavra-passe antes de soltar" "Instalado pelo gestor" "Atualizado pelo gestor" diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 2ba93ac25eb..7434b2ee537 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -980,7 +980,7 @@ "Нема довољно меморијског простора за систем. Уверите се да имате 250 MB слободног простора и поново покрените." "Апликација %1$s је покренута" "Додирните за више информација или заустављање апликације." - "Потврди" + "У реду" "Откажи" "Потврди" "Откажи" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 9f2069615d7..1019913dace 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1054,7 +1054,7 @@ "Додаток %1$s не відповідає" "Процес \"%1$s\" не відповідає" "OK" - "Відгук" + "Звіт" "Чекати" "Сторінка не відповідає.\n\nЗакрити її?" "Програму переадресовано" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 1af8d26a3a5..fcc1be2c755 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -318,7 +318,7 @@ "Cho phép ứng dụng làm cho các phần của ứng dụng trở nên ổn định trong bộ nhớ. Việc này có thể hạn chế bộ nhớ đối với các ứng dụng khác đang làm chậm TV." "Cho phép ứng dụng tạo sự đồng nhất cho các phần của mình trong bộ nhớ. Việc này có thể hạn chế bộ nhớ đối với các ứng dụng khác đang làm chậm điện thoại." "đo dung lượng lưu trữ ứng dụng" - "Cho phép ứng dụng truy xuất mã, dữ liệu và kích thước bộ nhớ cache của chính ứng dụng" + "Cho phép ứng dụng truy xuất mã, dữ liệu và kích thước bộ nhớ đệm của chính ứng dụng" "sửa đổi cài đặt hệ thống" "Cho phép ứng dụng sửa đổi dữ liệu cài đặt của hệ thống. Ứng dụng độc hại có thể làm hỏng cấu hình hệ thống của bạn." "chạy khi khởi động" diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 99742733cea..6fb80935435 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -838,7 +838,7 @@ "年份:%s" "天" "天" - "小时" + "点" "小时" "分钟" "分钟" @@ -1431,7 +1431,7 @@ "您已连续 %1$d 次画错解锁图案。如果再尝试 %2$d 次后仍不成功,系统就会要求您使用自己的电子邮件帐号解锁手机。\n\n请在 %3$d 秒后重试。" " — " "删除" - "要将音量调高到推荐水平以上吗?\n\n长时间保持高音量可能会损伤听力。" + "要将音量调高到建议的音量以上吗?\n\n长时间保持高音量可能会损伤听力。" "持续按住双指即可启用辅助功能。" "辅助功能已启用。" "已取消辅助功能。" diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 615774e8621..84eaf3c3b6c 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -838,7 +838,7 @@ "於 %s 年" "天" "天" - "小時" + "點" "小時" "分鐘" "分鐘" -- GitLab From 27be1e9ba40cbeb4098ecede645eb5ecefa6a6b2 Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Mon, 19 Feb 2018 15:39:15 +0000 Subject: [PATCH 058/386] Add flag to AMS.startInstrumentation() to disable hidden API checks Some tests need to use hidden APIs to check the internal state of the framework. For those special use cases, we add a new flag to ActivityManagerService.startInstrumentation that enables to start instrumented processes without hidden API enforcement. Individual test harnesses can change their Am command to request the exemption. Bug: 64382372 Test: adb shell am instrument --no-hidden-api-checks adb logcat | grep 'Accessing hidden' Merged-In: I1d734a95423fae90dae63ff09d5f606495830905 Change-Id: Ifbb0d19d95737a9f601b11e20352cdc11f0ca5b6 --- cmds/am/src/com/android/commands/am/Am.java | 2 ++ .../com/android/commands/am/Instrument.java | 8 ++++- .../server/am/ActivityManagerService.java | 30 ++++++++++++++++--- .../am/ActivityManagerShellCommand.java | 3 +- 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java index ab075ee0e9f..238cb65144a 100644 --- a/cmds/am/src/com/android/commands/am/Am.java +++ b/cmds/am/src/com/android/commands/am/Am.java @@ -167,6 +167,8 @@ public class Am extends BaseCommand { } else if (opt.equals("--no_window_animation") || opt.equals("--no-window-animation")) { instrument.noWindowAnimation = true; + } else if (opt.equals("--no-hidden-api-checks")) { + instrument.disableHiddenApiChecks = true; } else if (opt.equals("--user")) { instrument.userId = parseUserArg(nextArgRequired()); } else if (opt.equals("--abi")) { diff --git a/cmds/am/src/com/android/commands/am/Instrument.java b/cmds/am/src/com/android/commands/am/Instrument.java index b69ef1c2fca..432e8903ab2 100644 --- a/cmds/am/src/com/android/commands/am/Instrument.java +++ b/cmds/am/src/com/android/commands/am/Instrument.java @@ -52,12 +52,17 @@ public class Instrument { public boolean rawMode = false; public boolean proto = false; public boolean noWindowAnimation = false; + public boolean disableHiddenApiChecks = false; public String abi = null; public int userId = UserHandle.USER_CURRENT; public Bundle args = new Bundle(); // Required public String componentNameArg; + // Disable hidden API checks for the newly started instrumentation. + // Must be kept in sync with ActivityManagerService. + private static final int INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS = 1 << 0; + /** * Construct the instrument command runner. */ @@ -416,7 +421,8 @@ public class Instrument { } // Start the instrumentation - if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher, connection, userId, + int flags = disableHiddenApiChecks ? INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS : 0; + if (!mAm.startInstrumentation(cn, profileFile, flags, args, watcher, connection, userId, abi)) { throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString()); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 47000578801..6c60b74bbd2 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -533,6 +533,10 @@ public class ActivityManagerService extends IActivityManager.Stub // How long we wait until we timeout on key dispatching during instrumentation. static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT = 60*1000; + // Disable hidden API checks for the newly started instrumentation. + // Must be kept in sync with Am. + private static final int INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS = 1 << 0; + // How long to wait in getAssistContextExtras for the activity and foreground services // to respond with the result. static final int PENDING_ASSIST_EXTRAS_TIMEOUT = 500; @@ -3813,6 +3817,13 @@ public class ActivityManagerService extends IActivityManager.Stub private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) { + startProcessLocked(app, hostingType, hostingNameStr, false /* disableHiddenApiChecks */, + null /* abiOverride */, null /* entryPoint */, null /* entryPointArgs */); + } + + private final void startProcessLocked(ProcessRecord app, String hostingType, + String hostingNameStr, boolean disableHiddenApiChecks, String abiOverride, + String entryPoint, String[] entryPointArgs) { long startTime = SystemClock.elapsedRealtime(); if (app.pid > 0 && app.pid != MY_PID) { checkTime(startTime, "startProcess: removing from pids map"); @@ -3933,7 +3944,9 @@ public class ActivityManagerService extends IActivityManager.Stub runtimeFlags |= Zygote.ONLY_USE_SYSTEM_OAT_FILES; } - if (!app.info.isAllowedToUseHiddenApi() && !mHiddenApiBlacklist.isDisabled()) { + if (!app.info.isAllowedToUseHiddenApi() && + !disableHiddenApiChecks && + !mHiddenApiBlacklist.isDisabled()) { // This app is not allowed to use undocumented and private APIs, or blacklisting is // enabled. Set up its runtime with the appropriate flag. runtimeFlags |= Zygote.ENABLE_HIDDEN_API_CHECKS; @@ -12456,6 +12469,12 @@ public class ActivityManagerService extends IActivityManager.Stub final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated, String abiOverride) { + return addAppLocked(info, customProcess, isolated, false /* disableHiddenApiChecks */, + abiOverride); + } + + final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated, + boolean disableHiddenApiChecks, String abiOverride) { ProcessRecord app; if (!isolated) { app = getProcessRecordLocked(customProcess != null ? customProcess : info.processName, @@ -12487,8 +12506,8 @@ public class ActivityManagerService extends IActivityManager.Stub if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) { mPersistentStartingProcesses.add(app); startProcessLocked(app, "added application", - customProcess != null ? customProcess : app.processName, abiOverride, - null /* entryPoint */, null /* entryPointArgs */); + customProcess != null ? customProcess : app.processName, disableHiddenApiChecks, + abiOverride, null /* entryPoint */, null /* entryPointArgs */); } return app; @@ -20153,7 +20172,10 @@ public class ActivityManagerService extends IActivityManager.Stub // Instrumentation can kill and relaunch even persistent processes forceStopPackageLocked(ii.targetPackage, -1, true, false, true, true, false, userId, "start instr"); - ProcessRecord app = addAppLocked(ai, defProcess, false, abiOverride); + boolean disableHiddenApiChecks = + (flags & INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS) != 0; + ProcessRecord app = addAppLocked(ai, defProcess, false, disableHiddenApiChecks, + abiOverride); app.instr = activeInstr; activeInstr.mFinished = false; activeInstr.mRunningProcesses.add(app); diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 59c0ed1393e..254f4038538 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -2729,7 +2729,7 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.println(" specified then send to all users."); pw.println(" --receiver-permission : Require receiver to hold permission."); pw.println(" instrument [-r] [-e ] [-p ] [-w]"); - pw.println(" [--user | current]"); + pw.println(" [--user | current] [--no-hidden-api-checks]"); pw.println(" [--no-window-animation] [--abi ] "); pw.println(" Start an Instrumentation. Typically this target is in the"); pw.println(" form / or only if there"); @@ -2744,6 +2744,7 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.println(" test runners."); pw.println(" --user | current: Specify user instrumentation runs in;"); pw.println(" current user if not specified."); + pw.println(" --no-hidden-api-checks: disable restrictions on use of hidden API."); pw.println(" --no-window-animation: turn off window animations while running."); pw.println(" --abi : Launch the instrumented process with the selected ABI."); pw.println(" This assumes that the process supports the selected ABI."); -- GitLab From 2f05bb343ea56c2b0636e75c8c415d170080fa9b Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Mon, 19 Feb 2018 16:42:27 +0100 Subject: [PATCH 059/386] GlobalActions: Fix scrim with display cutouts Fixes an issue where the GlobalActions scrim would not extend under the display cutout. Change-Id: I307ccf400b6db5a5569546cfc2fb64cd64ed2e61 Fixes: 73483285 Test: Enable display cutout; long press power; verify scrim extends under the cutout (and over the statusbar) --- .../android/systemui/globalactions/GlobalActionsDialog.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 259bff28d45..c4c1ba703a9 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -14,6 +14,8 @@ package com.android.systemui.globalactions; +import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN; @@ -245,6 +247,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, } else { WindowManager.LayoutParams attrs = mDialog.getWindow().getAttributes(); attrs.setTitle("ActionsDialog"); + attrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; mDialog.getWindow().setAttributes(attrs); mDialog.show(); mWindowManagerFuncs.onGlobalActionsShown(); -- GitLab From a4513689c8852488c0657520317a46e96c4b55a0 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Feb 2018 08:07:44 -0800 Subject: [PATCH 060/386] Import translations. DO NOT MERGE Change-Id: I1b9d68a390483f6259a7eb05a2e337af617896b6 Auto-generated-cl: translation import --- packages/Keyguard/res/values-pl/strings.xml | 8 ++++---- packages/Keyguard/res/values-pt-rPT/strings.xml | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/Keyguard/res/values-pl/strings.xml b/packages/Keyguard/res/values-pl/strings.xml index f0980da7d08..aeea08c867b 100644 --- a/packages/Keyguard/res/values-pl/strings.xml +++ b/packages/Keyguard/res/values-pl/strings.xml @@ -83,10 +83,10 @@ "Próbowałeś %1$d razy nieprawidłowo odblokować telefon. Po kolejnych %2$d nieudanych próbach, ten użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich jego danych." "Próbowałeś %d razy nieprawidłowo odblokować tablet. Ten użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich jego danych." "Próbowałeś %d razy nieprawidłowo odblokować telefon. Ten użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich jego danych." - "Próbowałeś %1$d razy nieprawidłowo odblokować tablet. Po kolejnych %2$d nieudanych próbach profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu." - "Próbowałeś %1$d razy nieprawidłowo odblokować telefon. Po kolejnych %2$d nieudanych próbach profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu." - "Próbowałeś %d razy nieprawidłowo odblokować tablet. Profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu." - "Próbowałeś %d razy nieprawidłowo odblokować telefon. Profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu." + "Próbowałeś %1$d razy nieprawidłowo odblokować tablet. Po kolejnych %2$d nieudanych próbach profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu." + "Próbowałeś %1$d razy nieprawidłowo odblokować telefon. Po kolejnych %2$d nieudanych próbach profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu." + "Próbowałeś %d razy nieprawidłowo odblokować tablet. Profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu." + "Próbowałeś %d razy nieprawidłowo odblokować telefon. Profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu." "Po raz %1$d nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych %2$d nieudanych próbach konieczne będzie odblokowanie tabletu przy użyciu danych logowania na konto Google.\n\n Spróbuj ponownie za %3$d s." "Po raz %1$d nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych %2$d nieudanych próbach konieczne będzie odblokowanie telefonu przy użyciu danych logowania na konto Google.\n\n Spróbuj ponownie za %3$d s." "Nieprawidłowy kod PIN karty SIM. Musisz teraz skontaktować się z operatorem, by odblokował Twoje urządzenie." diff --git a/packages/Keyguard/res/values-pt-rPT/strings.xml b/packages/Keyguard/res/values-pt-rPT/strings.xml index dcd332723a9..2ed242fa58a 100644 --- a/packages/Keyguard/res/values-pt-rPT/strings.xml +++ b/packages/Keyguard/res/values-pt-rPT/strings.xml @@ -74,7 +74,7 @@ "Demasiadas tentativas para desenhar sequência" "Escreveu o PIN incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." "Escreveu a palavra-passe incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." - "Desenhou a sua sequência de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." + "Desenhou a sua padrão de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." "Tentou desbloquear incorretamente o tablet %1$d vezes. Após mais %2$d tentativas sem êxito, este telemóvel será reposto, o que eliminará todos os seus dados." "Tentou desbloquear incorretamente o telemóvel %1$d vezes. Após mais %2$d tentativas sem êxito, este telemóvel será reposto, o que eliminará todos os seus dados." "Tentou desbloquear incorretamente o tablet %d vezes. Este telemóvel será reposto, o que eliminará todos os seus dados." @@ -87,8 +87,8 @@ "Tentou desbloquear incorretamente o telemóvel %1$d vezes. Após mais %2$d tentativas sem êxito, o perfil de trabalho será removido, o que eliminará todos os dados do perfil." "Tentou desbloquear incorretamente o tablet %d vezes. O perfil de trabalho será removido, o que eliminará todos os dados do perfil." "Tentou desbloquear incorretamente o telemóvel %d vezes. O perfil de trabalho será removido, o que eliminará todos os dados do perfil." - "Desenhou a sequência de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." - "Desenhou a sequência de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." + "Desenhou o padrão de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." + "Desenhou o padrão de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." "Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo." Código PIN do cartão SIM incorreto. Tem mais %d tentativas. -- GitLab From a35d1b194696ff73970b640446b2391711ea6030 Mon Sep 17 00:00:00 2001 From: Insun Kang Date: Mon, 19 Feb 2018 18:55:28 +0900 Subject: [PATCH 061/386] VideoView2: Remove redundant listeners Bug: 73598418 Test: build Change-Id: Ibc79fde985a98c2323c2c63feef874a90e084652 --- core/java/android/widget/VideoView2.java | 114 ++---------------- .../media/update/VideoView2Provider.java | 16 +-- 2 files changed, 20 insertions(+), 110 deletions(-) diff --git a/core/java/android/widget/VideoView2.java b/core/java/android/widget/VideoView2.java index cb68bc30c0d..69c1fb62162 100644 --- a/core/java/android/widget/VideoView2.java +++ b/core/java/android/widget/VideoView2.java @@ -34,6 +34,8 @@ import android.os.Bundle; import android.util.AttributeSet; import android.view.View; +import com.android.internal.annotations.VisibleForTesting; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; @@ -343,72 +345,32 @@ public class VideoView2 extends ViewGroupHelper { mProvider.setCustomActions_impl(actionList, executor, listener); } - /** - * Registers a callback to be invoked when the media file is loaded and ready to go. - * - * @param executor executor to run callbacks on. - * @param l the callback that will be run. - */ - public void setOnPreparedListener(Executor executor, OnPreparedListener l) { - mProvider.setOnPreparedListener_impl(executor, l); - } - - /** - * Registers a callback to be invoked when the end of a media file has been reached during - * playback. - * - * @param executor executor to run callbacks on. - * @param l the callback that will be run. - */ - public void setOnCompletionListener(Executor executor, OnCompletionListener l) { - mProvider.setOnCompletionListener_impl(executor, l); - } - - /** - * Registers a callback to be invoked when an error occurs during playback or setup. If no - * listener is specified, or if the listener returned false, VideoView2 will inform the user of - * any errors. - * - * @param executor executor to run callbacks on. - * @param l The callback that will be run - */ - public void setOnErrorListener(Executor executor, OnErrorListener l) { - mProvider.setOnErrorListener_impl(executor, l); - } - - /** - * Registers a callback to be invoked when an informational event occurs during playback or - * setup. - * - * @param executor executor to run callbacks on. - * @param l The callback that will be run - */ - public void setOnInfoListener(Executor executor, OnInfoListener l) { - mProvider.setOnInfoListener_impl(executor, l); - } - /** * Registers a callback to be invoked when a view type change is done. * {@see #setViewType(int)} - * @param executor executor to run callbacks on. * @param l The callback that will be run + * + * @hide */ - public void setOnViewTypeChangedListener(Executor executor, OnViewTypeChangedListener l) { - mProvider.setOnViewTypeChangedListener_impl(executor, l); + @VisibleForTesting + public void setOnViewTypeChangedListener(OnViewTypeChangedListener l) { + mProvider.setOnViewTypeChangedListener_impl(l); } /** * Registers a callback to be invoked when the fullscreen mode should be changed. - * @param executor executor to run callbacks on. * @param l The callback that will be run */ - public void setFullScreenRequestListener(Executor executor, OnFullScreenRequestListener l) { - mProvider.setFullScreenRequestListener_impl(executor, l); + public void setFullScreenRequestListener(OnFullScreenRequestListener l) { + mProvider.setFullScreenRequestListener_impl(l); } /** * Interface definition of a callback to be invoked when the view type has been changed. + * + * @hide */ + @VisibleForTesting public interface OnViewTypeChangedListener { /** * Called when the view type has been changed. @@ -423,58 +385,6 @@ public class VideoView2 extends ViewGroupHelper { void onViewTypeChanged(View view, @ViewType int viewType); } - /** - * Interface definition of a callback to be invoked when the media source is ready for playback. - */ - public interface OnPreparedListener { - /** - * Called when the media file is ready for playback. - */ - void onPrepared(View view); - } - - /** - * Interface definition for a callback to be invoked when playback of a media source has - * completed. - */ - public interface OnCompletionListener { - /** - * Called when the end of a media source is reached during playback. - */ - void onCompletion(View view); - } - - /** - * Interface definition of a callback to be invoked when there has been an error during an - * asynchronous operation. - */ - public interface OnErrorListener { - // TODO: Redefine error codes. - /** - * Called to indicate an error. - * @param what the type of error that has occurred - * @param extra an extra code, specific to the error. - * @return true if the method handled the error, false if it didn't. - * @see MediaPlayer#OnErrorListener - */ - boolean onError(View view, int what, int extra); - } - - /** - * Interface definition of a callback to be invoked to communicate some info and/or warning - * about the media or its playback. - */ - public interface OnInfoListener { - /** - * Called to indicate an info or a warning. - * @param what the type of info or warning. - * @param extra an extra code, specific to the info. - * - * @see MediaPlayer#OnInfoListener - */ - void onInfo(View view, int what, int extra); - } - /** * Interface definition of a callback to be invoked to inform the fullscreen mode is changed. * Application should handle the fullscreen mode accordingly. diff --git a/media/java/android/media/update/VideoView2Provider.java b/media/java/android/media/update/VideoView2Provider.java index 7f9ecdd5115..21cc61ff245 100644 --- a/media/java/android/media/update/VideoView2Provider.java +++ b/media/java/android/media/update/VideoView2Provider.java @@ -27,6 +27,8 @@ import android.util.AttributeSet; import android.widget.MediaControlView2; import android.widget.VideoView2; +import com.android.internal.annotations.VisibleForTesting; + import java.util.List; import java.util.Map; import java.util.concurrent.Executor; @@ -70,12 +72,10 @@ public interface VideoView2Provider extends ViewGroupProvider { int getViewType_impl(); void setCustomActions_impl(List actionList, Executor executor, VideoView2.OnCustomActionListener listener); - void setOnPreparedListener_impl(Executor executor, VideoView2.OnPreparedListener l); - void setOnCompletionListener_impl(Executor executor, VideoView2.OnCompletionListener l); - void setOnErrorListener_impl(Executor executor, VideoView2.OnErrorListener l); - void setOnInfoListener_impl(Executor executor, VideoView2.OnInfoListener l); - void setOnViewTypeChangedListener_impl( - Executor executor, VideoView2.OnViewTypeChangedListener l); - void setFullScreenRequestListener_impl( - Executor executor, VideoView2.OnFullScreenRequestListener l); + /** + * @hide + */ + @VisibleForTesting + void setOnViewTypeChangedListener_impl(VideoView2.OnViewTypeChangedListener l); + void setFullScreenRequestListener_impl(VideoView2.OnFullScreenRequestListener l); } -- GitLab From caffa7789c80108c4f2c230c0a26bd8d8a549ec8 Mon Sep 17 00:00:00 2001 From: Benjamin Franz Date: Mon, 5 Feb 2018 16:36:10 +0000 Subject: [PATCH 062/386] Update lock task features name and javadoc Remove reference to recent and replace by overview. Also throw an IAE if recents is enabled without home. Also address API council feedback for ActivityOption.setLockTaskMode Bug: 72807036 Bug: 72799389 Bug: 71790952 Bug: 71866618 Test: atest FrameworksServicesTests:DevicePolicyManagerTest Change-Id: I70bed3b46137870e6bf0af5bf7f0846dc51f91ab --- api/current.txt | 4 +-- core/java/android/app/ActivityOptions.java | 4 +-- .../app/admin/DevicePolicyManager.java | 12 +++++--- .../am/ActivityManagerShellCommand.java | 3 +- .../android/server/am/LockTaskController.java | 5 ++-- .../DevicePolicyManagerService.java | 9 ++++++ .../devicepolicy/DevicePolicyManagerTest.java | 30 +++++++++++++++---- 7 files changed, 48 insertions(+), 19 deletions(-) diff --git a/api/current.txt b/api/current.txt index df18f10243e..df6c244a248 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4070,7 +4070,7 @@ package android.app { method public android.app.ActivityOptions setAppVerificationBundle(android.os.Bundle); method public android.app.ActivityOptions setLaunchBounds(android.graphics.Rect); method public android.app.ActivityOptions setLaunchDisplayId(int); - method public android.app.ActivityOptions setLockTaskMode(boolean); + method public android.app.ActivityOptions setLockTaskEnabled(boolean); method public android.os.Bundle toBundle(); method public void update(android.app.ActivityOptions); field public static final java.lang.String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time"; @@ -6677,7 +6677,7 @@ package android.app.admin { field public static final int LOCK_TASK_FEATURE_KEYGUARD = 32; // 0x20 field public static final int LOCK_TASK_FEATURE_NONE = 0; // 0x0 field public static final int LOCK_TASK_FEATURE_NOTIFICATIONS = 2; // 0x2 - field public static final int LOCK_TASK_FEATURE_RECENTS = 8; // 0x8 + field public static final int LOCK_TASK_FEATURE_OVERVIEW = 8; // 0x8 field public static final int LOCK_TASK_FEATURE_SYSTEM_INFO = 1; // 0x1 field public static final int MAKE_USER_EPHEMERAL = 2; // 0x2 field public static final java.lang.String MIME_TYPE_PROVISIONING_NFC = "application/com.android.managedprovisioning"; diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index d5430f05d65..09dcbf21345 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -164,7 +164,7 @@ public class ActivityOptions { /** * Whether the activity should be launched into LockTask mode. - * @see #setLockTaskMode(boolean) + * @see #setLockTaskEnabled(boolean) */ private static final String KEY_LOCK_TASK_MODE = "android:activity.lockTaskMode"; @@ -1148,7 +1148,7 @@ public class ActivityOptions { * @see Activity#startLockTask() * @see android.app.admin.DevicePolicyManager#setLockTaskPackages(ComponentName, String[]) */ - public ActivityOptions setLockTaskMode(boolean lockTaskMode) { + public ActivityOptions setLockTaskEnabled(boolean lockTaskMode) { mLockTaskMode = lockTaskMode; return this; } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index b29644bcf32..c40fa8fa945 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -1642,11 +1642,15 @@ public class DevicePolicyManager { public static final int LOCK_TASK_FEATURE_HOME = 1 << 2; /** - * Enable the Recents button and the Recents screen during LockTask mode. + * Enable the Overview button and the Overview screen during LockTask mode. This feature flag + * can only be used in combination with {@link #LOCK_TASK_FEATURE_HOME}, and + * {@link #setLockTaskFeatures(ComponentName, int)} will throw an + * {@link IllegalArgumentException} if this feature flag is defined without + * {@link #LOCK_TASK_FEATURE_HOME}. * * @see #setLockTaskFeatures(ComponentName, int) */ - public static final int LOCK_TASK_FEATURE_RECENTS = 1 << 3; + public static final int LOCK_TASK_FEATURE_OVERVIEW = 1 << 3; /** * Enable the global actions dialog during LockTask mode. This is the dialog that shows up when @@ -1678,7 +1682,7 @@ public class DevicePolicyManager { LOCK_TASK_FEATURE_SYSTEM_INFO, LOCK_TASK_FEATURE_NOTIFICATIONS, LOCK_TASK_FEATURE_HOME, - LOCK_TASK_FEATURE_RECENTS, + LOCK_TASK_FEATURE_OVERVIEW, LOCK_TASK_FEATURE_GLOBAL_ACTIONS, LOCK_TASK_FEATURE_KEYGUARD }) @@ -7189,7 +7193,7 @@ public class DevicePolicyManager { * {@link #LOCK_TASK_FEATURE_SYSTEM_INFO}, * {@link #LOCK_TASK_FEATURE_NOTIFICATIONS}, * {@link #LOCK_TASK_FEATURE_HOME}, - * {@link #LOCK_TASK_FEATURE_RECENTS}, + * {@link #LOCK_TASK_FEATURE_OVERVIEW}, * {@link #LOCK_TASK_FEATURE_GLOBAL_ACTIONS}, * {@link #LOCK_TASK_FEATURE_KEYGUARD} * @throws SecurityException if {@code admin} is not the device owner, the profile owner of an diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index fa0df562b6c..dadd86960b8 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -442,12 +442,11 @@ final class ActivityManagerShellCommand extends ShellCommand { options.setTaskOverlay(true, true /* canResume */); } } - android.util.Log.d("bfranz", "I was here: " + mIsLockTask); if (mIsLockTask) { if (options == null) { options = ActivityOptions.makeBasic(); } - options.setLockTaskMode(true); + options.setLockTaskEnabled(true); } if (mWaitOption) { result = mInterface.startActivityAndWait(null, null, intent, mimeType, diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java index e5762d29492..af99111e4bf 100644 --- a/services/core/java/com/android/server/am/LockTaskController.java +++ b/services/core/java/com/android/server/am/LockTaskController.java @@ -38,7 +38,6 @@ import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_PINNABLE; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; @@ -114,7 +113,7 @@ public class LockTaskController { STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_HOME, new Pair<>(StatusBarManager.DISABLE_HOME, StatusBarManager.DISABLE2_NONE)); - STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS, + STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW, new Pair<>(StatusBarManager.DISABLE_RECENT, StatusBarManager.DISABLE2_NONE)); STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_GLOBAL_ACTIONS, @@ -308,7 +307,7 @@ public class LockTaskController { private boolean isRecentsAllowed(int userId) { return (getLockTaskFeaturesForUser(userId) - & DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS) != 0; + & DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW) != 0; } private boolean isKeyguardAllowed(int userId) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 875334413b5..29d5d54e497 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -50,6 +50,8 @@ import static android.app.admin.DevicePolicyManager.ID_TYPE_IMEI; import static android.app.admin.DevicePolicyManager.ID_TYPE_MEID; import static android.app.admin.DevicePolicyManager.ID_TYPE_SERIAL; import static android.app.admin.DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED; +import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_HOME; +import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; import static android.app.admin.DevicePolicyManager.PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER; @@ -9817,6 +9819,13 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public void setLockTaskFeatures(ComponentName who, int flags) { Preconditions.checkNotNull(who, "ComponentName is null"); + + // Throw if Overview is used without Home. + boolean hasHome = (flags & LOCK_TASK_FEATURE_HOME) != 0; + boolean hasOverview = (flags & LOCK_TASK_FEATURE_OVERVIEW) != 0; + Preconditions.checkArgument(hasHome || !hasOverview, + "Cannot use LOCK_TASK_FEATURE_OVERVIEW without LOCK_TASK_FEATURE_HOME"); + final int userHandle = mInjector.userHandleGetCallingUserId(); synchronized (this) { enforceCanCallLockTaskLocked(who); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 00a85a53953..f58766f3939 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -94,7 +94,6 @@ import com.android.server.pm.UserRestrictionsUtils; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; -import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -3765,19 +3764,22 @@ public class DevicePolicyManagerTest extends DpmTestBase { // The DO can still set lock task packages final String[] doPackages = {"doPackage1", "doPackage2"}; final int flags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS - | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS; + | DevicePolicyManager.LOCK_TASK_FEATURE_HOME + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; verifyCanSetLockTask(DpmMockContext.CALLER_SYSTEM_USER_UID, UserHandle.USER_SYSTEM, admin1, doPackages, flags); final String[] secondaryPoPackages = {"secondaryPoPackage1", "secondaryPoPackage2"}; final int secondaryPoFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS - | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS; + | DevicePolicyManager.LOCK_TASK_FEATURE_HOME + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; verifyCanNotSetLockTask(DpmMockContext.CALLER_UID, admin3, secondaryPoPackages, secondaryPoFlags); // Managed profile is unaffiliated - shouldn't be able to setLockTaskPackages. mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; final String[] poPackages = {"poPackage1", "poPackage2"}; final int poFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS - | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS; + | DevicePolicyManager.LOCK_TASK_FEATURE_HOME + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; verifyCanNotSetLockTask(MANAGED_PROFILE_ADMIN_UID, adminDifferentPackage, poPackages, poFlags); // Setting same affiliation ids @@ -3820,7 +3822,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { final String[] poPackages = {"poPackage1", "poPackage2"}; final int poFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS - | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS; + | DevicePolicyManager.LOCK_TASK_FEATURE_HOME + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; verifyCanSetLockTask(DpmMockContext.CALLER_UID, DpmMockContext.CALLER_USER_HANDLE, admin1, poPackages, poFlags); @@ -3836,10 +3839,25 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; final String[] mpoPackages = {"poPackage1", "poPackage2"}; final int mpoFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS - | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS; + | DevicePolicyManager.LOCK_TASK_FEATURE_HOME + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; verifyCanNotSetLockTask(MANAGED_PROFILE_ADMIN_UID, adminDifferentPackage, mpoPackages, mpoFlags); } + public void testLockTaskFeatures_IllegalArgumentException() throws Exception { + // Setup a device owner. + mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; + setupDeviceOwner(); + // Lock task policy is updated when loading user data. + verifyLockTaskState(UserHandle.USER_SYSTEM); + + final int flags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; + assertExpectException(IllegalArgumentException.class, + "Cannot use LOCK_TASK_FEATURE_OVERVIEW without LOCK_TASK_FEATURE_HOME", + () -> dpm.setLockTaskFeatures(admin1, flags)); + } + public void testIsDeviceManaged() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); -- GitLab From fb5d1738dd3758a0c8455a51e98f7b670f38388f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Feb 2018 09:16:47 -0800 Subject: [PATCH 063/386] Import translations. DO NOT MERGE Change-Id: I2e31731c8393cbcd58b57cc4092d14626e60af8b Auto-generated-cl: translation import --- packages/SystemUI/res/values-bs-rBA/strings.xml | 14 +++++++------- packages/SystemUI/res/values-ca/strings.xml | 14 +++++++------- packages/SystemUI/res/values-es/strings.xml | 2 +- packages/SystemUI/res/values-ky-rKG/strings.xml | 2 +- packages/SystemUI/res/values-ne-rNP/strings.xml | 14 +++++++------- packages/SystemUI/res/values-pl/strings.xml | 4 ++-- packages/SystemUI/res/values-sv/strings.xml | 2 +- packages/SystemUI/res/values-sw/strings.xml | 2 +- 8 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/SystemUI/res/values-bs-rBA/strings.xml b/packages/SystemUI/res/values-bs-rBA/strings.xml index 3771b3252ef..b712c759f4d 100644 --- a/packages/SystemUI/res/values-bs-rBA/strings.xml +++ b/packages/SystemUI/res/values-bs-rBA/strings.xml @@ -196,13 +196,13 @@ "Uključen način rada u avionu." "Način rada u avionu je isključen." "Način rada u avionu je uključen." - "Opcija Ne ometaj je uključena, čut će se samo prioritetna obavještenja." - "Opcija Ne ometaj je uključena, potpuna tišina." - "Opcija Ne ometaj je uključena, čut će se samo alarmi." + "Način rada Ne ometaj je uključen, čut će se samo prioritetna obavještenja." + "Način rada Ne ometaj je uključen, potpuna tišina." + "Način rada Ne ometaj je uključen, čut će se samo alarmi." "Ne ometaj." - "Opcija Ne ometaj je isključena." - "Opcija Ne ometaj je isključena." - "Opcija Ne ometaj je uključena." + "Način rada Ne ometaj je isključen." + "Način rada Ne ometaj je isključen." + "Način rada Ne ometaj je uključen." "Bluetooth." "Bluetooth isključen." "Bluetooth uključen." @@ -576,7 +576,7 @@ "Prikazati sa kontrolama jačine zvuka" "Ne ometaj" "Prečica za dugmad za Jačinu zvuka" - "Deaktiviraj režim Ne ometaj kada se zvuk pojača" + "Deaktiviraj način rada Ne ometaj kada se zvuk pojača" "Baterija" "Sat" "Slušalice s mikrofonom" diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 949c63db4d3..1a62559d18f 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -35,8 +35,8 @@ "Queda poca bateria" "Queda un %s." "Queda un %s. L\'estalvi de bateria està activat." - "Pujada d\'USB no admesa.\nUtilitza només el carregador proporcionat." - "La pujada per USB no és compatible." + "Càrrega per USB no admesa.\nUtilitza només el carregador proporcionat." + "La càrrega per USB no és compatible." "Fes servir només el carregador proporcionat amb el dispositiu." "Configuració" "Vols activar l\'estalvi de bateria?" @@ -339,7 +339,7 @@ "Carregada" "S\'està carregant" - "%s per completar la pujada" + "%s per completar la càrrega" "No s\'està carregant" "És possible que la xarxa\nestigui controlada" "Cerca" @@ -363,9 +363,9 @@ "Silenci\ntotal" "Només\ninterr. prior." "Només\nalarmes" - "Carregant (%s per completar la pujada)" - "Pujada ràpida (%s per completar-se)" - "Pujada lenta (%s per completar-se)" + "Carregant (%s per completar la càrrega)" + "Càrrega ràpida (%s per completar-se)" + "Càrrega lenta (%s per completar-se)" "Canvia d\'usuari" "Canvia d\'usuari. Usuari actual: %s" "Usuari actual: %s" @@ -524,7 +524,7 @@ "Fet" "Controls de notificació de l\'aplicació %1$s" "Consum de la bateria" - "La funció Estalvi de bateria no està disponible durant la pujada" + "La funció Estalvi de bateria no està disponible durant la càrrega" "Estalvi de bateria" "Redueix el rendiment i les dades en segon pla" "Botó %1$s" diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index cd2720b32c7..0eb7b084a68 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -32,7 +32,7 @@ "No tienes notificaciones" "Entrante" "Notificaciones" - "Nivel de batería bajo" + "Batería baja" "Queda un %s de batería" "Queda un %s de batería. La función de ahorro de batería está activada." "No se admite la carga por USB.\nUtiliza solo el cargador proporcionado." diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index a3a11cf45fa..0429600aa1d 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -645,7 +645,7 @@ "Ыкчам жөндөөлөрдү ачуу." "Ыкчам жөндөөлөрдү жабуу." "Ойготкуч коюлду." - "%s каттоо эсеби аркылуу кирди" + "%s аккаунту менен кирди" "Интернет жок." "Чоо-жайын ачуу." "%s жөндөөлөрүн ачуу." diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 77983aaa417..8cc94c2f4c9 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -38,7 +38,7 @@ "USB चार्ज गर्न समर्थित छैन।\n आपूर्ति गरिएको चार्जर मात्र प्रयोग गर्नुहोस्।" "USB चार्ज समर्थित छैन।" "आपूर्ति गरिएको चार्जर मात्र प्रयोग गर्नुहोस्।" - "सेटिङ्हरू" + "सेटिङहरू" "ब्याट्री बचत खोल्नुहुन्छ?" "खोल्नुहोस्" "ब्याट्री बचत खोल्नुहोस्" @@ -251,8 +251,8 @@ भित्र थप %s सूचनाहरू छन्। भित्र थप %s सूचना छ। - "अधिसूचना सेटिङ्हरू" - "%s सेटिङ्हरू" + "अधिसूचना सेटिङहरू" + "%s सेटिङहरू" "स्क्रिन स्वतः घुम्ने छ।" "स्क्रिनलाई ल्यान्डस्केप अवस्थामा बन्द गरिएको छ।" "स्क्रिन पोर्टेट अभिमूखमा लक गरिएको छ।" @@ -347,8 +347,8 @@ "स्लाइड %sको लागि बायाँ।" "अलार्म, रिमाइन्डर, घटना, र तपाईंले निर्दिष्ट गर्नुहुने कलरहरू देखि बाहेक, आवाज र कम्पनले तपाईं लाई वाधा गर्ने छैन।" "आफू अनुकूल बनाउनुहोस्" - "यसले अलार्म, संगीत, भिडियो, र खेलहरू लगायतका सबै ध्वनि र कम्पन रोक्छ। तपाईं अझै पनि फोन कल गर्न सक्षम हुनुहुन्छ।" - "यसले अलार्म, संगीत, भिडियोहरू र खेलहरूसहित सबै ध्वनिहरू र कम्पनहरूलाई रोक्छ।" + "यसले अलार्म, सङ्गीत, भिडियो, र खेलहरू लगायतका सबै ध्वनि र कम्पन रोक्छ। तपाईं अझै पनि फोन कल गर्न सक्षम हुनुहुन्छ।" + "यसले अलार्म, सङ्गीत, भिडियोहरू र खेलहरूसहित सबै ध्वनिहरू र कम्पनहरूलाई रोक्छ।" "+%d" "तल कम जरुरी सूचनाहरू" "खोल्न पुनः ट्याप गर्नुहोस्" @@ -412,7 +412,7 @@ "विच्छेद VPN" "तपाईँको यन्त्र %1$s द्वारा व्यवस्थापन गरिन्छ।\n\n तपाईँको प्रशासकले सेटिङहरू, कर्पोरेट पहुँच, अनुप्रयोगहरू, आफ्नो उपकरण सम्बन्धित डेटा, र उपकरणको स्थानीय जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्छ। थप जानकारीको लागि, आफ्नो प्रशासकसँग सम्पर्क राख्नुहोस्।" "तपाईँले VPN जडान गर्न अनुप्रयोगलाई अनुमति दिनुभयो।\n\nयो अनुप्रयोगले तपाईँका यन्त्र र नेटवर्क गतिविधि लगायत इमेल, अनुप्रयोग र वेबसाइटहरू अनुगमन गर्न सक्छ।" - "तपाईंको यन्त्र %1$s द्वारा व्यवस्थापन गरिन्छ।\n\n तपाईंको प्रशासकले सेटिङ्हरू, कर्पोरेट पहुँच, अनुप्रयोगहरू, आफ्नो उपकरण सम्बन्धित डेटा, र उपकरणको स्थानीय जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्छ।\n\nतपाईं VPN सँग जडित हुनुहुन्छ, जसले तपाईंको इमेल, अनुप्रयोगहरू, र वेबसाइटहरू सहित आफ्नो सञ्जाल गतिविधि अनुगमन गर्न सक्छ। \n\nथप जानकारीको लागि, आफ्नो प्रशासकसँग सम्पर्क राख्नुहोस्।" + "तपाईंको यन्त्र %1$s द्वारा व्यवस्थापन गरिन्छ।\n\n तपाईंको प्रशासकले सेटिङहरू, कर्पोरेट पहुँच, अनुप्रयोगहरू, आफ्नो उपकरण सम्बन्धित डेटा, र उपकरणको स्थानीय जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्छ।\n\nतपाईं VPN सँग जडित हुनुहुन्छ, जसले तपाईंको इमेल, अनुप्रयोगहरू, र वेबसाइटहरू सहित आफ्नो सञ्जाल गतिविधि अनुगमन गर्न सक्छ। \n\nथप जानकारीको लागि, आफ्नो प्रशासकसँग सम्पर्क राख्नुहोस्।" "तपाईंको कार्य प्रोफाइल %1$sद्वारा व्यवस्थापन गरिन्छ।.\n\nतपाईंको प्रशासक इमेल, अनुप्रयोगहरू, र सुरक्षित वेबसाइटहरू लगायतका तपाईंका नेटवर्क गतिविधि अनुगमन गर्न सक्षम छ।\n\nथप जानकारीको लागि, आफ्नो प्रशासकसँग सम्पर्क राख्नुहोस्।\n\nतपाईं VPN सँग पनि जडित हुनुहुन्छ, जसले तपाईंको नेटवर्क गतिविधि अनुगमन गर्न सक्छ।" "VPN" "तपाईं %1$s सँग जडित हुनुहुन्छ जसले इ-मेल, अनुप्रयोगहरू र वेबसाइट लगायतका तपाईंका नेटवर्क गतिविधिको अनुगमन गर्न सक्छ।" @@ -566,7 +566,7 @@ "सम्पर्कहरू" "इमेल" "IM" - "संगीत" + "सङ्गीत" "YouTube" "पात्रो" "भोल्युम नियन्त्रणसहित देखाउनुहोस्" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 1fa65529878..2e3b67d8438 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -475,7 +475,7 @@ "Pokaż tryb demonstracyjny" "Ethernet" "Alarm" - "Profil do pracy" + "Profil służbowy" "Tryb samolotowy" "Dodaj nazwę" "Rozgłaszana nazwa" @@ -485,7 +485,7 @@ "w: %1$s" "Szybkie ustawienia, %s." "Hotspot" - "Profil do pracy" + "Profil służbowy" "Dobra zabawa, ale nie dla każdego" "Kalibrator System UI udostępnia dodatkowe sposoby dostrajania i dostosowywania interfejsu Androida. Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność." "Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność." diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 28ef70d0d6d..43e82e76c9e 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -31,7 +31,7 @@ "Inga aviseringar" "Pågående" - "Meddelanden" + "Aviseringar" "Lågt batteri" "%s kvar" "%s kvar. Batterisparläget är aktiverat." diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 1335fa6c21b..3ab76a37b49 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -325,7 +325,7 @@ "Hakuna vipengee vya hivi karibuni" "Umeondoa vipengee vyote" "Maelezo ya Programu" - "kudumisha programu moja" + "kubandika kwenye skirini" "tafuta" "Haikuweza kuanzisha %s." "%s imezimwa katika hali salama." -- GitLab From 1fc998b0fda051188665e599c891da4a5750581d Mon Sep 17 00:00:00 2001 From: Richard Ledley Date: Fri, 16 Feb 2018 15:45:06 +0000 Subject: [PATCH 064/386] Replace Entity Presets with hints and an explicit factory. This remove APIs to inspect the list of entities a TextClassifier will choose. We decided the developer should have no need to see these, and by not exposing it we allow more flexibility on the TextClassifier. Test: bit FrameworksCoreTests:android.widget.TextViewActivityTest CtsViewTestCases:android.view.textclassifier.cts.TextClassificationManagerTest FrameworksCoreTests:android.view.textclassifier.TextLinksTest Bug: 67629726 Change-Id: I70978e692bb8a1edee1567a10c31d5ded44baa49 --- api/current.txt | 15 +-- .../view/textclassifier/TextClassifier.java | 124 +++++++++++------- .../textclassifier/TextClassifierImpl.java | 24 +--- .../view/textclassifier/TextLinks.java | 14 +- .../TextClassificationManagerTest.java | 33 ++--- .../view/textclassifier/TextLinksTest.java | 14 +- 6 files changed, 115 insertions(+), 109 deletions(-) diff --git a/api/current.txt b/api/current.txt index 14fb7dd2824..eb903cecfa5 100644 --- a/api/current.txt +++ b/api/current.txt @@ -50311,15 +50311,13 @@ package android.view.textclassifier { method public default android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int, android.os.LocaleList); method public default android.view.textclassifier.TextLinks generateLinks(java.lang.CharSequence, android.view.textclassifier.TextLinks.Options); method public default android.view.textclassifier.TextLinks generateLinks(java.lang.CharSequence); - method public default java.util.Collection getEntitiesForPreset(int); method public default android.view.textclassifier.logging.Logger getLogger(android.view.textclassifier.logging.Logger.Config); method public default int getMaxGenerateLinksTextLength(); method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.view.textclassifier.TextSelection.Options); method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int); method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.os.LocaleList); - field public static final int ENTITY_PRESET_ALL = 0; // 0x0 - field public static final int ENTITY_PRESET_BASE = 2; // 0x2 - field public static final int ENTITY_PRESET_NONE = 1; // 0x1 + field public static final java.lang.String HINT_TEXT_IS_EDITABLE = "android.text_is_editable"; + field public static final java.lang.String HINT_TEXT_IS_NOT_EDITABLE = "android.text_is_not_editable"; field public static final android.view.textclassifier.TextClassifier NO_OP; field public static final java.lang.String TYPE_ADDRESS = "address"; field public static final java.lang.String TYPE_DATE = "date"; @@ -50333,11 +50331,12 @@ package android.view.textclassifier { } public static final class TextClassifier.EntityConfig implements android.os.Parcelable { - ctor public TextClassifier.EntityConfig(int); + method public static android.view.textclassifier.TextClassifier.EntityConfig create(java.util.Collection); + method public static android.view.textclassifier.TextClassifier.EntityConfig create(java.util.Collection, java.util.Collection, java.util.Collection); + method public static android.view.textclassifier.TextClassifier.EntityConfig createWithEntityList(java.util.Collection); method public int describeContents(); - method public android.view.textclassifier.TextClassifier.EntityConfig excludeEntities(java.lang.String...); - method public java.util.List getEntities(android.view.textclassifier.TextClassifier); - method public android.view.textclassifier.TextClassifier.EntityConfig includeEntities(java.lang.String...); + method public java.util.Collection getHints(); + method public java.util.List resolveEntityListModifications(java.util.Collection); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; } diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java index 2a62f23f19c..d52a30bcc01 100644 --- a/core/java/android/view/textclassifier/TextClassifier.java +++ b/core/java/android/view/textclassifier/TextClassifier.java @@ -16,7 +16,6 @@ package android.view.textclassifier; -import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; @@ -86,19 +85,15 @@ public interface TextClassifier { }) @interface EntityType {} - /** Designates that the TextClassifier should identify all entity types it can. **/ - int ENTITY_PRESET_ALL = 0; - /** Designates that the TextClassifier should identify no entities. **/ - int ENTITY_PRESET_NONE = 1; - /** Designates that the TextClassifier should identify a base set of entities determined by the - * TextClassifier. **/ - int ENTITY_PRESET_BASE = 2; + /** Designates that the text in question is editable. **/ + String HINT_TEXT_IS_EDITABLE = "android.text_is_editable"; + /** Designates that the text in question is not editable. **/ + String HINT_TEXT_IS_NOT_EDITABLE = "android.text_is_not_editable"; /** @hide */ @Retention(RetentionPolicy.SOURCE) - @IntDef(prefix = { "ENTITY_CONFIG_" }, - value = {ENTITY_PRESET_ALL, ENTITY_PRESET_NONE, ENTITY_PRESET_BASE}) - @interface EntityPreset {} + @StringDef(prefix = { "HINT_" }, value = {HINT_TEXT_IS_EDITABLE, HINT_TEXT_IS_NOT_EDITABLE}) + @interface Hints {} /** * No-op TextClassifier. @@ -322,17 +317,6 @@ public interface TextClassifier { return Integer.MAX_VALUE; } - /** - * Returns a {@link Collection} of the entity types in the specified preset. - * - * @see #ENTITY_PRESET_ALL - * @see #ENTITY_PRESET_NONE - * @see #ENTITY_PRESET_BASE - */ - default Collection getEntitiesForPreset(@EntityPreset int entityPreset) { - return Collections.EMPTY_LIST; - } - /** * Returns a helper for logging TextClassifier related events. * @@ -358,54 +342,92 @@ public interface TextClassifier { * Configs are initially based on a predefined preset, and can be modified from there. */ final class EntityConfig implements Parcelable { - private final @TextClassifier.EntityPreset int mEntityPreset; + private final Collection mHints; private final Collection mExcludedEntityTypes; private final Collection mIncludedEntityTypes; + private final boolean mUseHints; + + private EntityConfig(boolean useHints, Collection hints, + Collection includedEntityTypes, Collection excludedEntityTypes) { + mHints = hints == null + ? Collections.EMPTY_LIST + : Collections.unmodifiableCollection(new ArraySet<>(hints)); + mExcludedEntityTypes = excludedEntityTypes == null + ? Collections.EMPTY_LIST : new ArraySet<>(excludedEntityTypes); + mIncludedEntityTypes = includedEntityTypes == null + ? Collections.EMPTY_LIST : new ArraySet<>(includedEntityTypes); + mUseHints = useHints; + } - public EntityConfig(@TextClassifier.EntityPreset int mEntityPreset) { - this.mEntityPreset = mEntityPreset; - mExcludedEntityTypes = new ArraySet<>(); - mIncludedEntityTypes = new ArraySet<>(); + /** + * Creates an EntityConfig. + * + * @param hints Hints for the TextClassifier to determine what types of entities to find. + */ + public static EntityConfig create(@Nullable Collection hints) { + return new EntityConfig(/* useHints */ true, hints, + /* includedEntityTypes */null, /* excludedEntityTypes */ null); } /** - * Specifies an entity to include in addition to any specified by the enity preset. + * Creates an EntityConfig. + * + * @param hints Hints for the TextClassifier to determine what types of entities to find + * @param includedEntityTypes Entity types, e.g. {@link #TYPE_EMAIL}, to explicitly include + * @param excludedEntityTypes Entity types, e.g. {@link #TYPE_PHONE}, to explicitly exclude + * * * Note that if an entity has been excluded, the exclusion will take precedence. */ - public EntityConfig includeEntities(String... entities) { - for (String entity : entities) { - mIncludedEntityTypes.add(entity); - } - return this; + public static EntityConfig create(@Nullable Collection hints, + @Nullable Collection includedEntityTypes, + @Nullable Collection excludedEntityTypes) { + return new EntityConfig(/* useHints */ true, hints, + includedEntityTypes, excludedEntityTypes); } /** - * Specifies an entity to be excluded. + * Creates an EntityConfig with an explicit entity list. + * + * @param entityTypes Complete set of entities, e.g. {@link #TYPE_URL} to find. + * */ - public EntityConfig excludeEntities(String... entities) { - for (String entity : entities) { - mExcludedEntityTypes.add(entity); - } - return this; + public static EntityConfig createWithEntityList(@Nullable Collection entityTypes) { + return new EntityConfig(/* useHints */ false, /* hints */ null, + /* includedEntityTypes */ entityTypes, /* excludedEntityTypes */ null); } /** - * Returns an unmodifiable list of the final set of entities to find. + * Returns a list of the final set of entities to find. + * + * @param entities Entities we think should be found before factoring in includes/excludes + * + * This method is intended for use by TextClassifier implementations. */ - public List getEntities(TextClassifier textClassifier) { - ArrayList entities = new ArrayList<>(); - for (String entity : textClassifier.getEntitiesForPreset(mEntityPreset)) { - if (!mExcludedEntityTypes.contains(entity)) { - entities.add(entity); + public List resolveEntityListModifications(@NonNull Collection entities) { + final ArrayList finalList = new ArrayList<>(); + if (mUseHints) { + for (String entity : entities) { + if (!mExcludedEntityTypes.contains(entity)) { + finalList.add(entity); + } } } for (String entity : mIncludedEntityTypes) { - if (!mExcludedEntityTypes.contains(entity) && !entities.contains(entity)) { - entities.add(entity); + if (!mExcludedEntityTypes.contains(entity) && !finalList.contains(entity)) { + finalList.add(entity); } } - return Collections.unmodifiableList(entities); + return finalList; + } + + /** + * Retrieves the list of hints. + * + * @return An unmodifiable collection of the hints. + */ + public Collection getHints() { + return mHints; } @Override @@ -415,9 +437,10 @@ public interface TextClassifier { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(mEntityPreset); + dest.writeStringList(new ArrayList<>(mHints)); dest.writeStringList(new ArrayList<>(mExcludedEntityTypes)); dest.writeStringList(new ArrayList<>(mIncludedEntityTypes)); + dest.writeInt(mUseHints ? 1 : 0); } public static final Parcelable.Creator CREATOR = @@ -434,9 +457,10 @@ public interface TextClassifier { }; private EntityConfig(Parcel in) { - mEntityPreset = in.readInt(); + mHints = new ArraySet<>(in.createStringArrayList()); mExcludedEntityTypes = new ArraySet<>(in.createStringArrayList()); mIncludedEntityTypes = new ArraySet<>(in.createStringArrayList()); + mUseHints = in.readInt() == 1; } } diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java index 795caffd04d..c19e844234e 100644 --- a/core/java/android/view/textclassifier/TextClassifierImpl.java +++ b/core/java/android/view/textclassifier/TextClassifierImpl.java @@ -88,12 +88,6 @@ public final class TextClassifierImpl implements TextClassifier { TextClassifier.TYPE_DATE, TextClassifier.TYPE_DATE_TIME, TextClassifier.TYPE_FLIGHT_NUMBER)); - private static final List ENTITY_TYPES_BASE = - Collections.unmodifiableList(Arrays.asList( - TextClassifier.TYPE_ADDRESS, - TextClassifier.TYPE_EMAIL, - TextClassifier.TYPE_PHONE, - TextClassifier.TYPE_URL)); private final Context mContext; private final TextClassifier mFallback; @@ -222,7 +216,9 @@ public final class TextClassifierImpl implements TextClassifier { final LocaleList defaultLocales = options != null ? options.getDefaultLocales() : null; final Collection entitiesToIdentify = options != null && options.getEntityConfig() != null - ? options.getEntityConfig().getEntities(this) : ENTITY_TYPES_ALL; + ? options.getEntityConfig().resolveEntityListModifications( + getEntitiesForHints(options.getEntityConfig().getHints())) + : ENTITY_TYPES_ALL; final SmartSelection smartSelection = getSmartSelection(defaultLocales); final SmartSelection.AnnotatedSpan[] annotations = smartSelection.annotate(textString); for (SmartSelection.AnnotatedSpan span : annotations) { @@ -250,18 +246,8 @@ public final class TextClassifierImpl implements TextClassifier { return getSettings().getGenerateLinksMaxTextLength(); } - @Override - public Collection getEntitiesForPreset(@TextClassifier.EntityPreset int entityPreset) { - switch (entityPreset) { - case TextClassifier.ENTITY_PRESET_NONE: - return Collections.emptyList(); - case TextClassifier.ENTITY_PRESET_BASE: - return ENTITY_TYPES_BASE; - case TextClassifier.ENTITY_PRESET_ALL: - // fall through - default: - return ENTITY_TYPES_ALL; - } + private Collection getEntitiesForHints(Collection hints) { + return ENTITY_TYPES_ALL; } @Override diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java index 3d252f29366..dc24d0c4d68 100644 --- a/core/java/android/view/textclassifier/TextLinks.java +++ b/core/java/android/view/textclassifier/TextLinks.java @@ -309,23 +309,23 @@ public final class TextLinks implements Parcelable { * Returns a new options object based on the specified link mask. */ public static Options fromLinkMask(@LinkifyMask int mask) { - final TextClassifier.EntityConfig entityConfig = - new TextClassifier.EntityConfig(TextClassifier.ENTITY_PRESET_NONE); + final List entitiesToFind = new ArrayList<>(); if ((mask & Linkify.WEB_URLS) != 0) { - entityConfig.includeEntities(TextClassifier.TYPE_URL); + entitiesToFind.add(TextClassifier.TYPE_URL); } if ((mask & Linkify.EMAIL_ADDRESSES) != 0) { - entityConfig.includeEntities(TextClassifier.TYPE_EMAIL); + entitiesToFind.add(TextClassifier.TYPE_EMAIL); } if ((mask & Linkify.PHONE_NUMBERS) != 0) { - entityConfig.includeEntities(TextClassifier.TYPE_PHONE); + entitiesToFind.add(TextClassifier.TYPE_PHONE); } if ((mask & Linkify.MAP_ADDRESSES) != 0) { - entityConfig.includeEntities(TextClassifier.TYPE_ADDRESS); + entitiesToFind.add(TextClassifier.TYPE_ADDRESS); } - return new Options().setEntityConfig(entityConfig); + return new Options().setEntityConfig( + TextClassifier.EntityConfig.createWithEntityList(entitiesToFind)); } public Options() {} diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java index 430b30fcbff..624dce15698 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java @@ -35,6 +35,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.util.Arrays; +import java.util.Collections; @SmallTest @RunWith(AndroidJUnit4.class) @@ -178,39 +179,31 @@ public class TextClassificationManagerTest { if (isTextClassifierDisabled()) return; String text = "The number is +12122537077. See you tonight!"; assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig( - new TextClassifier.EntityConfig(TextClassifier.ENTITY_PRESET_ALL) - .excludeEntities(TextClassifier.TYPE_PHONE))), + TextClassifier.EntityConfig.create(Collections.EMPTY_LIST, + Collections.EMPTY_LIST, Arrays.asList(TextClassifier.TYPE_PHONE)))), not(isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE))); } @Test - public void testGenerateLinks_none_config() { - if (isTextClassifierDisabled()) return; - - String text = "The number is +12122537077. See you tonight!"; - assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig( - new TextClassifier.EntityConfig(TextClassifier.ENTITY_PRESET_NONE))), - not(isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE))); - } - - @Test - public void testGenerateLinks_address() { + public void testGenerateLinks_explicit_address() { if (isTextClassifierDisabled()) return; String text = "The address is 1600 Amphitheater Parkway, Mountain View, CA. See you!"; - assertThat(mClassifier.generateLinks(text, null), + assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig( + TextClassifier.EntityConfig.createWithEntityList( + Arrays.asList(TextClassifier.TYPE_ADDRESS)))), isTextLinksContaining(text, "1600 Amphitheater Parkway, Mountain View, CA", TextClassifier.TYPE_ADDRESS)); } @Test - public void testGenerateLinks_include() { + public void testGenerateLinks_exclude_override() { if (isTextClassifierDisabled()) return; - String text = "The address is 1600 Amphitheater Parkway, Mountain View, CA. See you!"; + String text = "The number is +12122537077. See you tonight!"; assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig( - new TextClassifier.EntityConfig(TextClassifier.ENTITY_PRESET_NONE) - .includeEntities(TextClassifier.TYPE_ADDRESS))), - isTextLinksContaining(text, "1600 Amphitheater Parkway, Mountain View, CA", - TextClassifier.TYPE_ADDRESS)); + TextClassifier.EntityConfig.create(Collections.EMPTY_LIST, + Arrays.asList(TextClassifier.TYPE_PHONE), + Arrays.asList(TextClassifier.TYPE_PHONE)))), + not(isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE))); } @Test diff --git a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java index d6ac8454b86..42796755f1a 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java @@ -31,6 +31,7 @@ import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Map; @@ -98,10 +99,10 @@ public class TextLinksTest { @Test public void testParcelOptions() { - TextClassifier.EntityConfig entityConfig = new TextClassifier.EntityConfig( - TextClassifier.ENTITY_PRESET_NONE); - entityConfig.includeEntities("a", "b", "c"); - entityConfig.excludeEntities("b"); + TextClassifier.EntityConfig entityConfig = TextClassifier.EntityConfig.create( + Arrays.asList(TextClassifier.HINT_TEXT_IS_EDITABLE), + Arrays.asList("a", "b", "c"), + Arrays.asList("b")); TextLinks.Options reference = new TextLinks.Options(); reference.setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY)); reference.setEntityConfig(entityConfig); @@ -113,6 +114,9 @@ public class TextLinksTest { TextLinks.Options result = TextLinks.Options.CREATOR.createFromParcel(parcel); assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags()); - assertEquals(Arrays.asList("a", "c"), result.getEntityConfig().getEntities(mClassifier)); + assertEquals(new String[]{TextClassifier.HINT_TEXT_IS_EDITABLE}, + result.getEntityConfig().getHints().toArray()); + assertEquals(Arrays.asList("a", "c"), + result.getEntityConfig().resolveEntityListModifications(Collections.emptyList())); } } -- GitLab From 84a8bb80a15ad9386983a619dafdc10748e6c14e Mon Sep 17 00:00:00 2001 From: pkanwar Date: Mon, 19 Feb 2018 10:33:33 -0800 Subject: [PATCH 065/386] Change KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL to false Bug: 73609752 Test: compile Change-Id: Ie9615e63d136f40ee301504b3e2b3b7ea4aec129 --- telephony/java/android/telephony/CarrierConfigManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index f360680913c..de75ac491f8 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -1855,7 +1855,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL, false); - sDefaults.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, true); + sDefaults.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL, true); sDefaults.putBoolean(KEY_CARRIER_IMS_GBA_REQUIRED_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL, false); -- GitLab From bd666411cc02b56d67567d7fd2564207183470e6 Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Mon, 19 Feb 2018 10:47:28 -0800 Subject: [PATCH 066/386] Frameworks: Fix JUnit4 test annotations Fix missing annotations in recoverablekeystore. Found by errorprone. Bug: 73513670 Test: atest PersistentKeyChainSnapshotTest Test: atest RecoverableKeyStoreDbTest Test: m javac-check RUN_ERROR_PRONE=true Change-Id: I976b29bf2c7f47d1a9c615b1f8102b593842724b --- .../storage/PersistentKeyChainSnapshotTest.java | 6 +++++- .../storage/RecoverableKeyStoreDbTest.java | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java index aad5295abd7..dcc6910e296 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java @@ -148,6 +148,7 @@ public class PersistentKeyChainSnapshotTest { () -> reader.readKeyEntry()); } + @Test public void testWriteProtectionParams() throws Exception { PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot(); writer.initWriter(); @@ -174,6 +175,7 @@ public class PersistentKeyChainSnapshotTest { () -> reader.readProtectionParams()); } + @Test public void testKeyChainSnapshot() throws Exception { PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot(); writer.initWriter(); @@ -233,6 +235,7 @@ public class PersistentKeyChainSnapshotTest { verifyDeserialize(snapshot); } + @Test public void testKeyChainSnapshot_withManyKeysAndProtectionParams() throws Exception { PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot(); writer.initWriter(); @@ -316,7 +319,7 @@ public class PersistentKeyChainSnapshotTest { .isEqualTo(snapshot.getTrustedHardwarePublicKey()); } - + @Test public void testDeserialize_failsForNewerVersion() throws Exception { byte[] newVersion = new byte[]{(byte) 2, (byte) 0, (byte) 0, (byte) 0}; assertThrows( @@ -324,6 +327,7 @@ public class PersistentKeyChainSnapshotTest { () -> PersistentKeyChainSnapshot.deserialize(newVersion)); } + @Test public void testDeserialize_failsForEmptyData() throws Exception { byte[] empty = new byte[]{}; assertThrows( diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java index 1c5bcd498f5..609faa49aff 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java @@ -317,6 +317,7 @@ public class RecoverableKeyStoreDbTest { assertThat(statuses).hasSize(0); } + @Test public void testInvalidateKeysWithOldGenerationId_withSingleKey() { int userId = 12; int uid = 1009; @@ -372,6 +373,7 @@ public class RecoverableKeyStoreDbTest { pubkey); } + @Test public void setRecoveryServiceCertPath_replaceOldValue() throws Exception { int userId = 12; int uid = 10009; @@ -453,6 +455,7 @@ public class RecoverableKeyStoreDbTest { assertThat(agents).contains(uid2); } + @Test public void setRecoverySecretTypes_emptyDefaultValue() throws Exception { int userId = 12; int uid = 10009; -- GitLab From 5a9f4e58683b6a59e0c0d997bd9817e8ee7fcd52 Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Mon, 19 Feb 2018 11:31:04 -0800 Subject: [PATCH 067/386] Frameworks: Disable two recoverablekeystore tests Disable failing tests. Bug: 73513670 Bug: 73609806 Test: atest PersistentKeyChainSnapshotTest Test: m javac-check RUN_ERROR_PRONE=true Change-Id: I86c37b6d9875c7380fb90aa1ab94b4fbb311ada7 --- .../storage/PersistentKeyChainSnapshotTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java index dcc6910e296..353a68f34a9 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java @@ -27,6 +27,7 @@ import android.security.keystore.recovery.KeyChainProtectionParams; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -175,6 +176,7 @@ public class PersistentKeyChainSnapshotTest { () -> reader.readProtectionParams()); } + @Ignore("Investigate why this is broken. b/73609806") @Test public void testKeyChainSnapshot() throws Exception { PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot(); @@ -235,6 +237,7 @@ public class PersistentKeyChainSnapshotTest { verifyDeserialize(snapshot); } + @Ignore("Investigate why this is broken. b/73609806") @Test public void testKeyChainSnapshot_withManyKeysAndProtectionParams() throws Exception { PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot(); -- GitLab From 27e4b74a3d88b5ece9c904c7759d454765e4c372 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 16 Feb 2018 17:25:14 -0700 Subject: [PATCH 068/386] Define sane default target SDK for system_server. Normal app launches always define a target SDK, but system_server doesn't pass in an "--target-sdk-version" option, meaning we left the default value target SDK of "0" in place, which isn't a valid SDK level, meaning we treat it as targeting Android 1.0. The majority of target SDK checks are using the higher-level value provided from Context, meaning they've always been enforced; this change means that we're now applying lower-level target SDK checks that go through VMRuntime. Test: builds, boots, typical operations still work Bug: 72331067 Change-Id: I6940bb8c3a1cd2234bcacadbf60c902625876a76 --- core/java/com/android/internal/os/ZygoteInit.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index c5d0a04b5de..66035f499b9 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -656,6 +656,7 @@ public class ZygoteInit { "--capabilities=" + capabilities + "," + capabilities, "--nice-name=system_server", "--runtime-args", + "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT, "com.android.server.SystemServer", }; ZygoteConnection.Arguments parsedArgs = null; -- GitLab From ac995993c94d5d8f710519952b1fd0f7287f4a00 Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Mon, 19 Feb 2018 17:21:46 +0000 Subject: [PATCH 069/386] Add more hidden APIs to light greylist Seen in use by common apps. Bug: 73539503 Test: make Change-Id: Iccbddb4c0d39f94f4152cdbbfb7c9017c29cf46f --- config/hiddenapi-light-greylist.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt index a7d07e34172..e45d66ec58a 100644 --- a/config/hiddenapi-light-greylist.txt +++ b/config/hiddenapi-light-greylist.txt @@ -78,8 +78,10 @@ Landroid/app/ActivityThread;->getProcessName()Ljava/lang/String; Landroid/app/ActivityThread;->getSystemContext()Landroid/app/ContextImpl; Landroid/app/ActivityThread$H;->BIND_SERVICE:I Landroid/app/ActivityThread$H;->CREATE_SERVICE:I +Landroid/app/ActivityThread$H;->DUMP_PROVIDER:I Landroid/app/ActivityThread$H;->EXIT_APPLICATION:I Landroid/app/ActivityThread$H;->GC_WHEN_IDLE:I +Landroid/app/ActivityThread$H;->INSTALL_PROVIDER:I Landroid/app/ActivityThread$H;->RECEIVER:I Landroid/app/ActivityThread$H;->REMOVE_PROVIDER:I Landroid/app/ActivityThread$H;->SERVICE_ARGS:I @@ -278,8 +280,10 @@ Landroid/app/IUiModeManager$Stub$Proxy;->(Landroid/os/IBinder;)V Landroid/app/IWallpaperManager;->getWallpaper(Ljava/lang/String;Landroid/app/IWallpaperManagerCallback;ILandroid/os/Bundle;I)Landroid/os/ParcelFileDescriptor; Landroid/app/job/IJobScheduler$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobScheduler; Landroid/app/job/IJobScheduler$Stub$Proxy;->(Landroid/os/IBinder;)V +Landroid/app/LoadedApk;->getAssets()Landroid/content/res/AssetManager; Landroid/app/LoadedApk;->getClassLoader()Ljava/lang/ClassLoader; Landroid/app/LoadedApk;->getDataDirFile()Ljava/io/File; +Landroid/app/LoadedApk;->getResources()Landroid/content/res/Resources; Landroid/app/LoadedApk;->mActivityThread:Landroid/app/ActivityThread; Landroid/app/LoadedApk;->makeApplication(ZLandroid/app/Instrumentation;)Landroid/app/Application; Landroid/app/LoadedApk;->mAppDir:Ljava/lang/String; @@ -295,6 +299,7 @@ Landroid/app/LoadedApk;->mReceivers:Landroid/util/ArrayMap; Landroid/app/LoadedApk;->mResDir:Ljava/lang/String; Landroid/app/LoadedApk;->mResources:Landroid/content/res/Resources; Landroid/app/LoadedApk;->mSplitResDirs:[Ljava/lang/String; +Landroid/app/LoadedApk;->rewriteRValues(Ljava/lang/ClassLoader;Ljava/lang/String;I)V Landroid/app/LocalActivityManager;->mActivities:Ljava/util/Map; Landroid/app/LocalActivityManager;->mActivityArray:Ljava/util/ArrayList; Landroid/app/NativeActivity;->hideIme(I)V -- GitLab From 26b0f3597ea2b31c571ffae6a41445901f6a9cb0 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 19 Feb 2018 16:30:17 -0700 Subject: [PATCH 070/386] Finish unlocking user before touching apps. Direct Boot unaware apps can end up calling back into the system, racing with us pushing the user into the UNLOCKED state. So make sure we get the user actually UNLOCKED before telling apps that we're unlocked. Test: builds, boots Bug: 73606555 Change-Id: I1501283f80a84d850364a5fc0e119893726618fa --- .../java/com/android/server/am/UserController.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index bfc787e45fb..6134d05c8fc 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -435,6 +435,14 @@ class UserController implements Handler.Callback { } mInjector.getUserManagerInternal().setUserState(userId, uss.state); uss.mUnlockProgress.finish(); + + // Get unaware persistent apps running and start any unaware providers + // in already-running apps that are partially aware + if (userId == UserHandle.USER_SYSTEM) { + mInjector.startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_UNAWARE); + } + mInjector.installEncryptionUnawareProviders(userId); + // Dispatch unlocked to external apps final Intent unlockedIntent = new Intent(Intent.ACTION_USER_UNLOCKED); unlockedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId); @@ -1951,10 +1959,6 @@ class UserController implements Handler.Callback { FgThread.getHandler().post(() -> { mInjector.loadUserRecents(userId); }); - if (userId == UserHandle.USER_SYSTEM) { - mInjector.startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_UNAWARE); - } - mInjector.installEncryptionUnawareProviders(userId); finishUserUnlocked((UserState) msg.obj); break; case SYSTEM_USER_CURRENT_MSG: -- GitLab From 349289e7088edbbc5780de2be01f2c57d03c178d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Feb 2018 15:45:45 -0800 Subject: [PATCH 071/386] Import translations. DO NOT MERGE Change-Id: Icb14c173e66c9bb9cfa41c2a733c1b3ea121f0e3 Auto-generated-cl: translation import --- core/res/res/values-af/strings.xml | 46 +++++------ core/res/res/values-am/strings.xml | 52 ++++++------ core/res/res/values-ar/strings.xml | 86 +++++++++----------- core/res/res/values-az/strings.xml | 46 +++++------ core/res/res/values-b+sr+Latn/strings.xml | 84 +++++++++----------- core/res/res/values-be/strings.xml | 89 +++++++++++---------- core/res/res/values-bg/strings.xml | 88 ++++++++++----------- core/res/res/values-bn/strings.xml | 55 +++++++------ core/res/res/values-bs/strings.xml | 46 +++++------ core/res/res/values-ca/strings.xml | 46 +++++------ core/res/res/values-cs/strings.xml | 46 +++++------ core/res/res/values-da/strings.xml | 15 ++-- core/res/res/values-de/strings.xml | 84 +++++++++----------- core/res/res/values-el/strings.xml | 82 +++++++++---------- core/res/res/values-en-rAU/strings.xml | 46 +++++------ core/res/res/values-en-rCA/strings.xml | 46 +++++------ core/res/res/values-en-rGB/strings.xml | 46 +++++------ core/res/res/values-en-rIN/strings.xml | 46 +++++------ core/res/res/values-en-rXC/strings.xml | 46 +++++------ core/res/res/values-es-rUS/strings.xml | 82 +++++++++---------- core/res/res/values-es/strings.xml | 48 +++++------- core/res/res/values-et/strings.xml | 88 ++++++++++----------- core/res/res/values-eu/strings.xml | 15 ++-- core/res/res/values-fa/strings.xml | 82 +++++++++---------- core/res/res/values-fi/strings.xml | 50 ++++++------ core/res/res/values-fr-rCA/strings.xml | 15 ++-- core/res/res/values-fr/strings.xml | 65 +++++++++------ core/res/res/values-gl/strings.xml | 88 ++++++++++----------- core/res/res/values-gu/strings.xml | 52 ++++++------ core/res/res/values-hi/strings.xml | 52 ++++++------ core/res/res/values-hr/strings.xml | 82 +++++++++---------- core/res/res/values-hu/strings.xml | 82 +++++++++---------- core/res/res/values-hy/strings.xml | 15 ++-- core/res/res/values-in/strings.xml | 67 ++++++++-------- core/res/res/values-is/strings.xml | 82 +++++++++---------- core/res/res/values-it/strings.xml | 46 +++++------ core/res/res/values-iw/strings.xml | 88 ++++++++++----------- core/res/res/values-ja/strings.xml | 71 +++++++++++------ core/res/res/values-ka/strings.xml | 88 ++++++++++----------- core/res/res/values-kk/strings.xml | 73 ++++++++--------- core/res/res/values-km/strings.xml | 68 ++++++++-------- core/res/res/values-kn/strings.xml | 52 ++++++------ core/res/res/values-ko/strings.xml | 88 ++++++++++----------- core/res/res/values-ky/strings.xml | 75 +++++++++--------- core/res/res/values-lo/strings.xml | 46 +++++------ core/res/res/values-lt/strings.xml | 83 +++++++++----------- core/res/res/values-lv/strings.xml | 89 +++++++++++---------- core/res/res/values-mk/strings.xml | 52 ++++++------ core/res/res/values-ml/strings.xml | 52 ++++++------ core/res/res/values-mn/strings.xml | 82 +++++++++---------- core/res/res/values-mr/strings.xml | 56 ++++++------- core/res/res/values-ms/strings.xml | 88 ++++++++++----------- core/res/res/values-my/strings.xml | 48 +++++------- core/res/res/values-nb/strings.xml | 52 ++++++------ core/res/res/values-ne/strings.xml | 52 ++++++------ core/res/res/values-nl/strings.xml | 84 +++++++++----------- core/res/res/values-pa/strings.xml | 52 ++++++------ core/res/res/values-pl/strings.xml | 94 ++++++++++------------ core/res/res/values-pt-rBR/strings.xml | 46 +++++------ core/res/res/values-pt-rPT/strings.xml | 64 +++++++-------- core/res/res/values-pt/strings.xml | 46 +++++------ core/res/res/values-ro/strings.xml | 46 +++++------ core/res/res/values-ru/strings.xml | 46 +++++------ core/res/res/values-si/strings.xml | 46 +++++------ core/res/res/values-sk/strings.xml | 82 +++++++++---------- core/res/res/values-sl/strings.xml | 88 ++++++++++----------- core/res/res/values-sq/strings.xml | 73 ++++++++--------- core/res/res/values-sr/strings.xml | 84 +++++++++----------- core/res/res/values-sv/strings.xml | 88 ++++++++++----------- core/res/res/values-sw/strings.xml | 46 +++++------ core/res/res/values-ta/strings.xml | 52 ++++++------ core/res/res/values-te/strings.xml | 52 ++++++------ core/res/res/values-th/strings.xml | 82 +++++++++---------- core/res/res/values-tl/strings.xml | 82 +++++++++---------- core/res/res/values-tr/strings.xml | 54 ++++++------- core/res/res/values-uk/strings.xml | 48 +++++------- core/res/res/values-ur/strings.xml | 52 ++++++------ core/res/res/values-uz/strings.xml | 15 ++-- core/res/res/values-vi/strings.xml | 91 +++++++++++---------- core/res/res/values-zh-rCN/strings.xml | 96 +++++++++++------------ core/res/res/values-zh-rHK/strings.xml | 89 +++++++++++---------- core/res/res/values-zh-rTW/strings.xml | 59 +++++++------- core/res/res/values-zu/strings.xml | 46 +++++------ 83 files changed, 2461 insertions(+), 2751 deletions(-) diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index ab54ad84a78..17742bf367f 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -93,6 +93,7 @@ "SMS-boodskappe" "Stemboodskappe" "Wi-Fi-oproepe" + "SIM-status" "Ander party het TTY-modus VOL versoek" "Ander party het TTY-modus GOD versoek" "Ander party het TTY-modus SOD versoek" @@ -238,7 +239,7 @@ "Instellings" "Help" "Stembystand" - "Snelsluit" + "Snelsluit" "999+" "Nuwe kennisgewing" "Virtuele sleutelbord" @@ -497,10 +498,8 @@ "Te veel pogings. Probeer later weer." "Te veel pogings. Vingerafdruksensor is gedeaktiveer." "Probeer weer." - - - - + "Geen vingerafdrukke is geregistreer nie." + "Hierdie toetstel het nie \'n vingerafdruksensor nie" "Vinger %d" @@ -827,6 +826,7 @@ "Wenk: Dubbeltik om in en uit te zoem." "Outovul" "Stel outovul op" + "Outovul" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "SIM-kaart bygevoeg" "Herbegin jou toestel om toegang tot die mobiele netwerk te kry." "Herbegin" - "Jy sal \'n program van jou diensverskaffer af moet installeer en oopmaak om jou nuwe SIM behoorlik te laat werk." - "KRY DIE PROGRAM" - "NIE NOU NIE" + "Aktiveer mobiele diens" + "Laai die diensverskafferprogram af om jou nuwe SIM te aktiveer" + "Laai program af" "Nuwe SIM is ingesit" "Tik om dit op te stel" "Stel tyd" @@ -1211,23 +1211,15 @@ "Geen toestemmings benodig nie" "dit kan jou dalk geld kos" "OK" - - - - - - - - - - - - - - + "Laai tans hierdie toestel via USB" + "Laai tans gekoppelde toestel via USB" + "USB-lêeroordrag is aangeskakel" + "PTP via USB is aangeskakel" + "USB-verbinding is aangeskakel" + "MIDI via USB is aangeskakel" + "USB-bykomstigheidmodus is aangeskakel" "Tik vir meer opsies." - - + "Laai tans gekoppelde toestel. Tik vir meer opsies." "Analoë oudiobykomstigheid bespeur" "Die aangehegde toestel is nie met hierdie foon versoenbaar nie. Tik om meer te wete te kom." "USB-ontfouter gekoppel" @@ -1830,8 +1822,7 @@ "Foon nie toegelaat vir stem nie" "Opspringvenster" "+ %1$d" - - + "Programweergawe is afgegradeer, of is nie met hierdie kortpad versoenbaar nie" "Kon nie die kortpad teruglaai nie omdat die program nie rugsteun en teruglaai steun nie" "Kon nie teruglaai nie omdat programondertekening nie ooreenstem nie" "Kon nie kortpad teruglaai nie" @@ -1841,4 +1832,7 @@ "Skadelike program is bespeur" "%1$s wil %2$s-skyfies wys" "Wysig" + "Stelselveranderinge" + "Moenie steur nie het verander" + "Tik om jou optrede-instellings vir onderbrekings na te gaan" diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 54b913e2000..92783e9b25f 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -93,6 +93,8 @@ "የኤስኤምኤስ መልዕክቶች" "የድምጽ መልዕክቶች" "የWi-Fi ጥሪ" + + "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ FULL ጠይቋል" "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ HCO ጠይቋል" "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ VCO ጠይቋል" @@ -238,7 +240,8 @@ "ቅንብሮች" "ደግፍ" "የድምጽ እርዳታ" - "ወደ ቁልፎ ማሰር ይግቡ" + + "999+" "አዲስ ማሳወቂያ" "ምናባዊ የቁልፍ ሰሌዳ" @@ -497,10 +500,8 @@ "ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።" "በጣም ብዙ ሙከራዎች። የጣት አሻራ ዳሳሽ ተሰናክሏል።" "እንደገና ይሞክሩ።" - - - - + "ምንም የጣት አሻራዎች አልተመዘገቡም።" + "ይህ መሣሪያ የጣት አሻራ ዳሳሽ የለውም" "ጣት %d" @@ -827,6 +828,8 @@ "ጠቃሚ ምክር፦ ለማጉላት እና ለማሳነስ ሁለቴ-መታ አድርግ።" "ራስ ሙላ" "በራስ ሰር ሙላ አዘጋጅ" + + " " "$1$2$3" "፣ " @@ -1197,9 +1200,12 @@ "SIM ካርድ አክል" "የተንቀሳቃሽ አውታረ መረብን ለመድረስ መሣሪያህን ድጋሚ አስነሳ።" "ዳግም ጀምር" - "የእርስዎ ሲም በአግባቡ እንዲሠራ ለማድረግ ከእርስዎ አገልግሎት አቅራቢ መተግበሪያ መጫን እና መክፈት አለብዎት።" - "መተግበሪያውን ያግኙ" - "አሁን አይደለም" + + + + + + "አዲስ ሲም ገብቷል" "ለማዋቀር መታ ያድርጉ" "ጊዜ አዘጋጅ" @@ -1211,23 +1217,15 @@ "ምንም ፍቃዶች አይጠየቁም" "ይህ ገንዘብ ሊያስወጣዎት ይችላል" "እሺ" - - - - - - - - - - - - - - + "ይህን መሣሪያ በዩኤስቢ በኩል ኃይል በመሙላት ላይ" + "በዩኤስቢ በኩል የተገናኘን መሣሪያ ኃይል በመሙላት ላይ" + "የዩኤስቢ ፋይል ሰደዳ በርቷል" + "PTP በዩኤስቢ በኩል በርቷል" + "ዩኤስቢን እንደ ሞደም መሰካት በርቷል" + "MIDI በዩኤስቢ በኩል በርቷል" + "የዩኤስቢ ተቀጥላ መሣሪያ ሁነታ በርቷል" "ለተጨማሪ አማራጮች መታ ያድርጉ።" - - + "የተገናኘ መሣሪያን ኃይል በመሙላት ላይ። ለተጨማሪ አማራጮች መታ ያድርጉ።" "የአናሎግ ኦዲዮ ረዳት እንዳለ ተደርሶበታል" "ዓባሪ የተያያዘው መሣሪያ ከዚህ ስልክ ጋር ተኳዃኝ አይደለም። የበለጠ ለመረዳት መታ ያድርጉ።" "USB አድስ ተያይዟል" @@ -1830,8 +1828,7 @@ "ስልክ ለድምጽ አይፈቀድም" "ብቅ-ባይ መስኮት" "+ %1$d" - - + "የመተግበሪያ ስሪት ደረጃው ዝቅ ብሏል ወይም ከዚህ አቋራጭ ጋር ተኳዃኝ አይደለም" "መተግበሪያ ምትኬን እና ወደ ነበረበት መመለስን ሳለማይደግፍ አቋራጭ ወደ ነበረበት ሊመለስ አልቻለም" "በመተግበሪያ ፊርማ አለመዛመድ አቋራጭን ወደነበረበት መመለስ አልተቻለም" "አቋራጭን ወደ ነበረበት መመለስ አልተቻለም" @@ -1841,4 +1838,7 @@ "ጎጂ መተግበሪያ ተገኝቷል" "%1$s%2$s ቁራጮችን ማሳየት ይፈልጋል" "አርትዕ" + "የሥርዓት ለውጦች" + "አትረብሽ ተቀይሯል" + "ለማቋረጦች የባህሪ ቅንብሮችዎን ለመፈተሽ መታ ያድርጉ" diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 065869cc53a..8bbf52e11fb 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -97,6 +97,7 @@ "‏الرسائل القصيرة SMS" "رسائل البريد الصوتي" "‏الاتصال عبر Wi-Fi" + "‏حالة شريحة SIM" "‏طلب النظير وضع TTY الكامل" "‏طلب النظير وضع TTY على HCO" "‏طلب النظير وضع TTY على VCO" @@ -250,7 +251,7 @@ "الإعدادات" "مساعدة" "المساعد الصوتي" - "تفعيل الإغلاق" + "إغلاق" "999+" "إشعار جديد" "لوحة المفاتيح الافتراضية" @@ -276,10 +277,8 @@ "%1$s، %2$s" "الوضع الآمن" "‏نظام Android" - - - - + "التبديل إلى الملف الشخصي" + "التبديل إلى الملف الشخصي للعمل" "جهات الاتصال" "الوصول إلى جهات اتصالك" "‏السماح لتطبيق <b>%1$s</b> بالوصول إلى جهات الاتصال" @@ -431,10 +430,8 @@ "للسماح للتطبيق بالدخول إلى ميزات الهاتف في الجهاز. ويتيح هذا الإذن للتطبيق تحديد رقم الهاتف ومعرّفات الجهاز، وما إذا كانت هناك مكالمة نشطة والرقم البعيد الذي تم الاتصال به في المكالمة." "توجيه المكالمات من خلال النظام" "يسمح للتطبيق بتوجيه المكالمات من خلال النظام لتحسين تجربة الاتصال." - - - - + "مواصلة مكالمة من تطبيق آخر" + "السماح للتطبيق بمواصلة مكالمة بدأت في تطبيق آخر." "قراءة أرقام الهواتف" "للسماح للتطبيق بالوصول إلى أرقام الهواتف على هذا الجهاز." "منع الجهاز اللوحي من الدخول في وضع السكون" @@ -509,11 +506,12 @@ "يتعذر تخزين بصمة الإصبع؛ يرجى إزالة إحدى البصمات المخزنة." "تم بلوغ مهلة إدخال بصمة الإصبع. أعد المحاولة." "تم إلغاء تشغيل بصمة الإصبع." - - + "تم إلغاء تشغيل بصمة الإصبع بواسطة المستخدم." "تم إجراء عدد كبير من المحاولات. أعد المحاولة لاحقًا." "تم إجراء عدد كبير جدًا من المحاولات. لذا تم تعطيل مستشعر بصمات الإصبع." "أعد المحاولة." + "ليست هناك بصمات إصبع مسجَّلة." + "لا يحتوي هذا الجهاز على مستشعر بصمات الأصابع." "الإصبع %d" @@ -840,6 +838,7 @@ "نصيحة: اضغط مرتين للتكبير والتصغير." "ملء تلقائي" "إعداد الملء التلقائي" + "ملء تلقائي" " " "$1$2$3" "، " @@ -1080,12 +1079,9 @@ "فتح" "رسالة" "إضافة" - - - - - - + "عرض" + "تحديد موعد حدث" + "تتبّع" "مساحة التخزين منخفضة" "قد لا تعمل بعض وظائف النظام" "ليست هناك سعة تخزينية كافية للنظام. تأكد من أنه لديك مساحة خالية تبلغ ٢٥٠ ميغابايت وأعد التشغيل." @@ -1195,9 +1191,9 @@ "مستوى صوت المكالمة" "مستوى صوت الوسائط" "مستوى صوت الإشعار" - "نغمة الرنين الافتراضية" + "نغمة الرنين التلقائية" "الافتراضية (%1$s)" - "لا شيء" + "بلا نغمة رنين" "نغمات الرنين" "أصوات التنبيه" "أصوات الإشعار" @@ -1219,8 +1215,7 @@ ‏تتوفر شبكة Wi-Fi واحدة مفتوحة "‏الاتصال بشبكة Wi-Fi المفتوحة" - - + "‏الاتصال بشبكة Wi‑Fi لمشغِّل شبكة الجوّال" "‏جارٍ الاتصال بشبكة Wi-Fi المفتوحة" "‏تم الاتصال بشبكة Wi-Fi" "‏تعذَّر الاتصال بشبكة Wi‑Fi" @@ -1290,9 +1285,9 @@ "‏تمت إضافة شريحة SIM" "أعد تشغيل جهازك للدخول إلى شبكة الجوال." "إعادة التشغيل" - "‏لتشغيل شريحة SIM الجديدة بشكل سليم، يجب تثبيت تطبيق من مشغّل شبكة الجوّال وفتحه." - "الحصول على التطبيق" - "ليس الآن" + "تفعيل خدمة الجوّال" + "‏تنزيل تطبيق مشغل شبكة الجوّال لتفعيل شريحة SIM الجديدة" + "تنزيل التطبيق" "‏تم إدخال شريحة SIM جديدة." "انقر لإعداده." "تعيين الوقت" @@ -1304,13 +1299,15 @@ "لا أذونات مطلوبة" "قد يكلفك هذا مالاً." "حسنًا" - "‏يتم استخدام الاتصال عبر USB لشحن هذا الجهاز" - "‏يتم استخدام الاتصال عبر USB لإمداد الجهاز المتصل بالطاقة" - "‏USB لنقل الملفات" - "‏USB لنقل الصور" - "‏USB لـ MIDI" - "‏الاتصال بجهاز USB ملحق" + "‏جارٍ شحن هذا الجهاز عبر منفذ USB" + "‏جارٍ شحن الجهاز المتصل عبر USB" + "‏تمّ تفعيل نقل الملفات عبر USB" + "‏تمّ تفعيل PTP عبر USB" + "‏تمّ تفعيل التوصيل عبر USB" + "‏تمّ تفعيل MIDI عبر USB" + "‏تمّ تفعيل وضع ملحق USB" "انقر للحصول على المزيد من الخيارات." + "جارٍ شحن الجهاز المتصل. انقر لعرض خيارات أكثر." "تم اكتشاف ملحق صوتي تناظري" "الجهاز الذي تم توصيله بالهاتف غير متوافق معه. انقر للحصول على المزيد من المعلومات." "‏تم توصيل تصحيح أخطاء USB" @@ -1761,9 +1758,6 @@ "%1$s المخصص للعمل" "العمل الثاني %1$s" "العمل الثالث %1$s" - "لإزالة تثبيت هذه الشاشة، يمكنك لمس زرّي \"رجوع\" و\"نظرة عامة\" مع الاستمرار" - "تم تثبيت الشاشة" - "تم إلغاء تثبيت الشاشة" "المطالبة برقم التعريف الشخصي قبل إزالة التثبيت" "المطالبة بنقش إلغاء القفل قبل إزالة التثبيت" "المطالبة بكلمة المرور قبل إزالة التثبيت" @@ -1893,15 +1887,11 @@ "جميع اللغات" "كل المناطق" "البحث" - - - - + "تفعيل الملف الشخصي للعمل؟" + "سيتم تفعيل تطبيقات العمل التي تستخدمها والإشعارات والبيانات وغيرها من ميزات الملف الشخصي للعمل" "تشغيل" - - - - + "‏تمّ إنشاء هذا التطبيق لإصدار قديم من Android وقد لا يعمل بشكل صحيح. جرِّب البحث عن تحديثات أو الاتصال بمطوّر البرامج." + "البحث عن تحديث" "لديك رسائل جديدة" "‏فتح تطبيق الرسائل القصيرة SMS للعرض" "ربما تكون بعض الوظائف مُقيّدة." @@ -1972,17 +1962,17 @@ "غير مسموح باستخدام الهاتف للصوت" "نافذة منبثقة" "+ %1$d" - "يتطلب هذا الاختصار أحدث تطبيق" + "إصدار التطبيق أقدم من إصداره على الجهاز الآخر أو أنه ليس متوافقًا مع هذا الاختصار." "تعذّرت استعادة الاختصار لأن التطبيق لا يوفِّر إمكانية النسخ الاحتياطي والاستعادة" "تعذّرت استعادة الاختصار بسبب عدم تطابق توقيع التطبيق" "تعذّرت استعادة الاختصار" "تم إيقاف الاختصار" - - - - - - + "إلغاء التثبيت" + "الفتح على أي حال" + "تم العثور على تطبيق ضار" "يريد تطبيق %1$s عرض شرائح تطبيق %2$s." "تعديل" + "تغييرات النظام" + "تم تغيير وضع \"الرجاء عدم الإزعاج\"." + "انقر للتأكد من عدم وجود انقطاع في إعدادات السلوك." diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 5254fcd4598..4842e7ee02d 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -93,6 +93,7 @@ "SMS mesajları" "Səsli e-poçt mesajları" "Wi-Fi zəngi" + "SIM status" "Eskpert TTY Rejimi FULL-u sorğuladı" "Ekspert TTY Rejimi HCO-nu sorğuladı" "Ekspert TTY Rejimi VCO-nu sorğuladı" @@ -238,7 +239,7 @@ "Ayarlar" "Yardım" "Səs Yardımçısı" - "Kilid əlavə edin" + "Kilidləyin" "999+" "Yeni bildiriş" "Virtual klaviatura" @@ -497,10 +498,8 @@ "Cəhdlər çox oldu. Sonraya saxlayın." "Həddindən çox cəhd. Barmaq izi sensoru deaktiv edilib." "Yenidən cəhd edin." - - - - + "Barmaq izi qeydə alınmayıb." + "Bu cihazda barmaq izi sensoru yoxdur" "Barmaq %d" @@ -827,6 +826,7 @@ "Məsləhət: Böyütmək və kiçiltmək üçün iki dəfə tıklayın." "Avtodoldurma" "AvtoDoldurmanı ayarla" + "Avtodoldurma" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "SİM kart əlavə edildi" "Mobil şəbəkəyə qoşulmaq üçün cihazınızı yenidən başladın." "Yenidən başlat" - "Yeni SIM kartınızın düzgün işləməsi üçün operatorunuzdan tətbiq yükləməli və açmalısınız." - "TƏTBİQİ ƏLDƏ EDİN" - "İNDİ YOX" + "Mobil xidməti aktiv edin" + "Yeni SIM-i aktiv etmək üçün operator tətbiqini endirin" + "Tətbiqi endirin" "Yeni SIM kart taxılıb" "Quraşdırmaq üçün tıklayın" "Vaxt ayarlayın" @@ -1211,23 +1211,15 @@ "Heç bir icazə tələb olunmur" "bununla sizdən xərc tutula bilər" "OK" - - - - - - - - - - - - - - + "USB vasitəsilə bu cihaza enerji doldurulur" + "USB vasitəsilə qoşulmuş cihaza enerji doldurulur" + "USB fayl transferi aktiv edildi" + "USB vasitəsilə PTP aktiv edildi" + "USB birləşmə aktiv edildi" + "USB vasitəsilə MIDI aktiv edildi" + "USB aksesuar rejimi aktiv edildi" "Əlavə seçimlər üçün tıklayın." - - + "Qoşulmuş cihaza enerji doldurulur. Əlavə seçimlər üçün klikləyin." "Analoq audio aksesuar aşkarlandı" "Əlavə edilən cihaz bu telefonla uyğun deyil. Ətraflı məlumat üçün klikləyin." "USB sazlama qoşuludur" @@ -1830,8 +1822,7 @@ "Səs üçün telefona icazə verilmir" "Popap Pəncərəsi" "+ %1$d" - - + "Tətbiq versiyası əvvəlki versiyaya endirilib və ya bu qısayol ilə uyğun deyil" "Qısayolu bərpa etmək mümkün olmadı, çünki tətbiq yedəkləməni və bərpa etməyi dəstəkləmir" "Tətbiqin imza uyğunsuzluğu səbəbilə qısayolu bərpa etmək mümkün olmadı" "Qısayolu bərpa etmək mümkün olmadı" @@ -1841,4 +1832,7 @@ "Zərərli tətbiq aşkarlandı" "%1$s %2$s tətbiqindən bölmələr göstərmək istəyir" "Redaktə edin" + "Sistem dəyişiklikləri" + "\"Narahat Etməyin\" rejimi dəyişdirildi" + "Kəsintilər üçün funksiya ayarlarını yoxlamağa görə klikləyin" diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 8cc35d414a2..2c81b719f9d 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -94,6 +94,7 @@ "SMS-ovi" "Poruke govorne pošte" "Pozivanje preko Wi-Fi mreže" + "Status SIM-a" "Korisnik zahteva POTPUN režim TTY" "Korisnik zahteva PRENOS ZVUKA za režim TTY" "Korisnik zahteva PRENOS GLASA za režim TTY" @@ -241,7 +242,7 @@ "Podešavanja" "Pomoć" "Glasovna pomoć" - "Zaključaj" + "Zaključavanje" "999+" "Novo obaveštenje" "Virtuelna tastatura" @@ -267,10 +268,8 @@ "%1$s, %2$s" "Bezbedni režim" "Android sistem" - - - - + "Pređi na lični profil" + "Pređi na poslovni profil" "Kontakti" "pristupi kontaktima" "Dozvolite da <b>%1$s</b> pristupa kontaktima" @@ -422,10 +421,8 @@ "Dozvoljava aplikaciji da pristupa funkcijama telefona na uređaju. Ova dozvola omogućava aplikaciji da utvrdi broj telefona i ID-ove uređaja, zatim da li je poziv aktivan, kao i broj daljinskog uređaja sa kojim je uspostavljen poziv." "preusmeravanje poziva preko sistema" "Dozvoljava aplikaciji da preusmerava pozive preko sistema da bi poboljšala doživljaj pozivanja." - - - - + "nastavi poziv u drugoj aplikaciji" + "Dozvoljava aplikaciji da nastavi poziv koji je započet u drugoj aplikaciji." "čitanje brojeva telefona" "Dozvoljava aplikaciji da pristupa brojevima telefona na uređaju." "sprečavanje prelaska tableta u stanje spavanja" @@ -500,11 +497,12 @@ "Nije moguće sačuvati otisak prsta. Uklonite neki od postojećih otisaka prstiju." "Vremensko ograničenje za otisak prsta je isteklo. Probajte ponovo." "Radnja sa otiskom prsta je otkazana." - - + "Korisnik je otkazao radnju sa otiskom prsta." "Previše pokušaja. Probajte ponovo kasnije." "Previše pokušaja. Senzor za otisak prsta je onemogućen." "Probajte ponovo." + "Nije registrovan nijedan otisak prsta." + "Ovaj uređaj nema senzor za otisak prsta" "Prst %d" @@ -831,6 +829,7 @@ "Savet: Dodirnite dvaput da biste uvećali i umanjili prikaz." "Autom. pop." "Podeš. aut. pop." + "Automatsko popunjavanje" " " "$1$2$3" ", " @@ -1020,18 +1019,15 @@ "Otvori" "Pošalji SMS" "Dodaj" - - - - - - + "Prikaži" + "Zakaži" + "Prati" "Memorijski prostor je na izmaku" "Neke sistemske funkcije možda ne funkcionišu" "Nema dovoljno memorijskog prostora za sistem. Uverite se da imate 250 MB slobodnog prostora i ponovo pokrenite." "Aplikacija %1$s je pokrenuta" "Dodirnite za više informacija ili zaustavljanje aplikacije." - "Potvrdi" + "U redu" "Otkaži" "Potvrdi" "Otkaži" @@ -1153,8 +1149,7 @@ Otvorene Wi-Fi mreže su dostupne "Povežite se sa otvorenom Wi‑Fi mrežom" - - + "Povežite se na Wi-Fi mrežu mobilnog operatera" "Povezujete se sa otvorenom Wi‑Fi mrežom" "Povezali ste se sa Wi‑Fi mrežom" "Povezivanje sa Wi‑Fi mrežom nije uspelo" @@ -1224,9 +1219,9 @@ "SIM kartica je dodata" "Restartujte uređaj da biste mogli da pristupite mobilnoj mreži." "Ponovo pokreni" - "Da bi nova SIM kartica pravilno funkcionisala, treba da instalirate i otvorite aplikaciju svog mobilnog operatera." - "PREUZMI APLIKACIJU" - "NE SADA" + "Aktivirajte mobilnu uslugu" + "Preuzmite aplikaciju mobilnog operatera da biste aktivirali novi SIM" + "Preuzmite aplikaciju" "Nova SIM kartica je umetnuta" "Dodirnite za podešavanje" "Podešavanje vremena" @@ -1238,13 +1233,15 @@ "Nije potrebna nijedna dozvola" "ovo će vam možda biti naplaćeno" "Potvrdi" - "USB puni ovaj uređaj" - "USB snabdeva energijom priključeni uređaj" - "USB za prenos datoteka" - "USB za prenos slika" - "USB za MIDI" - "Povezano sa USB dodatkom" + "Ovaj uređaj se puni preko USB-a" + "Povezani uređaj se puni preko USB-a" + "USB prenos datoteka je uključen" + "Režim PTP preko USB-a je uključen" + "USB privezivanje je uključeno" + "Režim MIDI preko USB-a je uključen" + "Režim USB dodatka je uključen" "Dodirnite za još opcija." + "Povezani uređaj se puni. Dodirnite za još opcija." "Otkrivena je analogna dodatna oprema za audio sadržaj" "Priključeni uređaj nije kompatibilan sa ovim telefonom. Dodirnite da biste saznali više." "Otklanjanje grešaka sa USB-a je omogućeno" @@ -1686,9 +1683,6 @@ "%1$s na poslu" "2. poslovni %1$s" "3. poslovni imejl %1$s" - "Da biste otkačili ovaj ekran, dodirnite i zadržite dugmad Nazad i Pregled" - "Ekran je zakačen" - "Ekran je otkačen" "Traži PIN pre otkačinjanja" "Traži šablon za otključavanje pre otkačinjanja" "Traži lozinku pre otkačinjanja" @@ -1791,15 +1785,11 @@ "Svi jezici" "Svi regioni" "Pretraži" - - - - + "Da uključimo profil za Work?" + "Uključiće se poslovne aplikacije, obaveštenja, podaci i druge funkcije profila za Work" "Uključi" - - - - + "Ova aplikacija je napravljena za stariju verziju Android-a, pa možda neće raditi ispravno. Potražite ažuriranja ili kontaktirajte programera." + "Potraži ažuriranje" "Imate nove poruke" "Otvorite aplikaciju za SMS da biste pregledali" "Neke funkcije su možda ograničene" @@ -1867,17 +1857,17 @@ "Telefon nije prilagođen za glasovne usluge" "Iskačući prozor" "i još %1$d" - "Ova prečica zahteva najnoviju aplikaciju" + "Aplikacija je vraćena na stariju verziju ili nije kompatibilna sa ovom prečicom" "Vraćanje prečice nije uspelo jer aplikacija ne podržava pravljenje rezervne kopije i vraćanje" "Vraćanje prečice nije uspelo jer se potpisi aplikacija ne podudaraju" "Vraćanje prečice nije uspelo" "Prečica je onemogućena" - - - - - - + "DEINSTALIRAJ" + "IPAK OTVORI" + "Otkrivena je štetna aplikacija" "Aplikacija %1$s želi da prikazuje isečke iz aplikacije %2$s" "Izmeni" + "Sistemske promene" + "Režim Ne uznemiravaj je promenjen" + "Dodirnite da biste proverili da li podešavanja ponašanja obuhvataju prekide" diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 64ee9d79b51..3af78d30831 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -95,6 +95,8 @@ "SMS-паведамленні" "Паведамленні галасавой пошты" "Wi-Fi-тэлефанія" + + "Аднарангавая прылада запытала рэжым TTY FULL" "Аднарангавая прылада запытала рэжым TTY НСО" "Аднарангавая прылада запытала рэжым TTY VCO" @@ -244,7 +246,8 @@ "Налады" "Дапамога" "Галас. дапамога" - "Увесці блакіроўку" + + "999+" "Новае апавяшчэнне" "Віртуальная клавіятура" @@ -270,10 +273,8 @@ "%1$s, %2$s" "Бяспечны рэжым" "Сістэма Android" - - - - + "Пераключыцца на асабісты профіль" + "Пераключыцца на працоўны профіль" "Кантакты" "атрымліваць доступ да вашых кантактаў" "Дазволіць <b>%1$s</b> атрымліваць доступ да вашых кантактаў" @@ -425,10 +426,8 @@ "Дазваляе прыкладанням атрымлiваць доступ да функцый тэлефона на прыладзе. Дзякуючы гэтаму дазволу прыкладанне можа вызначаць iдэнтыфiкатары нумару тэлефона i прылады, незалежна ад таго, цi актыўны выклiк, i аддалены нумар, на якi робiцца выклiк." "перанакіраванне выклікаў праз сістэму" "Дазваляе праграме перанакіроўваць выклікі праз сістэму ў мэтах паляпшэння выклікаў." - - - - + "працяг выкліку з іншай праграмы" + "Дазваляе праграме працягваць выклік, які пачаўся ў іншай праграме." "счытваць нумары тэлефонаў" "Дазваляе праграме атрымліваць доступ да нумароў тэлефонаў на прыладзе." "прадухіліць планшэт ад пераходу ў рэжым сну" @@ -503,11 +502,12 @@ "Адбіткі пальцаў нельга захаваць. Выдаліце існы адбітак." "Час чакання адбіткаў пальцаў выйшаў. Паспрабуйце яшчэ раз." "Аперацыя з адбіткамі пальцаў скасавана." - - + "Аўтэнтыфікацыя па адбітках пальцаў скасавана карыстальнікам." "Занадта шмат спроб. Паспрабуйце яшчэ раз пазней." "Занадта шмат спроб. Сканер адбіткаў пальцаў адключаны." "Паспрабуйце яшчэ раз." + "Адбіткі пальцаў не зарэгістраваны." + "На гэтай прыладзе няма сканера адбіткаў пальцаў" "Палец %d" @@ -834,6 +834,8 @@ "Падказка: двойчы націсніце, каб павялічыць або паменшыць." "Аўтазапаўненне" "Усталяванне аўтазапаўнення" + + " " "$1$2$3" ", " @@ -1040,12 +1042,9 @@ "Адкрыць" "Паведамленне" "Дадаць" - - - - - - + "Прагледзець" + "Графік" + "Сачыць" "Месца для захавання на зыходзе" "Некаторыя сістэмныя функцыі могуць не працаваць" "Не хапае сховішча для сістэмы. Пераканайцеся, што ў вас ёсць 250 МБ свабоднага месца, і перазапусціце." @@ -1175,8 +1174,7 @@ адкрытай сеткі Wi-Fi даступна "Падключыцеся да адкрытай сеткі Wi-Fi" - - + "Падключэнне да сеткі Wi‑Fi аператара" "Ідзе падключэнне да адкрытай сеткі Wi‑Fi" "Выканана падключэнне да адкрытай сеткі Wi‑Fi" "Не атрымалася падключыцца да адкрытай сеткі Wi‑Fi" @@ -1246,9 +1244,12 @@ "SIM-карта дадазеная" "Перазагрузіце прыладу, каб атрымаць доступ да мабільнай сеткі." "Перазапусціць" - "Каб ваша новая SIM-карта працавала належным чынам, вам неабходна ўсталяваць і адкрыць праграму ад вашага аператара." - "АТРЫМАЦЬ ПРАГРАМУ" - "НЕ ЗАРАЗ" + + + + + + "Устаўлена новая SIM-карта" "Краніце, каб наладзіць" "Задаць час" @@ -1260,13 +1261,15 @@ "Дазволу не патрабуецца" "за гэта можа спаганяцца плата" "ОК" - "Праз USB зараджаецца гэта прылада" - "Па USB падачецца сілкаванне падключанай прыладзе" - "USB для перадачы файлаў" - "USB для перадачы фота" - "USB для MIDI" - "Падключаны да USB-прылады" + "Зарадка гэтай прылады праз USB" + "Зарадка падключанай прылады праз USB" + "Перадача файлаў праз USB" + "Перадача фота (PTP) праз USB" + "Рэжым USB-мадэма" + "MIDI праз USB" + "Рэжым USB-прылады" "Дакраніцеся, каб атрымаць іншыя параметры." + "Зарадка падключанай прылады. Націсніце, каб убачыць іншыя параметры." "Выяўлены аксесуар аналагавага аўдыя" "Далучаная прылада не сумяшчальная з гэтым тэлефонам. Націсніце, каб даведацца больш." "Адладка па USB падключана" @@ -1711,9 +1714,6 @@ "%1$s (праца)" "Другая праца %1$s" "Трэцяя праца %1$s" - "Каб адмацаваць гэты экран, краніце і ўтрымлівайце кнопкі \"Назад\" і \"Агляд\"" - "Экран замацаваны" - "Экран адмацаваны" "Запытваць PIN-код перад адмацаваннем" "Запытваць узор разблакіроўкі перад адмацаваннем" "Запытваць пароль перад адмацаваннем" @@ -1825,15 +1825,11 @@ "Усе мовы" "Усе рэгіёны" "Шукаць" - - - - + "Уключыць працоўны профіль?" + "Будуць уключаны вашы рабочыя праграмы, апавяшчэнні, даныя і іншыя функцыі працоўнага профілю" "Уключыць" - - - - + "Гэта праграма была створана для больш старой версіі Android і можа не працаваць належным чынам. Праверце наяўнасць абнаўленняў або звярніцеся да распрацоўшчыка." + "Праверыць на наяўнасць абнаўленняў" "У вас ёсць новыя паведамленні" "Праглядзець праз праграму для SMS" "Частка функц. можа быць абмеж." @@ -1902,17 +1898,20 @@ "Дзеянні з голасам для гэтага тэлефона не дапускаюцца" "Выплыўное акно" "+ %1$d" - "Для гэтага ярлыка патрабуецца найноўшая версія праграмы" + "Ярлык адносіцца да старэйшай версіі праграмы або несумяшчальны з ёю" "Не атрымалася аднавіць ярлык, бо праграма не падтрымлівае рэзервовае капіраванне і аднаўленне" "Не атрымалася аднавіць ярлык з-за несупадзення подпісаў праграм" "Не атрымалася аднавіць ярлык" "Ярлык адключаны" - + "ВЫДАЛІЦЬ" + "УСЁ РОЎНА АДКРЫЦЬ" + "Выяўлена шкодная праграма" + "Праграма %1$s запытвае дазвол на паказ зрэзаў праграмы %2$s" + "Рэдагаваць" + - + - + - "Праграма %1$s запытвае дазвол на паказ зрэзаў праграмы %2$s" - "Рэдагаваць" diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 0904e771bff..66fb2a8fc94 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -93,6 +93,8 @@ "SMS съобщения" "Съобщения в гласовата поща" "Обаждания през Wi-Fi" + + "Отсрещният потребител заяви пълен TTY режим (FULL)" "Отсрещният потребител заяви TTY режим с пренос на слух (HCO)" "Отсрещният потребител заяви TTY режим с пренос на глас (VCО)" @@ -238,7 +240,8 @@ "Настройки" "Помощ" "Гласова помощ" - "Въведете заключване" + + "999+" "Ново известие" "Виртуална клавиатура" @@ -264,10 +267,8 @@ "%1$s, %2$s" "Безопасен режим" "Система Android" - - - - + "Превключване към личния потребителски профил" + "Превключване към служебния потребителски профил" "Контакти" "има достъп до контактите ви" "Разрешете на <b>%1$s</b> да осъществява достъп до контактите ви" @@ -419,10 +420,8 @@ "Разрешава на приложението достъп до телефонните функции на устройството. Това разрешение позволява на приложението да определя телефонния номер и идентификационния номер на устройството, дали се води разговор и отдалечения номер, до който е установена връзка с обаждането." "маршрутизиране на обажданията чрез системата" "Разрешава на приложението да маршрутизира обажданията си чрез системата с цел подобряване на свързаната с тях практическа работа." - - - - + "продължаване на обаждане от друго приложение" + "Разрешава на приложението да продължи обаждане, стартирано в друго приложение." "четене на телефонните номера" "Разрешава на приложението да осъществява достъп до телефонните номера на устройството." "предотвратяване на спящия режим на таблета" @@ -497,11 +496,12 @@ "Отпечатъкът не може да бъде съхранен. Моля, премахнете съществуващ." "Времето за изчакване за отпечатък изтече. Опитайте отново." "Операцията за отпечатък е анулирана." - - + "Операцията за удостоверяване чрез отпечатък бе анулирана от потребителя." "Твърде много опити. Пробвайте отново по-късно." "Твърде много опити. Сензорът за отпечатъци е деактивиран." "Опитайте отново." + "Няма регистрирани отпечатъци." + "Това устройство няма сензор за отпечатъци" "Пръст %d" @@ -828,6 +828,8 @@ "Съвет: Докоснете двукратно, за да увеличите или намалите мащаба." "Автопоп." "Автопоп.: Настройка" + + " " "$1$2$3" ", " @@ -1000,12 +1002,9 @@ "Отваряне" "Съобщение" "Добавяне" - - - - - - + "Преглед" + "Насрочване" + "Проследяване" "Мястото в хранилището е на изчерпване" "Възможно е някои функции на системата да не работят" "За системата няма достатъчно място в хранилището. Уверете се, че имате свободни 250 МБ, и рестартирайте." @@ -1131,8 +1130,7 @@ Има достъпна отворена Wi-Fi мрежа "Свързване с отворена Wi‑Fi мрежа" - - + "Свържете се с Wi‑Fi мрежа на оператор" "Установява се връзка с отворена Wi‑Fi мрежа" "Установихте връзка с Wi-Fi мрежата" "Не можа да се установи връзка с Wi‑Fi мрежата" @@ -1202,9 +1200,12 @@ "SIM картата е добавена" "Рестартирайте устройството си, за да осъществите достъп до мобилната мрежа." "Рестартиране" - "За да заработи правилно новата ви SIM карта, ще се наложи да инсталирате и отворите приложение от оператора си." - "ИЗТЕГЛЯНЕ НА ПРИЛОЖЕНИЕТО" - "НЕ СЕГА" + + + + + + "Поставена е нова SIM карта" "Докоснете, за да я настроите" "Задаване на часа" @@ -1216,13 +1217,15 @@ "Не се изискват разрешения" "това може да ви струва пари" "OK" - "Това устройство се зарежда през USB" - "През USB се зарежда свързаното устройство" - "USB за прехвърляне на файлове" - "USB за прехвърляне на снимки" - "USB за MIDI" - "Установена е връзка с аксесоар за USB" + "Това устройство се зарежда през USB" + "Свързаното устройство се зарежда през USB" + "Прехвърлянето на файлове през USB е включено" + "Режимът PTP през USB е включен" + "Тетърингът през USB е включен" + "Режимът MIDI през USB е включен" + "Режимът за аксесоари за USB е включен" "Докоснете за още опции." + "Свързаното устройство се зарежда. Докоснете за още опции." "Открит е аналогов аудиоаксесоар" "Свързаното устройство не е съвместимо с този телефон. Докоснете, за да научите повече." "Отстраняване на грешки през USB" @@ -1661,9 +1664,6 @@ "%1$s за работа" "Втори служебен профил (%1$s)" "Трети служебен профил (%1$s)" - "За да освободите този екран, докоснете и задръжте бутона за връщане назад и този за общ преглед" - "Екранът е фиксиран" - "Екранът е освободен" "Запитване за ПИН код преди освобождаване" "Запитване за фигура за отключване преди освобождаване" "Запитване за парола преди освобождаване" @@ -1757,15 +1757,11 @@ "Всички езици" "Всички региони" "Търсене" - - - - + "Вкл. на служ. потр. профил?" + "Служебните ви приложения, известия и данни, както и другите функции на служебния потребителски профил ще бъдат включени" "Включване" - - - - + "Това приложение бе създадено за по-стара версия на Android и може да не работи правилно. Опитайте да проверите за актуализации или се свържете с програмиста." + "Проверка за актуализация" "Имате нови съобщения" "Преглед в приложението за SMS" "Някои функции може да са огранич." @@ -1832,17 +1828,17 @@ "Гласовите услуги не са разрешени за телефона" "Изскачащ прозорец" "+ %1$d" - "За този пряк път се изисква най-новата версия на приложението" + "Версията на приложението е понижена или не е съвместима с този пряк път" "Прекият път не можа да бъде възстановен, защото приложението не поддържа създаването на резервно копие и възстановяването" "Прекият път не можа да бъде възстановен поради несъответствие в подписа на приложението" "Прекият път не можа да бъде възстановен" "Прекият път е деактивиран" - - - - - - + "ДЕИНСТАЛИРАНЕ" + "ОТВАРЯНЕ" + "Открито е опасно приложение" "%1$s иска да показва части от %2$s" "Редактиране" + "Промени в системата" + "Настройките за „Не безпокойте“ са променени" + "Докоснете, за да проверите настройките за поведението при прекъсвания" diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 21cf7d6a5b8..c7116c242c5 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -93,6 +93,8 @@ "এসএমএস মেসেজ" "ভয়েসমেল মেসেজ" "ওয়াই-ফাই কলিং" + + "পির TTY মোড FULL অনুরোধ করেছে" "পির TTY মোড HCO অনুরোধ করেছে" "পির TTY মোড VCO অনুরোধ করেছে" @@ -238,7 +240,8 @@ "সেটিংস" "সহযোগিতা" "ভয়েস সহায়তা" - "লকডাউন লিখুন" + + "৯৯৯+" "নতুন বিজ্ঞপ্তি" "ভার্চুয়াল কীবোর্ড" @@ -497,10 +500,8 @@ "অনেকবার প্রচেষ্টা করা হয়েছে৷ পরে আবার চেষ্টা করুন৷" "বহুবার চেষ্টা করেছেন। আঙ্গুলের ছাপ নেওয়ার সেন্সর অক্ষম করা হয়েছে।" "আবার চেষ্টা করুন৷" - - - - + "কোনও আঙ্গুলের ছাপ নথিভুক্ত করা হয়নি।" + "এই ডিভাইসে আঙ্গুলের ছাপের সেন্সর নেই" "আঙ্গুল %d" @@ -827,6 +828,8 @@ "টিপ: জুম বাড়ানো ও কমানোর জন্য দুইবার আলতো চাপুন৷" "স্বতঃপূর্ণ" "স্বতঃপূর্ণ সেট করুন" + + " " "$১$২$৩" ", " @@ -1198,9 +1201,12 @@ "সিম কার্ড যোগ করা হয়েছে" "মোবাইল নেটওয়ার্ক অ্যাক্সেস করতে আপনার ডিভাইসটি পুনর্সূচনা করুন৷" "রিস্টার্ট করুন" - "যাতে আপনার নতুন সিম সঠিকভাবে কাজ করে, তার জন্য আপনাকে আপনার পরিষেবা প্রদানকারীর থেকে একটি অ্যাপ্লিকেশান ইনস্টল করতে এবং খুলতে হবে৷" - "অ্যাপ্লিকেশানটি পান" - "এখনই নয়" + + + + + + "নতুন সিম ঢোকানো হয়েছে" "এটিকে সেট আপ করতে আলতো চাপুন" "সময় সেট করুন" @@ -1212,23 +1218,15 @@ "কোনো অনুমতির প্রয়োজন নেই" "এর জন্য অর্থপ্রদান করতে হতে পারে" "ঠিক আছে" - - - - - - - - - - - - - - + "এই ডিভাইসটি USB এর মাধ্যমে চার্জ করুন" + "সংযুক্ত ডিভাইসটি USB এর মাধ্যমে চার্জ করা হচ্ছে" + "USB ফাইল ট্রান্সফার চালু করা হয়েছে" + "USB এর মাধ্যমে PTP চালু করা হয়েছে" + "USB টিথারিং চালু করা হয়েছে" + "USB এর মাধ্যমে MIDI চালু করা হয়েছে" + "USB অ্যাক্সেসরি মোড চালু আছে" "আরও বিকল্পের জন্য আলতো চাপুন৷" - - + "সংযুক্ত ডিভাইস চার্জ করা হচ্ছে। আরও বিকল্প দেখতে ট্যাপ করুন।" "অ্যানালগ অডিও অ্যাক্সেসরি শনাক্ত করা হয়েছে" "সংযুক্ত ডিভাইসটি এই ফোনের সাথে ব্যবহার করা যাবে না। আরও জানতে ট্যাপ করুন।" "USB ডিবাগিং সংযুক্ত হয়েছে" @@ -1831,8 +1829,7 @@ "এই ফোন দিয়ে ভয়েস কল করা যাবে না" "পপ-আপ উইন্ডো" "+ %1$dটি" - - + "অ্যাপের ভার্সন ডাউনগ্রেড করা হয়েছে অথবা এই শর্টকাটের জন্য উপযুক্ত নয়" "শর্টকাট ফিরিয়ে আনা যায়নি কারণ অ্যাপটিতে \'ব্যাক-আপ এবং রিস্টোর\' করার সুবিধা নেই" "শর্টকাট ফিরিয়ে আনা যায়নি কারণ অ্যাপের সিগ্নেচারটি মিল হচ্ছে না" "শর্টকাট ফিরিয়ে আনা যায়নি" @@ -1842,4 +1839,10 @@ "ক্ষতিকর অ্যাপ শনাক্ত করা হয়েছে" "%1$s অ্যাপটি %2$s এর অংশ দেখাতে চায়" "এডিট করুন" + + + + + + diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 6eef37cc26f..1d1a36c43a2 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -94,6 +94,7 @@ "SMS poruke" "Poruke govorne pošte" "Wi-Fi pozivanje" + "Status SIM-a" "Ravnopravni uređaj zatražio TTY PUNI način rada" "Ravnopravni uređaj zatražio TTY HCO način rada" "Ravnopravni uređaj zatražio TTY VCO način rada" @@ -241,7 +242,7 @@ "Postavke" "Pomoć" "Glasovna pomoć" - "Unesite blokadu" + "Zaključavanje" "999+" "Novo obavještenje" "Virtuelna tastatura" @@ -500,10 +501,8 @@ "Previše pokušaja. Pokušajte ponovo kasnije." "Previše pokušaja. Senzor za otisak prsta je onemogućen." "Pokušajte ponovo." - - - - + "Nije prijavljen nijedan otisak prsta." + "Ovaj uređaj nema senzor za otisak prsta" "Prst %d" @@ -830,6 +829,7 @@ "Savjet: Dodirnite ekran dva puta za uvećanje ili smanjenje prikaza." "Autofill" "Podesite Autofill" + "Automatsko popunjavanje" " " "$1$2$3" ", " @@ -1221,9 +1221,9 @@ "SIM kartica dodana" "Za pristup mobilnoj mreži ponovo pokrenite uređaj." "Ponovo pokreni" - "Da bi nova SIM kartica ispravno radila, morate instalirati i otvoriti aplikaciju svog operatera." - "PREUZMI APLIKACIJU" - "NE SADA" + "Aktivirajte uslugu mobilne mreže" + "Preuzmite aplikaciju operatera da aktivirate novi SIM" + "Preuzmite aplikaciju" "Nova SIM kartica je umetnuta" "Dodirnite da biste postavili" "Postavljanje vremena" @@ -1235,23 +1235,15 @@ "Nisu potrebna odobrenja" "ovo se možda dodatno plaća" "Uredu" - - - - - - - - - - - - - - + "Punjenje uređaja putem USB-a" + "Punjenje povezanog uređaja putem USB-a" + "Uključen je način rada Prijenos fajlova putem USB-a" + "Uključen je način rada PTP putem USB-a" + "Uključen je način rada Povezivanje mobitela putem USB-a" + "Uključen je način rada MIDI putem USB-a" + "Uključen je način rada USB periferni uređaj" "Dodirnite za više opcija." - - + "Punjenje povezanog uređaja. Dodirnite za više opcija." "Otkriven je analogni periferni uređaj" "Priključeni uređaj nije kompatibilan s ovim telefonom. Dodirnite da saznate više." "Otklanjanje grešaka putem uređaja spojenog na USB je uspostavljeno" @@ -1867,8 +1859,7 @@ "Telefon nije dozvoljen za govor" "Iskočni prozor" "+ %1$d" - - + "Instalirana je starija verzija aplikacije ili aplikacija nije kompatibilna s ovom prečicom" "Prečica nije uspješno vraćena jer aplikacija ne podržava izradu sigurnosne kopije i vraćanje" "Prečica nije uspješno vraćena zbog nepodudaranja potpisa aplikacije" "Prečica nije uspješno vraćena" @@ -1878,4 +1869,7 @@ "Otkrivena je štetna aplikacija" "Aplikacija %1$s želi prikazati isječke aplikacije %2$s" "Uredi" + "Sistemske promjene" + "Način rada Ne ometaj je promijenjen" + "Dodirnite da provjerite ima li ometanja u postavkama ponašanja" diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index abdb966c13f..a58339c8ed6 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -93,6 +93,7 @@ "Missatges SMS" "Missatges de veu" "Trucades per Wi-Fi" + "Estat de la targeta SIM" "L\'altre dispositiu ha sol·licitat el mode TTY COMPLET." "L\'altre dispositiu ha sol·licitat el mode TTY HCO." "L\'altre dispositiu ha sol·licitat el mode TTY VCO." @@ -238,7 +239,7 @@ "Configuració" "Assistència" "Assist. per veu" - "Bloqueja" + "Bloqueja" "+999" "Notificació nova" "Teclat virtual" @@ -497,10 +498,8 @@ "S\'han produït massa intents. Torna-ho a provar més tard." "S\'han fet massa intents. S\'ha desactivat el sensor d\'empremtes digitals." "Torna-ho a provar." - - - - + "No s\'ha registrat cap empremta digital." + "Aquest dispositiu no té sensor d\'empremtes digitals" "Dit %d" @@ -827,6 +826,7 @@ "Consell: Pica dos cops per ampliar i per reduir." "Em. aut." "Conf. empl. aut." + "Emplena automàticament" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "Addició de la targeta SIM" "Reinicia el dispositiu per accedir a la xarxa mòbil." "Reinicia" - "Perquè la nova SIM funcioni, has d\'instal·lar i obrir una aplicació del teu operador de telefonia mòbil." - "BAIXA L\'APLICACIÓ" - "ARA NO" + "Activa el servei mòbil" + "Baixa l\'aplicació de l\'operador de telefonia mòbil per activar la targeta SIM nova" + "Baixa l\'aplicació" "S\'ha inserit una SIM nova" "Toca per configurar-la" "Defineix l\'hora" @@ -1211,23 +1211,15 @@ "No cal cap permís" "pot ser que comporti càrrecs" "D\'acord" - - - - - - - - - - - - - - + "S\'està carregant el dispositiu per USB" + "S\'està carregant el dispositiu connectat per USB" + "S\'ha activat la transferència de fitxers per USB" + "S\'ha activat el mode PTP per USB" + "S\'ha activat la compartició de xarxa per USB" + "S\'ha activat el mode MIDI per USB" + "S\'ha activat el mode d\'accessori USB" "Toca per veure més opcions." - - + "S\'està carregant el dispositiu connectat. Toca per veure més opcions." "S\'ha detectat un accessori d\'àudio analògic" "El dispositiu connectat no és compatible amb aquest telèfon. Toca per obtenir més informació." "Depuració USB activada" @@ -1830,8 +1822,7 @@ "El telèfon no és compatible per a la veu" "Finestra emergent" "%1$d més" - - + "S\'ha canviat a una versió anterior de l\'aplicació o la versió actual no és compatible amb aquesta drecera" "No s\'ha pogut restaurar la drecera perquè l\'aplicació no permet la còpia de seguretat ni la restauració" "No s\'ha pogut restaurar la drecera perquè la signatura de l\'aplicació no coincideix" "No s\'ha pogut restaurar la drecera" @@ -1841,4 +1832,7 @@ "S\'ha detectat una aplicació perjudicial" "%1$s vol mostrar porcions de l\'aplicació %2$s" "Edita" + "Canvis del sistema" + "S\'ha canviat el mode No molestis" + "Toca per comprovar la configuració del comportament per a les interrupcions" diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 89b6e296528..d17a488cc33 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -95,6 +95,7 @@ "Zprávy SMS" "Hlasové zprávy" "Volání přes Wi-Fi" + "Stav SIM karty" "Partner požádal o přechod na režim TTY FULL" "Partner požádal o přechod na režim TTY HCO" "Partner požádal o přechod na režim TTY VCO" @@ -244,7 +245,7 @@ "Nastavení" "Asistence" "Hlas. asistence" - "Zamknout" + "Zamknuto" "999+" "Nové oznámení" "Virtuální klávesnice" @@ -503,10 +504,8 @@ "Příliš mnoho pokusů. Zkuste to později." "Příliš mnoho pokusů. Snímač otisků prstů byl deaktivován." "Zkuste to znovu." - - - - + "Nejsou zaregistrovány žádné otisky prstů." + "Toto zařízení nemá snímač otisků prstů" "Prst %d" @@ -833,6 +832,7 @@ "Tip: Dvojitým klepnutím můžete zobrazení přiblížit nebo oddálit." "Aut.vyp." "Nastav aut. vyp." + "Automatické vyplňování" " " "$1$2$3" ", " @@ -1241,9 +1241,9 @@ "SIM karta přidána." "Mobilní síť bude přístupná po restartu zařízení." "Restartovat" - "Aby nová SIM karta fungovala správně, je třeba nainstalovat aplikaci od operátora." - "STÁHNOUT APLIKACI" - "TEĎ NE" + "Aktivovat mobilní službu" + "Chcete-li aktivovat novou SIM kartu, stáhněte si aplikaci operátora" + "Stáhnout aplikaci" "Byla vložena nová SIM karta" "Klepnutím zahájíte nastavení" "Nastavit čas" @@ -1255,23 +1255,15 @@ "Nejsou vyžadována žádná oprávnění" "může vás to něco stát" "OK" - - - - - - - - - - - - - - + "Nabíjení zařízení přes USB" + "Nabíjení připojeného zařízení přes USB" + "Byl zapnut přenos souborů přes USB" + "Byl zapnut režim PTP přes USB" + "Byl zapnut tethering přes USB" + "Byl zapnut režim MIDI přes USB" + "Byl zapnut režim příslušenství USB" "Klepnutím zobrazíte další možnosti." - - + "Nabíjení připojeného zařízení. Klepnutím zobrazíte další možnosti." "Bylo zjištěno analogové zvukové příslušenství" "Připojené zařízení není s tímto telefonem kompatibilní. Klepnutím zobrazíte další informace." "Ladění přes USB připojeno" @@ -1900,8 +1892,7 @@ "Telefon není povolen pro hlasovou komunikaci" "Vyskakovací okno" "a ještě %1$d" - - + "Verze aplikace byla snížena, případně aplikace není s touto zkratkou kompatibilní" "Zkratku nelze obnovit, protože aplikace nepodporuje zálohování a obnovu" "Zkratku nelze obnovit, protože se neshoduje podpis aplikace" "Zkratku nelze obnovit" @@ -1911,4 +1902,7 @@ "Byla zjištěna škodlivá aplikace" "Aplikace %1$s chce zobrazovat ukázky z aplikace %2$s" "Upravit" + "Změny nastavení systému" + "Nastavení režimu Nerušit se změnilo" + "Klepnutím zkontrolujete nastavení chování v souvislosti s vyrušeními" diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index ba64d0f7112..861ace06ea8 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -93,6 +93,7 @@ "Sms-beskeder" "Talebeskeder" "Wi-Fi-opkald" + "SIM-status" "Den anden enhed har skiftet til FULD TTY-tilstand" "Den anden enhed har skiftet til TTY-tilstanden HCO" "Den anden enhed har skiftet til TTY-tilstanden VCO" @@ -238,7 +239,7 @@ "Indstillinger" "Assistance" "Taleassistent" - "Aktivér lukning" + "Lukning" "999+" "Ny underretning" "Virtuelt tastatur" @@ -355,8 +356,6 @@ "Tillader, at appen gør dele af sig selv vedholdende i hukommelsen. Dette kan begrænse den tilgængelige hukommelse for andre apps, hvilket gør tabletten langsommere." "Giver appen lov til at gøre dele af sig selv vedholdende i hukommelsen. Dette kan begrænse den tilgængelige hukommelse for andre apps og derved gøre fjernsynet langsommere." "Tillader, at appen gør dele af sig selv vedholdende i hukommelsen. Dette kan begrænse den tilgængelige hukommelse for andre apps, hvilket gør telefonen langsommere." - "kør tjeneste i forgrunden" - "Tillad, at appen anvender tjenester i forgrunden." "måle appens lagerplads" "Tillader, at en app kan hente sin kode, data og cachestørrelser" "ændre systemindstillinger" @@ -827,6 +826,7 @@ "Tip! Dobbeltklik for at zoome ind eller ud." "Autofyld" "Konfigurer Autofyld" + "AutoFyld" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "SIM-kort blev tilføjet" "Genstart din enhed for at få adgang til mobilnetværket." "Genstart" - "Du skal installere og åbne en app fra dit mobilselskab for at få dit nye SIM-kort til at fungere korrekt." - "HENT APPEN" - "IKKE NU" + "Aktivér mobilselskab" + "Download mobilselskabsappen for at aktivere dit nye SIM-kort" + "Download app" "Nyt SIM-kort er indsat" "Tryk for at konfigurere" "Angiv tidspunkt" @@ -1832,4 +1832,7 @@ "Der er registreret en skadelig app" "%1$s anmoder om tilladelse til at vise eksempler fra %2$s" "Rediger" + "Systemændringer" + "Tilstanden Forstyr ikke blev ændret" + "Tryk for at tjekke indstillingerne for adfærd ved afbrydelser" diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index f2a96a9d83e..f291f62308d 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -93,6 +93,7 @@ "SMS" "Mailboxnachrichten" "Anrufe über WLAN" + "Status der SIM-Karte" "Peer hat TTY-Modus \"Vollständig\" angefordert." "Peer hat TTY-Modus \"HCO\" angefordert." "Peer hat TTY-Modus \"VC\" angefordert." @@ -238,7 +239,7 @@ "Einstellungen" "Assistent" "Sprachassistent" - "Sperren" + "Sperren" "999+" "Neue Benachrichtigung" "Bildschirmtastatur" @@ -264,10 +265,8 @@ "%1$s, %2$s" "Abgesicherter Modus" "Android-System" - - - - + "Zum persönlichen Profil wechseln" + "Zum Arbeitsprofil wechseln" "Kontakte" "auf deine Kontakte zugreifen" "<b>%1$s</b> Zugriff auf deine Kontakte erlauben" @@ -419,10 +418,8 @@ "Ermöglicht der App, auf die Telefonfunktionen des Geräts zuzugreifen. Die Berechtigung erlaubt der App, die Telefonnummer und Geräte-IDs zu erfassen, festzustellen, ob gerade ein Gespräch geführt wird, und die Rufnummer verbundener Anrufer zu lesen." "Anrufe über das System durchführen" "Ermöglicht der App, Anrufe über das System durchzuführen, um die Anrufqualität zu verbessern." - - - - + "Anruf aus einer anderen App weiterführen" + "Ermöglicht der App, einen Anruf weiterzuführen, der in einer anderen App begonnen wurde." "Telefonnummern vorlesen" "Ermöglicht der App, auf die Telefonnummern auf dem Gerät zuzugreifen." "Ruhezustand des Tablets deaktivieren" @@ -497,11 +494,12 @@ "Fingerabdruck kann nicht gespeichert werden. Entferne einen vorhandenen Fingerabdruck." "Zeitüberschreitung für Fingerabdruck. Versuche es erneut." "Fingerabdruckvorgang abgebrochen" - - + "Vorgang der Fingerabdruckauthentifizierung vom Nutzer abgebrochen." "Zu viele Versuche. Versuche es später erneut." "Zu viele Versuche. Der Fingerabdrucksensor wurde deaktiviert." "Bitte versuche es erneut." + "Keine Fingerabdrücke erfasst." + "Dieses Gerät hat keinen Fingerabdrucksensor" "Finger %d" @@ -828,6 +826,7 @@ "Tipp: Zum Vergrößern und Verkleinern zweimal tippen" "AutoFill" "AutoFill konfig." + "AutoFill" " " "$1$2$3" ", " @@ -1000,12 +999,9 @@ "Öffnen" "SMS" "Hinzufügen" - - - - - - + "Anzeigen" + "Terminübersicht" + "Verfolgen" "Der Speicherplatz wird knapp" "Einige Systemfunktionen funktionieren möglicherweise nicht." "Der Speicherplatz reicht nicht für das System aus. Stelle sicher, dass 250 MB freier Speicherplatz vorhanden sind, und starte das Gerät dann neu." @@ -1131,8 +1127,7 @@ Verfügbares WLAN öffnen "Mit offenem WLAN verbinden" - - + "Mit WLAN des Mobilfunkanbieters verbinden" "Verbindung mit offenem WLAN wird hergestellt" "Mit WLAN verbunden" "WLAN-Verbindung konnte nicht hergestellt werden" @@ -1202,27 +1197,29 @@ "SIM-Karte hinzugefügt" "Starte zur Nutzung des Mobilfunknetzes dein Gerät neu." "Neu starten" - "Damit deine neue SIM-Karte ordnungsgemäß funktioniert, musst du zuerst eine App deines Mobilfunkanbieters installieren und öffnen." - "APP HERUNTERLADEN" - "JETZT NICHT" + "Mobilfunkdienst aktivieren" + "Mobilfunkanbieter-App herunterladen, um deine neue SIM-Karte zu aktivieren" + "App herunterladen" "Neue SIM-Karte eingelegt" "Zum Einrichten tippen" "Uhrzeit festlegen" "Datum festlegen" "Speichern" "Fertig" - "Neu: " + "NEU: " "Zur Verfügung gestellt von %1$s" "Keine Berechtigungen erforderlich" "Hierfür können Gebühren anfallen." "OK" - "Gerät wird über USB aufgeladen" - "Angeschlossenes Gerät wird über USB aufgeladen" - "USB für die Dateiübertragung" - "USB für die Fotoübertragung" - "USB für MIDI" - "Mit USB-Zubehör verbunden" + "Gerät wird über USB aufgeladen" + "Verbundenes Gerät wird über USB aufgeladen" + "USB-Dateiübertragung aktiviert" + "PTP über USB aktiviert" + "USB-Tethering aktiviert" + "MIDI über USB aktiviert" + "USB-Zubehörmodus aktiviert" "Für weitere Optionen tippen." + "Verbundenes Gerät wird aufgeladen. Für weitere Optionen tippen." "Analoges Audiozubehör erkannt" "Das angeschlossene Gerät ist nicht mit diesem Smartphone kompatibel. Für weitere Informationen tippen." "USB-Debugging aktiviert" @@ -1661,9 +1658,6 @@ "%1$s (geschäftlich)" "2. %1$s (geschäftlich)" "3. %1$s (geschäftlich)" - "Um diesen Bildschirm loszulösen, berühre und halte gleichzeitig \"Zurück\" und \"Übersicht\"" - "Bildschirm fixiert" - "Bildschirm gelöst" "Vor dem Beenden nach PIN fragen" "Vor dem Beenden nach Entsperrungsmuster fragen" "Vor dem Beenden nach Passwort fragen" @@ -1757,15 +1751,11 @@ "Alle Sprachen" "Alle Regionen" "Suche" - - - - + "Arbeitsprofil aktivieren?" + "Deine geschäftlichen Apps, Benachrichtigungen, Daten und andere Funktionen des Arbeitsprofils werden aktiviert" "Aktivieren" - - - - + "Diese App wurde für eine ältere Android-Version entwickelt und funktioniert möglicherweise nicht mehr richtig. Prüfe, ob Updates verfügbar sind oder kontaktiere den Entwickler." + "Auf Updates prüfen" "Du hast neue Nachrichten" "Zum Ansehen SMS-App öffnen" "Einige Funktionen sind evtl. eingeschränkt" @@ -1832,17 +1822,17 @@ "Smartphone unterstützt Sprachfunktion nicht" "Pop-up-Fenster" "+ %1$d" - "Für diese Verknüpfung ist die aktuelle App-Version erforderlich" + "Die App-Version wurde zurückgestuft oder ist mit dieser Verknüpfung nicht kompatibel" "Verknüpfung konnte nicht wiederhergestellt werden, weil die App keine Sicherung und keine Wiederherstellung unterstützt" "Verknüpfung konnte nicht wiederhergestellt werden, weil die App-Signatur nicht übereinstimmt" "Verknüpfung konnte nicht wiederhergestellt werden" "Verknüpfung ist deaktiviert" - - - - - - + "DEINSTALLIEREN" + "TROTZDEM ÖFFNEN" + "Schädliche App erkannt" "%1$s möchte Teile von %2$s anzeigen" "Bearbeiten" + "Systemänderungen" + "\"Bitte nicht stören\" wurde geändert" + "Zum Prüfen der Verhaltenseinstellungen für Unterbrechungen hier tippen" diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index e0058c64210..5e657c84d0a 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -93,6 +93,7 @@ "Μηνύματα SMS" "Μηνύματα αυτόματου τηλεφωνητή" "Κλήση Wi-Fi" + "Κατάσταση SIM" "Αίτημα peer για TTY ΠΛΗΡΗΣ Λειτουργία" "Αίτημα peer για TTY Λειτουργία HCO" "Αίτημα peer για TTY Λειτουργία VCO" @@ -238,7 +239,7 @@ "Ρυθμίσεις" "Βοήθεια" "Φων.υποβοηθ." - "Εισαγ. κλειδώμ." + "Κλείδωμα" "999+" "Νέα ειδοποίηση" "Εικονικό πληκτρολόγιο" @@ -264,10 +265,8 @@ "%1$s, %2$s" "Ασφαλής λειτουργία" "Σύστημα Android" - - - - + "Εναλλαγή σε προσωπικό προφίλ" + "Εναλλαγή σε προφίλ εργασίας" "Επαφές" "πρόσβαση στις επαφές σας" "Να επιτρέπεται στην εφαρμογή <b>%1$s</b> να έχει πρόσβαση στις επαφές σας" @@ -419,10 +418,8 @@ "Επιτρέπει στην εφαρμογή την πρόσβαση στις λειτουργίες τηλεφώνου της συσκευής. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να καθορίζει τον αριθμό τηλεφώνου και τα αναγνωριστικά συσκευών, εάν μια κλήση είναι ενεργή, καθώς και τον απομακρυσμένο αριθμό που συνδέεται από μια κλήση." "δρομολόγηση κλήσεων μέσω του συστήματος" "Επιτρέπει στην εφαρμογή να δρομολογεί τις κλήσεις της μέσω του συστήματος για να βελτιώσει την εμπειρία κλήσης." - - - - + "συνέχιση κλήσης από άλλη συσκευή" + "Επιτρέπει στην εφαρμογή να συνεχίσει μια κλήση η οποία ξεκίνησε σε άλλη εφαρμογή." "ανάγνωση αριθμών τηλεφώνου" "Επιτρέπει στην εφαρμογή να αποκτήσει πρόσβαση στους αριθμούς τηλεφώνου της συσκευής" "αποτρέπει την μετάβαση του tablet σε κατάσταση αδράνειας" @@ -497,11 +494,12 @@ "Δεν είναι δυνατή η αποθήκευση μοναδικού χαρακτηριστικού. Καταργήστε το υπάρχον μοναδικό χαρακτηριστικό." "Λήξη χρονικού ορίου μοναδικού χαρακτηριστικού. Δοκιμάστε ξανά." "Η λειτουργία μοναδικού χαρακτηριστικού ακυρώθηκε." - - + "Η λειτουργία δακτυλικού αποτυπώματος ακυρώθηκε από τον χρήστη." "Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα." "Πάρα πολλές προσπάθειες. Ο αισθητήρας δακτυλικών αποτυπωμάτων απενεργοποιήθηκε." "Δοκιμάστε ξανά." + "Δεν έχουν καταχωριστεί δακτυλικά αποτυπώματα." + "Αυτή η συσκευή δεν διαθέτει αισθητήρα δακτυλικών αποτυπωμάτων" "Δάχτυλο %d" @@ -828,6 +826,7 @@ "Συμβουλή: Πατήστε δύο φορές για μεγέθυνση και σμίκρυνση." "Αυτόματη συμπλήρωση" "Ρύθμ.αυτ.συμπλ." + "Αυτόματη συμπλήρωση" " " "$1$2$3" ", " @@ -1000,12 +999,9 @@ "Άνοιγμα" "Μήνυμα" "Προσθήκη" - - - - - - + "Προβολή" + "Χρονοδιάγραμμα" + "Κομμάτι" "Ο αποθηκευτικός χώρος εξαντλείται" "Ορισμένες λειτουργίες συστήματος ενδέχεται να μην λειτουργούν" "Δεν υπάρχει αρκετός αποθηκευτικός χώρος για το σύστημα. Βεβαιωθείτε ότι διαθέτετε 250 MB ελεύθερου χώρου και κάντε επανεκκίνηση." @@ -1131,8 +1127,7 @@ Υπάρχει διαθέσιμο ανοικτό δίκτυο Wi-Fi "Σύνδεση σε ανοιχτό δίκτυο Wi‑Fi" - - + "Σύνδεση με δίκτυο Wi‑Fi εταιρείας κινητής τηλεφωνίας" "Σύνδεση σε ανοιχτό δίκτυο Wi‑Fi" "Ολοκληρώθηκε η σύνδεση στο δίκτυο Wi-Fi" "Δεν ήταν δυνατή η σύνδεση σε δίκτυο Wi‑Fi" @@ -1202,9 +1197,9 @@ "Προστέθηκε κάρτα SIM" "Επανεκκινήστε τη συσκευή σας για να αποκτήσετε πρόσβαση στο δίκτυο κινητής τηλεφωνίας." "Επανεκκίνηση" - "Για να λειτουργεί σωστά η νέα κάρτα SIM, θα πρέπει να εγκαταστήσετε και να ανοίξετε μια εφαρμογή από την εταιρεία κινητής τηλεφωνίας που χρησιμοποιείτε." - "ΛΗΨΗ ΤΗΣ ΕΦΑΡΜΟΓΗΣ" - "ΟΧΙ ΤΩΡΑ" + "Ενεργοποίηση υπηρεσίας κινητής τηλεφωνίας" + "Κατεβάστε την εφαρμογή της εταιρείας κινητής τηλεφωνίας, για να ενεργοποιήσετε τη νέα SIM" + "Λήψη εφαρμογής" "Τοποθετήθηκε νέα SIM" "Πατήστε για ρύθμιση" "Ρύθμιση ώρας" @@ -1216,13 +1211,15 @@ "Δεν απαιτούνται άδειες" "ενδέχεται να χρεωθείτε" "ΟΚ" - "Αυτή η συσκευή φορτίζεται μέσω USB" - "Η συνδεδεμένη συσκευή τροφοδοτείται μέσω USB" - "USB για μεταφορά αρχείων" - "USB για μεταφορά φωτογραφιών" - "USB για MIDI" - "Σύνδεση σε αξεσουάρ USB" + "Φόρτιση αυτής της συσκευής μέσω USB" + "Φόρτιση συνδεδεμένης συσκευής μέσω USB" + "Η μεταφορά αρχείων μέσω USB ενεργοποιήθηκε" + "Η λειτουργία PTP μέσω USB ενεργοποιήθηκε" + "Η σύνδεση μέσω USB ενεργοποιήθηκε" + "Η λειτουργία MIDI μέσω USB ενεργοποιήθηκε" + "Η λειτουργία αξεσουάρ USB ενεργοποιήθηκε" "Πατήστε για περισσότερες επιλογές." + "Φόρτιση συνδεδεμένης συσκευής. Πατήστε για περισσότερες επιλογές." "Εντοπίστηκε αναλογικό αξεσουάρ ήχου" "Η συνδεδεμένη συσκευή δεν είναι συμβατή με αυτό το τηλέφωνο. Πατήστε για να μάθετε περισσότερα." "Συνδέθηκε ο εντοπισμός σφαλμάτων USB" @@ -1661,9 +1658,6 @@ "Εργασία %1$s" "%1$s εργασίας 2" "%1$s εργασίας 3" - "Για να ξεκαρφιτσώσετε αυτήν την οθόνη, αγγίξτε παρατεταμένα τα κουμπιά \"Πίσω\" και \"Επισκόπηση\"" - "Η οθόνη καρφιτσώθηκε" - "Η οθόνη ξεκαρφιτσώθηκε" "Να γίνεται ερώτηση για το PIN, πριν από το ξεκαρφίτσωμα" "Να γίνεται ερώτηση για το μοτίβο ξεκλειδώματος, πριν από το ξεκαρφίτσωμα" "Να γίνεται ερώτηση για τον κωδικό πρόσβασης, πριν από το ξεκαρφίτσωμα" @@ -1757,15 +1751,11 @@ "Όλες οι γλώσσες" "Όλες οι περιοχές" "Αναζήτηση" - - - - + "Ενεργοποίηση προφίλ εργασίας;" + "Οι εφαρμογές, οι ειδοποιήσεις και τα δεδομένα εργασίας σας, καθώς και άλλες λειτουργίες του προφίλ εργασίας, θα ενεργοποιηθούν" "Ενεργοποίηση" - - - - + "Αυτή η εφαρμογή δημιουργήθηκε για παλαιότερη έκδοση του Android και μπορεί να μην λειτουργεί σωστά. Δοκιμάστε να ελέγξετε εάν υπάρχουν ενημερώσεις ή επικοινωνήστε με τον προγραμματιστή." + "Έλεγχος για ενημέρωση" "Έχετε νέα μηνύματα" "Άνοιγμα της εφαρμογής SMS για προβολή" "Μερ. λειτ. ίσως είναι περιορ." @@ -1832,17 +1822,17 @@ "Δεν επιτρέπεται η χρήση του τηλεφώνου για φωνητικές εντολές" "Αναδυόμενο παράθυρο" "+ %1$d" - "Αυτή η συντόμευση απαιτεί την πιο πρόσφατη έκδοση της εφαρμογής" + "Η έκδοση εφαρμογής υποβαθμίστηκε ή δεν είναι συμβατή με αυτήν τη συντόμευση" "Δεν ήταν δυνατή η επαναφορά της συντόμευσης, επειδή η εφαρμογή δεν υποστηρίζει τη δημιουργία αντιγράφων ασφαλείας και την επαναφορά" "Δεν ήταν δυνατή η επαναφορά της συντόμευσης, λόγω αναντιστοιχίας της υπογραφής εφαρμογής" "Δεν ήταν δυνατή η επαναφορά της συντόμευσης" "Η συντόμευση είναι απενεργοποιημένη" - - - - - - + "ΑΠΕΓΚΑΤΑΣΤΑΣΗ" + "ΑΝΟΙΓΜΑ" + "Εντοπίστηκε επιβλαβής εφαρμογή" "Η εφαρμογή %1$s θέλει να εμφανίζει τμήματα της εφαρμογής %2$s" "Επεξεργασία" + "Αλλαγές στο σύστημα" + "Η λειτουργία \"Μην ενοχλείτε\" άλλαξε" + "Πατήστε για να ελέγξετε τις ρυθμίσεις συμπεριφοράς για διακοπές" diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 873dd61581e..87a410ec009 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -93,6 +93,7 @@ "SMS messages" "Voicemail messages" "Wi-Fi Calling" + "SIM status" "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -238,7 +239,7 @@ "Settings" "Assist" "Voice Assist" - "Enter lockdown" + "Lockdown" "999+" "New notification" "Virtual keyboard" @@ -497,10 +498,8 @@ "Too many attempts. Try again later." "Too many attempts. Fingerprint sensor disabled." "Try again." - - - - + "No fingerprints enrolled." + "This device does not have a fingerprint sensor" "Finger %d" @@ -827,6 +826,7 @@ "Tip: double-tap to zoom in and out." "Auto-fill" "Set up Auto-fill" + "Auto-fill" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "SIM card added" "Restart your device to access the mobile network." "Restart" - "To get your new SIM working properly, you\'ll need to install and open an app from your operator." - "GET THE APP" - "NOT NOW" + "Activate mobile service" + "Download the mobile app to activate your new SIM" + "Download app" "New SIM inserted" "Tap to set it up" "Set time" @@ -1211,23 +1211,15 @@ "No permission required" "this may cost you money" "OK" - - - - - - - - - - - - - - + "Charging this device via USB" + "Charging connected device via USB" + "USB file transfer turned on" + "PTP via USB turned on" + "USB tethering turned on" + "MIDI via USB turned on" + "USB accessory mode turned on" "Tap for more options." - - + "Charging connected device. Tap for more options." "Analogue audio accessory detected" "The attached device is not compatible with this phone. Tap to learn more." "USB debugging connected" @@ -1830,8 +1822,7 @@ "Phone not allowed for voice" "Pop-Up Window" "+ %1$d" - - + "App version downgraded or isn’t compatible with this shortcut" "Couldn’t restore shortcut because app doesn’t support backup and restore" "Couldn’t restore shortcut because of app signature mismatch" "Couldn’t restore shortcut" @@ -1841,4 +1832,7 @@ "Harmful app detected" "%1$s wants to show %2$s slices" "Edit" + "System changes" + "Do Not Disturb has changed" + "Tap to check your behaviour settings for interruptions" diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 873dd61581e..87a410ec009 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -93,6 +93,7 @@ "SMS messages" "Voicemail messages" "Wi-Fi Calling" + "SIM status" "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -238,7 +239,7 @@ "Settings" "Assist" "Voice Assist" - "Enter lockdown" + "Lockdown" "999+" "New notification" "Virtual keyboard" @@ -497,10 +498,8 @@ "Too many attempts. Try again later." "Too many attempts. Fingerprint sensor disabled." "Try again." - - - - + "No fingerprints enrolled." + "This device does not have a fingerprint sensor" "Finger %d" @@ -827,6 +826,7 @@ "Tip: double-tap to zoom in and out." "Auto-fill" "Set up Auto-fill" + "Auto-fill" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "SIM card added" "Restart your device to access the mobile network." "Restart" - "To get your new SIM working properly, you\'ll need to install and open an app from your operator." - "GET THE APP" - "NOT NOW" + "Activate mobile service" + "Download the mobile app to activate your new SIM" + "Download app" "New SIM inserted" "Tap to set it up" "Set time" @@ -1211,23 +1211,15 @@ "No permission required" "this may cost you money" "OK" - - - - - - - - - - - - - - + "Charging this device via USB" + "Charging connected device via USB" + "USB file transfer turned on" + "PTP via USB turned on" + "USB tethering turned on" + "MIDI via USB turned on" + "USB accessory mode turned on" "Tap for more options." - - + "Charging connected device. Tap for more options." "Analogue audio accessory detected" "The attached device is not compatible with this phone. Tap to learn more." "USB debugging connected" @@ -1830,8 +1822,7 @@ "Phone not allowed for voice" "Pop-Up Window" "+ %1$d" - - + "App version downgraded or isn’t compatible with this shortcut" "Couldn’t restore shortcut because app doesn’t support backup and restore" "Couldn’t restore shortcut because of app signature mismatch" "Couldn’t restore shortcut" @@ -1841,4 +1832,7 @@ "Harmful app detected" "%1$s wants to show %2$s slices" "Edit" + "System changes" + "Do Not Disturb has changed" + "Tap to check your behaviour settings for interruptions" diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 873dd61581e..87a410ec009 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -93,6 +93,7 @@ "SMS messages" "Voicemail messages" "Wi-Fi Calling" + "SIM status" "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -238,7 +239,7 @@ "Settings" "Assist" "Voice Assist" - "Enter lockdown" + "Lockdown" "999+" "New notification" "Virtual keyboard" @@ -497,10 +498,8 @@ "Too many attempts. Try again later." "Too many attempts. Fingerprint sensor disabled." "Try again." - - - - + "No fingerprints enrolled." + "This device does not have a fingerprint sensor" "Finger %d" @@ -827,6 +826,7 @@ "Tip: double-tap to zoom in and out." "Auto-fill" "Set up Auto-fill" + "Auto-fill" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "SIM card added" "Restart your device to access the mobile network." "Restart" - "To get your new SIM working properly, you\'ll need to install and open an app from your operator." - "GET THE APP" - "NOT NOW" + "Activate mobile service" + "Download the mobile app to activate your new SIM" + "Download app" "New SIM inserted" "Tap to set it up" "Set time" @@ -1211,23 +1211,15 @@ "No permission required" "this may cost you money" "OK" - - - - - - - - - - - - - - + "Charging this device via USB" + "Charging connected device via USB" + "USB file transfer turned on" + "PTP via USB turned on" + "USB tethering turned on" + "MIDI via USB turned on" + "USB accessory mode turned on" "Tap for more options." - - + "Charging connected device. Tap for more options." "Analogue audio accessory detected" "The attached device is not compatible with this phone. Tap to learn more." "USB debugging connected" @@ -1830,8 +1822,7 @@ "Phone not allowed for voice" "Pop-Up Window" "+ %1$d" - - + "App version downgraded or isn’t compatible with this shortcut" "Couldn’t restore shortcut because app doesn’t support backup and restore" "Couldn’t restore shortcut because of app signature mismatch" "Couldn’t restore shortcut" @@ -1841,4 +1832,7 @@ "Harmful app detected" "%1$s wants to show %2$s slices" "Edit" + "System changes" + "Do Not Disturb has changed" + "Tap to check your behaviour settings for interruptions" diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 873dd61581e..87a410ec009 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -93,6 +93,7 @@ "SMS messages" "Voicemail messages" "Wi-Fi Calling" + "SIM status" "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -238,7 +239,7 @@ "Settings" "Assist" "Voice Assist" - "Enter lockdown" + "Lockdown" "999+" "New notification" "Virtual keyboard" @@ -497,10 +498,8 @@ "Too many attempts. Try again later." "Too many attempts. Fingerprint sensor disabled." "Try again." - - - - + "No fingerprints enrolled." + "This device does not have a fingerprint sensor" "Finger %d" @@ -827,6 +826,7 @@ "Tip: double-tap to zoom in and out." "Auto-fill" "Set up Auto-fill" + "Auto-fill" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "SIM card added" "Restart your device to access the mobile network." "Restart" - "To get your new SIM working properly, you\'ll need to install and open an app from your operator." - "GET THE APP" - "NOT NOW" + "Activate mobile service" + "Download the mobile app to activate your new SIM" + "Download app" "New SIM inserted" "Tap to set it up" "Set time" @@ -1211,23 +1211,15 @@ "No permission required" "this may cost you money" "OK" - - - - - - - - - - - - - - + "Charging this device via USB" + "Charging connected device via USB" + "USB file transfer turned on" + "PTP via USB turned on" + "USB tethering turned on" + "MIDI via USB turned on" + "USB accessory mode turned on" "Tap for more options." - - + "Charging connected device. Tap for more options." "Analogue audio accessory detected" "The attached device is not compatible with this phone. Tap to learn more." "USB debugging connected" @@ -1830,8 +1822,7 @@ "Phone not allowed for voice" "Pop-Up Window" "+ %1$d" - - + "App version downgraded or isn’t compatible with this shortcut" "Couldn’t restore shortcut because app doesn’t support backup and restore" "Couldn’t restore shortcut because of app signature mismatch" "Couldn’t restore shortcut" @@ -1841,4 +1832,7 @@ "Harmful app detected" "%1$s wants to show %2$s slices" "Edit" + "System changes" + "Do Not Disturb has changed" + "Tap to check your behaviour settings for interruptions" diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 85cfb87ba63..f9aa02c3b20 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -93,6 +93,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎SMS messages‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎Voicemail messages‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‎‏‎‎‎‏‎Wi-Fi calling‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‎SIM status‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎‏‎Peer requested TTY Mode FULL‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎Peer requested TTY Mode HCO‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎Peer requested TTY Mode VCO‎‏‎‎‏‎" @@ -238,7 +239,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎Settings‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎Assist‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‎Voice Assist‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‏‎‎‏‎‏‎Enter lockdown‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‎‎‎‏‏‎‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎Lockdown‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‏‎‏‏‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‎‏‎999+‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‎‏‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‎‏‏‎‏‎‎‎‎New notification‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‎‏‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎Virtual keyboard‎‏‎‎‏‎" @@ -497,10 +498,8 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‎‏‏‎‏‎‎‎‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‎‏‎‏‎‎Too many attempts. Try again later.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‏‎‏‎‏‎‏‎‎‏‎Too many attempts. Fingerprint sensor disabled.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‎‎‏‏‎‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎Try again.‎‏‎‎‏‎" - - - - + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‏‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‎‎No fingerprints enrolled.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‎This device does not have a fingerprint sensor‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‎‎‎‏‎‏‎‎Finger ‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎‎‏‎‎‏‎" @@ -827,6 +826,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‏‎Tip: Double-tap to zoom in and out.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‎‏‏‎‏‏‎‏‎‎‏‎‎‏‎‏‎‎‏‏‎‏‏‎‏‏‎‎‎‏‎‎‎‏‎‏‏‎‎‏‎‎‎Autofill‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‏‎‎Set up Autofill‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‎‎‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‎Autofill‎‏‎‎‏‎" " ‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‎‎ ‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‎‎‎‎‏‎$1$2$3‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‏‏‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‏‎‎‏‎‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‏‎, ‎‏‎‎‏‎ " @@ -1197,9 +1197,9 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‎‎‏‎‏‎SIM card added‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‎‎‎‎Restart your device to access the mobile network.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‏‎Restart‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‏‎To get your new SIM working properly, you\'ll need to install and open an app from your carrier.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‏‎‎‎‏‎GET THE APP‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎NOT NOW‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‎‎‎‎Activate mobile service‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‏‎‏‏‎‏‎‏‎‏‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎Download the carrier app to activate your new SIM‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‏‎‎‎‏‎‎‏‎‏‏‎‏‏‎‎‏‏‎‎‎‏‎Download app‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‏‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‏‏‏‎‏‎New SIM inserted‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‏‎‎‏‎‎‏‎‏‏‎‎‎‏‎Tap to set it up‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎Set time‎‏‎‎‏‎" @@ -1211,23 +1211,15 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎No permissions required‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‎‎‎‏‏‎‎‎‏‎‏‎‏‏‏‎‎‏‏‎‎‎this may cost you money‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‎‏‏‎‎‏‎‏‎OK‎‏‎‎‏‎" - - - - - - - - - - - - - - + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‎‏‏‎‎‏‏‏‎‎‎‏‎‏‏‎Charging this device via USB‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‎‏‎‎‏‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‏‎‏‎Charging connected device via USB‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‏‏‎‎‏‎‎‎‎‏‎‎‎‎‎‏‏‎‏‏‎‏‎‏‎USB file transfer turned on‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‏‏‎‎PTP via USB turned on‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‏‎USB tethering turned on‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎MIDI via USB turned on‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎‏‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎USB accessory mode turned on‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‎Tap for more options.‎‏‎‎‏‎" - - + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‎‎‏‎‎Charging connected device. Tap for more options.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‏‎‎‎Analog audio accessory detected‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‏‏‎The attached device is not compatible with this phone. Tap to learn more.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎USB debugging connected‎‏‎‎‏‎" @@ -1830,8 +1822,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‏‏‏‏‎‎‎‎‎‏‏‎‎‎Phone not allowed for voice‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‏‏‏‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎Popup Window‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‏‎‎‏‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎+ ‎‏‎‎‏‏‎%1$d‎‏‎‎‏‏‏‎‎‏‎‎‏‎" - - + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‎‏‏‎‏‎‏‏‎‎‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‏‎‎‎‎‎‎‎‎‎App version downgraded, or isn’t compatible with this shortcut‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‎Couldn’t restore shortcut because app doesn’t support backup and restore‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎Couldn’t restore shortcut because of app signature mismatch‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‏‎Couldn’t restore shortcut‎‏‎‎‏‎" @@ -1841,4 +1832,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‎Harmful app detected‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ wants to show ‎‏‎‎‏‏‎%2$s‎‏‎‎‏‏‏‎ slices‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‏‏‎‏‎Edit‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‎‎‏‏‎‎System changes‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‏‏‎‎Do Not Disturb has changed‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‎‏‎‎‎‎‎Tap to check your behavior settings for interruptions‎‏‎‎‏‎" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 6af7eda5656..c92db3dfeff 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -93,6 +93,7 @@ "Mensajes SMS" "Mensajes del buzón de voz" "Llamada con Wi-Fi" + "Estado de SIM" "El dispositivo del mismo nivel solicitó el modo TTY FULL." "El dispositivo del mismo nivel solicitó el modo TTY HCO." "El dispositivo del mismo nivel solicitó el modo TTY VCO." @@ -238,7 +239,7 @@ "Configuración" "Asistencia" "Asistente voz" - "Ingresa bloqueo" + "Bloqueo" "999+" "Notificación nueva" "Teclado virtual" @@ -264,10 +265,8 @@ "%1$s, %2$s" "Modo seguro" "Sistema Android" - - - - + "Cambiar al perfil personal" + "Cambiar al perfil de trabajo" "Contactos" "acceder a los contactos" "Permite que <b>%1$s</b> acceda a tus contactos" @@ -419,10 +418,8 @@ "Permite que la aplicación acceda a las funciones de teléfono del dispositivo. La aplicación puede utilizar este permiso para descubrir identificadores de dispositivos y números de teléfono, para saber si una llamada está activa y para conocer el número remoto con el que se ha establecido conexión mediante una llamada." "Transmite llamadas a través del sistema" "Permite que la app transmita las llamadas a través del sistema para mejorar la experiencia de llamadas." - - - - + "continuar llamada de otra app" + "Permite que la app continúe con una llamada que se inició en otra app." "leer números de teléfono" "Le permite a la app acceder a los números de teléfono del dispositivo." "evitar que el tablet entre en estado de inactividad" @@ -497,11 +494,12 @@ "No se puede almacenar la huella digital. Elimina una de las existentes." "Finalizó el tiempo de espera para la huella digital. Vuelve a intentarlo." "Se canceló la operación de huella digital." - - + "El usuario canceló la operación de huella digital." "Demasiados intentos. Vuelve a intentarlo más tarde." "Realizaste demasiados intentos. Se inhabilitó el sensor de huellas digitales." "Vuelve a intentarlo." + "No se registraron huellas digitales." + "Este dispositivo no tiene sensor de huellas digitales" "Dedo %d" @@ -828,6 +826,7 @@ "Consejo: Toca dos veces para acercar y alejar la imagen." "Autocompletar" "Conf. Autocompl." + "Autocompletar" " " "$1$2$3" ", " @@ -1000,12 +999,9 @@ "Abrir" "Mensaje" "Agregar" - - - - - - + "Ver" + "Programar" + "Realizar seguimiento" "Queda poco espacio de almacenamiento" "Es posible que algunas funciones del sistema no estén disponibles." "No hay espacio suficiente para el sistema. Asegúrate de que haya 250 MB libres y reinicia el dispositivo." @@ -1131,8 +1127,7 @@ Abrir red de Wi-Fi disponible "Conectarse a una red Wi-Fi abierta" - - + "Conectarse a la red Wi-Fi del proveedor" "Conectándose a una red Wi-Fi abierta" "Se conectó a la red Wi-Fi" "No fue posible conectarse a la red Wi‑Fi" @@ -1202,9 +1197,9 @@ "Tarjeta SIM agregada" "Reinicia el dispositivo para acceder a la red móvil." "Reiniciar" - "Para que tu SIM nueva funcione correctamente, debes instalar y abrir la app de tu proveedor." - "OBTENER LA APP" - "AHORA NO" + "Activa servicio de datos móviles" + "Descarga la app del proveedor para activar tu nueva SIM" + "Descargar app" "Nueva SIM insertada" "Presiona para configurar" "Configurar hora" @@ -1216,13 +1211,15 @@ "No se requieren permisos" "esto puede costarte dinero" "Aceptar" - "Cargando este dispositivo por USB" - "El dispositivo conectado se está cargando mediante USB" - "USB para transferir archivos" - "USB para transferir fotos" - "USB para MIDI" - "Conectado a un accesorio USB" + "Cargando dispositivo mediante USB" + "Cargando el dispositivo conectado mediante USB" + "Se activó la transferencia de archivos mediante USB" + "Se activó el modo PTP mediante USB" + "Se activó la conexión mediante dispositivo portátil por USB" + "Se activó el modo MIDI mediante USB" + "Se activó el modo de accesorio USB" "Presiona para ver más opciones." + "Cargando el dispositivo conectado. Presiona para ver más opciones." "Se detectó un accesorio de audio analógico" "El dispositivo adjunto no es compatible con este teléfono. Presiona para obtener más información." "Depuración por USB conectada" @@ -1661,9 +1658,6 @@ "%1$s de trabajo" "%1$s de trabajo 2" "%1$s de trabajo 3" - "Para dejar de fijar esta pantalla, mantén presionados los botones Atrás y Recientes" - "Pantalla fija" - "Pantalla no fija" "Solicitar PIN para quitar fijación" "Solicitar desbloqueo para quitar fijación" "Solicitar contraseña para quitar fijación" @@ -1757,15 +1751,11 @@ "Todos los idiomas" "Todas las regiones" "Búsqueda" - - - - + "¿Activar el perfil de trabajo?" + "Se activaran las apps de trabajo, los datos, las notificaciones y otras funciones del perfil de trabajo" "Activar" - - - - + "Esta app se creó para una versión anterior de Android y es posible que no funcione correctamente. Busca actualizaciones o comunícate con el programador." + "Buscar actualización" "Tienes mensajes nuevos" "Abrir app de SMS para ver el mensaje" "Funciones limitadas" @@ -1832,17 +1822,17 @@ "El teléfono no admite acciones de voz" "Ventana emergente" "%1$d más" - "Este acceso directo requiere la app más reciente" + "La app pasó a una versión anterior o no es compatible con este acceso directo" "Error al restablecer el acceso directo porque la app no admite la opción de copia de seguridad y restauración" "Error al restablecer el acceso directo por falta de coincidencia con la firma de apps" "Error al restablecer el acceso directo" "Se inhabilitó el acceso directo" - - - - - - + "DESINSTALAR" + "ABRIR DE TODOS MODOS" + "Se detectó una app dañina" "%1$s quiere mostrar fragmentos de %2$s" "Editar" + "Cambios del sistema" + "Se modificó la opción No interrumpir" + "Presiona para consultar la configuración de comportamiento de las interrupciones" diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 487d68af53f..cb74241b917 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -93,6 +93,7 @@ "Mensajes SMS" "Mensajes de voz" "Llamada por Wi-Fi" + "Estado de la tarjeta SIM" "Un dispositivo ha solicitado el modo TTY FULL" "Un dispositivo ha solicitado el modo TTY HCO" "Un dispositivo ha solicitado el modo TTY VCO" @@ -238,7 +239,7 @@ "Ajustes" "Asistencia" "Asistente voz" - "Activar bloqueo" + "Bloquear" "> 999" "Notificación nueva" "Teclado virtual" @@ -497,10 +498,8 @@ "Demasiados intentos. Vuelve a intentarlo más tarde." "Demasiados intentos. Se ha inhabilitado el sensor de huellas digitales." "Vuelve a intentarlo." - - - - + "No se ha registrado ninguna huella digital." + "El dispositivo no tiene ningún sensor de huellas digitales" "Dedo %d" @@ -827,6 +826,7 @@ "Sugerencia: toca dos veces para ampliar o reducir el contenido." "Autocompletar" "Configurar Autocompletar" + "Autocompletar" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "Tarjeta SIM añadida" "Reinicia el dispositivo para acceder a la red móvil." "Reiniciar" - "Para que tu nueva SIM funcione correctamente, debes instalar y abrir una aplicación de tu operador." - "DESCARGAR LA APLICACIÓN" - "AHORA NO" + "Activar servicio móvil" + "Descara la aplicación del operador para activar tu nueva tarjeta SIM" + "Descargar aplicación" "Nueva SIM insertada" "Toca para configurar" "Establecer hora" @@ -1211,23 +1211,15 @@ "No es necesario ningún permiso" "es posible que esto te cueste dinero" "Aceptar" - - - - - - - - - - - - - - + "Cargando este dispositivo por USB" + "Cargando dispositivo conectado por USB" + "Modo de transferencia de archivos por USB activado" + "Modo PTP por USB activado" + "Modo de conexión compartida por USB activado" + "Modo MIDI por USB activado" + "Modo de accesorio USB activado" "Toca para ver más opciones." - - + "Cargando el dispositivo conectado. Toca para ver más opciones." "Se ha detectado un accesorio de audio analógico" "El dispositivo adjunto no es compatible con este teléfono. Toca para obtener más información." "Depuración USB habilitada" @@ -1529,7 +1521,7 @@ "Has fallado %1$d veces al dibujar el patrón de desbloqueo. Si fallas otras %2$d veces, deberás usar una cuenta de correo electrónico para desbloquear el teléfono.\n\n Inténtalo de nuevo en %3$d segundos." " — " "Quitar" - "¿Quieres subir el volumen por encima del nivel recomendado?\n\nEscuchar sonidos a alto volumen durante largos períodos de tiempo puede dañar tus oídos." + "¿Quieres subir el volumen por encima del nivel recomendado?\n\nEscuchar sonidos fuertes durante mucho tiempo puede dañar los oídos." "¿Utilizar acceso directo de accesibilidad?" "Si el acceso directo está activado, pulsa los dos botones de volumen durante tres segundos para iniciar una función de accesibilidad.\n\n Función de accesibilidad actual:\n %1$s\n\n Puedes cambiar la función en Ajustes > Accesibilidad." "Desactivar acceso directo" @@ -1830,8 +1822,7 @@ "Teléfono no permitido para voz" "Ventana emergente" "%1$d más" - - + "Se ha instalado una versión anterior de la aplicación o no es compatible con este acceso directo" "No se ha podido restaurar el acceso directo porque la aplicación no es compatible con la función de copia de seguridad y restauración" "No se ha podido restaurar el acceso directo porque la firma de la aplicación no coincide" "No se ha podido restaurar el acceso directo" @@ -1841,4 +1832,7 @@ "Se ha detectado una aplicación dañina" "%1$s quiere mostrar fragmentos de %2$s" "Editar" + "Cambios del sistema" + "Ha cambiado el modo No molestar" + "Toca para consultar los ajustes de comportamiento de las interrupciones" diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 29d600f6dcf..de44b89472f 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -93,6 +93,8 @@ "SMS-sõnumid" "Kõnepostisõnumid" "WiFi-kõned" + + "Partner taotles TTY-režiimi TÄIELIK" "Partner taotles TTY-režiimi HCO" "Partner taotles TTY-režiimi VCO" @@ -238,7 +240,8 @@ "Seaded" "Abi" "Häälabi" - "Kasuta lukust." + + "999+" "Uus märguanne" "Virtuaalne klaviatuur" @@ -264,10 +267,8 @@ "%1$s, %2$s" "Turvarežiim" "Android-süsteem" - - - - + "Lülitu isiklikule profiilile" + "Lülitu tööprofiilile" "Kontaktid" "juurdepääs kontaktidele" "Lubage rakendusele <b>%1$s</b> juurdepääs kontaktidele" @@ -419,10 +420,8 @@ "Annab rakendusele juurdepääsu seadme telefonifunktsioonidele. See luba võimaldab rakendusel määrata telefoninumbri ja seadme ID-d ning kontrollida, kas kõne on aktiivne ja kaugnumber on kõne kaudu telefoniga ühendatud." "kõnede marsruutimine süsteemi kaudu" "Võimaldab rakendusel kõnesid süsteemi kaudu marsruutida, et helistamiskogemust täiustada." - - - - + "jätka kõnet teises rakenduses" + "Lubab rakendusel jätkata kõnet, mida alustati teises rakenduses." "lugeda telefoninumbreid" "Rakendusel lubatakse juurde pääseda seadme telefoninumbritele." "tahvelarvuti uinumise vältimine" @@ -497,11 +496,12 @@ "Sõrmejälge ei saa salvestada. Eemaldage olemasolev sõrmejälg." "Sõrmejälje riistvara taimeri ajalõpp. Proovige uuesti." "Sõrmejälje toiming tühistati." - - + "Kasutaja tühistas sõrmejälje kasutamise." "Liiga palju katseid. Proovige hiljem uuesti." "Liiga palju katseid. Sõrmejäljeandur on keelatud." "Proovige uuesti." + "Ühtegi sõrmejälge pole registreeritud." + "Selles seadmes pole sõrmejäljeandurit" "Sõrm %d" @@ -828,6 +828,8 @@ "Vihje: suurendamiseks ja vähendamiseks puudutage kaks korda." "Automaatne täitmine" "Automaatse täitmise seadistamine" + + " " "$1$2$3" ", " @@ -1000,12 +1002,9 @@ "Ava" "Saada sõnum" "Lisa" - - - - - - + "Kuva" + "Lisa ajakavasse" + "Jälgi" "Talletusruum saab täis" "Mõned süsteemifunktsioonid ei pruugi töötada" "Süsteemis pole piisavalt talletusruumi. Veenduge, et seadmes oleks 250 MB vaba ruumi, ja käivitage seade uuesti." @@ -1131,8 +1130,7 @@ Avatud WiFi-võrk on saadaval "Looge ühendus avatud WiFi-võrguga" - - + "Ühendatud operaatori WiFi-võrguga" "Ühenduse loomine avatud WiFi-võrguga" "Ühendatud WiFi-võrguga" "WiFi-võrguga ei õnnestunud ühendust luua" @@ -1202,9 +1200,12 @@ "SIM-kaart lisatud" "Mobiilsidevõrku pääsemiseks taaskäivitage seade." "Taaskäivita" - "Uue SIM-kaardi kasutamiseks peate installima ja avama operaatorilt saadud rakenduse." - "HANKIGE RAKENDUS" - "MITTE PRAEGU" + + + + + + "Uus SIM-kaart on sisestatud" "Puudutage seadistamiseks" "Kellaaja määramine" @@ -1216,13 +1217,15 @@ "Lube pole vaja" "see võib olla tasuline" "OK" - "Seadet laetakse USB kaudu" - "Ühendatud seade saab toidet USB kaudu" - "USB failide edastamiseks" - "USB fotode edastamiseks" - "USB MIDI jaoks" - "Ühendatud USB-lisaseadmega" + "Seda seadet laetakse USB kaudu" + "Ühendatud seadet laetakse USB kaudu" + "Failiedastus USB kaudu on sisse lülitatud" + "PTP USB kaudu on sisse lülitatud" + "USB kaudu jagamine on sisse lülitatud" + "MIDI USB kaudu on sisse lülitatud" + "USB-lisaseadme režiim on sisse lülitatud" "Puudutage lisavalikute nägemiseks." + "Ühendatud seadet laetakse. Puudutage lisavalikute nägemiseks." "Tuvastati analoogne helitarvik" "Ühendatud seade ei ühildu selle telefoniga. Puudutage lisateabe saamiseks." "USB-silumine ühendatud" @@ -1661,9 +1664,6 @@ "Töö %1$s" "2. töö %1$s" "3. töö %1$s" - "Ekraani vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade" - "Ekraan on kinnitatud" - "Ekraan on vabastatud" "Enne vabastamist küsi PIN-koodi" "Enne vabastamist küsi avamismustrit" "Enne vabastamist küsi parooli" @@ -1757,15 +1757,11 @@ "Kõik keeled" "Kõik piirkonnad" "Otsing" - - - - + "Kas lülitada tööprofiil sisse?" + "Teie töörakendused, märguanded, andmed ja muud tööprofiili funktsioonid lülitatakse sisse" "Lülita sisse" - - - - + "See rakendus on loodud Androidi vanema versiooni jaoks ega pruugi õigesti töötada. Otsige värskendusi või võtke ühendust arendajaga." + "Otsi värskendust" "Teile on uusi sõnumeid" "Avage vaatamiseks SMS-rakendus" "Funktsioon võib olla piiratud" @@ -1832,17 +1828,17 @@ "Telefoni ei lubata häälega kasutada" "Hüpikaken" "+ %1$d" - "See otsetee nõuab rakenduse uusimat versiooni" + "Rakendus viidi üle vanemale versioonile või see ei ühildu selle otseteega" "Otseteed ei õnnestunud taastada, kuna rakendus ei toeta varundamist ega taastamist" "Otseteed ei õnnestunud taastada, kuna rakenduse allkiri ei ühti" "Otseteed ei õnnestunud taastada" "Otsetee on keelatud" - - - - - - + "DESINSTALLI" + "AVA IKKA" + "Tuvastati kahjulik rakendus" "Rakendus %1$s soovib näidata rakenduse %2$s lõike" "Muutmine" + "Süsteemi muudatused" + "Režiimi Mitte segada muudeti" + "Puudutage katkestuste käitumise seadete kontrollimiseks" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 1b3e1316b7a..55b48a6500d 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -93,6 +93,7 @@ "SMS mezuak" "Erantzungailuko mezuak" "Wi-Fi bidezko deiak" + "SIMaren egoera" "Beste gailuak TTY osagarria FULL moduan erabiltzea eskatu du" "Beste gailuak TTY osagarria HCO moduan erabiltzea eskatu du" "Beste gailuak TTY osagarria VCO moduan erabiltzea eskatu du" @@ -238,7 +239,7 @@ "Ezarpenak" "Lagundu" "Ahots-laguntza" - "Sartu blokeo moduan" + "Blokeoa" "999+" "Jakinarazpen berria" "Teklatu birtuala" @@ -355,8 +356,6 @@ "Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta tableta motel daiteke." "Beren zati batzuk memorian modu iraunkorrean aktibo uztea baimentzen die aplikazioei. Horrela, beste aplikazioek memoria gutxiago izan lezakete erabilgarri eta telebistak motelago funtziona lezake." "Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta telefonoa motel daiteke." - "Exekutatu zerbitzuak aurreko planoan" - "Aurreko planoko zerbitzuak erabiltzea baimentzen dio aplikazioari." "neurtu aplikazioen biltegiratze-tokia" "Bere kodea, datuak eta cache-tamainak eskuratzea baimentzen die aplikazioei." "aldatu sistemaren ezarpenak" @@ -827,6 +826,7 @@ "Aholkua: sakatu birritan handitzeko edo txikitzeko." "Betetze automatikoa" "Konfiguratu betetze automatikoa" + "Betetze automatikoa" " " "$1$2$3" ", " @@ -1198,9 +1198,9 @@ "SIM txartela gehitu da" "Berrabiarazi gailua sare mugikorra atzitzeko." "Berrabiarazi" - "SIM berriak behar bezala funtziona dezan, operadorearen aplikazio bat instalatu eta ireki behar duzu." - "ESKURATU APLIKAZIOA" - "ORAIN EZ" + "Aktibatu zerbitzu mugikorra" + "Deskargatu operadorearen aplikazioa SIM berria aktibatzeko" + "Deskargatu aplikazioa" "SIM berria sartu da" "Sakatu konfiguratzeko" "Ezarri ordua" @@ -1833,4 +1833,7 @@ "Aplikazio kaltegarri bat hauteman da" "%1$s aplikazioak %2$s aplikazioaren zatiak erakutsi nahi ditu" "Editatu" + "Sistema-aldaketak" + "\"Ez molestatu\" modua aldatu da" + "Sakatu etenaldietarako ezarri den jokabidea ikusteko" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 9f9d33579df..8be34800f26 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -93,6 +93,7 @@ "پیامک‌ها" "پیام‌های پست صوتی" "‏تماس ازطریق Wi-Fi" + "وضعیت سیم‌کارت" "‏دستگاه مرتبط درخواست TTY حالت FULL کرد" "‏دستگاه مرتبط درخواست TTY حالت HCO کرد" "‏دستگاه مرتبط درخواست TTY حالت VCO کرد" @@ -238,7 +239,7 @@ "تنظیمات" "دستیار" "دستیار صوتی" - "قفل همه را وارد کنید" + "قفل همه" "۹۹۹+" "اعلان جدید" "صفحه‌‌کلید مجازی" @@ -264,10 +265,8 @@ "%1$s، %2$s" "حالت ایمن" "‏سیستم Android" - - - - + "جابه‌جا شدن به نمایه شخصی" + "جابه‌جا شدن به نمایه کاری" "مخاطبین" "دسترسی به مخاطبین شما" "‏به <b>%1$s</b> امکان دهید به مخاطبین شما دسترسی پیدا کند" @@ -419,10 +418,8 @@ "به برنامه اجازه می‌دهد به ویژگی‌های تلفن دستگاه شما دسترسی پیدا کند. این مجوز به برنامه اجازه می‌دهد شماره تلفن و شناسه‌های دستگاه، فعال بودن یک تماس و شماره راه دوری که با یک تماس متصل شده است را مشخص کند." "برقرار کردن تماس‌ها ازطریق سیستم" "به برنامه امکان می‌دهد برای بهبود تجربه تماس، تماس‌هایش را ازطریق سیستم برقرار کند." - - - - + "ادامه دادن تماس از برنامه‌ای دیگر" + "به برنامه اجازه می‌دهد تماسی را که در برنامه دیگری شروع شده ادامه دهد." "خواندن شماره تلفن‌ها" "به برنامه امکان می‌دهد به شماره تلفن‌های دستگاه دسترسی داشته باشد." "ممانعت از به خواب رفتن رایانهٔ لوحی" @@ -497,11 +494,12 @@ "ذخیره اثر انگشت ممکن نیست. لطفاً یک اثر انگشت موجود را حذف کنید." "مهلت زمانی ثبت اثر انگشت به پایان رسید. دوباره امتحان کنید." "عملکرد اثر انگشت لغو شد." - - + "کاربر عملیات اثر انگشت را لغو کرد" "تلاش‌های زیادی انجام شده است. بعداً دوباره امتحان کنید." "تلاش‌های بسیاری زیادی انجام شده است. حسگر اثر انگشت غیرفعال شد." "دوباره امتحان کنید." + "اثر انگشتی ثبت نشده است." + "این دستگاه حسگر اثر انگشت ندارد" "انگشت %d" @@ -828,6 +826,7 @@ "نکته: برای بزرگ‌نمایی و کوچکنمایی، دو بار ضربه بزنید." "تکمیل خودکار" "راه‌اندازی تکمیل خودکار" + "تکمیل خودکار" " " "$1$2$3" "، " @@ -1000,12 +999,9 @@ "باز کردن" "پیام" "افزودن" - - - - - - + "مشاهده" + "زمان‌بندی" + "پیگیری" "حافظه درحال پر شدن است" "برخی از عملکردهای سیستم ممکن است کار نکنند" "فضای ذخیره‌سازی سیستم کافی نیست. اطمینان حاصل کنید که دارای ۲۵۰ مگابایت فضای خالی هستید و سیستم را راه‌اندازی مجدد کنید." @@ -1131,8 +1127,7 @@ ‏شبکه‌ Wi-Fi باز در دسترس "‏اتصال به شبکه Wi‑Fi باز" - - + "‏اتصال به شبکه Wi-Fi شرکت مخابراتی" "‏درحال اتصال به شبکه Wi‑Fi باز" "‏به شبکه Wi‑Fi متصل شد" "‏به شبکه Wi-Fi متصل نشد" @@ -1202,9 +1197,9 @@ "سیم کارت اضافه شد" "برای دسترسی به شبکهٔ تلفن همراه، دستگاه خود را مجدداً راه‌اندازی کنید." "راه‌اندازی مجدد" - "برای اینکه سیم‌کارت جدیدتان عملکرد درستی داشته باشد باید برنامه‌ای را از شرکت مخابراتی‌تان نصب و باز کنید." - "دریافت برنامه" - "اکنون نه" + "سرویس دستگاه همراه را فعال کنید" + "برای فعال کردن سیم‌کارت جدیدتان، برنامه شرکت مخابراتی را بارگیری کنید" + "بارگیری برنامه" "سیم‌کارت جدید جاگذاری شد" "برای تنظیم آن ضربه بزنید" "تنظیم زمان" @@ -1216,13 +1211,15 @@ "مجوزی لازم نیست" "ممکن است برای شما هزینه داشته باشد" "تأیید" - "‏شارژ کردن این دستگاه از طریق USB" - "‏شارژ دستگاه متصل از طریق USB" - "‏USB برای انتقال فایل" - "‏USB برای انتقال عکس" - "‏USB برای MIDI" - "‏به یک وسیله جانبی USB وصل شده است" + "‏درحال شارژ کردن این دستگاه ازطریق USB" + "‏درحال شارژ کردن دستگاه متصل‌‌شده ازطریق USB" + "‏انتقال فایل ازطریق USB روشن شد" + "‏PTP ازطریق USB روشن شد" + "‏اتصال به اینترنت با USB تلفن همراه روشن شد" + "‏MIDI ازطریق USB روشن شد" + "‏حالت لوازم جانبی USB روشن شد" "برای گزینه‌های بیشتر ضربه بزنید." + "درحال شارژ کردن دستگاه متصل‌‌شده. برای گزینه‌های بیشتر، ضربه بزنید." "لوازم جانبی صوتی آنالوگ شناسایی شد" "دستگاه متصل‌شده با این تلفن سازگار نیست. روی اطلاعات بیشتر، ضربه بزنید." "‏اشکال‌زدایی USB متصل شد" @@ -1661,9 +1658,6 @@ "%1$s محل کار" "کار دوم %1$s" "کار سوم %1$s" - "برای برداشتن پین این صفحه، دکمه‌های «برگشت» و «نمای کلی» را لمس کنید و نگه‌دارید" - "صفحه پین شد" - "پین صفحه برداشته شد" "درخواست کد پین قبل از برداشتن پین" "درخواست الگوی باز کردن قفل قبل از برداشتن پین" "درخواست گذرواژه قبل از برداشتن پین" @@ -1757,15 +1751,11 @@ "همه زبان‌ها" "همه منطقه‌ها" "جستجو" - - - - + "نمایه کاری روشن شود؟" + "برنامه‌ها، اعلان‌ها، داده‌ها و سایر قابلیت‌های نمایه کاری شما روشن خواهد شد" "روشن کردن" - - - - + "‏این برنامه برای نسخه قدیمی‌تری از Android ساخته شده است و ممکن است درست کار نکند. وجود به‌روزرسانی را بررسی کنید یا با برنامه‌نویس تماس بگیرید." + "بررسی وجود به‌روزرسانی" "پیام‌های جدیدی دارید" "برای مشاهده، برنامه پیامک را باز کنید" "ممکن است برخی از عملکردها محدود باشند" @@ -1832,17 +1822,17 @@ "تلفن برای عملیات صوتی مجاز نیست" "پنجره بازشو" "‎+ %1$d‎" - "این میان‌بر به جدیدترین نسخه برنامه نیاز دارد" + "نسخه برنامه تنزل داده شده است یا با این میان‌بر سازگار نیست" "نمی‌توان میان‌بر را بازیابی کرد زیرا برنامه از پشتیبان‌گیری و بازیابی پشتیبانی نمی‌کند" "به‌علت عدم تطابق امضای برنامه نمی‌توان میان‌بر را بازیابی کرد" "نمی‌توان میان‌بر را بازیابی کرد" "میان‌بر غیرفعال شده است" - - - - - - + "حذف نصب" + "درهرصورت باز شود" + "برنامه مضر شناسایی شد" "%1$s می‌خواهد تکه‌های %2$s را نشان دهد" "ویرایش" + "تغییرات سیستم" + "«مزاحم نشوید» تغییر کرده است" + "برای بررسی تنظیمات رفتار شما دربرابر وقفه‌ها، ضربه بزنید" diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 8d1350a6f22..98b667f47db 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -93,6 +93,7 @@ "Tekstiviestit" "Vastaajaviestit" "Wi-Fi-puhelut" + "SIM-kortin tila" "Toinen käyttäjä vaihtoi TTY-tilaksi TÄYSI" "Toinen käyttäjä vaihtoi TTY-tilaksi HCO" "Toinen käyttäjä vaihtoi TTY-tilaksi VCO" @@ -238,7 +239,7 @@ "Asetukset" "Auta" "Ääniapuri" - "Lukitse" + "Lukitse" "999+" "Uusi ilmoitus" "Virtuaalinen näppäimistö" @@ -497,10 +498,8 @@ "Liian monta yritystä. Yritä myöhemmin uudelleen." "Liian monta yritystä. Sormenjälkitunnistin poistettu käytöstä." "Yritä uudelleen." - - - - + "Sormenjälkiä ei ole otettu käyttöön." + "Laitteessa ei ole sormenjälkitunnistinta." "Sormi %d" @@ -827,6 +826,7 @@ "Vinkki: lähennä ja loitonna kaksoisnapauttamalla." "Aut. täyttö" "Määritä autom. täyttö" + "Automaattinen täyttö" " " "$1$2$3" ", " @@ -889,7 +889,7 @@ "vuonna %s" "päivä" "päivää" - "tunti" + "tunnit" "tuntia" "min" "min" @@ -1197,9 +1197,9 @@ "SIM-kortti lisätty" "Muodosta mobiiliverkkoyhteys käynnistämällä laite uudelleen." "Käynnistä uudelleen" - "Jotta saat uuden SIM-kortin toimimaan oikein, sinun on asennettava ja avattava operaattorisi sovellus." - "LATAA SOVELLUS" - "EI NYT" + "Aktivoi mobiilipalvelu" + "Lataa operaattorin sovellus, niin voit aktivoida SIM-korttisi." + "Lataa sovellus" "Uusi SIM-kortti asetettu" "Määritä se napauttamalla" "Aseta aika" @@ -1211,23 +1211,15 @@ "Lupia ei tarvita" "tämä voi maksaa" "OK" - - - - - - - - - - - - - - + "Laitetta ladataan USB-yhteyden kautta" + "Ladataan yhdistettyä laitetta USB:n kautta" + "USB-tiedostonsiirto on käytössä" + "PTP USB:n kautta on käytössä" + "Internetin jakaminen USB:n kautta on käytössä" + "MIDI USB:n kautta on käytössä" + "USB-lisävarustetila on käytössä" "Näet lisää vaihtoehtoja napauttamalla." - - + "Ladataan yhdistettyä laitetta. Napauta nähdäksesi lisää vaihtoehtoja." "Analoginen äänilaite havaittu" "Liitetty laite ei ole yhteensopiva puhelimen kanssa. Napauta, niin näet lisätietoja." "USB-vianetsintä yhdistetty" @@ -1792,7 +1784,7 @@ "Tuottavuus" "Laitteen tallennustila" "USB-vianetsintä" - "tunti" + "tunnit" "minuutit" "Aseta aika" "Anna kelvollinen aika." @@ -1830,8 +1822,7 @@ "Äänipalvelujen käyttö ei sallittua puhelimella" "Ponnahdusikkuna" "+ %1$d" - - + "Sovellusversio on päivitetty vanhempaan versioon tai ei ole yhteensopiva tämän pikakuvakkeen kanssa." "Pikakuvakkeen palautus epäonnistui, koska sovellus ei tue varmuuskopiointia eikä palauttamista." "Pikakuvakkeen palautus epäonnistui sovelluksen allekirjoituksen yhteensopimattomuuden vuoksi." "Pikakuvakkeen palautus epäonnistui." @@ -1841,4 +1832,7 @@ "Haitallinen sovellus havaittu" "%1$s haluaa näyttää osia sovelluksesta %2$s." "Muokkaa" + "Järjestelmän muutokset" + "Älä häiritse ‑tila muuttui" + "Tarkasta keskeytyksiä koskevat toiminta-asetukset napauttamalla." diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index ade233cd8cf..c989856c8fb 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -93,6 +93,7 @@ "Messages texte" "Messages vocaux" "Appels Wi-Fi" + "État de la carte SIM" "Mode TTY COMPLET demandé par un pair" "Mode TTY HCO demandé par un pair" "Mode TTY VCO demandé par un pair" @@ -238,7 +239,7 @@ "Paramètres" "Assistance" "Assist. vocale" - "Entrez verrou." + "Verrouillage" ">999" "Nouvelle notification" "Clavier virtuel" @@ -355,8 +356,6 @@ "Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir la tablette." "Permet à l\'application de placer certaines de ses parties en permanence dans la mémoire. Cela peut limiter la mémoire disponible pour les autres applications et ralentir le téléviseur." "Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir le téléphone." - "exécuter le service en premier plan" - "Permet à l\'application d\'utiliser les services en premier plan." "évaluer l\'espace de stockage de l\'application" "Permet à l\'application de récupérer la taille de son code, de ses données et de sa mémoire cache." "modifier les paramètres du système" @@ -827,6 +826,7 @@ "Conseil : Appuyez deux fois pour faire un zoom avant ou arrière." "Saisie auto" "Conf. saisie auto" + "Remplissage automatique" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "Carte SIM ajoutée." "Redémarrez votre appareil pour accéder au réseau mobile." "Redémarrer" - "Pour que la nouvelle carte SIM fonctionne correctement, vous devez installer et ouvrir une application fournie par votre fournisseur de services." - "TÉLÉCHARGER L\'APPLICATION" - "PAS MAINTENANT" + "Activer le service cellulaire" + "Téléchargez l\'application du fournisseur de services pour activer votre nouvelle carte SIM" + "Télécharger l\'application" "Nouvelle carte SIM insérée" "Touchez ici pour effectuer la configuration" "Définir l\'heure" @@ -1832,4 +1832,7 @@ "Une application nuisible a été détectée" "%1$s souhaite afficher %2$s tranches" "Modifier" + "Changements système" + "Les paramètres du mode Ne pas déranger ont changé" + "Touchez l\'écran pour vérifier vos paramètres de comportement pour les interruptions" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 06a56845b7c..924a9a3b7d7 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -93,6 +93,7 @@ "SMS" "Messages vocaux" "Appels Wi-Fi" + "État de la carte SIM" "Mode TTY demandé par l\'interlocuteur : COMPLET" "Mode TTY demandé par l\'interlocuteur : HCO" "Mode TTY demandé par l\'interlocuteur : VCO" @@ -181,6 +182,7 @@ "Votre organisation gère cet appareil et peut surveiller le trafic réseau. Appuyez ici pour obtenir plus d\'informations." "Les données de votre appareil vont être effacées" "Impossible d\'utiliser l\'application d\'administration. Les données de votre appareil vont maintenant être effacées.\n\nSi vous avez des questions, contactez l\'administrateur de votre organisation." + "Impression désactivée par %s." "Moi" "Options de la tablette" "Options du téléviseur" @@ -237,7 +239,7 @@ "Paramètres" "Assistance" "Assistance vocale" - "Verrouiller" + "Verrouillé" ">999" "Nouvelle notification" "Clavier virtuel" @@ -263,8 +265,8 @@ "%1$s, %2$s" "Mode sécurisé" "Système Android" - "Passer au profil personnel" - "Passer au profil professionnel" + "Passer au profil personnel" + "Passer au profil professionnel" "Contacts" "accéder à vos contacts" "Permettre à <b>%1$s</b> d\'accéder à vos contacts" @@ -416,6 +418,8 @@ "Permet à l\'application d\'accéder aux fonctionnalités téléphoniques de l\'appareil. Cette autorisation permet à l\'application de déterminer le numéro de téléphone et les identifiants de l\'appareil, si un appel est actif et le numéro distant connecté par un appel." "acheminer les appels via le système" "Autorise l\'application à acheminer les appels via le système afin d\'optimiser le confort d\'utilisation." + "continuer un appel issu d\'une autre application" + "Autorise l\'application à continuer un appel qui a été démarré dans une autre application." "lire les numéros de téléphone" "Permet à l\'application d\'accéder aux numéros de téléphone de l\'appareil." "empêcher la tablette de passer en mode veille" @@ -485,13 +489,17 @@ "Vous avez déplacé votre doigt trop lentement. Veuillez réessayer." + "Non reconnu" "Matériel d\'empreinte numérique indisponible." "Impossible d\'enregistrer l\'empreinte numérique. Veuillez supprimer une empreinte." "Délai de détection de l\'empreinte numérique expiré. Veuillez réessayer." "Opération d\'empreinte numérique annulée." + "Opération d\'authentification par empreinte digitale annulée par l\'utilisateur." "Trop de tentatives. Veuillez réessayer plus tard." "Trop de tentatives. Lecteur d\'empreinte digitale désactivé." "Veuillez réessayer." + "Aucune empreinte digitale enregistrée." + "Aucun lecteur d\'empreinte digitale n\'est installé sur cet appareil" "Doigt %d" @@ -818,6 +826,7 @@ "Conseil : Appuyez deux fois pour faire un zoom avant ou arrière." "Saisie auto" "Conf. saisie auto" + "Saisie automatique" " " "$1$2$3" ", " @@ -990,6 +999,9 @@ "Ouvrir" "Envoyer un message" "Ajouter" + "Afficher" + "Planifier" + "Suivre" "Espace de stockage bientôt saturé" "Il est possible que certaines fonctionnalités du système ne soient pas opérationnelles." "Espace de stockage insuffisant pour le système. Assurez-vous de disposer de 250 Mo d\'espace libre, puis redémarrez." @@ -1115,6 +1127,7 @@ Réseaux Wi-Fi ouverts disponibles "Se connecter pour ouvrir le réseau Wi-Fi" + "Se connecter au réseau Wi-Fi de l\'opérateur" "Connexion pour ouvrir un réseau Wi-Fi…" "Connecté au réseau Wi-Fi" "Impossible de se connecter au réseau Wi-Fi" @@ -1184,9 +1197,9 @@ "Carte SIM ajoutée." "Redémarrez votre appareil pour accéder au réseau mobile." "Redémarrer" - "Pour que la nouvelle carte SIM fonctionne correctement, vous devez installer et ouvrir une application fournie par votre opérateur." - "TÉLÉCHARGER L\'APPLICATION" - "PLUS TARD" + "Activer le service de données mobiles" + "Téléchargez l\'application de l\'opérateur pour activer votre nouvelle carte SIM" + "Télécharger l\'application" "Nouvelle carte SIM insérée" "Appuyez ici pour effectuer la configuration." "Définir l\'heure" @@ -1198,13 +1211,15 @@ "Aucune autorisation requise" "Cela peut engendrer des frais" "OK" - "Recharge via USB de cet appareil…" - "Alimentation via USB de l\'appareil connecté…" - "USB pour le transfert de fichiers" - "USB pour le transfert de photos" - "USB en mode MIDI" - "Connecté à un accessoire USB" + "Rechargement via USB de cet appareil" + "Rechargement via USB de l\'appareil connecté" + "Transfert de fichiers via USB activé" + "PTP via USB activé" + "Partage de connexion via USB activé" + "MIDI via USB activé" + "Mode d\'accessoire USB activé" "Appuyez ici pour plus d\'options." + "Rechargement de l\'appareil connecté. Appuyez ici pour plus d\'options." "Accessoire audio analogique détecté" "L\'appareil connecté n\'est pas compatible avec ce téléphone. Appuyez ici pour en savoir plus." "Débogage USB activé" @@ -1412,6 +1427,8 @@ "%s au-delà de la limite spécifiée." "Données en arrière-plan limitées" "Appuyez pour suppr. restriction." + "Consommation données importante" + "Consommation de données supérieure à la normale au cours des derniers jours. Appuyez pour afficher consommation et paramètres." "Certificat de sécurité" "Ce certificat est valide." "Délivré à :" @@ -1641,9 +1658,6 @@ "%1$s (travail)" "2e %1$s professionnelle" "3e %1$s professionnelle" - "Pour annuler l\'épinglage de l\'écran, appuyez de manière prolongée sur les boutons Retour et Aperçu" - "Écran épinglé." - "Épinglage d\'écran annulé." "Demander le code PIN avant d\'annuler l\'épinglage" "Demander le schéma de déverrouillage avant d\'annuler l\'épinglage" "Demander le mot de passe avant d\'annuler l\'épinglage" @@ -1688,7 +1702,7 @@ "Jusqu\'à %1$s" "Jusqu\'à %1$s (alarme suivante)" - "Jusqu\'à ce que vous désactiviez ce mode" + "Jusqu\'à la désactivation" "Jusqu\'à ce que vous désactiviez la fonctionnalité \"Ne pas déranger\"" "%1$s/%2$s" "Réduire" @@ -1737,9 +1751,11 @@ "Toutes les langues" "Toutes les régions" "Rechercher" - "Activer le mode pro ?" - "Votre profil professionnel sera activé, y compris les applications, la synchronisation en arrière-plan et les fonctionnalités associées" + "Activer profil professionnel ?" + "Vos applications professionnelles, notifications, données et d\'autres fonctionnalités de votre profil professionnel seront activées" "Activer" + "Cette application a été conçue pour une ancienne version d\'Android et risque de ne pas fonctionner correctement. Recherchez des mises à jour ou contactez le développeur." + "Rechercher une mise à jour" "Vous avez de nouveaux messages" "Ouvrir l\'application de SMS pour afficher le message" "Des fonctionnalités peuvent être limitées" @@ -1806,12 +1822,17 @@ "Téléphone non autorisé pour les commandes vocales" "Fenêtre pop-up" "%1$d autres" - "Ce raccourci nécessite la dernière version de l\'application" + "La version de l\'application est revenue à une version antérieure ou n\'est pas compatible avec cet raccourci" "Le raccourci ne peut pas être restauré car l\'application n\'accepte pas la sauvegarde et la restauration" "Le raccourci ne peut pas être restauré car la signature de l\'application est différente" "Impossible de restaurer le raccourci" "Le raccourci est désactivé" - "Désinstaller" - "Lancer quand même" - "Désinstaller l\'application malveillante ?" + "DÉSINSTALLER" + "OUVRIR QUAND MÊME" + "Application dangereuse détectée" + "%1$s souhaite afficher des éléments de %2$s" + "Modifier" + "Modifications du système" + "Le mode Ne pas déranger a été modifié" + "Appuyez afin de vérifier vos paramètres de comportement pour les interruptions" diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 9fd7fe62881..d36e4a61bf2 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -93,6 +93,8 @@ "Mensaxes SMS" "Mensaxes de correo de voz" "Chamadas por wifi" + + "Outro dispositivo solicitou o modo TTY COMPLETO" "Outro dispositivo solicitou o modo TTY HCO" "Outro dispositivo solicitou o modo TTY VCO" @@ -238,7 +240,8 @@ "Configuración" "Asistencia" "Asistente voz" - "Activar bloqueo" + + ">999" "Notificación nova" "Teclado virtual" @@ -264,10 +267,8 @@ "%1$s, %2$s" "Modo seguro" "Sistema Android" - - - - + "Cambiar ao perfil persoal" + "Cambiar ao perfil de traballo" "Contactos" "acceder aos teus contactos" "Permitir que a aplicación <b>%1$s</b> acceda aos teus contactos" @@ -419,10 +420,8 @@ "Permite á aplicación acceder ás funcións de teléfono do dispositivo. Con este permiso a aplicación pode determinar o número de teléfono e os ID do dispositivo, se unha chamada está activa e o número remoto conectado mediante unha chamada." "dirixir as chamadas a través do sistema" "Permite á aplicación dirixir as súas chamadas a través do sistema para mellorar a túa experiencia durante as chamadas." - - - - + "continuar unha chamada iniciada noutra aplicación" + "Permite que a aplicación continúe unha chamada que se iniciou noutra aplicación." "ler números de teléfono" "Permite que a aplicación acceda aos números de teléfono do dispositivo." "evitar que a tableta entre en modo de inactividade" @@ -497,11 +496,12 @@ "Non se pode almacenar a impresión dixital. Elimina unha impresión dixital existente." "Esgotouse o tempo de espera da impresión dixital. Téntao de novo." "Cancelouse a operación da impresión dixital." - - + "O usuario cancelou a operación da impresión dixital." "Demasiados intentos. Téntao de novo máis tarde." "Demasiados intentos. Desactivouse o sensor de impresión dixital." "Téntao de novo." + "Non se rexistraron impresións dixitais." + "Este dispositivo non ten sensor de impresión dixital" "Dedo %d" @@ -828,6 +828,8 @@ "Consello: Toca dúas veces para achegar e afastar o zoom." "Encher" "Conf. autocompletar" + + " " "$1$2$3" ", " @@ -1000,12 +1002,9 @@ "Abrir" "Mensaxe" "Engadir" - - - - - - + "Ver" + "Programar" + "Realizar seguimento" "Estase esgotando o espazo de almacenamento" "É posible que algunhas funcións do sistema non funcionen" "Non hai almacenamento suficiente para o sistema. Asegúrate de ter un espazo libre de 250 MB e reinicia o dispositivo." @@ -1131,8 +1130,7 @@ Abrir rede wifi dispoñible "Conéctate a unha rede wifi aberta" - - + "Conectarse á rede wifi dun operador" "Conectándose á rede wifi aberta" "Conectouse á rede wifi" "Non se puido conectar á rede wifi" @@ -1203,9 +1201,12 @@ "Engadiuse unha tarxeta SIM" "Reinicia o dispositivo para acceder á rede móbil." "Reiniciar" - "Para conseguir que a túa SIM nova funcione correctamente, deberás instalar e abrir unha aplicación do teu operador." - "DESCARGAR A APLICACIÓN" - "AGORA NON" + + + + + + "Introduciuse unha nova SIM" "Tocar para configurar" "Configurar hora" @@ -1217,13 +1218,15 @@ "Non é necesario ningún permiso" "é posible que teñas que pagar" "Aceptar" - "Cargando este dispositivo por USB" - "O USB está proporcionando enerxía ao dispositivo conectado" - "USB para transferencia de ficheiros" - "USB para transferencia de fotos" - "USB para MIDI" - "Conectado a un accesorio USB" + "Cargando este dispositivo por USB" + "Cargando o dispositivo conectado por USB" + "Activouse a transferencia de ficheiros por USB" + "Activouse o modo PTP por USB" + "Activouse a conexión compartida por USB" + "Activouse o modo MIDI por USB" + "Activouse o modo de accesorio USB" "Toca para ver máis opcións." + "Cargando o dispositivo conectado. Toca para ver máis opcións." "Detectouse un accesorio de audio analóxico" "O dispositivo conectado non é compatible con este teléfono. Toca para obter máis información." "Depuración USB conectada" @@ -1662,9 +1665,6 @@ "%1$s do traballo" "2.º %1$s do traballo" "3.º %1$s do traballo" - "Para soltar a pantalla, mantén premidos os botóns Volver e Visión xeral." - "Pantalla fixada" - "Pantalla desactivada" "Solicitar un PIN antes de soltar a pantalla" "Solicitar un padrón de desbloqueo antes de soltar a pantalla" "Solicitar un contrasinal antes de soltar a pantalla" @@ -1758,15 +1758,11 @@ "Todos os idiomas" "Todas as rexións" "Buscar" - - - - + "Activar o perfil de traballo?" + "Activaranse as túas aplicacións de traballo, as notificacións, os datos e outras funcións do perfil de traballo" "Activar" - - - - + "Esta aplicación deseñouse para unha versión anterior de Android e quizais non funcione correctamente. Proba a buscar actualizacións ou contacta co programador." + "Buscar actualización" "Tes mensaxes novas" "Abre a aplicación de SMS para ver as mensaxes" "Pode haber funcións limitadas" @@ -1833,17 +1829,17 @@ "Non se permite o teléfono para as accións de voz" "Ventá emerxente" "%1$d máis" - "Para utilizar este atallo, necesítase a versión máis recente da aplicación" + "A aplicación mudou a unha versión anterior ou non é compatible con este atallo" "Non se puido restaurar o atallo porque a aplicación non é compatible coa restauración e a copia de seguranza" "Non se puido restaurar o atallo porque a sinatura da aplicación non coincide" "Non se puido restaurar o atallo" "Desactivouse o atallo" - - - - - - + "DESINSTALAR" + "ABRIR IGUALMENTE" + "Detectouse unha aplicación daniña" "A aplicación %1$s quere mostrar partes de %2$s" "Editar" + "Cambios no sistema" + "O modo Non molestar cambiou" + "Toca para cambiar a túa configuración de comportamentos para as interrupcións" diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 9356c969ed0..bb6ac6dd702 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -93,6 +93,8 @@ "SMS સંદેશા" "વૉઇસમેઇલ સંદેશા" "વાઇ-ફાઇ કૉલિંગ" + + "પીઅરે TTY મોડ પૂર્ણની વિનંતી કરી" "પીઅરે TTY મોડ HCO ની વિનંતી કરી" "પીઅરે TTY મોડ VCO ની વિનંતી કરી" @@ -238,7 +240,8 @@ "સેટિંગ્સ" "સહાય" "વૉઇસ સહાય" - "લોકડાઉન દાખલ કરો" + + "999+" "નવું નોટિફિકેશન" "વર્ચ્યુઅલ કીબોર્ડ" @@ -497,10 +500,8 @@ "ઘણા બધા પ્રયત્નો. પછીથી ફરી પ્રયાસ કરો." "ઘણા વધુ પ્રયત્નો. ફિંગરપ્રિન્ટ સેન્સર અક્ષમ કરવામાં આવ્યું છે." "ફરી પ્રયાસ કરો." - - - - + "કોઈ ફિંગરપ્રિન્ટની નોંધણી કરવામાં આવી નથી." + "આ ઉપકરણમાં કોઈ ફિંગરપ્રિન્ટ સેન્સર નથી" "આંગળી %d" @@ -827,6 +828,8 @@ "ટિપ: ઝૂમ વધારવા અને ઘટાડવા માટે બે વાર ટેપ કરો." "સ્વતઃભરણ" "સ્વતઃભરણ સેટ કરો" + + " " "$1$2$3" ", " @@ -1198,9 +1201,12 @@ "સિમ કાર્ડ ઉમેર્યો" "મોબાઇલ નેટવર્કને ઍક્સેસ કરવા માટે તમારા ઉપકરણને પુનઃપ્રારંભ કરો." "રિસ્ટાર્ટ કરો" - "તમારું નવું સિમ ઠીકથી કામ કરે તે માટે, તમને તમારા કેરીઅર પરથી ઍપ્લિકેશન ઇન્સ્ટૉલ કરીને ખોલવી પડશે." - "ઍપ્લિકેશન મેળવો" - "હમણાં નહીં" + + + + + + "નવું સિમ દાખલ કર્યું" "તેને સેટ કરવા માટે ટૅપ કરો" "સમય સેટ કરો" @@ -1212,23 +1218,15 @@ "કોઈ પરવાનગીઓ જરૂરી નથી" "આનાથી તમારા પૈસા ખર્ચ થઈ શકે છે" "ઓકે" - - - - - - - - - - - - - - + "આ ઉપકરણને USB મારફતે ચાર્જ કરી રહ્યાં છીએ" + "કનેક્ટેડ ઉપકરણને USB મારફતે ચાર્જ કરી રહ્યાં છીએ" + "USB ફાઇલ ટ્રાન્સફર ચાલુ છે" + "USB મારફતે PTP ચાલુ કર્યું" + "USBથી ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ કરી" + "USB મારફતે MIDI ચાલુ કર્યું" + "USB ઍક્સેસરી મોડ ચાલુ કર્યો" "વધુ વિકલ્પો માટે ટૅપ કરો." - - + "કનેક્ટ કરેલ ઉપકરણ ચાર્જ થઈ રહ્યું છે. વધુ વિકલ્પો માટે ટૅપ કરો." "એનાલોગ ઑડિઓ ઍક્સેસરી મળી" "જોડેલ ઉપકરણ આ ફોન સાથે સુસંગત નથી. વધુ જાણવા માટે ટૅપ કરો." "USB ડીબગિંગ કનેક્ટ થયું." @@ -1831,8 +1829,7 @@ "વૉઇસ માટે આ ફોનને મંજૂરી નથી" "પૉપઅપ વિંડો" "+ %1$d" - - + "આ ઍપનું વર્ઝન ડાઉનગ્રેડ કરવામાં આવ્યું છે અથવા આ શૉર્ટકટ સાથે સુસંગત નથી" "શૉર્ટકટ ફરી મેળવી શકાયો નથી કારણ કે ઍપ બૅકઅપ અને ફરી મેળવવાનું સમર્થન કરતી નથી" "શૉર્ટકટ ફરી મેળવી શકાયો નથી કારણ કે ઍપમાં છે તે સહી મેળ ખાતી નથી" "શૉર્ટકટ પાછો મેળવી શકાયો નથી" @@ -1842,4 +1839,7 @@ "નુકસાનકારક ઍપ મળી આવી છે" "%1$s%2$s સ્લાઇસ બતાવવા માગે છે" "ફેરફાર કરો" + "સિસ્ટમના ફેરફારો" + "ખલેલ પાડશો નહીંમાં ફેરફાર થયો છે" + "વિક્ષેપો સંબંધિત તમારી વર્તણૂક સેટિંગ તપાસવા માટે ટૅપ કરો" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 9dc0e2f23ec..5b81d3e2d9b 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -93,6 +93,8 @@ "मैसेज (एसएमएस)" "वॉइसमेल संदेश" "वाई-फ़ाई कॉलिंग" + + "पीयर ने टेलीटाइपराइटर (TTY) मोड फ़ुल का अनुरोध किया" "पीयर ने टेलीटाइपराइटर (TTY) मोड एचसीओ (HCO) का अनुरोध किया" "पीयर ने टेलीटाइपराइटर (TTY) मोड वीसीअो (VCO) का अनुरोध किया" @@ -238,7 +240,8 @@ "सेटिंग" "सहायता" "आवाज़ से डिवाइस का इस्तेमाल" - "लॉकडाउन डालें" + + "999+" "नई सूचना" "वर्चुअल कीबोर्ड" @@ -497,10 +500,8 @@ "बहुत अधिक प्रयास कर लिए गए हैं. बाद में पुन: प्रयास करें." "बहुत अधिक कोशिशें. फ़िंगरप्रिंट सेंसर अक्षम है." "पुन: प्रयास करें." - - - - + "कोई फ़िंगरप्रिंट रजिस्टर नहीं किया गया है." + "इस डिवाइस में फ़िंगरप्रिंट सेंसर नहीं है" "उंगली %d" @@ -827,6 +828,8 @@ "सलाह: ज़ूम इन और आउट करने के लिए दो बार छूएं." "स्‍वत: भरण" "स्वत: भरण सेट करें" + + " " "$1$2$3" ", " @@ -1197,9 +1200,12 @@ "सिम कार्ड जोड़ा गया" "मोबाइल नेटवर्क की पहुंच पाने लिए अपना डिवाइस फिर से चालू करें." "फिर से शुरू करें" - "आपका नया SIM ठीक से काम करे, इसके लिए आपको अपनी मोबाइल और इंटरनेट सेवा देने वाली कंपनी से कोई ऐप इंस्टॉल करना होगा और उसे खोलना होगा." - "ऐप प्राप्त करें" - "रद्द करें" + + + + + + "नई SIM डाली गई" "इसे सेट करने के लिए टैप करें" "समय सेट करें" @@ -1211,23 +1217,15 @@ "किसी अनुमति की आवश्‍यकता नहीं है" "इससे आपको धन देना पड़ सकता है" "ठीक है" - - - - - - - - - - - - - - + "यह डिवाइस यूएसबी से चार्ज हो रहा है" + "जोड़ा गया डिवाइस यूएसबी के ज़रिए चार्ज हो रहा है" + "यूएसबी फ़ाइल ट्रांसफ़र की सुविधा चालू की गई" + "यूएसबी के ज़रिए पीटीपी की सुविधा चालू की गई" + "यूएसबी टेदरिंग की सुविधा चालू की गई" + "यूएसबी के ज़रिए एमआईडीआई (मिडी) की सुविधा चालू की गई" + "यूएसबी ऐक्सेसरी वाला मोड चालू कर दिया गया है" "ज़्यादा विकल्पों के लिए टैप करें." - - + "जोड़ा गया डिवाइस चार्ज हो रहा है. ज़्यादा विकल्पों के लिए टैप करें." "एनालॉग ऑडियो एक्सेसरी का पता चला" "अटैच किया गया डिवाइस इस फ़ोन से संगत नहीं है. अधिक जानने के लिए टैप करें." "USB डीबग कनेक्ट किया गया" @@ -1830,8 +1828,7 @@ "फ़ोन से कॉल करने की इजाज़त नहीं है" "पॉपअप विंडो" "+ %1$d" - - + "ऐप्लिकेशन का वर्शन पुराना हो चुका है या यह इस शॉर्टकट के साथ काम नहीं करता" "शॉर्टकट बहाल नहीं किया जा सका क्योंकि इस ऐप में बैकअप लेने और उसे बहाल करने की सुविधा नहीं है" "ऐप सिग्नेचर अलग होने के कारण शॉर्टकट बहाल नहीं किया जा सका" "शॉर्टकट बहाल नहीं किया जा सका" @@ -1841,4 +1838,7 @@ "नुकसान पहुंचाने वाले ऐप का पता चला" "%1$s, %2$s के हिस्से (स्लाइस) दिखाना चाहता है" "बदलाव करें" + "सिस्टम में हुए बदलाव" + "परेशान न करें की सुविधा बदल गई है" + "सूचना पर टैप करके जानें कि आपने रुकावटों के लिए कौनसी सेटिंग सेट की है" diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 767cbacf900..857ef3658c9 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -94,6 +94,7 @@ "SMS poruke" "Poruke govorne pošte" "Wi-Fi pozivi" + "Status SIM-a" "Način TTY FULL koji zahtijeva paralelni uređaj" "Način TTY HCO koji zahtijeva paralelni uređaj" "Način TTY VCO koji zahtijeva paralelni uređaj" @@ -241,7 +242,7 @@ "Postavke" "Pomoć" "Glasovna pomoć" - "Zaključaj" + "Zaključavanje" "999+" "Nova obavijest" "Virtualna tipkovnica" @@ -267,10 +268,8 @@ "%1$s, %2$s" "Siguran način rada" "Sustav Android" - - - - + "Prijeđite na osobni profil" + "Prijeđite na radni profil" "Kontakti" "pristupati vašim kontaktima" "Dopustite aplikaciji <b>%1$s</b> da pristupa vašim kontaktima" @@ -422,10 +421,8 @@ "Aplikaciji omogućuje pristup telefonskim značajkama uređaja. Ta dozvola aplikaciji omogućuje utvrđivanje telefonskog broja i ID-ova uređaja, je li poziv aktivan te udaljeni broj koji je povezan pozivom." "preusmjeravati pozive putem sustava" "Omogućuje aplikaciji da preusmjerava pozive putem sustava radi poboljšanja doživljaja." - - - - + "nastaviti poziv iz neke druge aplikacije" + "Omogućuje aplikaciji da nastavi poziv započet u nekoj drugoj aplikaciji." "čitati telefonske brojeve" "Aplikaciji omogućuje da pristupi telefonskim brojevima na uređaju." "spriječi mirovanje tabletnog uređaja" @@ -500,11 +497,12 @@ "Otisak prsta nije pohranjen. Uklonite postojeći otisak prsta." "Isteklo je vrijeme čekanja za otisak prsta. Pokušajte ponovo." "Radnja otiska prsta otkazana je." - - + "Radnju s otiskom prsta otkazao je korisnik." "Previše pokušaja. Pokušajte ponovo kasnije." "Senzor otiska prsta onemogućen je zbog previše pokušaja." "Pokušajte ponovo." + "Nije registriran nijedan otisak prsta." + "Ovaj uređaj nema senzor otiska prsta" "Prst %d" @@ -831,6 +829,7 @@ "Savjet: Dvaput dotaknite za povećavanje i smanjivanje." "Aut.pop." "Post. Auto. pop." + "Automatsko popunjavanje" " " "$1$2$3" ", " @@ -1020,12 +1019,9 @@ "Otvori" "Poruka" "Dodaj" - - - - - - + "Prikaži" + "Raspored" + "Prati" "Ponestaje prostora za pohranu" "Neke sistemske funkcije možda neće raditi" "Nema dovoljno pohrane za sustav. Oslobodite 250 MB prostora i pokrenite uređaj ponovo." @@ -1153,8 +1149,7 @@ Dostupne su otvorene Wi-Fi mreže "Povezivanje s otvorenom Wi‑Fi mrežom" - - + "Povežite se s Wi‑Fi mrežom mobilnog operatera" "Povezivanje s otvorenom Wi‑Fi mrežom" "Povezano s Wi-Fi mrežom" "Nije uspjelo povezivanje s Wi-Fi mrežom" @@ -1224,9 +1219,9 @@ "SIM kartica dodana" "Za pristup mobilnoj mreži ponovo pokrenite uređaj." "Ponovno pokreni" - "Da bi vaša nova SIM kartica pravilno funkcionirala, morate instalirati i otvoriti aplikaciju mobilnog operatera." - "PREUZMI APLIKACIJU" - "NE SADA" + "Aktivirajte mobilnu uslugu" + "Preuzmite aplikaciju mobilnog operatera da biste aktivirali novi SIM" + "Preuzmite aplikaciju" "Umetnuta je nova SIM kartica" "Dodirnite da biste je postavili" "Postavljanje vremena" @@ -1238,13 +1233,15 @@ "Nije potrebno dopuštenje" "možda ćete morati platiti" "U redu" - "Punjenje uređaja USB-om" - "Napajanje priključenog uređaja USB-om" - "USB za prijenos datoteka" - "USB za prijenos fotografija" - "USB za MIDI" - "Spojen na USB pribor" + "Uređaj se puni putem USB-a" + "Povezani uređaj puni se putem USB-a" + "Uključen je prijenos datoteka putem USB-a" + "Uključen je PTP putem USB-a" + "Uključeno je modemsko povezivanje putem USB-a" + "Uključen je MIDI putem USB-a" + "Uključen je način rada s USB dodatkom" "Dodirnite za više opcija." + "Povezani se uređaj puni. Dodirnite za više opcija." "Otkriven je analogni audiododatak" "Priključeni uređaj nije kompatibilan s ovim telefonom. Dodirnite da biste saznali više." "Priključen je alat za otklanjanje pogrešaka putem USB-a" @@ -1686,9 +1683,6 @@ "%1$s za posao" "2. %1$s za posao" "3. %1$s za posao" - "Da biste otkvačili ovaj zaslon, dodirnite i zadržite Natrag i Pregled" - "Zaslon je pričvršćen" - "Zaslon je otkvačen" "Traži PIN radi otkvačivanja" "Traži uzorak za otključavanje radi otkvačivanja" "Traži zaporku radi otkvačivanja" @@ -1791,15 +1785,11 @@ "Svi jezici" "Sve regije" "Pretraži" - - - - + "Želite uključiti radni profil?" + "Uključit će se vaše radne aplikacije, obavijesti, podaci i druge značajke radnog profila" "Uključi" - - - - + "Ova je aplikacija razvijena za stariju verziju Androida i možda neće funkcionirati pravilno. Potražite ažuriranja ili se obratite razvojnom programeru." + "Provjeri ažuriranja" "Imate nove poruke" "Otvorite SMS aplikaciju da biste pregledali poruke" "Funkcije mogu biti ograničene" @@ -1867,17 +1857,17 @@ "Telefon nije dopušten za glasovne pozive" "Skočni prozor" "još %1$d" - "Za taj je prečac potrebna najnovija aplikacija" + "Aplikacija je vraćena na stariju verziju ili verzija nije kompatibilna s ovim prečacem" "Vraćanje prečaca nije uspjelo jer aplikacija ne podržava sigurnosno kopiranje i vraćanje" "Vraćanje prečaca nije uspjelo zbog nepodudaranja potpisa aplikacije" "Vraćanje prečaca nije uspjelo" "Prečac je onemogućen" - - - - - - + "DEINSTALIRAJ" + "IPAK OTVORI" + "Otkrivena je štetna aplikacija" "%1$s želi prikazivati isječke aplikacije %2$s" "Uređivanje" + "Promjene sustava" + "Promijenjena je postavka Ne uznemiravaj" + "Dodirnite za provjeru postavki načina Ne uznemiravaj" diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index e072b705a55..41d9355237e 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -93,6 +93,7 @@ "SMS-ek" "Hangpostaüzenetek" "Wi-Fi-hívás" + "SIM-kártya állapota" "Partner által kért TTY-mód: FULL" "Partner által kért TTY-mód: HCO" "Partner által kért TTY-mód: VCO" @@ -238,7 +239,7 @@ "Beállítások" "Segítség" "Hangsegéd" - "Zár megadása" + "Zárolás" "999+" "Új értesítés" "Virtuális billentyűzet" @@ -264,10 +265,8 @@ "%1$s, %2$s" "Biztonsági üzemmód" "Android rendszer" - - - - + "Váltás személyes profilra" + "Váltás munkaprofilra" "Névjegyek" "hozzáférés a névjegyekhez" "Engedélyezi a(z) <b>%1$s</b> számára, hogy hozzáférjen a névjegyekhez" @@ -419,10 +418,8 @@ "Lehetővé teszi az alkalmazás számára, hogy hozzáférjen az eszköz telefonálási funkcióihoz. Az engedéllyel rendelkező alkalmazás meghatározhatja a telefonszámot és eszközazonosítókat, hogy egy hívás aktív-e, valamint híváskor a másik fél telefonszámát." "rendszeren keresztüli hívásirányítás" "A telefonálási élmény javítása érdekében lehetővé teszi az alkalmazás számára a rendszeren keresztüli hívásirányítást." - - - - + "Másik alkalmazásból indított hívás folytatása" + "Engedélyezi az alkalmazásnak, hogy folytassa a hívást, amelyet valamelyik másik alkalmazásban kezdtek meg." "telefonszámok olvasása" "Engedélyezi az alkalmazás számára az eszköz telefonszámaihoz való hozzáférést." "táblagép alvás üzemmódjának megakadályozása" @@ -497,11 +494,12 @@ "Az ujjlenyomat nem tárolható. Távolítson el egy meglévő ujjlenyomatot." "Az ujjlenyomat-beolvasási műveletkor időtúllépés történt. Próbálkozzon újra." "Ujjlenyomattal kapcsolatos művelet megszakítva" - - + "Az ujjlenyomattal kapcsolatos műveletet a felhasználó megszakította." "Túl sok próbálkozás. Próbálja újra később." "Túl sok próbálkozás. Ujjlenyomat-érzékelő letiltva." "Próbálkozzon újra." + "Nincsenek regisztrált ujjlenyomatok." + "Ez az eszköz nem rendelkezik ujjlenyomat-érzékelővel" "%d. ujj" @@ -828,6 +826,7 @@ "Tipp: érintse meg kétszer a nagyításhoz és kicsinyítéshez." "Kitöltés" "Kitöltés beáll." + "Automatikus kitöltés" " " "$1$2$3" ", " @@ -1000,12 +999,9 @@ "Megnyitás" "Üzenet" "Hozzáadás" - - - - - - + "Megtekintés" + "Ütemezés" + "Nyomon követés" "Kevés a szabad terület" "Előfordulhat, hogy néhány rendszerfunkció nem működik." "Nincs elegendő tárhely a rendszerhez. Győződjön meg arról, hogy rendelkezik 250 MB szabad területtel, majd kezdje elölről." @@ -1131,8 +1127,7 @@ Nyílt Wi-Fi hálózat érhető el "Nyílt Wi-Fi-hálózathoz kapcsolódhat" - - + "Csatlakozás szolgáltatói Wi‑Fi-hálózatra" "Kapcsolódás nyílt Wi‑Fi-hálózathoz…" "Sikeres kapcsolódás a Wi-Fi-hálózathoz" "Nem sikerült kapcsolódni a Wi‑Fi-hálózathoz" @@ -1202,9 +1197,9 @@ "SIM kártya hozzáadva" "A mobilhálózathoz eléréséhez indítsa újra az eszközt." "Újraindítás" - "Az új SIM-kártya megfelelő működéséhez telepíteni kell, illetve el is kell indítani szolgáltatója egyik alkalmazását." - "AZ ALKALMAZÁS LETÖLTÉSE" - "MOST NEM" + "Mobilszolgáltatás aktiválása" + "Töltse le a szolgáltatói alkalmazást az új SIM-kártya aktiválásához" + "Alkalmazás letöltése" "Új SIM behelyezve" "Koppintson rá a beállításhoz" "Idő beállítása" @@ -1216,13 +1211,15 @@ "Nincs szükség engedélyre" "ez pénzbe kerülhet Önnek" "OK" - "Az eszköz USB-s töltése" - "A csatlakoztatott eszköz USB-n keresztül való töltése" - "USB fájlátvitelhez" - "USB fotóátvitelhez" - "USB MIDI-hez" - "Csatlakoztatva egy USB-kiegészítőhöz" + "Folyamatban van az eszköz USB-n keresztüli töltése" + "Folyamatban van a csatlakoztatott eszköz USB-n keresztüli töltése" + "Az USB-fájlátvitel be van kapcsolva" + "Az USB-n keresztüli PTP be van kapcsolva" + "Az USB-internetmegosztás be van kapcsolva" + "Az USB-n keresztüli MIDI be van kapcsolva" + "Az USB-kiegészítő mód be van kapcsolva" "Koppintson a további beállítások megjelenítéséhez." + "Folyamatban van a csatlakoztatott eszköz töltése. Koppintson a további lehetőségekhez." "Analóg audiotartozék észlelve" "A csatlakoztatott eszköz nem kompatibilis ezzel a telefonnal. További információért koppintson ide." "USB hibakereső csatlakoztatva" @@ -1661,9 +1658,6 @@ "Munkahelyi %1$s" "2. munkahelyi %1$s" "3. munkahelyi %1$s" - "A képernyő rögzítésének feloldásához tartsa lenyomva a Vissza és az Áttekintés gombot" - "Képernyő rögzítve" - "Képernyő rögzítése feloldva" "PIN-kód kérése a rögzítés feloldásához" "Feloldási minta kérése a rögzítés feloldásához" "Jelszó kérése a rögzítés feloldásához" @@ -1757,15 +1751,11 @@ "Minden nyelv" "Minden régió" "Keresés" - - - - + "Bekapcsolja a munkaprofilt?" + "A munkahelyi alkalmazások, értesítések, adatok és a munkaprofilhoz tartozó egyéb funkciók be lesznek kapcsolva" "Bekapcsolás" - - - - + "Ez az alkalmazás az Android egyik korábbi verziójához készült, így elképzelhető, hogy nem működik majd megfelelően ezen a rendszeren. Keressen frissítéseket, vagy vegye fel a kapcsolatot a fejlesztővel." + "Frissítés keresése" "Új üzenetei érkeztek" "SMS-alkalmazás megnyitása a megtekintéshez" "Egyes funkciók korlátozva lehetnek" @@ -1832,17 +1822,17 @@ "A telefon nem engedélyezett a hanghoz" "Előugró ablak" "+ %1$d" - "A parancsikon működéséhez az alkalmazás legfrissebb verziójára van szükség" + "Az alkalmazás alacsonyabb verziójú, vagy nem kompatibilis ezzel a parancsikonnal" "Nem sikerült visszaállítani a parancsikont, mert az alkalmazás nem támogatja a biztonsági mentést és visszaállítást" "Nem sikerült visszaállítani a parancsikont, mert az alkalmazás-aláírás nem egyezik" "Nem sikerült visszaállítani a parancsikont" "A parancsikon le van tiltva" - - - - - - + "ELTÁVOLÍTÁS" + "MEGNYITÁS MÉGIS" + "A rendszer kártékony alkalmazást észlelt" "A(z) %1$s alkalmazás részleteket szeretne megjeleníteni a(z) %2$s alkalmazásból" "Szerkesztés" + "Rendszermódosítások" + "Módosultak a Ne zavarjanak mód beállításai" + "Koppintson a megszakításokkal kapcsolatos viselkedési beállítások megtekintéséhez." diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index efee7367925..ca46497cb46 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -93,6 +93,7 @@ "SMS հաղորդագրություններ" "Ձայնային փոստի հաղորդագրություններ" "Զանգեր Wi-Fi-ի միջոցով" + "SIM քարտի կարգավիճակը" "Բաժանորդի սարքում ընտրված է հեռատիպի ԲՈԼՈՐԸ ռեժիմը" "Բաժանորդի սարքում ընտրված է հեռատիպի HCO ռեժիմը" "Բաժանորդի սարքում ընտրված է հեռատիպի VCO ռեժիմը" @@ -238,7 +239,7 @@ "Կարգավորումներ" "Օգնական" "Ձայնային օգնութ" - "Արգելափակել" + "Արգելափակում" "999+" "Նոր ծանուցում" "Վիրտուալ ստեղնաշար" @@ -355,8 +356,6 @@ "Թույլ է տալիս հավելվածին մնայուն դարձնել իր մասերը հիշողության մեջ: Սա կարող է սահմանափակել այլ հավելվածներին հասանելի հիշողությունը` դանդաղեցնելով պլանշետի աշխատանքը:" "Թույլ է տալիս հավելվածին պահել իր տարրերը հիշողության մեջ: Սա կարող է սահմանափակել այլ հավելվածների համար հատկացված հիշողությունը և դանդաղեցնել հեռուստացույցի աշխատանքը:" "Թույլ է տալիս հավելվածին մնայուն դարձնել իր մասերը հիշողության մեջ: Սա կարող է սահմանափակել այլ հավելվածներին հասանելի հիշողությունը` դանդաղեցնելով հեռախոսի աշխատանքը:" - "աշխատեցնել ակտիվ ծառայությունները" - "Թույլ է տալիս հավելվածին օգտագործել ակտիվ ծառայությունները:" "չափել հավելվածի պահոցի տարածքը" "Թույլ է տալիս հավելվածին առբերել իր կոդը, տվյալները և քեշի չափերը" "փոփոխել համակարգի կարգավորումները" @@ -827,6 +826,7 @@ "Հուշակ` կրկնակի հպեք` մեծացնելու և փոքրացնելու համար:" "Ինքնալրացում" "Դնել ինքնալրացում" + "Ինքնալրացում" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "SIM քարտը ավելացվել է" "Վերագործարկեք ձեր սարքը` բջջային ցանց մուտք ունենալու համար:" "Վերագործարկել" - "Նոր SIM քարտի պատշաճ աշխատանքն ապահովելու համար ձեզ անհրաժեշտ է տեղադրել և գործարկել ձեր օպերատորից ստացած հավելվածը:" - "ՏԵՂԱԴՐԵԼ ՀԱՎԵԼՎԱԾԸ" - "ՈՉ ՀԻՄԱ" + "Ակտիվացրեք բջջային ծառայությունը" + "Նոր SIM քարտն ակտիվացնելու համար ներբեռնեք օպերատորի հավելվածը" + "Ներբեռնել հավելվածը" "Տեղադրվել է նոր SIM քարտ" "Հպեք՝ կարգավորելու համար" "Սահմանել ժամը" @@ -1832,4 +1832,7 @@ "Հայտնաբերվել է վնասաբեր հավելված" "%1$s հավելվածն ուզում է ցուցադրել հատվածներ %2$s հավելվածից" "Փոփոխել" + "Համակարգի փոփոխություններ" + "«Չանհանգստացնել» ռեժիմի կարգավորումները փոխվել են" + "Հպեք՝ ծանուցման կարգավորումները ստուգելու համար" diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index a93d33305c2..17178145efe 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -93,6 +93,7 @@ "Pesan SMS" "Notifikasi pesan suara" "Panggilan Wi-Fi" + "Status SIM" "Rekan meminta Mode TTY PENUH" "Rekan meminta Mode TTY HCO" "Rekan meminta Mode TTY VCO" @@ -238,7 +239,7 @@ "Setelan" "Bantuan" "Bantuan Suara" - "Kunci total" + "Gembok total" "999+" "Notifikasi baru" "Keyboard virtual" @@ -417,10 +418,8 @@ "Memungkinkan aplikasi mengakses fitur telepon perangkat. Izin ini memungkinkan aplikasi menentukan nomor telepon dan ID perangkat, apakah suatu panggilan aktif atau tidak, dan nomor jarak jauh yang tersambung oleh sebuah panggilan." "sambungkan panggilan telepon melalui sistem" "Mengizinkan aplikasi menyambungkan panggilan telepon melalui sistem untuk menyempurnakan pengalaman menelepon." - - - - + "lanjutkan panggilan dari aplikasi lain" + "Mengizinkan aplikasi melanjutkan panggilan yang dimulai di aplikasi lain." "membaca nomor telepon" "Mengizinkan aplikasi mengakses nomor telepon perangkat." "cegah tablet dari tidur" @@ -499,6 +498,8 @@ "Terlalu banyak upaya. Coba lagi nanti." "Terlalu sering dicoba. Sensor sidik jari dinonaktifkan." "Coba lagi." + "Tidak ada sidik jari yang terdaftar." + "Perangkat ini tidak memiliki sensor sidik jari" "Jari %d" @@ -825,6 +826,7 @@ "Kiat: Ketuk dua kali untuk memperbesar dan memperkecil." "IsiOtomatis" "Siapkan Pengisian Otomatis" + "IsiOtomatis" " " "$1$2$3" ", " @@ -997,12 +999,9 @@ "Buka" "Pesan" "Tambahkan" - - - - - - + "Lihat" + "Jadwal" + "Lacak" "Ruang penyimpanan hampir habis" "Beberapa fungsi sistem mungkin tidak dapat bekerja" "Penyimpanan tidak cukup untuk sistem. Pastikan Anda memiliki 250 MB ruang kosong, lalu mulai ulang." @@ -1128,8 +1127,7 @@ Jaringan Wi-Fi terbuka tersedia "Hubungkan ke jaringan Wi-Fi terbuka" - - + "Hubungkan ke jaringan Wi-Fi operator" "Menghubungkan ke jaringan Wi-Fi terbuka" "Terhubung ke jaringan Wi-Fi" "Tidak dapat menghubungkan ke jaringan Wi‑Fi" @@ -1199,9 +1197,9 @@ "Kartu SIM ditambahkan" "Mulai ulang perangkat Anda untuk mengakses jaringan selular." "Nyalakan Ulang" - "Agar SIM baru bekerja dengan baik, Anda harus memasang dan membuka aplikasi dari operator." - "DAPATKAN APLIKASI" - "LAIN KALI" + "Aktifkan layanan seluler" + "Download aplikasi operator untuk mengaktifkan SIM baru" + "Download aplikasi" "SIM baru dimasukkan" "Ketuk untuk menyiapkan" "Setel waktu" @@ -1213,13 +1211,15 @@ "Tidak perlu izin" "ini mungkin tidak gratis" "Oke" - "Isi daya perangkat ini melalui USB" - "Suplai daya melalui USB ke perangkat yang terpasang" - "USB untuk transfer file" - "USB untuk transfer foto" - "USB untuk MIDI" - "Tersambung ke aksesori USB" + "Mengisi daya perangkat ini via USB" + "Mengisi daya perangkat yang terhubung via USB" + "Transfer file USB diaktifkan" + "PTP via USB diaktifkan" + "Tethering USB diaktifkan" + "MIDI via USB diaktifkan" + "Mode aksesori USB diaktifkan" "Ketuk untuk opsi lainnya." + "Mengisi daya perangkat yang terhubung. Tap untuk opsi lainnya." "Aksesori audio analog terdeteksi" "Perangkat yang terpasang tidak kompatibel dengan ponsel ini. Tap untuk mempelajari lebih lanjut." "Debugging USB terhubung" @@ -1658,9 +1658,6 @@ "Kantor %1$s" "Upaya ke-2 %1$s" "Upaya ke-3 %1$s" - "Untuk melepas pin layar ini, sentuh & tahan tombol Kembali dan Ringkasan" - "Layar disematkan" - "Layar dicopot sematannya" "Meminta PIN sebelum melepas sematan" "Meminta pola pembukaan kunci sebelum melepas sematan" "Meminta sandi sebelum melepas sematan" @@ -1757,10 +1754,8 @@ "Aktifkan profil kerja?" "Aplikasi kerja, notifikasi, data, dan fitur profil kerja lainnya akan diaktifkan" "Aktifkan" - - - - + "Aplikasi ini dibuat untuk Android versi lama dan mungkin tidak berfungsi sebagaimana mestinya. Coba periksa apakah ada update, atau hubungi developer." + "Periksa apakah ada update" "Ada pesan baru" "Buka aplikasi SMS untuk melihat" "Beberapa fungsi mungkin terbatas" @@ -1827,17 +1822,17 @@ "Ponsel tidak diizinkan untuk suara" "Jendela Pop-up" "+ %1$d" - "Pintasan ini memerlukan aplikasi terbaru" + "Versi aplikasi di-downgrade, atau tidak kompatibel dengan pintasan ini" "Tidak dapat memulihkan pintasan karena aplikasi tidak mendukung backup dan pulihkan" "Tidak dapat memulihkan pintasan karena tanda tangan aplikasi tidak cocok" "Tidak dapat memulihkan pintasan." "Pintasan dinonaktifkan" - - - - - - + "UNINSTAL" + "TETAP BUKA" + "Aplikasi berbahaya terdeteksi" "%1$s ingin menampilkan potongan %2$s" "Edit" + "Perubahan sistem" + "Jangan Ganggu telah berubah" + "Tap untuk memeriksa apakah ada gangguan pada setelan perilaku Anda" diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index b5462eb8797..e4819007b14 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -93,6 +93,7 @@ "SMS-skilaboð" "Talhólfsskilaboð" "Wi-Fi símtöl" + "Staða SIM-korts" "Jafningi bað um FULLA stillingu fjarrita" "Jafningi bað um HCO-stillingu fjarrita" "Jafningi bað um VCO-stillingu fjarrita" @@ -238,7 +239,7 @@ "Stillingar" "Aðstoð" "Raddaðstoð" - "Virkja læsingu" + "Læsing" "999+" "Ný tilkynning" "Sýndarlyklaborð" @@ -264,10 +265,8 @@ "%1$s, %2$s" "Örugg stilling" "Android kerfið" - - - - + "Skipta yfir í eigið snið" + "Skipta yfir í vinnusnið" "Tengiliðir" "fá aðgang að tengiliðunum þínum" "Veita <b>%1$s</b> aðgang að tengiliðunum þínum" @@ -419,10 +418,8 @@ "Leyfir forriti að fá aðgang að símaeiginleikum tækisins. Þessi heimild gerir forritinu kleift að komast að símanúmeri og auðkennum tækisins, hvort símtal er í gangi og símanúmeri viðmælanda í símtali." "senda símtöl gegnum kerfið" "Heimilar forritinu að senda símtöl sín gegnum kerfið til að bæta gæði símtalsins." - - - - + "halda áfram með símtal úr öðru forriti" + "Leyfir forritinu að halda áfram með símtal sem hófst í öðru forriti." "lesa símanúmer" "Veitir forritinu aðgang að símanúmerum tækisins." "koma í veg fyrir að spjaldtölvan fari í biðstöðu" @@ -497,11 +494,12 @@ "Ekki er hægt að vista fingrafarið. Fjarlægðu eitthvert af fingraförunum sem fyrir eru." "Tímamörk runnu út fyrir fingrafar. Reyndu aftur." "Hætt við fingrafarsaðgerð." - - + "Notandi hætti við að nota fingrafar." "Of margar tilraunir. Reyndu aftur síðar." "Of margar tilraunir. Fingrafaralesari gerður óvirkur." "Reyndu aftur." + "Engin fingraför hafa verið skráð." + "Þetta tæki er ekki með fingrafaralesara" "Fingur %d" @@ -828,6 +826,7 @@ "Ábending: Ýttu tvisvar til að auka og minnka aðdrátt." "Fylla út" "Stilla útfyllingu" + "Sjálfvirk útfylling" " " "$1$2$3" ", " @@ -1000,12 +999,9 @@ "Opna" "Skilaboð" "Bæta við" - - - - - - + "Skoða" + "Setja á dagskrá" + "Rekja" "Geymslurýmið er senn á þrotum" "Sumir kerfiseiginleikar kunna að vera óvirkir" "Ekki nægt geymslurými fyrir kerfið. Gakktu úr skugga um að 250 MB séu laus og endurræstu." @@ -1131,8 +1127,7 @@ Opin Wi-Fi net í boði "Tengjast opnu Wi-Fi neti" - - + "Tengjast við Wi‑Fi net símafyrirtækis" "Tengist opnu Wi‑Fi neti" "Tengt við Wi‑Fi net" "Ekki hægt að tengjast Wi-Fi neti" @@ -1203,9 +1198,9 @@ "SIM-korti bætt við" "Endurræstu tækið að fá aðgang að farsímakerfinu." "Endurræsa" - "Þú þarft að setja upp og opna forrit frá símafyrirtækinu þínu til að nýja SIM-kortið þitt virki eins og vera ber." - "SÆKJA FORRITIÐ" - "EKKI NÚNA" + "Virkja farsímaþjónustu" + "Sæktu forrit símafyrirtækisins til að virkja nýja SIM-kortið þitt" + "Sækja forritið" "Nýtt SIM-kort sett í" "Ýttu til að setja það upp" "Veldu tíma" @@ -1217,13 +1212,15 @@ "Engra heimilda þörf" "þú gætir þurft að borga fyrir þetta" "Í lagi" - "Þetta tæki er í USB-hleðslu" - "Tengt tæki er í USB-hleðslu" - "USB fyrir skráaflutning" - "USB fyrir myndaflutning" - "USB fyrir MIDI" - "Tengt við USB-aukabúnað" + "Hleður tækið með USB-tengingu" + "Hleður tengt tæki með USB" + "Kveikt er á USB-gagnaflutningi" + "Kveikt er á PTP yfir USB" + "Kveikt er á USB-tjóðrun" + "Kveikt er á MIDI yfir USB" + "Kveikt á stillingu USB-aukabúnaðar" "Ýttu til að sjá fleiri valkosti." + "Hleður tengt tæki. Ýttu til að sjá fleiri valkosti." "Hliðrænn hljóðaukabúnaður greindist" "Tengda tækið er ekki samhæft við þennan síma. Ýttu til að fá frekari upplýsingar." "USB-villuleit tengd" @@ -1662,9 +1659,6 @@ "%1$s í vinnu" "%1$s í vinnu (2)" "%1$s í vinnu (3)" - "Til að losa þessa skjámynd skaltu halda hnöppunum „Til baka“ og „Yfirlit“ inni" - "Skjár festur" - "Skjár opnaður" "Biðja um PIN-númer til að losa" "Biðja um opnunarmynstur til að losa" "Biðja um aðgangsorð til að losa" @@ -1758,15 +1752,11 @@ "Öll tungumál" "Öll svæði" "Leita" - - - - + "Kveikja á vinnusniði?" + "Kveikt verður á vinnuforritum, tilkynningum, gögnum og öðrum eiginleikum vinnusniðsins" "Kveikja" - - - - + "Þetta forrit var hannað fyrir eldri útgáfu af Android og ekki er víst að það virki eðlilega. Athugaðu hvort uppfærslur séu í boði eða hafðu samband við þróunaraðilann." + "Leita að uppfærslu" "Þú ert með ný skilaboð" "Opnaðu SMS-forritið til að skoða" "Sum virkni kann að vera takmörkuð" @@ -1833,17 +1823,17 @@ "Sími er ekki heimilaður fyrir rödd" "Sprettigluggi" "+ %1$d" - "Nýjasta útgáfa forritsins þarf að vera til staðar til að þessi flýtileið virki" + "Útgáfa forritsins er of gömul eða er ekki samhæf þessari flýtileið" "Ekki var hægt að endurheimta flýtileið vegna þess að forritið styður ekki öryggisafritun og endurheimt" "Ekki var hægt að endurheimta flýtileið vegna þess að undirskriftir forrita passa ekki saman" "Ekki var hægt að endurheimta flýtileið" "Flýtileið er óvirk" - - - - - - + "FJARLÆGJA" + "OPNA SAMT" + "Skaðlegt forrit fannst" "%1$s vill sýna sneiðar úr %2$s" "Breyta" + "Breytingar á kerfi" + "„Ónáðið ekki“ var breytt" + "Ýttu til að leita að truflunum í stillingum „Ónáðið ekki“" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index e0df831e949..c950f3b12b8 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -93,6 +93,7 @@ "SMS" "Messaggi vocali" "Chiamate Wi-Fi" + "Stato SIM" "Peer ha richiesto la modalità TTY FULL" "Peer ha richiesto la modalità TTY HCO" "Peer ha richiesto la modalità TTY VCO" @@ -238,7 +239,7 @@ "Impostazioni" "Assistenza" "Voice Assist" - "Inser. blocco" + "Blocco" "999+" "Nuova notifica" "Tastiera virtuale" @@ -497,10 +498,8 @@ "Troppi tentativi. Riprova più tardi." "Troppi tentativi. Sensore di impronte digitali disattivato." "Riprova." - - - - + "Nessuna impronta digitale registrata." + "Questo dispositivo non è dotato di sensore di impronte digitali" "Dito %d" @@ -827,6 +826,7 @@ "Suggerimento. Tocca due volte per aumentare e diminuire lo zoom." "Compilazione autom." "Compilaz. autom." + "Compilazione automatica" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "Scheda SIM aggiunta" "Riavvia il dispositivo per accedere alla rete mobile." "Riavvia" - "Per far funzionare correttamente la tua nuova SIM, dovrai installare e aprire un\'app del tuo operatore." - "SCARICA L\'APP" - "NON ORA" + "Attiva il servizio dati mobile" + "Scarica l\'app dell\'operatore per attivare la nuova SIM" + "Scarica app" "Nuova SIM inserita" "Tocca per configurarla" "Imposta ora" @@ -1211,23 +1211,15 @@ "Nessuna autorizzazione richiesta" "potrebbe comportare dei costi" "OK" - - - - - - - - - - - - - - + "Dispositivo in carica tramite USB" + "Dispositivo collegato in carica tramite USB" + "Trasferimento file tramite USB attivato" + "Modalità PTP tramite USB attivata" + "Tethering USB attivato" + "Modalità MIDI tramite USB attivata" + "Modalità accessorio USB attivata" "Tocca per altre opzioni." - - + "Dispositivo collegato in carica. Tocca per altre opzioni." "Accessorio audio analogico rilevato" "Il dispositivo collegato non è compatibile con questo telefono. Tocca per avere ulteriori informazioni." "Debug USB collegato" @@ -1830,8 +1822,7 @@ "Telefono non consentito per la voce" "Finestra popup" "+ %1$d" - - + "È stato eseguito il downgrade della versione dell\'app oppure la versione non è compatibile con questa scorciatoia" "Impossibile ripristinare la scorciatoia perché l\'app non supporta il backup e il ripristino" "Impossibile ripristinare la scorciatoia perché la firma dell\'app non corrisponde" "Impossibile ripristinare la scorciatoia" @@ -1841,4 +1832,7 @@ "App dannosa rilevata" "L\'app %1$s vuole mostrare porzioni dell\'app %2$s" "Modifica" + "Modifiche al sistema" + "L\'impostazione Non disturbare è cambiata" + "Tocca per controllare le interruzioni nelle impostazioni relative al comportamento" diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index d14e2aae95b..5702ee5d1b0 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -95,6 +95,8 @@ "‏הודעות SMS" "הודעות קוליות" "‏שיחות Wi-Fi" + + "‏העמית ביקש TTY במצב FULL" "‏העמית ביקש TTY במצב HCO" "‏העמית ביקש TTY במצב VCO" @@ -244,7 +246,8 @@ "הגדרות" "סיוע" "Voice Assist" - "נעילת חירום" + + "999+" "הודעה חדשה" "מקלדת וירטואלית" @@ -270,10 +273,8 @@ "%2$s, %1$s" "מצב בטוח" "‏מערכת Android" - - - - + "החלפה לפרופיל אישי" + "החלפה לפרופיל עבודה" "אנשי קשר" "גישה אל אנשי הקשר" "‏האפליקציה <b>%1$s</b> תקבל הרשאת גישה לאנשי הקשר שלך" @@ -425,10 +426,8 @@ "מאפשר לאפליקציה לגשת לתכונות הטלפון של המכשיר. אישור זה מתיר לאפליקציה לגלות את מספר הטלפון ואת זיהויי המכשיר, האם שיחה פעילה ואת המספר המרוחק המחובר באמצעות שיחה." "ניתוב שיחות דרך המערכת" "מאפשרת לאפליקציה לנתב את השיחות דרך המערכת כדי לשפר את חוויית השיחה." - - - - + "המשך שיחה מאפליקציה אחרת" + "הרשאה זו מתירה לאפליקציה להמשיך שיחה שהחלה באפליקציה אחרת." "גישה למספרי הטלפון" "מתירה לאפליקציה גישה למספרי הטלפון במכשיר." "מנע מהטאבלט לעבור למצב שינה" @@ -503,11 +502,12 @@ "לא ניתן לאחסן טביעת אצבע. הסר טביעת אצבע קיימת." "חלף הזמן הקצוב לטביעת אצבע. נסה שוב." "פעולת טביעת האצבע בוטלה." - - + "פעולת טביעת האצבע בוטלה בידי המשתמש." "יותר מדי ניסיונות. נסה שוב מאוחר יותר." "יותר מדי ניסיונות. חיישן טביעות האצבע הושבת." "נסה שוב." + "לא נרשמו טביעות אצבע." + "במכשיר זה אין חיישן טביעות אצבע" "אצבע %d" @@ -834,6 +834,8 @@ "טיפ: הקש פעמיים כדי להגדיל ולהקטין." "מילוי אוטומטי" "הגדר מילוי אוטומטי" + + " " "$1$2$3" ", " @@ -1040,12 +1042,9 @@ "פתיחה" "הודעה" "הוספה" - - - - - - + "תצוגה" + "לוח זמנים" + "מעקב" "שטח האחסון אוזל" "ייתכן שפונקציות מערכת מסוימות לא יפעלו" "‏אין מספיק שטח אחסון עבור המערכת. ודא שיש לך שטח פנוי בגודל 250MB התחל שוב." @@ -1175,8 +1174,7 @@ ‏יש רשת Wi-Fi פתוחה וזמינה "‏התחברות לרשת Wi‑Fi פתוחה" - - + "‏התחברות לרשת Wi‑Fi של ספק" "‏מתחבר לרשת Wi‑Fi פתוחה" "‏מחובר לרשת Wi-Fi" "‏לא ניתן היה להתחבר לרשת Wi-Fi" @@ -1246,9 +1244,12 @@ "‏כרטיס ה-SIM נוסף" "הפעל מחדש את המכשיר כדי לגשת אל הרשת הסלולרית." "הפעלה מחדש" - "‏כדי שה-SIM החדש שלך יפעל כראוי, תצטרך להתקין אפליקציה מהספק ולפתוח אותה." - "קבל את האפליקציה" - "לא עכשיו" + + + + + + "‏ה-SIM החדש הוכנס" "הקש כדי להגדיר" "הגדרת שעה" @@ -1260,13 +1261,15 @@ "לא דרושים אישורים" "פעולה זו עשויה לחייב אותך בכסף:" "אישור" - "‏USB טוען את המכשיר הזה" - "‏USB מספק מתח למכשיר המצורף" - "‏USB להעברת קבצים" - "‏USB להעברת תמונות" - "‏USB ל-MIDI" - "‏מחובר לאביזר USB" + "‏טעינת המכשיר הזה באמצעות USB" + "‏טעינת המכשיר המחובר באמצעות USB" + "‏העברת קבצים ב-USB מופעלת" + "‏PTP באמצעות USB מופעל" + "‏שיתוף אינטרנט בין מכשירים באמצעות USB מופעל" + "‏MIDI באמצעות USB מופעל" + "‏מצב אביזר USB מופעל" "הקש לקבלת אפשרויות נוספות." + "טעינת המכשיר המחובר. יש להקיש לאפשרויות נוספות." "המכשיר זיהה התקן אודיו אנלוגי" "ההתקן שחיברת לא תואם לטלפון הזה. הקש למידע נוסף." "‏ניפוי באגים של USB מחובר" @@ -1711,9 +1714,6 @@ "עבודה %1$s" "%1$s שני בעבודה" "%1$s שלישי בעבודה" - "כדי לבטל את ההצמדה של מסך זה, גע בלחצנים \'הקודם\' ו\'סקירה\' והחזק אותם" - "המסך מוצמד" - "הצמדת המסך בוטלה" "בקש קוד גישה לפני ביטול הצמדה" "בקש קו ביטול נעילה לפני ביטול הצמדה" "בקש סיסמה לפני ביטול הצמדה" @@ -1825,15 +1825,11 @@ "כל השפות" "כל האזורים" "חיפוש" - - - - + "להפעיל את פרופיל העבודה?" + "אפליקציות העבודה, הודעות, נתונים ותכונות נוספות של פרופיל העבודה יופעלו" "הפעל" - - - - + "‏האפליקציה הזו עוצבה לגרסה ישנה יותר של Android וייתכן שלא תפעל כראוי. ניתן לבדוק אם יש עדכונים או ליצור קשר עם המפתח." + "האם יש עדכון חדש?" "יש לך הודעות חדשות" "‏פתח את אפליקציית ה-SMS כדי להציג" "ייתכן שחלק מהפונקציונליות תהיה מוגבלת" @@ -1902,17 +1898,17 @@ "הטלפון לא מורשה לזיהוי קולי" "חלון קופץ" "+ %1$d" - "קיצור דרך זה דורש את האפליקציה העדכנית ביותר" + "גרסת האפליקציה שודרגה לאחור או שאינה תואמת לקיצור דרך זה" "לא ניתן היה לשחזר את קיצור הדרך מפני שהאפליקציה אינה תומכת בגיבוי ובשחזור" "לא ניתן היה לשחזר את קיצור הדרך עקב חוסר התאמה בחתימה על האפליקציות" "לא ניתן היה לשחזר את קיצור הדרך" "מקש הקיצור מושבת" - - - - - - + "הסרת התקנה" + "רוצה לפתוח בכל זאת" + "אותרה אפליקציה מזיקה" "%1$s רוצה להציג חלקים מ-%2$s" "עריכה" + "שינויי מערכת" + "ההגדרה \'נא לא להפריע\' השתנתה" + "יש להקיש כדי לבדוק את הגדרות הביצועים להפרעות" diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 3b124fffe1a..00aeab9ab21 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -93,6 +93,8 @@ "SMS メッセージ" "ボイスメール メッセージ" "Wi-Fi 通話" + + "ピアから、TTY モードを FULL にするようリクエストされました" "ピアから、TTYモードをHCOにするようリクエストされました" "ピアから、TTYモードをVCOにするようリクエストされました" @@ -181,6 +183,7 @@ "この端末は組織によって管理され、ネットワーク トラフィックが監視される場合があります。詳しくはタップしてください。" "端末のデータが消去されます" "管理アプリを使用できません。端末のデータはこれから消去されます。\n\nご不明な点がある場合は、組織の管理者にお問い合わせください。" + "「%s」により印刷は無効にされています。" "自分" "タブレットオプション" "テレビのオプション" @@ -237,7 +240,8 @@ "設定" "サポート" "音声アシスト" - "ロックダウンを入力" + + "999+" "新しい通知" "仮想キーボード" @@ -263,8 +267,8 @@ "%1$s%2$s" "セーフモード" "Androidシステム" - "個人用に切り替える" - "仕事用に切り替える" + "個人用プロファイルに切り替える" + "仕事用プロファイルに切り替える" "連絡先" "連絡先へのアクセス" "連絡先へのアクセスを <b>%1$s</b> に許可してください" @@ -416,6 +420,8 @@ "端末の電話機能へのアクセスをアプリに許可します。これにより、電話番号、端末ID、通話中かどうか、通話相手の電話番号をアプリから特定できるようになります。" "システム経由での通話転送" "通話環境の改善のために、システム経由での通話転送をアプリに許可します。" + "別のアプリでの通話の続行" + "別のアプリで通話を続行することをこのアプリに許可します。" "電話番号の読み取り" "端末の電話番号へのアクセスをアプリに許可します。" "タブレットのスリープを無効化" @@ -485,13 +491,17 @@ "指の動きが遅すぎました。もう一度お試しください。" + "認識されませんでした" "指紋ハードウェアは使用できません。" "指紋を保存できません。既存の指紋を削除してください。" "指紋の読み取りがタイムアウトになりました。もう一度お試しください。" "指紋の操作をキャンセルしました。" + "指紋の操作がユーザーによりキャンセルされました。" "所定の回数以上間違えました。しばらくしてからもう一度お試しください。" "試行回数が上限を超えました。指紋認証センサーを無効にしました。" "もう一度お試しください。" + "指紋が登録されていません。" + "この端末には指紋認証センサーがありません" "指紋%d" @@ -818,6 +828,8 @@ "ヒント: ダブルタップで拡大/縮小できます。" "自動入力" "自動入力を設定" + + " " "$3$2$1" "、 " @@ -990,6 +1002,9 @@ "開く" "メッセージ" "追加" + "表示" + "スケジュール" + "トラック" "空き容量わずか" "一部のシステム機能が動作しない可能性があります" "システムに十分な容量がありません。250MBの空き容量を確保して再起動してください。" @@ -1115,6 +1130,7 @@ Wi-Fiオープンネットワークが利用できます "Wi-Fi オープン ネットワークに接続" + "携帯通信会社の Wi‑Fi ネットワークに接続" "Wi-Fi オープン ネットワークに接続しています" "Wi-Fi ネットワークに接続しました" "Wi‑Fi ネットワークに接続できませんでした" @@ -1184,9 +1200,12 @@ "SIMカードが追加されました" "モバイルネットワークにアクセスするには端末を再起動してください。" "再起動" - "新しい SIM を正常に動作させるには、携帯通信会社からアプリをダウンロードして起動する必要があります。" - "アプリをダウンロード" - "後で行う" + + + + + + "新しい SIM が挿入されました" "タップして設定" "時刻設定" @@ -1198,13 +1217,15 @@ "権限の許可は必要ありません" "料金が発生する場合があります" "OK" - "この端末を USB で充電" - "接続した端末に USB で給電" - "USBをファイル転送に使用" - "USBを写真転送に使用" - "USBをMIDIに使用" - "USBアクセサリを接続しました" + "この端末を USB で充電中" + "USB で接続された端末を充電しています" + "USB ファイル転送モード ON" + "USB PTP モード ON" + "USB テザリング ON" + "USB MIDI モード ON" + "USB アクセサリ モード ON" "タップしてその他のオプションを表示します。" + "接続されている端末を充電しています。タップすると、他の項目が表示されます。" "アナログのオーディオ アクセサリを検出" "接続したデバイスはこのスマートフォンと互換性がありません。タップすると、詳細を確認できます。" "USBデバッグが接続されました" @@ -1412,6 +1433,8 @@ "指定した上限を%s超えました。" "バックグラウンドデータに上限あり" "タップして制限を解除します。" + "データ使用量の増加" + "ここ数日間のデータ使用量が通常より増えています。タップして使用状況と設定を確認してください。" "セキュリティ証明書" "証明書は有効です。" "発行先:" @@ -1641,9 +1664,6 @@ "仕事の%1$s" "2 番目の仕事用%1$s" "3 番目の仕事用%1$s" - "この画面の固定を解除するには [戻る] ボタンと [最近] ボタンを押し続けます" - "画面を固定しました" - "画面固定を解除しました" "オフライン再生を解除する前にPINの入力を求める" "画面固定を解除する前にロック解除パターンの入力を求める" "オフライン再生を解除する前にパスワードの入力を求める" @@ -1688,7 +1708,7 @@ "%1$sまで" "%1$s(次のアラーム)まで" - "マナーモードを OFF にするまで" + "ユーザーが OFF にするまで" "マナーモードを OFF にするまで" "%1$s/%2$s" "折りたたむ" @@ -1737,9 +1757,11 @@ "すべての言語" "すべての地域" "検索" - "Work モード ON" - "これで、アプリ、バックグラウンド同期、関連機能など、仕事用プロファイルが有効になります。" + "仕事用プロファイルの有効化" + "仕事用のアプリ、通知、データなど、仕事用プロファイルの機能が ON になります" "ON にする" + "このアプリは以前のバージョンの Android 用に作成されており、正常に動作しない可能性があります。アップデートを確認するか、デベロッパーにお問い合わせください。" + "アップデートを確認" "新着メッセージがあります" "表示するには SMS アプリを開きます" "一部機能が制限されている可能性" @@ -1806,12 +1828,17 @@ "音声を使用できないスマートフォンです" "ポップアップ ウィンドウ" "他 %1$d 件" - "このショートカットを使用するには、最新のアプリが必要です" + "アプリのバージョンがダウングレードされているか、このショートカットに対応していません" "このアプリはバックアップと復元に対応していないため、ショートカットを復元できませんでした" "アプリの署名が一致しないため、ショートカットを復元できませんでした" "ショートカットを復元できませんでした" "ショートカットは無効になっています" - "アンインストール" - "このまま起動" - "有害なアプリをアンインストールしますか?" + "アンインストール" + "開く" + "有害なアプリが検出されました" + "「%1$s」が「%2$s」のスライスの表示をリクエストしています" + "編集" + "システムの変更" + "マナーモードが変わりました" + "タップして割り込みの動作設定をご確認ください" diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 663aa062eef..174a7708aed 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -93,6 +93,8 @@ "SMS შეტყობინებები" "ხმოვანი ფოსტის შეტყობინებები" "დარეკვა Wi-Fi-ს მეშვეობით" + + "მოთხოვნილია კვანძი TTY რეჟიმი FULL" "მოთხოვნილია კვანძი TTY რეჟიმი HCO" "მოთხოვნილია კვანძი TTY რეჟიმი VCO" @@ -238,7 +240,8 @@ "პარამეტრები" "დახმარება" "ხმოვანი ასისტ." - "დაბლოკვა" + + "999+" "ახალი შეტყობინება" "ვირტუალური კლავიატურა" @@ -264,10 +267,8 @@ "%1$s, %2$s" "უსაფრთხო რეჟიმი" "Android-ის სისტემა" - - - - + "პერსონალურ პროფილზე გადართვა" + "სამსახურის პროფილზე გადართვა" "კონტაქტები" "თქვენს კონტაქტებზე წვდომა" "<b>%1$s-ისთვის</b> თქვენს კონტაქტებზე წვდომის ნების დართვა" @@ -419,10 +420,8 @@ "აპს შეეძლება ჰქონდეს წვდომა მოწყობილობის სატელეფონო ფუნქციებზე. აპმა მსგავსი უფლებით შეძლებს დაადგინოს ტელეფონის ნომერი, მისი სერიული გამოცემა, აქტიური ზარი, დაკავშირებული ნომერი და მსგავსი." "ზარების სისტემის მეშვეობით მარშრუტიზაცია" "დარეკვის ხარისხის გაუმჯობესების მიზნით, აპს ზარების სისტემის მეშვეობით მარშრუტიზაციის საშუალებას აძლევს." - - - - + "ზარის სხვა აპიდან გაგრძელება" + "ნებას რთავს აპს, გააგრძელოს ზარი, რომელიც სხვა აპშია წამოწყებული." "ტელეფონის ნომრების წაკითხვა" "აპს მოწყობილობის ტელეფონის ნომრებზე წვდომის საშუალებას მისცემს." "დაიცავით ტაბლეტი დაძინებისგან" @@ -497,11 +496,12 @@ "თითის ანაბეჭდის შენახვა ვერ ხერხდება. გთხოვთ, ამოშალოთ არსებული თითის ანაბეჭდი." "თითის ანაბეჭდის ლოდინის დრო ამოიწურა. სცადეთ ხელახლა." "თითის ანაბეჭდის აღების ოპერაცია გაუქმდა." - - + "თითის ანაბეჭდის ოპერაცია გააუქმა მომხმარებელმა." "ძალიან ბევრი მცდელობა იყო. სცადეთ მოგვიანებით." "დაფიქსირდა მეტისმეტად ბევრი მცდელობა. თითის ანაბეჭდის სენსორი გათიშულია." "ხელახლა სცადეთ" + "თითის ანაბეჭდები რეგისტრირებული არ არის." + "ამ მოწყობილობას არ აქვს თითის ანაბეჭდის სენსორი" "თითი %d" @@ -828,6 +828,8 @@ "რჩევა: მასშტაბის შესაცვლელად გამოიყენეთ ორმაგი შეხება." "ავტოშევსება" "ავტოშევსების დაყენება" + + " " "$1$2$3" ", " @@ -1000,12 +1002,9 @@ "გახსნა" "შეტყობინება" "დამატება" - - - - - - + "ნახვა" + "განრიგი" + "ჩანაწერი" "თავისუფალი ადგილი იწურება" "სისტემის ზოგიერთმა ფუნქციამ შესაძლოა არ იმუშავოს" "სისტემისათვის საკმარისი საცავი არ არის. დარწმუნდით, რომ იქონიოთ სულ მცირე 250 მბაიტი თავისუფალი სივრცე და დაიწყეთ ხელახლა." @@ -1131,8 +1130,7 @@ ხელმისაწვდომია ღია Wi-Fi ქსელი "დაუკავშირდით ღია Wi‑Fi ქსელს" - - + "დაუკავშირდით ოპერატორის Wi‑Fi-ქსელს" "მიმდინარეობს ღია Wi‑Fi ქსელთან დაკავშირება" "Wi‑Fi ქსელთან დაკავშირება წარმატებით მოხერხდა" "Wi‑Fi ქსელთან დაკავშირება ვერ მოხერხდა" @@ -1202,9 +1200,12 @@ "SIM ბარათი დაემატა" "გადატვირთეთ თქვენი მოწყობილობა მობილურ ქსელზე წვდომისთვის." "გადატვირთვა" - "ახალი SIM ბარათის გამართული მუშაობისთვის აუცილებელია თქვენი ოპერატორის აპის ინსტალაცია და გახსნა." - "აპის ჩამოტვირთვა" - "ახლა არა" + + + + + + "მოთავსებულია ახალი SIM ბარათი" "შეეხეთ პარამეტრების დასაყენებლად" "დროის დაყენება" @@ -1216,13 +1217,15 @@ "ნებართვა საჭირო არ არის" "ამისათვის შესაძლოა მოგიწიოთ თანხის გადახდა" "OK" - "მოწყობილობა USB-თი იტენება" - "მიერთებულ მოწყობილობას ელკვებას USB აწვდის" - "USB ფაილების გადაცემისთვის" - "USB ფოტოების გადაცემისთვის" - "USB MIDI-სთვის" - "დაკავშირებულია USB აქსესუართან" + "ეს მოწყობილობა USB-თი იტენება" + "დაკავშირებული მოწყობილობა USB-თი იტენება" + "ფაილების USB-თი გადაცემა ჩართულია" + "ჩართულია PTP, USB-ს მეშვეობით" + "USB ტეტერინგი ჩართულია" + "ჩართულია MIDI, USB-ს მეშვეობით" + "USB აქსესუარის რეჟიმი ჩართულია" "შეეხეთ დამატებითი ვარიანტების სანახავად." + "დაკავშირებული მოწყობილობა იტენება. შეეხეთ დამატებითი ვარიანტებისთვის." "აღმოჩენილია ანალოგური აუდიო აქსესუარი" "მიერთებული მოწყობილობა არაა თავსებადი ამ ტელეფონთან. მეტის გასაგებად, შეეხეთ." "USB გამართვა შეერთებულია" @@ -1661,9 +1664,6 @@ "სამსახური %1$s" "მე-2 სამსახური %1$s" "მე-3 სამსახური %1$s" - "ამ ეკრანის ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ ღილაკებს „უკან“ და „მიმოხილვა“" - "ეკრანი დაფიქსირდა" - "ეკრანს ფიქსაცია მოეხსნა" "ფიქსაციის მოხსნამდე PIN-ის მოთხოვნა" "ფიქსაციის მოხსნამდე განბლოკვის ნიმუშის მოთხოვნა" "ფიქსაციის მოხსნამდე პაროლის მოთხოვნა" @@ -1757,15 +1757,11 @@ "ყველა ენა" "ყველა რეგიონი" "ძიება" - - - - + "ჩაირთოს სამსახურის პროფილი?" + "თქვენი სამსახურის აპები, შეტყობინებები, მონაცემები და სამსახურის პროფილის ყველა სხვა ფუნქცია ჩაირთვება" "ჩართვა" - - - - + "ეს აპი Android-ის ძველი ვერსიისთვის შეიქმნა და შესაძლოა სათანადოდ არ მუშაობდეს. გადაამოწმეთ განახლებები ან დაუკავშირდით დეველოპერს." + "განახლების შემოწმება" "თქვენ ახალი შეტყობინებები გაქვთ" "სანახავად, გახსენით SMS აპი" "ზოგიერთი ფუნქცია შეიძლება შეიზღუდოს" @@ -1832,17 +1828,17 @@ "ტელეფონი ამ ხმისთვის დაუშვებელია" "ამომხტარი ფანჯარა" "+ %1$d" - "ეს მალსახმობი საჭიროებს აპის უახლეს ვერსიას" + "აპის ვერსია დაქვეითებულია ან არაა თავსებადი ამ მალსახმობთან" "მალსახმობის აღდგენა ვერ მოხერხდა, რადგან ამ აპის მიერ მხარდაუჭერელია სარეზერვო ასლით აღდგენა" "მალსახმობის აღდგენა ვერ მოხერხდა აპის ხელმოწერის შეუსაბამობის გამო" "მალსახმობის აღდგენა ვერ მოხერხდა" "მალსახმობი გათიშულია" - - - - - - + "დეინსტალაცია" + "მაინც გახსნა" + "აღმოჩენილია საზიანო აპი" "%1$s-ს სურს, გაჩვენოთ %2$s-ის ფრაგმენტები" "რედაქტირება" + "სისტემის ცვლილებები" + "„არ შემაწუხოთ“ რეჟიმი შეცვლილია" + "შეეხეთ, რათა გადაამოწმოთ შეფერხებების მოქმედებათა პარამეტრები" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index a65286b4e97..d4f3e7d84b3 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -93,6 +93,8 @@ "SMS хабарлары" "Дауыстық пошта хабарлары" "Wi-Fi қоңыраулары" + + "Пир TTY режимі ТОЛЫҚ сұрады" "Пир TTY режимінің HCO сұрады" "Пир TTY режимінің VCO сұрады" @@ -238,7 +240,8 @@ "Параметрлер" "Көмек" "Дауыс көмекшісі" - "Құлыптауды енгізу" + + "999+" "Жаңа хабарландыру" "Виртуалды пернетақта" @@ -417,10 +420,8 @@ "Қолданбаға құрылғыдағы телефон функцияларына кіру мүмкіндігін береді. Бұл рұқсат қолданбаға телефон нөмірі, құрылғы жеке анықтағышы, қоңырау белсенділігі және сол қоңырауға байланысты қашықтағы нөмірді анықтау мүмкіндігін береді." "қоңырауларды жүйе арқылы бағыттау" "Қоңырау шалу тәжірибесін жақсарту үшін қолданба қоңырауларды жүйе арқылы бағыттай алады." - - - - + "басқа қолданбадағы қоңырауды жалғастыру" + "Қолданбаға басқа қолданбадағы қоңырауды жалғастыруға рұқсат береді." "телефон нөмірлерін оқу" "Қолданбаға құрылғының телефон нөмірлерін алуға мүмкіндік береді." "планшетті ұйқыдан бөгеу" @@ -499,6 +500,8 @@ "Талпыныстар тым көп. Кейінірек қайталап көріңіз." "Тым көп әрекет жасалды. Саусақ ізін оқу сканері өшірілді." "Әрекетті қайталаңыз." + "Саусақ іздері тіркелмеген." + "Бұл құрылғыда саусақ ізін оқу сканері жоқ" "%d саусағы" @@ -825,6 +828,8 @@ "Кеңес: Ұлғайту немесе кішірейту үшін екі рет түртіңіз." "Aвто толтыру" "Автотолтыруды орнату" + + " " "$1$2$3" ", " @@ -997,12 +1002,9 @@ "Ашу" "Хабар" "Енгізу" - - - - - - + "Көру" + "Кесте" + "Бақылау" "Жадта орын азайып барады" "Жүйенің кейбір функциялары жұмыс істемеуі мүмкін" "Жүйе үшін жад жеткіліксіз. 250 МБ бос орын бар екенін тексеріп, қайта іске қосыңыз." @@ -1128,8 +1130,7 @@ Ашық Wi-Fi желісі қол жетімді "Ашық Wi‑Fi желісіне қосылу" - - + "Оператордың Wi‑Fi желісіне қосылу" "Ашық Wi‑Fi желісіне қосылуда" "Wi‑Fi желісіне қосылды" "Wi‑Fi желісіне қосылмады" @@ -1200,9 +1201,12 @@ "SIM картасы қосылды" "Ұялы желіге кіру үшін құрылғыны қайта бастаңыз." "Қайта бастау" - "Жаңа SIM картаңыз дұрыс жұмыс істеуі үшін оператордың қолданбасын орнату және ашу керек." - "ҚОЛДАНБАНЫ АЛУ" - "ҚАЗІР ЕМЕС" + + + + + + "Жаңа SIM салынды" "Оны орнату үшін түртіңіз" "Уақытты реттеу" @@ -1214,13 +1218,15 @@ "Рұқсат қажет емес" "бұған төлем қажет болуы мүмкін" "Жарайды" - "USB арқылы зарядтау" - "USB жалғанған құрылғыға қуат беруде" - "Файлды тасымалдауға арналған USB" - "Фотосуретті тасымалдауға арналған USB" - "MIDI режиміне арналған USB" - "USB жабдығына қосылған" + "Құрылғы USB арқылы зарядталып тұр" + "Жалғанған құрылғы USB арқылы зарядталуда" + "USB арқылы файл жіберу мүмкіндігі қосылды" + "PTP режимі USB арқылы қосылды" + "USB тетеринг режимі қосылды" + "MIDI режимі USB арқылы қосылды" + "USB жабдығы режимі қосылды" "Қосымша опциялар үшін түртіңіз." + "Жалғанған құрылғы зарядталуда. Қосымша параметрлер үшін түртіңіз." "Аналогтық аудиожабдық анықталды" "Жалғанған құрылғы бұл телефонмен үйлесімсіз. Қосымша ақпарат алу үшін түртіңіз." "USB түзетуі қосылған" @@ -1659,9 +1665,6 @@ "Жұмыс %1$s" "2-ші жұмыс профилі (%1$s)" "3-ші жұмыс профилі (%1$s)" - "Бұл экранды босату үшін \"Артқа\" және \"Шолу\" түймелерін түртіп, ұстап тұрыңыз" - "Экран түйрелді" - "Экран босатылды" "Босату алдында PIN кодын сұрау" "Босату алдында бекітпесін ашу өрнегін сұрау" "Босату алдында құпия сөзді сұрау" @@ -1758,10 +1761,8 @@ "Жұмыс профилі қосылсын ба?" "Жұмыс қолданбалары, хабарландырулар, деректер және басқа да жұмыс профильдерінің мүмкіндіктері қосылады" "Қосу" - - - - + "Қолданба Android жүйесінің ескі нұсқасына арналған және дұрыс жұмыс істемеуі мүмкін. Жаңартылған нұсқаны тексеріңіз немесе әзірлеушіге хабарласыңыз." + "Жаңартылған нұсқаны тексеру" "Сізде жаңа хабарлар бар" "Көру үшін SMS қолданбасын ашыңыз" "Кейбір функциялар істемеуі мүмкін" @@ -1828,17 +1829,17 @@ "Телефонды дауысқа пайдалануға тыйым салынған" "Қалқымалы терезе" "+ %1$d" - "Бұл таңбаша ең соңғы қолданбаны қажет етеді" + "Қолданбаның нұсқасы ескі немесе бұл таңбашамен үйлеспейді" "Қолданба сақтық көшірме жасау мен қалпына келтіруді қолдамайтындықтан, таңбаша қалпына келтірілмеді" "Қолтаңба сәйкес келмейтіндіктен, таңбаша қалпына келтірілмеді" "Таңбаша қалпына келтірілмеді" "Таңбаша өшірілген" - - - - - - + "ЖОЮ" + "БӘРІБІР АШУ" + "Зиянды қолданба анықталды" "%1$s қолданбасы %2$s қолданбасының үзінділерін көрсеткісі келеді" "Өзгерту" + "Жүйе өзгерістері" + "\"Мазаламау\" режимі өзгерді" + "Түймені түртіп, кедергі жасалған кезде орындалатын әрекет параметрлерін тексеріңіз" diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index bccd96dbfa2..a78d527d26f 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -93,6 +93,7 @@ "សារ SMS" "សារ​ជា​សំឡេង" "ការហៅ​ទូរសព្ទ​តាម Wi-Fi" + "ស្ថានភាព​ស៊ីម" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode FULL" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode HCO" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode VCO" @@ -238,7 +239,7 @@ "ការ​កំណត់" "ជំនួយ" "ជំនួយសម្លេង" - "បញ្ជូលការចាក់សោជាប់" + "ការចាក់​សោ" "999+" "ការជូនដំណឹងថ្មី" "ក្ដារ​ចុច​និម្មិត" @@ -417,10 +418,8 @@ "ឲ្យ​កម្មវិធី​ចូល​ដំណើរការ​លក្ខណៈ​ទូរស័ព្ទ​នៃ​ឧបករណ៍។ សិទ្ធិ​នេះ​​ឲ្យ​កម្មវិធី​កំណត់​លេខ​ទូរស័ព្ទ និង​លេខ​សម្គាល់​ឧបករណ៍ ថា​តើ​ការ​ហៅ​សកម្ម និង​លេខ​ពី​ចម្ងាយ​បាន​ភ្ជាប់​ដោយ​ការ​ហៅ។" "បញ្ជូន​ការ​ហៅ​ទូរសព្ទ​តាមរយៈ​ប្រព័ន្ធ" "អនុញ្ញាត​ឲ្យ​កម្មវិធី​នេះ​បញ្ជូន​ការ​ហៅ​ទូរសព្ទ​របស់វា​តាមរយៈ​ប្រព័ន្ធ ​ដើម្បី​ធ្វើ​ឲ្យ​ការ​ហៅ​ទូរសព្ទ​ប្រសើរ​ជាង​មុន។" - - - - + "បន្ត​ការ​ហៅ​ទូរសព្ទ​ពី​កម្មវិធី​ផ្សេង​" + "អនុញ្ញាត​ឱ្យ​កម្មវិធី​បន្ត​ការ​ហៅ​ទូរសព្ទ​ ដែល​បាន​ចាប់ផ្តើម​នៅក្នុង​កម្មវិធី​ផ្សេង​។" "អាន​លេខ​ទូរសព្ទ" "អនុញ្ញាត​ឲ្យ​កម្មវិធីនេះ​ចូលប្រើប្រាស់​លេខទូរសព្ទ​របស់​ឧបករណ៍​នេះ។" "ការពារ​​កុំព្យូទ័រ​បន្ទះ​មិន​ឲ្យ​ដេក" @@ -499,6 +498,8 @@ "ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។" "ព្យាយាមចូលច្រើនដងពេកហើយ។ ឧបករណ៍ចាប់ស្នាមម្រាមដៃត្រូវ​បានបិទ។" "ព្យាយាមម្ដងទៀត។" + "មិន​មាន​ការ​ចុះឈ្មោះស្នាម​ម្រាមដៃទេ។" + "ឧបករណ៍នេះ​មិនមាន​ឧបករណ៍ចាប់​ស្នាមម្រាមដៃទេ" "ម្រាមដៃ %d" @@ -825,6 +826,7 @@ "ជំនួយ៖ ប៉ះ​ពីរ​ដង ដើម្បី​ពង្រីក និង​បង្រួម។" "បំពេញ​ស្វ័យ​ប្រវត្តិ" "រៀបចំ​ការ​បំពេញ​ស្វ័យ​ប្រវត្តិ" + "បំពេញ​ដោយ​ស្វ័យប្រវត្តិ" " " "$1$2$3" ", " @@ -997,12 +999,9 @@ "បើក" "សារ" "បញ្ចូល" - - - - - - + "មើល" + "កាលវិភាគ" + "តាម​ដាន" "អស់​ទំហំ​ផ្ទុក" "មុខងារ​ប្រព័ន្ធ​មួយ​ចំនួន​អាច​មិន​ដំណើរការ​" "មិន​មាន​ទំហំ​ផ្ទុក​​គ្រប់​គ្រាន់​សម្រាប់​ប្រព័ន្ធ​។ សូម​ប្រាកដ​ថា​អ្នក​មាន​ទំហំ​ទំនេរ​ 250MB ហើយ​ចាប់ផ្ដើម​ឡើង​វិញ។" @@ -1130,8 +1129,7 @@ បើកបណ្តាញ Wi-Fi ដែលមាន "ភ្ជាប់ទៅបណ្តាញ Wi‑Fi ចំហ" - - + "ភ្ជាប់​បណ្តាញ Wi‑Fi របស់​ក្រុមហ៊ុន​សេវាទូរសព្ទ" "កំពុងភ្ជាប់ទៅបណ្តាញ Wi‑Fi ចំហ" "បានភ្ជាប់ទៅបណ្តាញ Wi‑Fi" "មិនអាចភ្ជាប់ទៅបណ្តាញ Wi‑Fi បានទេ" @@ -1201,9 +1199,9 @@ "បាន​បន្ថែម​ស៊ីម​កាត" "ចាប់ផ្ដើម​ឧបករណ៍​របស់​អ្នក​ឡើង​វិញ ដើម្បី​ចូល​ដំណើរការ​បណ្ដាញ​ចល័ត។" "ចាប់ផ្ដើម​ឡើងវិញ" - "ដើម្បីឲ្យស៊ីមកាតថ្មីរបស់អ្នកដំណើរការប្រក្រតី អ្នកត្រូវដំឡើង និងបើកកម្មវិធីចេញពីក្រុមហ៊ុនផ្តល់សេវាទូរស័ព្ទរបស់អ្នក។" - "ទាញយកកម្មវិធី" - "មិនមែនឥឡូវទេ" + "បើក​ដំណើរការ​សេវាកម្ម​ទូរសព្ទ​ចល័ត" + "ទាញយក​កម្មវិធី​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ ដើម្បី​បើក​ដំណើរការ​សីុមថ្មី​របស់អ្នក" + "ទាញយក​កម្មវិធី" "ស៊ីមកាតថ្មីត្រូវបានស៊កចូល" "ប៉ះដើម្បីដំឡើង" "កំណត់​ម៉ោង​" @@ -1215,13 +1213,15 @@ "មិន​ទាមទារ​សិទ្ធិ" "វា​អាច​កាត់​លុយ​​អ្នក" "យល់ព្រម" - "USB កំពុងសាកឧបករណ៍នេះ" - "USB កំពុងផ្គត់ផ្គង់ថាមពលទៅឧបករណ៍ដែលបានភ្ជាប់" - "USB សម្រាប់ការផ្ទេរឯកសារ" - "USB សម្រាប់ការផ្ទេររូបថត" - "USB សម្រាប់ MIDI" - "បាន​ភ្ជាប់​ឧបករណ៍​យូអេសប៊ី" + "កំពុងសាកថ្ម​ឧបករណ៍នេះ​តាម USB" + "កំពុងសាកថ្ម​ឧបករណ៍​ដែលបាន​ភ្ជាប់តាម​ USB" + "មុខងារ​ផ្ទេរឯកសារ​តាម USB ត្រូវបានបើក" + "មុខងារ PTP តាម​ USB ត្រូវបានបើក" + "ការភ្ជាប់តាម USB ត្រូវបានបើក" + "មុខងារ​ MIDI តាម USB ត្រូវបានបើក" + "មុខងារ​គ្រឿងបរិក្ខារ USB ត្រូវបានបើក" "ប៉ះសម្រាប់ជម្រើសជាច្រើនទៀត" + "កំពុងសាកថ្ម​ឧបករណ៍​ដែលបានភ្ជាប់។ សូមចុចសម្រាប់​ជម្រើសបន្ថែម។" "បាន​រកឃើញ​គ្រឿង​បរិក្ខារ​សំឡេង​អាណាឡូក" "ឧបករណ៍​ដែលភ្ជាប់​មក​ជាមួយ​មិនត្រូវគ្នា​ជាមួយ​ទូរសព្ទ​នេះទេ។ ចុច​ដើម្បី​ស្វែងយល់​បន្ថែម។" "បាន​ភ្ជាប់​ការ​កែ​កំហុស​ USB" @@ -1660,9 +1660,6 @@ "កន្លែង​ធ្វើការ %1$s" "%1$s ការងារទី 2" "%1$s ការងារទី 3" - "ដើម្បី​ដក​ការ​ខ្ទាស់​អេក្រង់​នេះ សូម​ចុច​ប៉ូតុង​ថយ​ក្រោយ និង​ប៊ូតុង​ទិដ្ឋភាព​ឲ្យ​ជាប់" - "បាន​ភ្ជាប់​អេក្រង់" - "មិន​បាន​ភ្ជាប់​អេក្រង់" "សួរ​រក​កូដ PIN មុន​ពេល​ផ្ដាច់" "សួរ​រក​លំនាំ​ដោះ​សោ​មុន​ពេល​ផ្ដាច់" "សួរ​រក​ពាក្យ​សម្ងាត់​មុន​ពេល​ផ្ដាច់" @@ -1759,10 +1756,8 @@ "បើក​កម្រង​ព័ត៌មាន​ការ​ងារ?" "កម្មវិធី​ការងារ ការ​ជូនដំណឹង ទិន្នន័យ និង​មុខងារ​កម្រង​ព័ត៌មាន​ការងារ​ផ្សេង​ទៀត​របស់អ្នក​នឹង​ត្រូវ​បាន​បើក" "បើក" - - - - + "កម្មវិធី​នេះ​ត្រូវបាន​បង្កើត​ឡើង​សម្រាប់​កំណែ​ប្រព័ន្ធ​ប្រតិបត្តិការ Android ចាស់ ហើយ​វាអាច​ដំណើរការ​ខុសប្រក្រតី។ សូម​សាកល្បង​ពិនិត្យមើល​កំណែ​ថ្មី ឬ​ទាក់ទង​ទៅអ្នក​អភិវឌ្ឍន៍។" + "ពិនិត្យមើល​កំណែ​ថ្មី" "អ្នកមានសារថ្មី" "បើកកម្មវិធីសារ SMS ដើម្បីមើល" "លទ្ធភាពប្រើមុខងារមួយចំនួនអាចត្រូវបាកម្រិត" @@ -1829,17 +1824,20 @@ "ទូរសព្ទមិនអនុញ្ញាតសម្រាប់ការហៅទូរសព្ទទេ" "វិនដូលេចឡើង" "+ %1$d" - "ផ្លូវកាត់នេះត្រូវការកម្មវិធីថ្មីបំផុត" + "កំណែកម្មវិធី​ត្រូវបាន​បន្ទាប​ជំនាន់​ ឬមិន​ត្រូវគ្នា​ជាមួយ​ផ្លូវកាត់​នេះ" "មិនអាចស្តារផ្លូវកាត់បានទេ ដោយសារកម្មវិធីមិនស្គាល់ការបម្រុងទុក និងការស្តារ" "មិនអាចស្តារផ្លូវកាត់បានទេ ដោយសារការស៊ីញ៉េកម្មវិធីមិនត្រូវគ្នា" "មិនអាចស្តារផ្លូវកាត់បានទេ" "ផ្លូវកាត់ត្រូវ​បាន​បិទ" - + "លុប" + "មិន​អីទេ បើក​ចុះ" + "បាន​រកឃើញ​កម្មវិធី​ដែលបង្ក​គ្រោះថ្នាក់" + "%1$s ចង់​បង្ហាញ​ស្ថិតិ​ប្រើប្រាស់​របស់ %2$s" + "កែសម្រួល" + - + - + - "%1$s ចង់​បង្ហាញ​ស្ថិតិ​ប្រើប្រាស់​របស់ %2$s" - "កែសម្រួល" diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 14c295f4c59..adf234b2408 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -93,6 +93,8 @@ "ಎಸ್‌ಎಂಎಸ್ ಸಂದೇಶಗಳು" "ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳು" "ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ" + + "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ HCO" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ VCO" @@ -238,7 +240,8 @@ "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಸಹಾಯ ಮಾಡು" "ಧ್ವನಿ ಸಹಾಯಕ" - "ಲಾಕ್‌ಡೌನ್" + + "999+" "ಹೊಸ ಅಧಿಸೂಚನೆ" "ವರ್ಚುಯಲ್ ಕೀಬೋರ್ಡ್" @@ -497,10 +500,8 @@ "ಹಲವಾರು ಪ್ರಯತ್ನಗಳು. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ." "ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಫಿಂಗರ್‌ ಫ್ರಿಂಟ್‌ ಸೆನ್ಸಾರ್ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ." "ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ." - - - - + "ಯಾವುದೇ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ ಅನ್ನು ನೋಂದಣಿ ಮಾಡಿಲ್ಲ." + "ಈ ಸಾಧನವು ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ ಸೆನ್ಸಾರ್ ಅನ್ನು ಹೊಂದಿಲ್ಲ" "ಫಿಂಗರ್ %d" @@ -827,6 +828,8 @@ "ಸಲಹೆ: ಝೂಮ್ ಇನ್ ಮತ್ತು ಝೂಮ್ ಔಟ್ ಮಾಡಲು ಡಬಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ" "ಸ್ವಯಂತುಂಬುವಿಕೆ" "ಸ್ವಯಂತುಂಬುವಿಕೆಯನ್ನು ಹೊಂದಿಸಿ" + + " " "$1$2$3" ", " @@ -1198,9 +1201,12 @@ "ಸಿಮ್‌ ಕಾರ್ಡ್ ಸೇರಿಸಲಾಗಿದೆ" "ಮೊಬೈಲ್ ನೆಟ್‍ವರ್ಕ್ ಪ್ರವೇಶಿಸಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ." "ಮರುಪ್ರಾರಂಭಿಸು" - "ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡಲು, ನಿಮ್ಮ ವಾಹಕದಿಂದ ಒಂದು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನೀವು ಸ್ಥಾಪಿಸಬೇಕಾಗುತ್ತದೆ ಮತ್ತು ತೆರೆಯಬೇಕಾಗುತ್ತದೆ." - "ಅಪ್ಲಿಕೇಶನ್ ಪಡೆದುಕೊಳ್ಳಿ" - "ಈಗ ಬೇಡ" + + + + + + "ಹೊಸ ಸಿಮ್ ಸೇರಿಸಲಾಗಿದೆ" "ಇದನ್ನು ಸ್ಥಾಪಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ" "ಸಮಯವನ್ನು ಹೊಂದಿಸಿ" @@ -1212,23 +1218,15 @@ "ಯಾವುದೇ ಅನುಮತಿಗಳ ಅಗತ್ಯವಿಲ್ಲ" "ಇದು ನಿಮ್ಮ ಹಣವನ್ನು ವ್ಯಯಿಸಬಹುದು" "ಸರಿ" - - - - - - - - - - - - - - + "USB ಮೂಲಕ ಈ ಸಾಧನವು ಚಾರ್ಜ್‌ ಆಗುತ್ತಿದೆ" + "USB ಮೂಲಕ ಸಂಪರ್ಕಗೊಂಡಿರುವ ಸಾಧನವನ್ನು ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ" + "USB ಫೈಲ್ ವರ್ಗಾವಣೆಯು ಆನ್‌ ಆಗಿದೆ" + "USB ಮೂಲಕ PTP ಆನ್‌ ಆಗಿದೆ" + "USB ಟೆಥರಿಂಗ್ ಆನ್ ಆಗಿದೆ" + "USB ಮೂಲಕ MIDI ಆನ್‌ ಆಗಿದೆ" + "USB ಪರಿಕರದ ಮೋಡ್ ಆನ್ ಆಗಿದೆ" "ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗೆ ಟ್ಯಾಪ್ ಮಾಡಿ." - - + "ಸಂಪರ್ಕಗೊಂಡಿರುವ ಸಾಧನವನ್ನು ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ. ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ." "ಅನ್‌ಲಾಗ್ ಆಡಿಯೋ ಪರಿಕರ ಪತ್ತೆಯಾಗಿದೆ" "ಲಗತ್ತಿಸಲಾದ ಸಾಧನವು ಈ ಫೋನಿನೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ." "USB ಡೀಬಗಿಂಗ್‌‌ ಸಂಪರ್ಕ" @@ -1831,8 +1829,7 @@ "ಧ್ವನಿಗಾಗಿ ಫೋನ್ ಅನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" "ಪಾಪ್‌ಅಪ್ ವಿಂಡೋ" "+ %1$d" - - + "ಅಪ್ಲಿಕೇಶನ್ ಆವೃತ್ತಿಯನ್ನು ಡೌನ್‌ಗ್ರೇಡ್‌ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಈ ಶಾರ್ಟ್‌ಕಟ್‌ಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ" "ಅಪ್ಲಿಕೇಶನ್‌ ಬ್ಯಾಕಪ್ ಮತ್ತು ಪುನಃಸ್ಥಾಪನೆಯನ್ನು ಬೆಂಬಲಿಸದಿರುವುದರಿಂದ ಶಾರ್ಟ್‌ಕಟ್‌ ಅನ್ನು ಪುನಃಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ" "ಅಪ್ಲಿಕೇಶನ್‌ ಸಹಿ ಹೊಂದಿಕೆಯಾಗದ ಕಾರಣದಿಂದ ಶಾರ್ಟ್‌ಕಟ್‌ ಅನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ" "ಶಾರ್ಟ್‌ಕಟ್‌ ಅನ್ನು ಪುನಃ ಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ" @@ -1842,4 +1839,7 @@ "ಅಪಾಯಕಾರಿ ಅಪ್ಲಿಕೇಶನ್ ಕಂಡುಬಂದಿದೆ" "%2$s ಸ್ಲೈಸ್‌ಗಳನ್ನು %1$s ತೋರಿಸಲು ಬಯಸಿದೆ" "ಎಡಿಟ್" + "ಸಿಸ್ಟಂ ಬದಲಾವಣೆಗಳು" + "ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಬದಲಾಗಿದೆ" + "ಅಡಚಣೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ವರ್ತನೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಪರೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index b3a5ba663d4..77e6971dae2 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -93,6 +93,8 @@ "SMS 메시지" "음성사서함 메시지" "Wi-Fi 통화" + + "피어가 TTY 모드 FULL을 요청했습니다." "피어가 TTY 모드 HCO를 요청했습니다." "피어가 TTY 모드 VCO를 요청했습니다." @@ -238,7 +240,8 @@ "설정" "지원" "음성 지원" - "잠금 설정" + + "999+" "새 알림" "가상 키보드" @@ -264,10 +267,8 @@ "%1$s, %2$s" "안전 모드" "Android 시스템" - - - - + "개인 프로필로 전환" + "직장 프로필로 전환" "주소록" "주소록에 액세스" "<b>%1$s</b>에서 내 연락처를 액세스하도록 허용합니다." @@ -419,10 +420,8 @@ "앱이 기기의 휴대전화 기능에 접근할 수 있도록 허용합니다. 이 권한을 사용하면 앱이 전화번호 및 기기의 ID, 활성 통화인지 여부, 통화가 연결된 원격 번호 등을 확인할 수 있습니다." "시스템을 통해 통화 연결" "통화 환경을 개선하기 위해 앱이 시스템을 통해 통화를 연결하도록 허용합니다." - - - - + "다른 앱에서 전화 받기" + "다른 앱에서 수신한 전화를 계속하려면 앱을 허용합니다." "전화번호 읽기" "앱에서 기기의 전화번호에 액세스하도록 허용합니다." "태블릿이 절전 모드로 전환되지 않도록 설정" @@ -497,11 +496,12 @@ "지문을 저장할 수 없습니다. 기존 지문을 삭제하세요." "지문 인식 시간이 초과되었습니다. 다시 시도하세요." "지문 인식 작업이 취소되었습니다." - - + "사용자가 지문 인식 작업을 취소했습니다." "시도 횟수가 너무 많습니다. 나중에 다시 시도하세요." "시도 횟수가 너무 많습니다. 지문 센서가 사용 중지되었습니다." "다시 시도해 보세요." + "등록된 지문이 없습니다." + "기기에 지문 센서가 없습니다." "손가락 %d" @@ -828,6 +828,8 @@ "도움말: 확대/축소하려면 두 번 탭합니다." "자동완성" "자동완성 설정..." + + " " "$3$2$1" ", " @@ -1000,12 +1002,9 @@ "열기" "메시지" "추가" - - - - - - + "보기" + "일정" + "추적" "저장 공간이 부족함" "일부 시스템 기능이 작동하지 않을 수 있습니다." "시스템의 저장 공간이 부족합니다. 250MB의 여유 공간이 확보한 후 다시 시작하세요." @@ -1131,8 +1130,7 @@ 개방형 Wi-Fi 네트워크 사용 가능 "공개 Wi‑Fi 네트워크에 연결" - - + "이동통신사 Wi‑Fi 네트워크에 연결" "공개 Wi‑Fi 네트워크에 연결 중" "Wi‑Fi 네트워크에 연결됨" "Wi‑Fi 네트워크에 연결할 수 없음" @@ -1202,9 +1200,12 @@ "SIM 카드 추가됨" "모바일 네트워크에 액세스하려면 기기를 다시 시작하세요." "다시 시작" - "새 SIM이 제대로 작동하게 하려면 이동통신사의 앱을 설치하고 열어야 합니다." - "앱 다운로드" - "나중에" + + + + + + "새 SIM이 삽입됨" "탭하여 설정" "시간 설정" @@ -1216,13 +1217,15 @@ "권한 필요 없음" "비용이 부과될 수 있습니다." "확인" - "이 기기를 USB로 충전" - "연결된 기기에 USB로 전력 공급" - "파일 전송용 USB" - "사진 전송용 USB" - "MIDI용 USB" - "USB 액세서리에 연결됨" + "이 기기를 USB로 충전" + "USB를 통해 연결된 기기 충전" + "USB 파일 전송 사용 설정됨" + "USB를 통해 PTP 사용 설정됨" + "USB 테더링 사용 설정됨" + "USB를 통해 MIDI 사용 설정됨" + "USB 액세서리 모드 사용 설정됨" "옵션을 더 보려면 탭하세요." + "연결된 기기를 충전합니다. 옵션을 더 보려면 탭하세요." "아날로그 오디오 액세서리가 감지됨" "연결된 기기가 이 휴대전화와 호환되지 않습니다. 자세히 알아보려면 탭하세요." "USB 디버깅 연결됨" @@ -1661,9 +1664,6 @@ "업무용 %1$s" "두 번째 업무용 %1$s" "세 번째 업무용%1$s" - "이 화면을 고정 해제하려면 \'뒤로\' 및 \'최근 사용\'을 길게 터치하세요." - "화면 고정됨" - "화면 고정 해제됨" "고정 해제 이전에 PIN 요청" "고정 해제 이전에 잠금해제 패턴 요청" "고정 해제 이전에 비밀번호 요청" @@ -1757,15 +1757,11 @@ "모든 언어" "모든 지역" "검색" - - - - + "직장 프로필을 사용 설정하시겠어요?" + "업무용 앱, 알림, 데이터 및 기타 직장 프로필 기능이 사용 설정됩니다." "사용 설정" - - - - + "이 앱은 Android 이전 버전에 맞게 개발되었기 때문에 제대로 작동하지 않을 수 있습니다. 업데이트를 확인하거나 개발자에게 문의하세요." + "업데이트 확인" "새 메시지 있음" "SMS 앱을 열고 확인" "일부 기능이 제한될 수 있습니다." @@ -1832,17 +1828,17 @@ "휴대전화에서 음성이 허용되지 않음" "팝업 창" "%1$d개 더보기" - "바로가기를 사용하려면 최신 앱이 필요합니다" + "앱 버전이 다운그레이드되었거나 이 단축키와 호환되지 않습니다." "앱이 백업 및 복원을 지원하지 않으므로 바로가기를 복원할 수 없습니다" "앱 서명이 일치하지 않아 바로가기를 복원할 수 없습니다" "바로가기를 복원할 수 없습니다" "바로가기가 사용 중지됨" - - - - - - + "제거" + "열기" + "유해한 앱 감지됨" "%1$s에서 %2$s의 슬라이스를 표시하려고 합니다" "수정" + "시스템 변경사항" + "알림 일시중지 변경" + "알림 일시중지 설정을 확인하려면 탭하세요." diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 6b4be9b3135..ef40d0e72da 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -93,6 +93,8 @@ "SMS билдирүүлөрү" "Үн почтасынын билдирүүлөрү" "Wi-Fi аркылуу чалуу" + + "Peer TTY режимин FULL кылууну суранды" "Peer TTY режимин HCO кылууну суранды" "Peer TTY режимин VCO кылууну суранды" @@ -238,7 +240,8 @@ "Жөндөөлөр" "Жардам" "Үн жардамчысы" - "Кулпуну иштетүү" + + "999+" "Жаңы эскертме" "Виртуалдык баскычтоп" @@ -417,10 +420,8 @@ "Колдонмого түзмөктүн чалуу мүмкүнчүлүктөрүнө жетки алуу уруксатын берет. Бул уруксат колдонмого, телефондун номурун, түзмөктүн ID-син, чалуунун абалын жана байланышта чыккан номурду аныктоого жол берет." "чалууларды тутум аркылуу өткөрүү" "Чалуунун сапатын жакшыртуу максатында колдонмого чалууларын тутум аркылуу өткөрүүгө уруксат берет." - - - - + "чалууну башка колдонмодон улантуу" + "Башка колдонмодон аткарылган чалууну бул колдонмодо улантууга уруксат берүү." "телефон номерлерин окуу" "Колдонмого түзмөктүн телефон номерлерин окуу мүмкүнчүлүгү берилет." "планшетти уктатпай сактоо" @@ -499,6 +500,8 @@ "Аракеттер өтө көп болду. Кийинчерээк кайра аракет кылыңыз." "Өтө көп жолу аракет жасадыңыз. Манжа изинин сенсору өчүрүлдү." "Кайра бир аракеттениңиз." + "Бир да манжа изи катталган эмес." + "Бул түзмөктө манжа изинин сенсору жок" "%d-манжа" @@ -825,6 +828,8 @@ "Кыйытма: Чоңойтуп-кичирейтиш үчүн эки жолу басыңыз." "Авто-толтуруу" "Автотолтурууну тууралоо" + + " " "$1$2$3" ", " @@ -997,12 +1002,9 @@ "Ачуу" "Билдирүү" "Кошуу" - - - - - - + "Көрүү" + "Графикке киргизүү" + "Көз салуу" "Сактагычта орун калбай баратат" "Системанын кээ бир функциялары иштебеши мүмкүн" "Тутумда сактагыч жетишсиз. 250МБ бош орун бар экенин текшерип туруп, өчүрүп күйгүзүңүз." @@ -1128,8 +1130,7 @@ Ачык Wi-Fi тармагы жеткиликтүү "Ачык Wi‑Fi тармагына туташуу" - - + "Байланыш операторунун Wi‑Fi тармагына туташуу" "Ачык Wi‑Fi тармагына туташууда" "Ачык Wi‑Fi тармагына туташты" "Wi-Fi тармагына туташпай калды" @@ -1200,9 +1201,12 @@ "SIM-карта кошулду" "Мобилдик түйүнкгө жетки алуу үчүн, түзмөгүңүздү өчүрүп кайра жандырыңыз." "Кайра баштоо" - "Жаңы SIM картаңыз талаптагыдай иштеши үчүн, колдонмону орнотуп, аны операторуңуз аркылуу ачышыңыз керек болот." - "КОЛДОНМОГО ЭЭ БОЛУУ" - "АЗЫР ЭМЕС" + + + + + + "Жаңы SIM карта салынды" "Аны жөндөө үчүн таптап коюңуз" "Убакытты коюу" @@ -1214,13 +1218,15 @@ "Эч уруксаттын кереги жок" "бул үчүн акы алынышы мүмкүн" "Жарайт" - "Бул түзмөк USB менен кубатталууда" - "Тиркелген түзмөк USB менен кубатталууда" - "Файл өткөрүү үчүн USB" - "Сүрөт өткөрүү үчүн USB" - "MIDI үчүн USB" - "USB аксессуарга байланышты" + "Бул түзмөк USB аркылуу кубатталууда" + "USB аркылуу туташкан түзмөк кубатталууда" + "USB аркылуу файл өткөрүү режими күйгүзүлдү" + "USB аркылуу PTP режими күйгүзүлдү" + "USB модем күйгүзүлдү" + "USB аркылуу MIDI режими күйгүзүлдү" + "USB шайманы режими күйгүзүлдү" "Кошумча параметрлерди ачуу үчүн таптап коюңуз." + "Туташкан түзмөк кубатталууда. Дагы параметрлерди көрүү үчүн таптап коюңуз." "Аналогдук аудио жабдуу табылды" "Тиркелген түзмөк бул телефонго шайкеш келбейт. Көбүрөөк маалымат алуу үчүн таптап коюңуз." "Мүчүлүштүктөрдү USB аркылуу оңдоо иштетилген" @@ -1660,9 +1666,6 @@ "Жумуш %1$s" "2-жумуш %1$s" "3-жумуш %1$s" - "Бул экранды бошотуу үчүн \"Артка\" жана \"Сереп салуу\" баскычтарын басып, кармап туруңуз" - "Экран кадалды" - "Экран бошотулду" "Бошотуудан мурун PIN суралсын" "Бошотуудан мурун кулпуну ачкан үлгү суралсын" "Бошотуудан мурун сырсөз суралсын" @@ -1757,12 +1760,10 @@ "Бардык аймактар" "Издөө" "Жумуш профили күйгүзүлсүнбү?" - "Жумуш колдонмолоруңуз, эскертмелериңиз, дайындарыңыз жана жумуш профилинин башка функциялары өчүрүлөт" + "Жумуш колдонмолоруңуз, эскертмелериңиз, дайындарыңыз жана жумуш профилинин башка функциялары күйгүзүлөт." "Күйгүзүү" - - - - + "Бул колдонмо Android\'дин эски версиясы үчүн иштеп чыгарылган, андыктан туура эмес иштеши мүмкүн. Жаңыртууларды издеп көрүңүз же иштеп чыгуучуга кайрылыңыз." + "Жаңыртууну издөө" "Сизге жаңы билдирүүлөр келди" "Көрүү үчүн SMS колдонмосун ачыңыз" "Айрым функциялар чектлши мүмкн" @@ -1829,17 +1830,17 @@ "Телефонду сүйлөшүү үчүн колдонууга тыюу салынган" "Калкып чыкма терезе" "+ %1$d" - "Бул кыска жолго колдонмонун эң акыркы версиясы талап кылынат" + "Колдонмонун мурунку версиясын иштетип жатасыз же ал бул шилтемеге шайкеш эмес" "Колдонмо камдык көчүрмөнү сактоо жана калыбына келтирүү функцияларын колдобогондуктан кыска жол калыбына келтирилбей койду" "Колдонмонун колтамгасы дал келбегендиктен кыска жол калыбына келтирилбей койду" "Кыска жол калыбына келтирилбей койду" "Кыска жол өчүрүлгөн" - - - - - - + "ЧЫГАРЫП САЛУУ" + "БААРЫ БИР АЧЫЛСЫН" + "Зыянкеч колдонмо аныкталды" "%1$s колдонмосу %2$s үлгүлөрүн көрсөткөнү жатат" "Түзөтүү" + "Тутум өзгөрүүлөрү" + "\"Тынчымды алба\" режими өзгөрдү" + "\"Тынчымды алба\" режиминин жөндөөлөрүн текшерүү үчүн таптаңыз" diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index cc568d38896..c75b1ff3efb 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -93,6 +93,7 @@ "ຂໍ້ຄວາມ SMS" "ຂໍ້ຄວາມສຽງ" "ການ​ໂທ Wi-Fi" + "ສະຖານະ SIM" "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ​ນັ້ນ​ເຕັມ​ແລ້ວ" "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ HCO" "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ VCO" @@ -238,7 +239,7 @@ "​ການ​ຕັ້ງ​ຄ່າ" "ຕົວຊ່ວຍ" "ຊ່ວຍ​ເຫຼືອ​ທາງ​ສຽງ" - "ລະບຸການລັອກ" + "ລັອກໄວ້" "999+" "ການແຈ້ງເຕືອນໃໝ່" "ແປ້ນພິມສະເໝືອນ" @@ -497,10 +498,8 @@ "ມີ​ຄວາມ​ພະ​ຍາ​ຍາມ​ຫຼາຍ​ຄັ້ງ​ເກີນ​ໄປ. ລອງ​ໃໝ່​ພາຍ​ຫຼັງ." "ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ລະບົບປິດການເຮັດວຽກຂອງເຊັນເຊີລາຍນິ້ວມືແລ້ວ." "ລອງໃໝ່ອີກຄັ້ງ." - - - - + "ບໍ່ມີການລົງທະບຽນລາຍນິ້ວມື." + "ອຸປະກອນນີ້ບໍ່ມີເຊັນເຊີລາຍນິ້ວມື" "ນີ້ວ​ມື %d" @@ -827,6 +826,7 @@ "ເຄັດລັບ: ແຕະສອງຄັ້ງເພື່ອຊູມເຂົ້າ ແລະຊູມອອກ." "ຕື່ມຂໍ້ມູນອັດຕະໂນມັດ" "ຕັ້ງການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ" + "ຕື່ມຂໍ້ມູນອັດຕະໂນມັດ" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "ເພີ່ມຊິມກາດແລ້ວ" "ປິດແລ້ວເປີດອຸປະກອນຂອງທ່ານ ເພື່ອເຂົ້າເຖິງເຄືອຂ່າຍມືຖື." "ຣີສະຕາດ" - "ເພື່ອໃຫ້ SIM ໃໝ່ຂອງທ່ານສາມາດໃຊ້ໄດ້ປົກກະຕິ, ທ່ານຈຳເປັນຕ້ອງຕິດຕັ້ງ ແລະ ເປີດແອັບຈາກຜູ້ໃຫ້ບໍລິການຂອງທ່ານ." - "ດາວໂຫລດແອັບ" - "ບໍ່ແມ່ນຕອນນີ້" + "ເປີດໃຊ້ບໍລິການມືຖື" + "ກະລຸນາດາວໂຫລດແອັບຜູ້ໃຫ້ບໍລິການເພື່ອເປີດໃຊ້ SIM ໃໝ່ຂອງທ່ານ" + "ດາວໂຫລດແອັບ" "ໃສ່ SIM ໃໝ່ແລ້ວ" "ແຕະເພື່ອຕັ້ງມັນ" "ຕັ້ງເວລາ" @@ -1211,23 +1211,15 @@ "ບໍ່ຕ້ອງການການອະນຸຍາດ" "ລາຍການນີ້ອາດມີການເກັບເງິນ" "ຕົກລົງ" - - - - - - - - - - - - - - + "ກຳລັງສາກອຸປະກອນນີ້ຜ່ານ USB" + "ກຳລັງສາກໄຟອຸປະກອນຜ່ານ USB" + "ເປີດໂໝດໂອນຍ້າຍໄຟລ໌ USB ແລ້ວ" + "ເປີດໂໝດ PTP ຜ່ານ USB ແລ້ວ" + "ເປີດໂໝດ USB tethering ແລ້ວ" + "ເປີດໃຊ້ MIDI ຜ່ານ USB ແລ້ວ" + "ເປີດໂໝດອຸປະກອນເສີມ USB ແລ້ວ" "ແຕະເພື່ອເບິ່ງຕົວເລືອກເພີ່ມເຕີມ." - - + "ກຳລັງສາກອຸປະກອນທີ່ເຊື່ອມຕໍ່. ແຕະເພື່ອເບິ່ງຕົວເລືອກເພີ່ມເຕີມ." "ກວດພົບອຸປະກອນເສີມສຽງ" "ອຸປະກອນທີ່ເຊື່ອມຕໍ່ນັ້ນບໍ່ສາມາດໃຊ້ຮ່ວມກັບໂທລະສັບນີ້ໄດ້. ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ." "ເຊື່ອມຕໍ່ການດີບັກຜ່ານ USB ແລ້ວ" @@ -1830,8 +1822,7 @@ "ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ໂທລະສັບສຳລັບການໂທສຽງ" "ໜ້າຈໍປັອບອັບ" "+ %1$d" - - + "ດາວເກຣດເວີຊັນແອັບແລ້ວ ຫຼື ບໍ່ສາມາດໃຊ້ຮ່ວມກັບທາງລັດນີ້ໄດ້" "ບໍ່ສາມາດກູ້ທາງລັດຂຶ້ນມາໄດ້ເນື່ອງຈາກແອັບບໍ່ຮອງຮັບການສຳຮອງ ແລະ ກູ້ຂໍ້ມູນ" "ບໍ່ສາມາດກູ້ທາງລັດຄືນມາໄດ້ເນື່ອງຈາກລາຍເຊັນແອັບບໍ່ກົງກັນ" "ບໍ່ສາມາດກູ້ທາງລັດຄືນມາໄດ້" @@ -1841,4 +1832,7 @@ "ກວດສອບແອັບທີ່ເປັນອັນຕະລາຍ" "%1$s ຕ້ອງການສະແດງ %2$s ສະໄລ້" "ແກ້ໄຂ" + "System changes" + "Do Not Disturb has changed" + "Tap to check your behavior settings for interruptions" diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 89d803c04f3..72ef6ffe2c4 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -95,6 +95,7 @@ "SMS pranešimai" "Balso pašto pranešimai" "„Wi-Fi“ skambinimas" + "SIM būsena" "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo FULL" "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo HCO" "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo VCO" @@ -244,7 +245,7 @@ "Nustatymai" "Pagalba" "Voice Assist" - "Užrakinti" + "Užrakinimas" "999+" "Naujas pranešimas" "Virtualioji klaviatūra" @@ -270,10 +271,8 @@ "%1$s, %2$s" "Saugos režimas" "„Android“ sistema" - - - - + "Perjungti į asmeninį profilį" + "Perjungti į darbo profilį" "Kontaktai" "pasiekti kontaktus" "Suteikti <b>%1$s</b> prieigą prie kontaktų" @@ -425,10 +424,8 @@ "Leidžiama programai pasiekti telefono funkcijas įrenginyje. Šis leidimas suteikia teisę programai nustatyti telefono numerį ir įrenginio ID, tai, ar skambutis aktyvus, ir skambučiu prijungtą nuotolinį numerį." "nukreipti skambučius per sistemą" "Programai leidžiama nukreipti jos skambučius per sistemą siekiant pagerinti skambinimo paslaugas." - - - - + "tęsti skambutį naudojant kitą programą" + "Programai leidžiama tęsti skambutį, kuris buvo pradėtas naudojant kitą programą." "skaityti telefonų numerius" "Programai leidžiama pasiekti įrenginio telefonų numerius." "neleisti planšetiniam kompiuteriui užmigti" @@ -503,11 +500,12 @@ "Negalima išsaugoti kontrolinio kodo. Pašalinkite esamą kontrolinį kodą." "Baigėsi kontrolinio kodo nustatymo skirtasis laikas. Bandykite dar kartą." "Kontrolinio kodo operacija atšaukta." - - + "Kontrolinio kodo operaciją atšaukė naudotojas." "Per daug bandymų. Vėliau bandykite dar kartą." "Per daug bandymų. Kontrolinio kodo jutiklis išjungtas." "Bandykite dar kartą." + "Neužregistruota jokių kontrolinių kodų." + "Šiame įrenginyje nėra kontrolinio kodo jutiklio" "%d pirštas" @@ -834,6 +832,7 @@ "Patarimas: palieskite dukart, kad padidintumėte ar sumažintumėte mastelį." "Automatinis pildymas" "Nust. aut. pild." + "Automatinis pildymas" " " "$1$2$3" ", " @@ -1040,12 +1039,9 @@ "Atidaryti" "Pranešimas" "Pridėti" - - - - - - + "Peržiūrėti" + "Tvarkaraštis" + "Stebėti" "Mažėja laisvos saugyklos vietos" "Kai kurios sistemos funkcijos gali neveikti" "Sistemos saugykloje nepakanka vietos. Įsitikinkite, kad yra 250 MB laisvos vietos, ir paleiskite iš naujo." @@ -1175,8 +1171,7 @@ Pasiekiami atvirieji „Wi-Fi“ tinklai "Prisijunkite prie atviro „Wi‑Fi“ tinklo" - - + "Prisijungimas prie operatoriaus „Wi‑Fi“ tinklo" "Prisijungiama prie atviro „Wi‑Fi“ tinklo" "Prisijungta prie „Wi-Fi“ tinklo" "Nepavyko prisijungti prie „Wi‑Fi“ tinklo" @@ -1246,9 +1241,9 @@ "SIM kortelė pridėta" "Jei norite pasiekti mobiliojo ryšio tinklą, reikia iš naujo paleisti įrenginį." "Paleisti iš naujo" - "Kad nauja SIM kortelė veiktų tinkamai, turite įdiegti ir atidaryti iš operatoriaus gautą programą." - "GAUTI PROGRAMĄ" - "NE DABAR" + "Suaktyvinti mobiliojo ryšio paslaugą" + "Atsisiųskite operatoriaus programą, kad suaktyvintumėte naują SIM" + "Atsisiųsti programą" "Įdėta nauja SIM kortelė" "Jei norite tai nustatyti, palieskite" "Nustatyti laiką" @@ -1260,13 +1255,15 @@ "Nereikia leidimų" "tai gali kainuoti" "Gerai" - "Įrenginys įkraunamas naudojant USB" - "Maitinimas prijungtam įrenginiui tiekiamas naudojant USB" - "USB (failų perkėlimas)" - "USB (nuotraukų perkėlimas)" - "USB (MIDI)" - "Prijungta prie USB priedo" + "Šis įrenginys įkraunamas naudojant USB" + "Prijungtas įrenginys įkraunamas naudojant USB" + "USB failų perkėlimas įjungtas" + "PTP režimas naudojant USB įjungtas" + "USB įrenginio kaip modemo naudojimas įjungtas" + "MIDI režimas naudojant USB įjungtas" + "USB priedo režimas įjungtas" "Palieskite, kad būtų rodoma daugiau parinkčių." + "Įkraunamas prijungtas įrenginys. Palieskite, jei reikia daugiau parinkčių." "Aptiktas analoginis garso priedas" "Prijungtas įrenginys nesuderinamas su šiuo telefonu. Palieskite, kad sužinotumėte daugiau." "USB derinimas prijungtas" @@ -1711,9 +1708,6 @@ "Darbo %1$s" "2-asis darbo %1$s" "3-iasis darbo %1$s" - "Kad atsegtumėte šį ekraną, palieskite ir palaikykite mygtukus „Atgal“ ir „Apžvalga“" - "Ekrano prisegtas" - "Ekranas atsegtas" "Prašyti PIN kodo prieš atsegant" "Prašyti atrakinimo piešinio prieš atsegant" "Prašyti slaptažodžio prieš atsegant" @@ -1825,15 +1819,11 @@ "Visos kalbos" "Visi regionai" "Paieška" - - - - + "Įjungti darbo profilį?" + "Darbo programos, pranešimai, duomenys ir kitos darbo profilio funkcijos bus išjungtos" "Įjungti" - - - - + "Ši programa sukurta naudoti senesnės versijos sistemoje „Android“ ir gali tinkamai neveikti. Pabandykite patikrinti, ar yra naujinių, arba susisiekite su kūrėju." + "Tikrinti, ar yra naujinių" "Turite naujų pranešimų" "Atidaryti SMS programą, norint peržiūrėti" "Kai kurios funkcijos gali būti ribojamos" @@ -1902,17 +1892,20 @@ "Telefonas neleidžiamas naudojant balso paslaugas" "Iššokantysis langas" "Dar %1$d" - "Norint naudoti šį spartųjį klavišą būtina naujausios versijos programa" + "Grąžinta ankstesnė programos versija arba versija nesuderinama su šiuo sparčiuoju klavišu" "Nepavyko atkurti sparčiojo klavišo, nes programa nepalaiko atsarginės kopijos kūrimo ir atkūrimo funkcijų" "Nepavyko atkurti sparčiojo klavišo, nes programos parašas neatitinka" "Nepavyko atkurti sparčiojo klavišo" "Spartusis klavišas išjungtas" - + "PAŠALINTI" + "VIS TIEK ATIDARYTI" + "Aptikta žalinga programa" + "„%1$s“ nori rodyti „%2$s“ fragmentus" + "Redaguoti" + - + - + - "„%1$s“ nori rodyti „%2$s“ fragmentus" - "Redaguoti" diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 75f39de1980..d63558f3469 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -94,6 +94,8 @@ "Īsziņas" "Balss pasta ziņojumi" "Wi-Fi zvani" + + "Vienādranga ierīce pieprasīja teksta tālruņa režīmu FULL" "Vienādranga ierīce pieprasīja teksta tālruņa režīmu HCO" "Vienādranga ierīce pieprasīja teksta tālruņa režīmu VCO" @@ -241,7 +243,8 @@ "Iestatījumi" "Palīdzība" "Balss palīgs" - "Iest. bloķēšanu" + + "Pārsniedz" "Jauns paziņojums" "Virtuālā tastatūra" @@ -267,10 +270,8 @@ "%1$s, %2$s" "Drošais režīms" "Android sistēma" - - - - + "Pārslēgties uz personisko profilu" + "Pārslēgties uz darba profilu" "Kontaktpersonas" "piekļūt jūsu kontaktpersonu datiem" "Atļaut lietotnei <b>%1$s</b> piekļūt jūsu kontaktpersonām" @@ -422,10 +423,8 @@ "Ļauj lietotnei piekļūt ierīces tālruņa funkcijām. Ar šo atļauju lietotne var noteikt tālruņa numuru un ierīču ID, zvana statusu un attālo numuru, ar ko ir izveidots savienojums, veicot zvanu." "maršrutēt zvanus sistēmā" "Ļauj lietotnei maršrutēt tās zvanus sistēmā, lai uzlabotu zvanīšanas pieredzi." - - - - + "turpināt zvanu no citas lietotnes" + "Ļauj lietotnei turpināt zvanu, kas tika sākts citā lietotnē." "lasīt tālruņa numurus" "Ļauj lietotnei piekļūt ierīcē esošajiem tālruņa numuriem." "novērst planšetdatora pāriešanu miega režīmā" @@ -500,11 +499,12 @@ "Pirkstu nospiedumu nevar saglabāt. Lūdzu, noņemiet esošu pirksta nospiedumu." "Pirkstu nospiedumu nolasīšanas aparatūras noildze. Mēģiniet vēlreiz." "Nospieduma darbība neizdevās." - - + "Lietotājs atcēla pirksta nospieduma darbību." "Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz." "Pārāk daudz mēģinājumu. Pirksta nospieduma sensors atspējots." "Mēģiniet vēlreiz." + "Nav reģistrēts neviens pirksta nospiedums." + "Šajā ierīcē nav pirksta nospieduma sensora." "%d. pirksts" @@ -831,6 +831,8 @@ "Padoms. Divreiz pieskarieties, lai tuvinātu un tālinātu." "Automātiskā aizpilde" "Iest. aut. aizp." + + " " "$1$2$3" ", " @@ -1020,12 +1022,9 @@ "Atvērt" "Īsziņa" "Pievienot" - - - - - - + "Skatīt" + "Grafiks" + "Izsekot" "Paliek maz brīvas vietas" "Dažas sistēmas funkcijas var nedarboties." "Sistēmai pietrūkst vietas. Atbrīvojiet vismaz 250 MB vietas un restartējiet ierīci." @@ -1153,8 +1152,7 @@ Ir pieejami atvērti Wi-Fi tīkli "Savienojuma izveide ar atvērtu Wi-Fi tīklu" - - + "Savienojuma izveide ar mobilo sakaru operatora Wi‑Fi tīklu" "Notiek savienojuma izveide ar atvērtu Wi-Fi tīklu" "Ir izveidots savienojums ar Wi-Fi tīklu" "Nevarēja izveidot savienojumu ar Wi‑Fi tīklu" @@ -1224,9 +1222,12 @@ "SIM karte ir pievienota." "Ierīces restartēšana, lai piekļūtu mobilo sakaru tīklam." "Restartēt" - "Lai jūsu jaunā SIM karte darbotos pareizi, jums jāinstalē un jāatver mobilo sakaru operatora lietotne." - "IEGŪT LIETOTNI" - "VĒLĀK" + + + + + + "Ievietota jauna SIM karte" "Pieskarieties, lai to iestatītu." "Iestatīt laiku" @@ -1238,13 +1239,15 @@ "Atļaujas nav nepieciešamas." "par to no jums var tikt iekasēta maksa" "Labi" - "USB savienojums tiek izmantots šīs ierīces uzlādei" - "USB savienojums tiek izmantots pievienotās ierīces barošanai" - "USB savienojums failu pārsūtīšanai" - "USB savienojums fotoattēlu pārsūtīšanai" - "USB savienojums MIDI režīmā" - "Ir izveidots savienojums ar USB piederumu." + "Ierīces uzlāde, izmantojot USB savienojumu" + "Pievienotās ierīces uzlāde, izmantojot USB savienojumu" + "Ieslēgta failu pārsūtīšana, izmantojot USB savienojumu" + "Ieslēgts PTP režīms, izmantojot USB savienojumu" + "Ieslēgta USB piesaiste" + "Ieslēgts MIDI režīms, izmantojot USB savienojumu" + "Ieslēgts USB piederumu režīms" "Pieskarieties, lai skatītu citas iespējas." + "Pievienotā ierīce tiek uzlādēta. Pieskarieties, lai skatītu citas opcijas." "Konstatēts analogs audio piederums" "Pievienotā ierīce nav saderīga ar šo tālruni. Pieskarieties, lai uzzinātu vairāk." "USB atkļūdošana ir pievienota." @@ -1686,9 +1689,6 @@ "Darbā: %1$s" "2. darba profils: %1$s" "3. darba profils: %1$s" - "Lai atspraustu šo ekrānu, pieskarieties pogām “Atpakaļ” un “Pārskats” un turiet tās." - "Ekrāns ir piesprausts" - "Ekrāns ir atsprausts" "Prasīt PIN kodu pirms atspraušanas" "Pirms atspraušanas pieprasīt grafisko atsl." "Pirms atspraušanas pieprasīt paroli" @@ -1791,15 +1791,11 @@ "Visas valodas" "Visi reģioni" "Meklēt" - - - - + "Vai ieslēgt darba profilu?" + "Tiks ieslēgtas jūsu darba lietotnes, paziņojumi, dati un citas darba profila funkcijas." "Ieslēgt" - - - - + "Šī lietotne tika izstrādāta vecākai Android versijai un var nedarboties pareizi. Meklējiet atjauninājumus vai sazinieties ar izstrādātāju." + "Meklēt atjauninājumu" "Jums ir jaunas īsziņas." "Lai skatītu, atveriet īsziņu lietotni." "Funkcijas var būt ierobežotas" @@ -1867,17 +1863,20 @@ "Tālruni nav atļauts izmantot balss zvaniem" "Uznirstošais logs" "Vēl %1$d" - "Šai saīsnei ir nepieciešama jaunākā lietotne." + "Ir notikusi atkāpšanās uz vecāku lietotnes versiju, vai lietotne nav saderīga ar šo saīsni." "Nevarēja atjaunot saīsni, jo lietotnē netiek atbalstīta dublēšana un atjaunošana." "Saīsni nevarēja atjaunot lietotnes paraksta neatbilstības dēļ." "Nevarēja atjaunot saīsni." "Saīsne ir atspējota." - + "ATINSTALĒT" + "TIK UN TĀ ATVĒRT" + "Konstatēta kaitīga lietotne" + "Lietotne %1$s vēlas rādīt lietotnes %2$s sadaļas" + "Rediģēt" + - + - + - "Lietotne %1$s vēlas rādīt lietotnes %2$s sadaļas" - "Rediģēt" diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 7c6f7f017c7..8bfe4242320 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -93,6 +93,8 @@ "SMS-пораки" "Пораки од говорна пошта" "Повикување преку Wi-Fi" + + "Рамноправен уред го побара режимот на TTY „FULL“" "Рамноправен уред го побара режимот на TTY „HCO“" "Рамноправен уред го побара режимот на TTY „VCO“" @@ -238,7 +240,8 @@ "Поставки" "Асистенција" "Гласовна помош" - "Заклучување" + + "999+" "Ново известување" "Виртуелна тастатура" @@ -497,10 +500,8 @@ "Премногу обиди. Обидете се повторно подоцна." "Премногу обиди. Сензорот за отпечатоци е оневозможен." "Обидете се повторно." - - - - + "Не се запишани отпечатоци." + "Уредов нема сензор за отпечатоци" "Прст %d" @@ -827,6 +828,8 @@ "Совет: допри двапати за да зумираш и да одзумираш." "Автоматско пополнување" "Постави „Автоматско пополнување“" + + " " "$1$2$3" ", " @@ -1198,9 +1201,12 @@ "Додадена е SIM картичка" "Рестартирај го својот уред за да пристапиш на мобилната мрежа." "Рестартирај" - "За да работи правилно вашата нова SIM-картичка, треба да ја инсталирате и да ја отворите апликацијата од операторот." - "ПРЕЗЕМИ ЈА АПЛИКАЦИЈАТА" - "НЕ СЕГА" + + + + + + "Вметната е нова SIM-картичка" "Допрете за да поставите" "Постави време" @@ -1212,23 +1218,15 @@ "Не се потребни дозволи" "ова може да ве чини пари" "Во ред" - - - - - - - - - - - - - - + "Уредов се полни преку USB" + "Поврзаниот уред се полни преку USB" + "Вклучен е пренос на датотеки преку USB" + "Вклучен е PTP преку USB" + "Вклучено е врзување преку USB" + "Вклучен е MIDI преку USB" + "Вклучен е режимот за USB-додаток" "Допрете за повеќе опции." - - + "Се полни поврзаниот уред. Допрете за повеќе опции." "Откриен е аналоген аудиододаток" "Приложениот уред не е компатибилен со телефонов. Допрете за да дознаете повеќе." "Поврзано е отстранување грешки преку USB" @@ -1833,8 +1831,7 @@ "Не е дозволен телефон за глас" "Појавен прозорец" "+ %1$d" - - + "Верзијата на апликацијата е постара или не е компатибилна со кратенкава" "Не можеше да се врати кратенката бидејќи апликацијата не поддржува бекап и враќање" "Не можеше да се врати кратенката бидејќи потписот на апликацијата не се совпаѓа" "Не можеше да се врати кратенката" @@ -1844,4 +1841,7 @@ "Откриена е штетна апликација" "%1$s сака да прикажува делови од %2$s" "Измени" + "Системски промени" + "Поставките за „Не вознемирувај“ се изменија" + "Допрете за да ги проверите поставките за однесување при прекини" diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index cfde3c6df8d..c0bc727acff 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -93,6 +93,8 @@ "SMS സന്ദേശങ്ങൾ" "വോയ്‌സ്‌മെയിൽ സന്ദേശങ്ങൾ" "വൈഫൈ കോളിംഗ്" + + "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് \'ഫുൾ\'" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് HCO" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് VCO" @@ -238,7 +240,8 @@ "ക്രമീകരണം" "അസിസ്റ്റ്" "വോയ്‌സ് സഹായം" - "ലോക്ക്‌ഡൗൺ നൽകൂ" + + "999+" "പുതിയ അറിയിപ്പ്" "വെർച്വൽ കീബോർഡ്" @@ -497,10 +500,8 @@ "നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക." "നിരവധി തവണ ശ്രമിച്ചതിനാൽ, വിരലടയാള സെൻസർ പ്രവർത്തനരഹിതമായി." "വീണ്ടും ശ്രമിക്കൂ." - - - - + "വിരലടയാളങ്ങൾ എൻറോൾ ചെയ്തിട്ടില്ല." + "ഈ ഉപകരണത്തിൽ വിരലടയാള സെൻസർ ഇല്ല" "കൈവിരൽ %d" @@ -827,6 +828,8 @@ "നുറുങ്ങ്: സൂം ഇൻ ചെയ്യാനും സൂം ഔട്ട് ചെയ്യാനും ഇരട്ട-ടാപ്പുചെയ്യുക." "ഓട്ടോഫിൽ" "ഓട്ടോഫിൽ സജ്ജീകരിക്കുക" + + " " "$1$2$3" ", " @@ -1198,9 +1201,12 @@ "സിം കാർഡ് ചേർത്തു" "മൊബൈൽ നെറ്റ്‌വർക്ക് ആക്‌സസ്സുചെയ്യാൻ നിങ്ങളുടെ ഉപകരണം പുനരാരംഭിക്കുക." "പുനരാരംഭിക്കുക" - "നിങ്ങളുടെ സിം ശരിയായി പ്രവർത്തിക്കുന്നതിന്, നിങ്ങളുടെ കാരിയറിൽ നിന്നുള്ള ആപ്പ് നിങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യുകയും തുറക്കുകയും ചെയ്യേണ്ടതുണ്ട്." - "ആപ്പ് സ്വന്തമാക്കുക" - "ഇപ്പോഴല്ല" + + + + + + "പുതിയ സിം ഇട്ടു" "ഇത് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക" "സമയം സജ്ജീകരിക്കുക" @@ -1212,23 +1218,15 @@ "അനുമതികളൊന്നും ആവശ്യമില്ല" "ഇത് നിങ്ങൾക്ക് പണച്ചെലവിനിടയാക്കാം" "ശരി" - - - - - - - - - - - - - - + "USB വഴി ഈ ഉപകരണം ചാർജ് ചെയ്യുന്നു" + "USB വഴി കണക്‌റ്റ് ചെയ്‌ത ഉപകരണം ചാർജ് ചെയ്യുന്നു" + "USB ഫയൽ കൈമാറ്റം ഓണാക്കി" + "USB വഴിയുള്ള PTP ഓണാക്കി" + "USB ടെതറിംഗ് ഓണാക്കി" + "USB വഴിയുള്ള MIDI ഓണാക്കി" + "USB ആക്‌സസറി മോഡ് ഓണാക്കി" "കൂടുതൽ ഓപ്ഷനുകൾക്ക് ടാപ്പുചെയ്യുക." - - + "കണക്‌റ്റ് ചെയ്‌ത ഉപകരണം ചാർജ് ചെയ്യുന്നു. കൂടുതൽ ഓപ്ഷനുകൾക്ക് ടാപ്പ് ചെയ്യുക." "അനലോഗ് ഓഡിയോ ആക്‌സസറി കണ്ടെത്തി" "അറ്റാച്ചുചെയ്‌ത ഉപകരണം ഈ ഫോണിന് അനുയോജ്യമല്ല. കൂടുതലറിയാൻ ടാപ്പുചെയ്യുക." "USB ഡീബഗ്ഗിംഗ് കണക്റ്റ് ചെയ്തു" @@ -1831,8 +1829,7 @@ "ഫോൺ വോയ്‌സിന് അനുവദനീയമല്ല" "പോപ്പ് അപ്പ് വിൻഡോ" "+ %1$d" - - + "ആപ്പ് പതിപ്പ് തരംതാഴ്ത്തി, അല്ലെങ്കിൽ ഈ കുറുക്കുവഴിക്ക് അനുയോജ്യമല്ല" "ആപ്പ് \'ബാക്കപ്പും പുനഃസ്ഥാപിക്കലും\' പിന്തുണയ്ക്കാത്തതിനാൽ കുറുക്കുവഴി പുനഃസ്ഥാപിക്കാനായില്ല" "ആപ്പ് സിഗ്നേച്ചർ പൊരുത്തപ്പെടാത്തതിനാൽ കുറുക്കുവഴി പുനഃസ്ഥാപിക്കാനായില്ല" "കുറുക്കുവഴി പുനഃസ്ഥാപിക്കാനായില്ല" @@ -1842,4 +1839,7 @@ "ദോഷകരമായ ആപ്പ് കണ്ടെത്തി" "%2$s സ്ലൈസുകൾ കാണിക്കാൻ %1$s താൽപ്പര്യപ്പെടുന്നു" "എഡിറ്റ് ചെയ്യുക" + "സിസ്‌റ്റത്തിലെ മാറ്റങ്ങൾ" + "\'ശല്യപ്പെടുത്തരുത്\' മാറ്റി" + "തടസ്സങ്ങൾക്കായുള്ള പ്രവർത്തന ക്രമീകരണം പരിശോധിക്കാൻ ടാപ്പ് ചെയ്യുക" diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 7d082fd7a37..5d6a1ebdb23 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -93,6 +93,7 @@ "SMS мессеж" "Дуут шуудангийн мессеж" "Wi-Fi дуудлага" + "SIM статус" "Хандлагын цэгт хүсэлт тавьсан TTY Mode FULL" "Хандлагын цэгт хүсэлт тавьсан TTY Mode HCO" "Хандлагын цэгт хүсэлт тавьсан TTY Mode VCO" @@ -238,7 +239,7 @@ "Тохиргоо" "Туслах" "Дуут туслах" - "Хүчтэй түгжээ оруулах" + "Түгжих" "999+" "Шинэ мэдэгдэл" "Виртуал гар" @@ -264,10 +265,8 @@ "%1$s, %2$s" "Аюулгүй горим" "Андройд систем" - - - - + "Хувийн профайл руу сэлгэх" + "Ажлын профайл руу сэлгэх" "Харилцагчдын хаяг" "харилцагч руугаа хандах" "<b>%1$s</b>-д таны харилцагчдад хандахыг зөвшөөрнө үү" @@ -419,10 +418,8 @@ "Апп нь төхөөрөмжийн утасны функцд хандах боломжтой. Энэ зөвшөөрөл нь апп-д утасны дугаар болон төхөөрөмжийн ID-г, дуудлага идэвхтэй эсэх, холын дугаар дуудлагаар холбогдсон байгаа эсэхийг тогтоох боломжийг олгоно," "системээр дамжуулах дуудлага" "Дуудлагыг сайжруулахын тулд дуудлагаа системээр дамжуулах зөвшөөрлийг апп-д олгодог." - - - - + "дуудлагыг өөр аппаас үргэлжлүүлэх" + "Аппад өөр аппад эхлүүлсэн дуудлагыг үргэлжлүүлэхийг зөвшөөрдөг." "утасны дугаарыг унших" "Төхөөрөмжийн утасны дугаарт хандах зөвшөөрлийг апп-д олгоно." "таблетыг унтуулахгүй байлгах" @@ -497,11 +494,12 @@ "Хурууны хээг хадгалах боломжгүй байна. Одоо байгаа хурууны хээг арилгана уу." "Хурууны хээ оруулах хугацаа өнгөрсөн байна. Дахин оруулна уу." "Хурууны хээний бүртгэл амжилтгүй боллоо." - - + "Хэрэглэгч хурууны хээн баталгаажуулалтыг цуцалсан байна." "Хэтэрхий олон оролдлоо. Түр хүлээгээд дахин оролдоно уу." "Хэт олон удаа оролдсон тул хурууны хээ мэдрэгчийг идэвхгүй болголоо." "Дахин оролдно уу." + "Бүртгүүлсэн хурууны хээ алга." + "Энэ төхөөрөмжид хурууны хээ мэдрэгч алга" "Хурууны хээ %d" @@ -828,6 +826,7 @@ "Зөвлөмж: Өсгөх бол давхар товшино уу." "Автомат бичих" "Автомат дүүргэлтийг тохируулах" + "Автоматaaр бөглөх" " " "$1$2$3" ", " @@ -1000,12 +999,9 @@ "Нээх" "Зурвас" "Нэмэх" - - - - - - + "Үзэх" + "Хуваарь" + "Бичлэг" "Сангийн хэмжээ дутагдаж байна" "Зарим систем функц ажиллахгүй байна" "Системд хангалттай сан байхгүй байна. 250MБ чөлөөтэй зай байгаа эсэхийг шалгаад дахин эхлүүлнэ үү." @@ -1131,8 +1127,7 @@ Нээлттэй Wi-Fi сүлжээ ашиглах боломжтой "Нээлттэй Wi‑Fi сүлжээнд холбогдох" - - + "Оператор Wi‑Fi сүлжээнд холбогдох" "Нээлттэй Wi‑Fi сүлжээнд холбогдож байна" "Wi‑Fi сүлжээнд холбогдлоо" "Wi‑Fi сүлжээнд холбогдож чадсангүй" @@ -1202,9 +1197,9 @@ "SIM карт нэмэгдсэн" "Мобайл сүлжээнд хандах бол төхөөрөмжөө дахин асаан уу." "Дахин эхлүүлэх" - "Шинэ SIM-ээ зөв ажиллуулахын тулд та оператор компаниасаа апп суулгаж, нээнэ үү." - "АПП АВАХ" - "ОДОО БИШ" + "Мобайл үйлчилгээг идэвхжүүлэх" + "Шинэ SIM-ээ идэвхжүүлэхийн тулд үүрэн холбооны компанийн аппыг татаж авна уу" + "Апп татаж авах" "Шинэ SIM-г оруулсан" "Үүнийг тохируулахын тулд дарна уу" "Цагийн тохируулах" @@ -1216,13 +1211,15 @@ "Зөвшөөрөл шаардахгүй" "Энэ таныг төлбөрт оруулж болзошгүй" "OK" - "Энэ төхөөрөмжийг USB цэнэглэж байна" - "Залгасан төхөөрөмжөөс USB цэнэг авч байна" - "Файл шилжүүлэх USB" - "Фото зураг шилжүүлэх USB" - "MIDI-ийн USB" - "USB төхөөрөмжид холбогдов" + "Энэ төхөөрөмжийг USB-р цэнэглэж байна" + "Холбосон төхөөрөмжийг USB-р цэнэглэж байна" + "USB файл дамжуулалтыг асаасан" + "USB-р PTP горимд асаасан" + "USB модем болгохыг асаасан" + "USB-р MIDI горимд асаасан" + "USB хандалтын горимыг асаасан" "Бусад сонголтыг харахын тулд товшино уу." + "Холбосон төхөөрөмжийг цэнэглэж байна. Бусад сонголтыг харах бол товшино уу." "Аналог аудионы дагалдах хэрэгсэл илэрсэн" "Холбосон төхөөрөмж энэ утастай тохирохгүй байна. Дэлгэрэнгүй үзэх бол товшино уу." "USB дебаг холбогдсон" @@ -1661,9 +1658,6 @@ "Ажлын %1$s" "2 дахь ажил %1$s" "3 дахь ажил %1$s" - "Энэ дэлгэцийг тогтоосныг болиулахын тулд Буцах, Тойм гэсэн сонголтыг товшоод, хүлээнэ үү" - "Дэлгэцийг тогтоосон" - "Дэлгэцийг сулласан" "Тогтоосныг суллахаас өмнө PIN асуух" "Тогтоосныг суллахаас өмнө түгжээ тайлах хээ асуух" "Тогтоосныг суллахаас өмнө нууц үг асуух" @@ -1755,15 +1749,11 @@ "Бүх хэл" "Бүх бүс нутаг" "Хайх" - - - - + "Ажлын профайлыг асаах уу?" + "Таны ажлын апп, мэдэгдэл, өгөгдөл болон бусад ажлын профайлын онцлогийг асаана" "Асаах" - - - - + "Энэ аппыг Андройдын хуучин хувилбарт зориулсан бөгөөд буруу ажиллаж болзошгүй. Шинэчлэлтийг шалгаж эсвэл хөгжүүлэгчтэй холбогдоно уу." + "Шинэчлэлтийг шалгах" "Танд шинэ зурвасууд байна" "Үзэхийн тулд SMS аппыг нээх" "Зарим үйлдэл хязгаарлалттай байж болно" @@ -1830,17 +1820,17 @@ "Утсыг дуу хоолойд зөвшөөрдөггүй" "гэнэт гарч ирэх цонх" "+ %1$d" - "Энэ товчлолд саяхны апп шаардлагатай" + "Аппын хувилбарыг бууруулсан эсвэл энэ товчлолтой тохирохгүй байна" "Апп нөөцлөлт, сэргээлтийг дэмждэггүй тул товчлолыг сэргээж чадсангүй" "Аппын гарын үсэг таарахгүй байгаа тул товчлолыг сэргээж чадсангүй" "Товчлолыг сэргээж чадсангүй" "Товчлолыг идэвхгүй болгосон" - - - - - - + "УСТГАХ" + "ЯМАР Ч ТОХИОЛДОЛД НЭЭХ" + "Аюултай апп олдсон" "%1$s %2$s-н хэсгүүдийг (slices) харуулах хүсэлтэй байна" "Засах" + "Системийн өөрчлөлт" + "Бүү саад бол горимыг өөрчилсөн" + "Төлөвийн тохиргоонд саад болох зүйл байгаа эсэхийг шалгахын тулд товшино уу" diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index d1a5455b677..a7d07f6ad73 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -93,6 +93,8 @@ "SMS संदेश" "व्हॉइसमेल संदेश" "वाय-फाय कॉलिंग" + + "समवयस्क व्यक्तीने TTY मोड पूर्ण ची विनंती केली" "समवयस्क व्यक्तीने TTY मोड HCO ची विनंती केली" "समवयस्क व्यक्तीने TTY मोड VCO ची विनंती केली" @@ -238,7 +240,8 @@ "सेटिंग्ज" "सहाय्यता" "व्हॉइस सहाय्य" - "लॉकडाउन टाका" + + "999+" "नवीन सूचना" "व्हर्च्युअल कीबोर्ड" @@ -414,7 +417,7 @@ "IMS कॉल सेवा अॅक्सेस करा" "आपल्‍या हस्तक्षेपाशिवाय अ‍ॅपला कॉल करण्‍यासाठी IMS सेवा वापरण्याची अनुमती देते." "फोन स्थिती आणि ओळख वाचा" - "डिव्हाइस च्या फोन वैशिष्ट्यांवर अॅक्सेस करण्यास अॅपला अनुमती देते. ही परवानगी कॉल अॅक्टिव्हेट असला किंवा नसला तरीही, फोन नंबर आणि डिव्हाइस आयडी आणि कॉलद्वारे कनेक्ट केलेला रीमोट नंबर निर्धारित करण्यासाठी अॅपला अनुमती देते." + "डिव्हाइस च्या फोन वैशिष्ट्यांवर अॅक्सेस करण्यास अॅपला अनुमती देते. ही परवानगी कॉल अॅक्टिव्हेट असला किंवा नसला तरीही, फोन नंबर आणि डिव्हाइस आयडी आणि कॉलद्वारे कनेक्ट केलेला रिमोट नंबर निर्धारित करण्यासाठी अॅपला अनुमती देते." "प्रणालीच्या माध्यमातून कॉल रूट करा" "कॉल करण्याचा अनुभव सुधारण्यासाठी अॅपला त्याचे कॉल प्रणालीच्या माध्यमातून रूट करू देते." "दुसऱ्या अॅपवरून कॉल करणे सुरू ठेवा" @@ -497,10 +500,8 @@ "खूप प्रयत्न केले. नंतर पुन्हा प्रयत्न करा." "खूप प्रयत्न करून झाले. फिंगरप्रिंट सेंसर बंद आहे." "पुन्हा प्रयत्न करा." - - - - + "कोणत्याही फिंगरप्रिंटची नोंद झाली नाही" + "या डिव्हाइसवर फिंगरप्रिंट सेन्सर नाही" "%d बोट" @@ -827,6 +828,8 @@ "टीप: झूम कमी करण्यासाठी आणि वाढवण्यासाठी दोनदा-टॅप करा." "स्वयं-भरण" "स्वयं-भरण सेट करा" + + " " "$1$2$3" ", " @@ -1198,9 +1201,12 @@ "सिम कार्ड जोडले" "मोबाईल नेटवर्कवर अॅक्सेस करण्यासाठी तुमचे डिव्हाइस रीस्टार्ट करा." "रीस्टार्ट" - "आपल्या नवीन सिमने योग्यरित्या कार्य करण्यासाठी, आपल्याला अॅप इंस्टॉल करण्याची आणि तो आपल्या वाहकामधून उघडण्याची आवश्यकता असेल." - "अ‍ॅप मिळवा" - "आता नाही" + + + + + + "नवीन सिम घाला" "ते सेट करण्यासाठी टॅप करा" "वेळ सेट करा" @@ -1212,23 +1218,15 @@ "परवानग्या आवश्यक नाहीत" "यासाठी आपले पैसे खर्च होऊ शकतात" "ठीक" - - - - - - - - - - - - - - + "हे डिव्हाइस USB ने चार्ज करत आहे" + "USB ने चार्ज करायला ठेवलेले डिव्हाइस" + "USB फाइल ट्रांसफर चालू केले" + "USB मार्फत PTP चालू केले" + "USB टेदरिंग चालू केले" + "USB मार्फत MIDI चालू केले" + "USB अ‍ॅक्सेसरी मोड चालू आहे" "अधिक पर्यायांसाठी टॅप करा." - - + "चार्जर लावलेले डिव्हाइस. आणखी पर्यायांसाठी टॅप करा" "अॅनालॉग ऑडिओ अॅक्‍सेसरी आढळली" "या फोनसह संलग्‍न केलेले डीव्‍हाइस सुसंगत नाही. अधिक जाणून घेण्‍यासाठी टॅप करा." "USB डीबग करणे कनेक्‍ट केले" @@ -1818,7 +1816,7 @@ "पत्ता" "क्रेडिट कार्ड" "वापरकर्तानाव" - "ईमेल पत्ता" + "ईमेल अॅड्रेस" "शांत रहा आणि जवळपास निवारा शोधा." "किनारपट्टीचे प्रदेश आणि नदीकाठची क्षेत्रे त्वरित रिकामी करून उंच मैदानासारख्या अधिक सुरक्षित ठिकाणी जा." "शांत रहा आणि जवळपास निवारा शोधा." @@ -1831,8 +1829,7 @@ "व्‍हॉइसची फोनला अनुमती नाही" "पॉपअप विंडो" "+ %1$d" - - + "अ‍ॅपची आवृत्ती डाउनग्रेड केली, किंवा ती या शॉर्टकटशी कंपॅटिबल नाही" "अॅप बॅकअप आणि रिस्‍टोअर करण्यास सपोर्ट देत नसल्यामुळे शॉर्टकट रिस्‍टोअर करू शकलो नाही" "अॅप स्वाक्षरी न जुळल्यामुळे शॉर्टकट रिस्‍टोअर करू शकलो नाही" "शॉर्टकट रिस्‍टोअर करू शकलो नाही" @@ -1842,4 +1839,7 @@ "हानिकारक अॅप आढळला" "%1$s ला %2$s चे तुकडे दाखवायचे आहेत" "संपादित करा" + "सिस्टम बदल" + "व्यत्यय आणू नका बदलले आहे" + "व्यत्ययांसाठीच्या तुमच्या वर्तन सेटिंग्ज तपासण्यासाठी टॅप करा" diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index e27b0f12e16..55362296ead 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -93,6 +93,8 @@ "Mesej SMS" "Mesej mel suara" "Panggilan Wi-Fi" + + "Rakan meminta Mod TTY PENUH" "Rakan meminta Mod TTY HCO" "Rakan meminta Mod TTY VCO" @@ -238,7 +240,8 @@ "Tetapan" "Bantu" "Bantuan Suara" - "Kunci semua" + + "999+" "Pemberitahuan baharu" "Papan kekunci maya" @@ -264,10 +267,8 @@ "%1$s, %2$s" "Mod selamat" "Sistem Android" - - - - + "Beralih ke profil peribadi" + "Beralih ke profil kerja" "Kenalan" "mengakses kenalan anda" "Benarkan <b>%1$s</b> mengakses kenalan anda" @@ -419,10 +420,8 @@ "Membenarkan apl mengakses ciri telefon pada peranti. Kebenaran ini membolehkan apl menentukan nombor telefon dan ID peranti, sama ada panggilan aktif dan nombor jauh yang dihubungkan dengan panggilan." "halakan panggilan menerusi sistem" "Membenarkan apl menghalakan panggilan menerusi sistem untuk meningkatkan pengalaman panggilan." - - - - + "teruskan panggilan daripada apl lain" + "Membenarkan apl meneruskan panggilan yang dimulakan dalam apl lain." "baca nombor telefon" "Membenarkan apl mengakses nombor telefon peranti." "menghalang tablet daripada tidur" @@ -497,11 +496,12 @@ "Cap jari tidak dapat disimpan. Sila alih keluar cap jari sedia ada." "Tamat masa cap jari dicapai. Cuba lagi." "Pengendalian cap jari dibatalkan." - - + "Pengendalian cap jari dibatalkan oleh pengguna." "Terlalu banyak percubaan. Cuba sebentar lagi." "Terlalu banyak percubaan. Penderia cap jadi dilumpuhkan." "Cuba lagi." + "Tiada cap jari didaftarkan." + "Peranti ini tiada penderia cap jari" "Jari %d" @@ -828,6 +828,8 @@ "Petua: Ketik dua kali untuk mengezum masuk dan keluar." "Auto isi" "Sediakan Autoisi" + + " " "$1$2$3" ", " @@ -1000,12 +1002,9 @@ "Buka" "Mesej" "Tambah" - - - - - - + "Lihat" + "Jadual" + "Pantau" "Ruang storan semakin berkurangan" "Beberapa fungsi sistem mungkin tidak berfungsi" "Tidak cukup storan untuk sistem. Pastikan anda mempunyai 250MB ruang kosong dan mulakan semula." @@ -1131,8 +1130,7 @@ Rangkaian Wi-Fi terbuka tersedia "Sambung ke rangkaian Wi-Fi terbuka" - - + "Sambung ke rangkaian Wi-Fi pembawa" "Menyambung ke rangkaian Wi‑Fi terbuka" "Disambungkan ke rangkaian Wi-Fi" "Tidak dapat menyambung ke rangkaian Wi-Fi" @@ -1202,9 +1200,12 @@ "Kad SIM ditambah" "Mulakan semula peranti anda untuk mengakses rangkaian mudah alih." "Mulakan semula" - "Untuk membolehkan SIM baharu anda berfungsi dengan betul, anda perlu memasang dan membuka apl daripada pembawa." - "DAPATKAN APL" - "BUKAN SEKARANG" + + + + + + "SIM baharu dimasukkan" "Ketik untuk menyediakannya" "Tetapkan masa" @@ -1216,13 +1217,15 @@ "Tiada kebenaran diperlukan" "anda mungkin dikenakan bayaran" "OK" - "Mengecas peranti ini melalui USB" - "Membekalkan kuasa kepada peranti tersambung melalui USB" - "USB untuk pemindahan fail" - "USB untuk pemindahan foto" - "USB untuk MIDI" - "Disambungkan kepada aksesori USB" + "Mengecas peranti ini melalui USB" + "Mengecas peranti tersambung melalui USB" + "Pindahan fail USB dihidupkan" + "PTP melalui USB dihidupkan" + "Penambatan USB dihidupkan" + "MIDI melalui USB dihidupkan" + "Mod aksesori USB dihidupkan" "Ketik untuk mendapatkan lagi pilihan." + "Mengecas peranti tersambung. Ketik untuk mendapatkan lagi pilihan." "Aksesori audio analog dikesan" "Peranti yang disambungkan tidak serasi dengan telefon ini. Ketik untuk mengetahui lebih lanjut." "Penyahpepijatan USB disambungkan" @@ -1661,9 +1664,6 @@ "Kerja %1$s" "%1$s kerja ke-2" "%1$s kerja ke-3" - "Untuk menyahsematkan skrin ini, sentuh & tahan butang Kembali dan Ikhtisar" - "Skrin disemat" - "Skrin dinyahsemat" "Minta PIN sebelum menyahsemat" "Minta corak buka kunci sebelum menyahsemat" "Minta kata laluan sebelum menyahsemat" @@ -1757,15 +1757,11 @@ "Semua bahasa" "Semua rantau" "Cari" - - - - + "Hidupkan profil kerja?" + "Apl kerja, pemberitahuan, data dan ciri profil kerja anda yang lain akan dihidupkan" "Hidupkan" - - - - + "Apl ini dibina untuk versi Android yang lebih lama dan mungkin tidak berfungsi dengan betul. Cuba semak kemas kini atau hubungi pembangun." + "Semak kemas kini" "Anda mempunyai mesej baharu" "Buka apl SMS untuk melihat" "Sesetengah fungsi mungkin terhad" @@ -1832,17 +1828,17 @@ "Telefon tidak dibenarkan untuk suara" "Tetingkap Timbul" "+ %1$d" - "Pintasan ini memerlukan apl yang terbaharu" + "Versi apl diturunkan taraf atau tidak serasi dengan pintasan ini" "Tidak dapat memulihkan pintasan kerana apl tidak menyokong sandaran dan segerakan" "Tidak dapat memulihkan pintasan kerana ketakpadanan tandatangan apl" "Tidak dapat memulihkan pintasan" "Pintasan dilumpuhkan" - - - - - - + "NYAHPASANG" + "BUKA JUGA" + "Apl berbahaya dikesan" "%1$s mahu menunjukkan %2$s hirisan" "Edit" + "Perubahan sistem" + "Jangan Ganggu telah berubah" + "Ketik untuk menyemak tetapan gelagat anda bagi gangguan" diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 4c757df93e7..77b83cce287 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -93,6 +93,7 @@ "SMS မက်ဆေ့ဂျ်များ" "အသံမေးလ် မက်ဆေ့ဂျ်များ" "Wi-Fi ခေါ်ဆိုမှု" + "ဆင်းမ် အခြေအနေ" "အခြားစက်မှ TTY မုဒ် FULL ပြုရန် တောင်းဆို၏" "အခြားစက်မှ TTY မုဒ် HCO ပြုရန် တောင်းဆို၏" "TTY မုဒ် VCO ပြုရန် အခြားစက်မှ တောင်းဆို၏" @@ -238,7 +239,7 @@ "ဆက်တင်များ" "အကူအညီ" "အသံ အကူအညီ" - "ချိပ်ပိတ်ရန်" + "ချိတ်ပိတ်ရန်" "၉၉၉+" "အကြောင်းကြားချက်အသစ်" "ပကတိအသွင်ကီးဘုတ်" @@ -497,10 +498,8 @@ "ကြိုးစာမှု အကြိမ်များနေ၏။ နောက်မှ ထပ်မံကြိုးစားပါ။" "အကြိမ်အရေအတွက် အလွန်များနေပါပြီ။ လက်ဗွေဖတ်စနစ်ကို ပိတ်ထားပါသည်။" "ပြန်ကြိုးစားပါ" - - - - + "မည်သည့် လက်ဗွေကိုမျှ ထည့်သွင်းမထားပါ။" + "ဤစက်ပစ္စည်းတွင် လက်ဗွေအာရုံခံကိရိယာ မရှိပါ" "လက်ချောင်း %d" @@ -827,6 +826,7 @@ "အကြံပေးချက်- ဇူးမ်ဆွဲရန်နှင့် ဖြုတ်ရန် နှစ်ကြိမ်ဆက်တိုက် တို့ပါ" "အလိုအလျောက်ဖြည့်ပါ" "အလိုအလျောက်ဖြည့်ရန် သတ်မှတ်သည်" + "အလိုအလျောက်ဖြည့်ရန်" " " "$1$2$3" ", " @@ -997,7 +997,7 @@ "ခေါ်ဆိုရန်" "တည်နေရာ" "ဖွင့်ရန်" - "စာပို့ရန်" + "SMS" "ထည့်ရန်" "ကြည့်ရန်" "အချိန်ဇယား" @@ -1198,9 +1198,9 @@ "ဆင်းမ်ကဒ် ထည့်ပါသည်" "မိုးဘိုင်းကွန်ရက်ကို ဆက်သွယ်ရန် စက်ကို ပြန် စ ပါ" "အစက ပြန်စရန်" - "သင့် SIM အသစ်ပုံမှန် အလုပ်လုပ်ရန်၊ သင်အသုံးပြုသည့် မိုဘိုင်းဝန်ဆောင်မှုမှ အက်ပ်တစ်ခုထည့်သွင်း၍ ဖွင့်ရန်လိုအပ်ပါသည်။" - "အက်ပ်ကို ရယူပါ" - "ယခုမလုပ်ပါ" + "မိုဘိုင်းဝန်ဆောင်မှု စတင်ဖွင့်လှစ်ရန်" + "သင့်ဆင်းမ် အသစ်ကို စတင်အသုံးပြုရန် ဝန်ဆောင်မှုပေးသူအက်ပ်ကို ဒေါင်းလုဒ်လုပ်ပါ" + "အက်ပ် ဒေါင်းလုဒ်လုပ်ရန်" "SIM အသစ်ထည့်သွင်းလိုက်ပါသည်" "၎င်းကိုတပ်ဆင်ရန် တို့ပါ" "အချိန်သတ်မှတ်ရန်" @@ -1212,23 +1212,15 @@ "ခွင့်ပြုချက်မလိုအပ်ပါ" "သင့်အတွက် ပိုက်ဆံကုန်ကျနိုင်ပါသည်" "အိုကေ" - - - - - - - - - - - - - - + "ဤစက်ပစ္စည်းကို USB မှတစ်ဆင့် အားသွင်းနေသည်" + "USB မှတစ်ဆင့် ချိတ်ဆက်ထားသည့် စက်ပစ္စည်းကို အားသွင်းနေသည်" + "USB ဖြင့် ဖိုင်လွှဲပြောင်းခြင်းကို ဖွင့်ထားသည်" + "USB မှတစ်ဆင့် PTP ကို အသုံးပြုရန် ဖွင့်ထားသည်" + "USB မှတစ်ဆင့် မိုဘိုင်းဖုန်းကို မိုဒမ်အဖြစ်သုံးရန် ဖွင့်ထားသည်" + "USB မှတစ်ဆင့် MIDI ကို အသုံးပြုရန် ဖွင့်ထားသည်" + "USB တွဲဖက်ပစ္စည်းမုဒ်ကို ဖွင့်ထားသည်" "နောက်ထပ်ရွေးချယ်စရာများအတွက် တို့ပါ။" - - + "ချိတ်ဆက်ထားသည့် စက်ပစ္စည်းကို အားသွင်းနေသည်။ နောက်ထပ်ရွေးချယ်စရာများအတွက် တို့ပါ။" "အန်နာလော့ အသံကိရိယာကို တွေ့ထားပါသည်" "တပ်ဆင်ထားသော ကိရိယာကို ဤဖုန်းနှင့် တွဲသုံး၍မရပါ။ ပိုမိုလေ့လာရန် တို့ပါ။" "USB အမှားရှာပြင်စနစ် ချိတ်ဆက်ထားသည်" @@ -1831,8 +1823,7 @@ "စကားသံအတွက် ဖုန်းကို ခွင့်မပြုပါ" "ပေါ့ပ်အပ် ဝင်းဒိုး" "+ %1$d" - - + "အက်ပ်ဗားရှင်းကို အဆင့်နှိမ့်ထားသည် သို့မဟုတ် ဤဖြတ်လမ်းလင့်ခ်နှင့် သဟဇာတမဖြစ်ပါ" "အက်ပ်သည် မိတ္တူကူးခြင်းနှင့် ပြန်ယူခြင်းကို ပံ့ပိုးခြင်းမရှိသည့်အတွက် ဖြတ်လမ်းလင့်ခ်ကို ပြန်ယူ၍မရပါ" "အက်ပ်လက်မှတ် မတူညီသည့်အတွက် ဖြတ်လမ်းလင့်ခ်များကို ပြန်ယူ၍မရပါ" "ဖြတ်လမ်းလင့်ခ်ကို ပြန်ယူ၍မရပါ" @@ -1842,4 +1833,7 @@ "အန္တရာယ်ရှိသော အက်ပ်ကို တွေ့ရှိထားသည်" "%1$s သည် %2$s ၏အချပ်များကို ပြသလိုသည်" "တည်းဖြတ်ရန်" + "စနစ် အပြောင်းအလဲများ" + "\'မနှောင့်ယှက်ရ\' ပြောင်းလဲသွားပါပြီ" + "ကြားဖြတ်ခြင်းများအတွက် သင်၏ အမူအကျင့်ဆက်တင်များကို စစ်ဆေးရန် တို့ပါ" diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 1b73237e261..59b4ffaff15 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -93,6 +93,8 @@ "SMS-meldinger" "Talepostmeldinger" "Wi-Fi-anrop" + + "Motpart ba om TTY-modus FULL" "Motpart ba om TTY-modus HCO" "Motpart ba om TTY-modus VCO" @@ -238,7 +240,8 @@ "Innstillinger" "Hjelp" "Talehjelp" - "Start låsing" + + "999+" "Nytt varsel" "Virtuelt tastatur" @@ -497,10 +500,8 @@ "For mange forsøk. Prøve på nytt senere." "For mange forsøk. Fingeravtrykkssensoren er slått av." "Prøv igjen." - - - - + "Ingen fingeravtrykk er registrert." + "Denne enheten har ikke fingeravtrykkssensor" "Finger %d" @@ -827,6 +828,8 @@ "Tips: Dobbelttrykk for å zoome inn og ut." "Autofyll" "Konfig. autofyll" + + " " "$1$2$3" ", " @@ -1197,9 +1200,12 @@ "SIM-kort er lagt til" "Start enheten på nytt for å få tilgang til det mobile nettverket." "Start på nytt" - "For at det nye SIM-kortet ditt skal fungere skikkelig, må du installere og åpne en app fra operatøren din." - "SKAFF DEG APPEN" - "IKKE NÅ" + + + + + + "Et nytt SIM-kort er satt inn" "Trykk for å konfigurere" "Stille klokken" @@ -1211,23 +1217,15 @@ "Trenger ingen rettigheter" "dette kan koste deg penger" "OK" - - - - - - - - - - - - - - + "Enheten lades via USB" + "Den tilkoblede enheten lades via USB" + "USB-filoverføring er slått på" + "PTP via USB er slått på" + "USB-internettdeling er slått på" + "MIDI via USB er slått på" + "Modus for USB-tilbehør er slått på" "Trykk for å få flere alternativ." - - + "Den tilkoblede enheten lades. Trykk for å se flere alternativer." "Analogt lydtilbehør ble oppdaget" "Den tilkoblede enheten er ikke kompatibel med denne telefonen. Trykk for å finne ut mer." "USB-feilsøking tilkoblet" @@ -1830,8 +1828,7 @@ "Telefonen har ikke tillatelse til tale" "Forgrunnsvindu" "+ %1$d" - - + "Appversjonen er nedgradert eller ikke kompatibel med denne snarveien" "Kunne ikke gjenopprette snarveien fordi appen ikke støtter sikkerhetskopiering og gjenoppretting" "Kunne ikke gjenopprette snarveien på grunn av manglende samsvar for appsignaturen" "Kunne ikke gjenopprette snarveien" @@ -1841,4 +1838,7 @@ "En skadelig app ble oppdaget" "%1$s vil vise %2$s-utsnitt" "Endre" + "Systemendringer" + "Ikke forstyrr er endret" + "Trykk for å sjekke atferdsinnstillingene dine for forstyrrelser" diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 4a2aad61085..76850841b8e 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -93,6 +93,8 @@ "SMS सन्देशहरू" "भ्वाइस मेल सन्देशहरू" "Wi-Fi कल" + + "सहकर्मी अनुरोध गरियो। TTY मोड पूर्ण" "सहकर्मी अनुरोध गरियो। TTY मोड HCO" "सहकर्मी अनुरोध गरियो। TTY मोड VCO" @@ -238,7 +240,8 @@ "सेटिङहरू" "सहायता दिनुहोस्" "आवाज सहायता" - "लकडाउन प्रविष्ट गर्नुहोस्" + + "९९९+" "नयाँ सूचना" "भर्चुअल किबोर्ड" @@ -497,10 +500,8 @@ "धेरै प्रयासहरू। केहि समय पछि पुन: प्रयास गर्नुहोला" "अत्यन्त धेरै प्रयासहरू। फिंगरप्रिन्ट सेन्सरलाई असक्षम पारियो।" "पुन: प्रयास गर्नुहोला।" - - - - + "कुनै पनि फिंगरप्रिन्ट दर्ता गरिएको छैन।" + "यो यन्त्रमा कुनै फिंगरप्रिन्ट सेन्सर छैन" "औंला %d" @@ -827,6 +828,8 @@ "जुक्ति: जुमलाई ठूलो र सानो पार्न दुई पटक हान्नुहोस्।" "स्वतः भर्ने" "अटोफिल सेटअप गर्नुहोस्" + + " " "$१$२$३" ", " @@ -1203,9 +1206,12 @@ "SIM कार्ड थप गरियो" "मोबाइल नेटवर्क पहुँच गर्न तपाईँको उपकरण पुनःस्टार्ट गर्नुहोस्।" "पुनः सुरु गर्नुहोस्" - "तपाईंको नयाँ SIM ले राम्रोसँग काम गर्न, तपाईंले आफ्नो वाहक मार्फत अनुप्रयोग स्थापना र खोल्न आवश्यक हुनेछ।" - "अनुप्रयोग प्राप्त गर्नुहोस्" - "अहिले होइन" + + + + + + "नयाँ SIM घुसाइयो" "यसलाई सेटअप गर्न ट्याप गर्नुहोस्" "समय मिलाउनुहोस्" @@ -1217,23 +1223,15 @@ "कुनै अनुमति आवश्यक छैन" "सायद तपाईँलाई पैसा पर्न सक्छ।" "ठीक छ" - - - - - - - - - - - - - - + "यो यन्त्रलाई USB मार्फत चार्ज गर्दै" + "जडान गरिएको यन्त्रलाई USB मार्फत चार्ज गर्दै" + "USB फाइल स्थानान्तरण सेवा सक्रिय गरियो" + "USB मार्फत PTP सेवा सक्रिय गरियो" + "USB टेदरिङ सेवा सक्रिय गरियो" + "USB मार्फत MIDI सेवा सक्रिय गरियो" + "USB सहायक उपकरण मोड सक्रिय गरियो" "थप विकल्पहरूका लागि ट्याप गर्नुहोस्।" - - + "जडान गरिएको यन्त्र चार्ज गर्दै। थप विकल्पहरूका लागि ट्याप गर्नुहोस्।" "एनालग अडियोको सहायक उपकरण पत्ता लाग्यो" "संलग्न गरिएको यन्त्र यो फोनसँग कम्प्याटिबल छैन। थप जान्न ट्याप गर्नुहोस्।" "USB डिबग गर्ने सुविधा सुचारू छ" @@ -1836,8 +1834,7 @@ "फोनमार्फत भ्वाइस कल गर्न मिल्दैन" "पपअप विन्डो" "+ %1$d" - - + "या त अनुप्रयोगको संस्करण स्तरह्रास गरियो वा यो यस सर्टकटसँग मिल्दो छैन" "अनुप्रयोगले ब्याकअप तथा पुनर्स्थापनालाई समर्थन नगर्ने हुँदा सर्टकट पुनर्स्थापित गर्न सकिएन" "अनुप्रयोगमा प्रयोग गरिने हस्ताक्षर नमिल्ने हुँदा सर्टकट पुनर्स्थापित गर्न सकिएन" "सर्टकट पुनर्स्थापित गर्न सकिएन" @@ -1847,4 +1844,7 @@ "हानिकारक अनुप्रयोग भेटियो" "%1$s ले %2$s का स्लाइसहरू देखाउन चाहन्छ" "सम्पादन गर्नुहोस्" + "प्रणालीसम्बन्धी परिवर्तनहरू" + "बाधा नपुर्‍याउनुहोस् मोड परिवर्तन भएको छ" + "अवरोधहरूका सम्बन्धमा गरिने व्यवहारसम्बन्धी सेटिङहरू जाँच गर्न ट्याप गर्नुहोस्" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 7aa8bf0737f..87be867e335 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -93,6 +93,7 @@ "Sms\'jes" "Voicemailberichten" "Bellen via wifi" + "Simkaartstatus" "Door peer aangevraagde TTY-modus VOL" "Door peer aangevraagde TTY-modus HCO" "Door peer aangevraagde TTY-modus VCO" @@ -238,7 +239,7 @@ "Instellingen" "Helpen" "Spraakassistent" - "Afschermen activeren" + "Afgesloten" "999 +" "Nieuwe melding" "Virtueel toetsenbord" @@ -264,16 +265,14 @@ "%1$s, %2$s" "Veilige modus" "Android-systeem" - - - - + "Schakelen naar persoonlijk profiel" + "Schakelen naar werkprofiel" "Contacten" "toegang krijgen tot je contacten" "Geef <b>%1$s</b> toegang tot je contacten" "Locatie" "de locatie van dit apparaat openen" - "Geef <b>%1$s</b> toegang tot de locatie van dit apparaat" + "Toestaan dat <b>%1$s</b> het volgende doet: toegang krijgen tot de locatie van dit apparaat?" "Agenda" "toegang krijgen tot je agenda" "Geef <b>%1$s</b> toegang tot je agenda" @@ -419,10 +418,8 @@ "Hiermee kan de app toegang krijgen tot de telefoonfuncties van het apparaat, Met deze toestemming kan de app het telefoonnummer en de apparaat-ID\'s bepalen, of een oproep actief is, en het andere telefoonnummer waarmee wordt gebeld." "oproepen doorschakelen via het systeem" "Hiermee kan de app de bijbehorende oproepen doorschakelen via het systeem om de belfunctionaliteit te verbeteren." - - - - + "een gesprek voortzetten vanuit een andere app" + "Hiermee kan de app een gesprek voortzetten dat is gestart in een andere app." "telefoonnummers lezen" "Hiermee kan de app toegang krijgen tot de telefoonnummers van het apparaat." "voorkomen dat tablet overschakelt naar slaapmodus" @@ -497,11 +494,12 @@ "Vingerafdruk kan niet worden opgeslagen. Verwijder een bestaande vingerafdruk." "Time-out bereikt voor vingerafdruk. Probeer het opnieuw." "Vingerafdrukbewerking geannuleerd." - - + "Vingerafdrukverificatie geannuleerd door gebruiker." "Te veel pogingen. Probeer het later opnieuw." "Te veel pogingen. Vingerafdruksensor uitgeschakeld." "Probeer het opnieuw." + "Geen vingerafdrukken geregistreerd." + "Dit apparaat heeft geen vingerafdruksensor" "Vinger %d" @@ -828,6 +826,7 @@ "Tip: dubbeltik om in en uit te zoomen." "Autom. aanvullen" "Autom. aanvullen instellen" + "Automatisch aanvullen" " " "$1$2$3" ", " @@ -1000,12 +999,9 @@ "Openen" "Bericht" "Toevoegen" - - - - - - + "Weergeven" + "Plannen" + "Volgen" "Opslagruimte is bijna vol" "Bepaalde systeemfuncties werken mogelijk niet" "Onvoldoende opslagruimte voor het systeem. Zorg ervoor dat je 250 MB vrije ruimte hebt en start opnieuw." @@ -1131,8 +1127,7 @@ Open wifi-netwerk beschikbaar "Verbinding maken met een open wifi-netwerk" - - + "Verbinden met wifi-netwerk van provider" "Verbinding maken met een open wifi-netwerk…" "Verbonden met een wifi-netwerk" "Kan geen verbinding maken met het wifi-netwerk" @@ -1202,9 +1197,9 @@ "Simkaart aangesloten" "Start je apparaat opnieuw voor toegang tot het mobiele netwerk." "Opnieuw starten" - "Je moet een app van je provider installeren en openen om te zorgen dat je nieuwe simkaart correct werkt." - "DE APP DOWNLOADEN" - "NIET NU" + "Mobiele service activeren" + "Download de provider-app om je nieuwe simkaart te activeren" + "App downloaden" "Nieuwe simkaart geplaatst" "Tik om dit in te stellen" "Tijd instellen" @@ -1216,13 +1211,15 @@ "Geen machtigingen vereist" "hieraan kunnen kosten zijn verbonden" "OK" - "Dit apparaat wordt opgeladen via USB" - "Het aangesloten apparaat wordt via USB van voeding voorzien" - "USB voor bestandsoverdacht" - "USB voor foto-overdracht" - "USB voor MIDI" - "Aangesloten op een USB-accessoire" + "Dit apparaat wordt opgeladen via USB" + "Verbonden apparaat wordt opgeladen via USB" + "USB-bestandsoverdracht ingeschakeld" + "PTP via USB ingeschakeld" + "USB-tethering ingeschakeld" + "MIDI via USB ingeschakeld" + "USB-accessoiremodus ingeschakeld" "Tik voor meer opties." + "Verbonden apparaat wordt opgeladen. Tik voor meer opties." "Analoog audioaccessoire gedetecteerd" "Het aangesloten apparaat werkt niet met deze telefoon. Tik voor meer informatie." "USB-foutopsporing verbonden" @@ -1661,9 +1658,6 @@ "Werk %1$s" "2e %1$s, werk" "3e %1$s, werk" - "Tik op Terug en Overzicht en houd deze knoppen vast om dit scherm los te maken" - "Scherm vastgezet" - "Scherm losgemaakt" "Vraag pin voor losmaken" "Vraag patroon voor losmaken" "Vraag wachtwoord voor losmaken" @@ -1757,15 +1751,11 @@ "Alle talen" "Alle regio\'s" "Zoeken" - - - - + "Werkprofiel inschakelen?" + "Je werk-apps, meldingen, gegevens en andere functies van je werkprofiel worden uitgeschakeld" "Inschakelen" - - - - + "Deze app is ontwikkeld voor een oudere versie van Android en werkt mogelijk niet op de juiste manier. Controleer op updates of neem contact op met de ontwikkelaar." + "Controleren op update" "Je hebt nieuwe berichten" "Open je sms-app om ze te bekijken" "Bepaalde functionaliteit kan zijn beperkt" @@ -1832,17 +1822,17 @@ "Telefoon niet toegestaan voor spraak" "Pop-upvenster" "+ %1$d" - "Voor deze snelkoppeling is de nieuwste app vereist" + "App-versie gedowngraded of niet geschikt voor deze snelkoppeling" "Kan snelkoppeling niet herstellen omdat de app geen ondersteuning biedt voor \'Back-up maken en terugzetten\'" "Kan snelkoppeling niet herstellen vanwege een niet-overeenkomende app-ondertekening" "Kan snelkoppeling niet herstellen" "Snelkoppeling is uitgeschakeld" - - - - - - + "VERWIJDEREN" + "TOCH OPENEN" + "Schadelijke app gevonden" "%1$s wil segmenten van %2$s weergeven" "Bewerken" + "Systeemwijzigingen" + "\'Niet storen\' is gewijzigd" + "Tik om je gedragsinstellingen voor onderbrekingen te controleren" diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index ae3014d2906..c4f068b3a37 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -93,6 +93,8 @@ "SMS ਸੁਨੇਹੇ" "ਵੌਇਸਮੇਲ ਸੁਨੇਹੇ" "ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ" + + "ਪੀਅਰ ਨੇ TTY Mode FULL ਦੀ ਬੇਨਤੀ ਕੀਤੀ" "ਪੀਅਰ ਨੇ TTY Mode HCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ" "ਪੀਅਰ ਨੇ TTY Mode VCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ" @@ -238,7 +240,8 @@ "ਸੈਟਿੰਗਾਂ" "ਸਹਾਇਤਾ ਕਰੋ" "ਅਵਾਜ਼ੀ ਸਹਾਇਕ" - "ਲਾਕਡਾਊਨ ਦਾਖਲ ਕਰੋ" + + "999+" "ਨਵੀਂ ਸੂਚਨਾ" "ਆਭਾਸੀ ਕੀ-ਬੋਰਡ" @@ -497,10 +500,8 @@ "ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ. ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ." "ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ।" "ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ." - - - - + "ਕੋਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਰਜ ਨਹੀਂ ਕੀਤੇ ਗਏ।" + "ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨਹੀਂ ਹੈ" "ਉਂਗਲ %d" @@ -827,6 +828,8 @@ "ਨੁਕਤਾ: ਜ਼ੂਮ ਵਧਾਉਣ ਅਤੇ ਘਟਾਉਣ ਲਈ ਡਬਲ ਟੈਪ ਕਰੋ।" "ਆਟੋਫਿਲ" "ਆਟੋਫਿਲ ਸੈਟ ਅਪ ਕਰੋ" + + " " "$1$2$3" ", " @@ -1198,9 +1201,12 @@ "SIM ਕਾਰਡ ਜੋੜਿਆ ਗਿਆ" "ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਲਈ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਮੁੜ-ਚਾਲੂ ਕਰੋ।" "ਰੀਸਟਾਰਟ ਕਰੋ" - "ਤੁਹਾਡੀ ਨਵੀਂ ਸਿਮ ਦੇ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਤੋਂ ਇੱਕ ਐਪ ਸਥਾਪਤ ਕਰਨ ਅਤੇ ਖੋਲ੍ਹਣ ਦੀ ਲੋੜ ਪਵੇਗੀ।" - "ਐਪ ਪ੍ਰਾਪਤ ਕਰੋ" - "ਅਜੇ ਨਹੀਂ" + + + + + + "ਨਵੀਂ SIM ਦਾਖਲ ਕੀਤੀ ਗਈ" "ਇਸ ਨੂੰ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" "ਸਮਾਂ ਸੈੱਟ ਕਰੋ" @@ -1212,23 +1218,15 @@ "ਕੋਈ ਅਨੁਮਤੀਆਂ ਲੁੜੀਂਦੀਆਂ ਨਹੀਂ" "ਇਸ ਨਾਲ ਤੁਹਾਨੂੰ ਖਰਚਾ ਪੈ ਸਕਦਾ ਹੈ" "ਠੀਕ" - - - - - - - - - - - - - - + "USB ਰਾਹੀਂ ਇਸ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ" + "ਕਨੈਕਟ ਕੀਤਾ ਡੀਵਾਈਸ USB ਰਾਹੀਂ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ" + "USB ਫ਼ਾਈਲ ਟ੍ਰਾਂਸਫ਼ਰ ਚਾਲੂ ਹੈ" + "USB ਰਾਹੀਂ PTP ਚਾਲੂ ਹੈ" + "USB ਟੈਦਰਿੰਗ ਚਾਲੂ ਹੈ" + "USB ਰਾਹੀਂ MIDI ਚਾਲੂ ਹੈ" + "USB ਐਕਸੈਸਰੀ ਮੋਡ ਚਾਲੂ ਹੈ" "ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ।" - - + "ਕਨੈਕਟ ਕੀਤਾ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ। ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ।" "ਐਨਾਲੌਗ ਆਡੀਓ ਉਪਸਾਧਨ ਦਾ ਪਤਾ ਲੱਗਿਆ" "ਨੱਥੀ ਕੀਤਾ ਡੀਵਾਈਸ ਇਸ ਫ਼ੋਨ ਦੇ ਅਨੁਰੂਪ ਨਹੀਂ ਹੈ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।" "USB ਡੀਬਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ" @@ -1831,8 +1829,7 @@ "ਫ਼ੋਨ ਰਾਹੀਂ ਅਵਾਜ਼ੀ ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ" "ਪੌਪਅੱਪ ਵਿੰਡੋ" "+ %1$d" - - + "ਐਪ ਦਾ ਵਰਜਨ ਡਾਊਨਗ੍ਰੇਡ ਕੀਤਾ ਗਿਆ, ਜਾਂ ਇਸ ਸ਼ਾਰਟਕੱਟ ਦੇ ਅਨੁਕੂਲ ਨਹੀਂ ਹੈ" "ਸ਼ਾਰਟਕੱਟ ਮੁੜ-ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਕਿਉਂਕਿ ਐਪ \'ਬੈਕਅੱਪ ਅਤੇ ਮੁੜ-ਬਹਾਲੀ\' ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰਦੀ" "ਐਪ ਹਸਤਾਖਰ ਦਾ ਮੇਲ ਨਾ ਹੋਣ ਕਾਰਨ ਸ਼ਾਰਟਕੱਟ ਮੁੜ-ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ" "ਸ਼ਾਰਟਕੱਟ ਮੁੜ-ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ" @@ -1842,4 +1839,7 @@ "ਹਾਨੀਕਾਰਕ ਐਪ ਦਾ ਪਤਾ ਲੱਗਿਆ" "%1$s ਦੀ %2$s ਦੇ ਹਿੱਸੇ ਦਿਖਾਉਣ ਦੀ ਇੱਛਾ ਹੈ" "ਸੰਪਾਦਨ ਕਰੋ" + "ਸਿਸਟਮ ਬਦਲਾਅ" + "\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵਿਕਲਪ ਬਦਲ ਗਿਆ ਹੈ" + "ਰੁਕਾਵਟਾਂ ਲਈ ਆਪਣੀਆਂ ਵਰਤਾਅ ਸੈਟਿੰਗਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 952e55db3d6..f7ba675cce6 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -95,6 +95,7 @@ "SMS-y" "Wiadomości poczty głosowej" "Połączenia przez Wi-Fi" + "Stan karty SIM" "Drugie urządzenie zażądało trybu „TTY pełny”" "Drugie urządzenie zażądało trybu „TTY HCO”" "Drugie urządzenie zażądało trybu „TTY VCO”" @@ -176,10 +177,10 @@ "Przez nieznany podmiot zewnętrzny" "Przez administratora Twojego profilu do pracy" "Przez %s" - "Usunięto profil do pracy" - "Profil do pracy został usunięty z powodu braku aplikacji administratora" - "Brakuje aplikacji administratora profilu do pracy lub jest ona uszkodzona. Dlatego Twój profil do pracy i związane z nim dane zostały usunięte. Skontaktuj się ze swoim administratorem, by uzyskać pomoc." - "Twój profil do pracy nie jest już dostępny na tym urządzeniu" + "Usunięto profil służbowy" + "Profil służbowy został usunięty z powodu braku aplikacji administratora" + "Brakuje aplikacji administratora profilu do pracy lub jest ona uszkodzona. Dlatego Twój profil służbowy i związane z nim dane zostały usunięte. Skontaktuj się ze swoim administratorem, by uzyskać pomoc." + "Twój profil służbowy nie jest już dostępny na tym urządzeniu" "Zbyt wiele prób podania hasła" "Urządzenie jest zarządzane" "Twoja organizacja zarządza tym urządzeniem i może monitorować ruch w sieci. Kliknij, by dowiedzieć się więcej." @@ -244,7 +245,7 @@ "Ustawienia" "Pomoc" "Asystent głosowy" - "Użyj blokady" + "Blokada" ">999" "Nowe powiadomienie" "Klawiatura wirtualna" @@ -270,10 +271,8 @@ "%1$s, %2$s" "Tryb awaryjny" "System Android" - - - - + "Przełącz na profil osobisty" + "Przełącz na profil służbowy" "Kontakty" "dostęp do kontaktów" "Zezwalaj aplikacji <b>%1$s</b> na dostęp do kontaktów" @@ -425,10 +424,8 @@ "Pozwala aplikacji na dostęp do funkcji telefonicznych urządzenia. Aplikacja z tym uprawnieniem może odczytać numer telefonu i identyfikator urządzenia, sprawdzić, czy połączenie jest aktywne, oraz poznać numer, z którym jest nawiązane połączenie." "przekazywanie połączeń przez system" "Zezwala aplikacji na przekazywanie połączeń przez system, by poprawić ich jakość." - - - - + "kontynuuj połączenie w innej aplikacji" + "Zezwala na kontynuowanie przez aplikację połączenia rozpoczętego w innej aplikacji." "odczytywanie numerów telefonów" "Zezwala aplikacji na dostęp do numerów telefonów na urządzeniu." "zapobieganie przechodzeniu tabletu do trybu uśpienia" @@ -503,11 +500,12 @@ "Nie można zapisać odcisku palca. Usuń istniejący odcisk palca." "Osiągnięto limit czasu odczytu linii papilarnych. Spróbuj ponownie." "Odczyt odcisku palca został anulowany." - - + "Odczyt odcisku palca został anulowany przez użytkownika." "Zbyt wiele prób. Spróbuj ponownie później." "Zbyt wiele prób. Czytnik linii papilarnych został wyłączony." "Spróbuj ponownie." + "Nie zarejestrowano odcisków palców." + "To urządzenie nie jest wyposażone w czytnik linii papilarnych" "Odcisk palca %d" @@ -834,6 +832,7 @@ "Wskazówka: dotknij dwukrotnie, aby powiększyć lub pomniejszyć." "Autouzupełnianie" "Ustaw autouzupełnianie" + "Autouzupełnianie" " " "$1$2$3" ", " @@ -1040,12 +1039,9 @@ "Otwórz" "Wyślij SMS-a" "Dodaj" - - - - - - + "Wyświetl" + "Zaplanuj" + "Utwór" "Kończy się miejsce" "Niektóre funkcje systemu mogą nie działać" "Za mało pamięci w systemie. Upewnij się, że masz 250 MB wolnego miejsca i uruchom urządzenie ponownie." @@ -1175,8 +1171,7 @@ Dostępna jest otwarta sieć Wi-Fi "Połącz się z otwartą siecią Wi-Fi" - - + "Połącz się z siecią Wi‑Fi operatora" "Łączę się z otwartą siecią Wi-Fi" "Połączono z siecią Wi-Fi" "Nie udało się połączyć z siecią Wi‑Fi" @@ -1246,9 +1241,9 @@ "Dodano kartę SIM" "Uruchom ponownie urządzenie, aby uzyskać dostęp do sieci komórkowej." "Uruchom ponownie" - "Aby nowa karta SIM działała prawidłowo, musisz zainstalować i otworzyć aplikację udostępnioną przez operatora." - "POBIERZ APLIKACJĘ" - "NIE TERAZ" + "Aktywuj usługę sieci komórkowej" + "Pobierz aplikację operatora, by aktywować nową kartę SIM" + "Pobierz aplikację" "Włożono nową kartę SIM" "Kliknij, by skonfigurować" "Ustaw godzinę" @@ -1260,13 +1255,15 @@ "Nie są wymagane żadne uprawnienia" "to może generować dodatkowe koszty" "OK" - "Ładowanie urządzenia przez USB" - "Zasilanie urządzenia przez USB" - "USB w trybie przesyłania plików" - "USB w trybie przesyłania zdjęć" - "USB w trybie MIDI" - "Podłączono akcesorium USB" + "Ładowanie urządzenia przez USB" + "Ładowanie podłączonego urządzenia przez USB" + "Przesyłanie plików przez USB włączone" + "Tryb PTP przez USB włączony" + "Tethering USB włączony" + "Tryb MIDI przez USB włączony" + "Tryb akcesorium USB włączony" "Kliknij, by wyświetlić więcej opcji." + "Ładowanie podłączonego urządzenia. Kliknij, by wyświetlić więcej opcji." "Wykryto analogowe urządzenie audio" "Podłączone urządzenie nie jest zgodne z tym telefonem. Kliknij, by dowiedzieć się więcej." "Podłączono moduł debugowania USB" @@ -1711,9 +1708,6 @@ "%1$s (praca)" "%1$s – praca 2" "%1$s – praca 3" - "Aby odpiąć ten ekran, naciśnij i przytrzymaj Wstecz oraz Przegląd" - "Ekran przypięty" - "Ekran odpięty" "Podaj PIN, aby odpiąć" "Aby odpiąć, poproś o wzór odblokowania" "Aby odpiąć, poproś o hasło" @@ -1795,7 +1789,7 @@ "Żądanie SS zostało zmienione na żądanie Video DIAL." "Żądanie SS zostało zmienione na żądanie USSD." "Żądanie SS zostało zmienione na nowe żądanie SS." - "Profil do pracy" + "Profil służbowy" "Rozwiń" "Zwiń" "przełącz rozwijanie" @@ -1825,21 +1819,17 @@ "Wszystkie języki" "Wszystkie kraje" "Szukaj" - - - - + "Włączyć profil służbowy?" + "Aplikacje do pracy, powiadomienia, dane i inne funkcje profilu do pracy zostaną włączone" "Włącz" - - - - + "Ta aplikacja jest na starszą wersję Androida i może nie działać prawidłowo. Sprawdź dostępność aktualizacji lub skontaktuj się z programistą." + "Sprawdź dostępność aktualizacji" "Masz nowe wiadomości" "Otwórz aplikację do SMS-ów, by wyświetlić wiadomość" "Niektóre funkcje mogą być niedostępne" "Kliknij, by odblokować" "Dane użytkownika zablokowane" - "Profil do pracy zablokowany" + "Profil służbowy zablokowany" "Kliknij, by odblokować profil" "Połączono z: %1$s" "Dotknij, by wyświetlić pliki" @@ -1902,17 +1892,17 @@ "Telefon jest niedozwolony w przypadku usług głosowych" "Wyskakujące okienko" "+ %1$d" - "Ten skrót wymaga zainstalowania najnowszej wersji aplikacji" + "Zmieniono wersję aplikacji na starszą lub aplikacja nie jest zgodna z tym skrótem" "Nie można przywrócić skrótu, bo aplikacja nie obsługuje tworzenia i przywracania kopii zapasowej" "Nie można przywrócić skrótu z powodu niezgodności podpisu aplikacji" "Nie można przywrócić skrótu" "Skrót jest wyłączony" - - - - - - + "ODINSTALUJ" + "OTWÓRZ MIMO TO" + "Wykryto szkodliwą aplikację" "Aplikacja %1$s chce pokazywać wycinki z aplikacji %2$s" "Edytuj" + "Zmiany w systemie" + "Zmiany w trybie Nie przeszkadzać" + "Kliknij, by sprawdzić ustawienia zachowania w przypadku zakłóceń" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 8fe4729d699..4c88bc6f29d 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -93,6 +93,7 @@ "Mensagens SMS" "Mensagens do correio de voz" "Chamadas por Wi-Fi" + "Status do SIM" "TTD modo COMPLETO solicitado" "TTD modo HCO solicitado" "TTD modo VCO solicitado" @@ -238,7 +239,7 @@ "Configurações" "Assistência" "Ajuda de voz" - "Bloqueio. total" + "Bloqueio total" ">999" "Nova notificação" "Teclado virtual" @@ -497,10 +498,8 @@ "Excesso de tentativas. Tente novamente mais tarde." "Excesso de tentativas. Sensor de impressão digital desativado." "Tente novamente." - - - - + "Nenhuma impressão digital registrada." + "Este dispositivo não tem um sensor de impressão digital" "Dedo %d" @@ -827,6 +826,7 @@ "Dica: toque duas vezes para aumentar e diminuir o zoom." "Preench. aut." "Conf. preench. aut." + "Preenchimento automático" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "Cartão SIM adicionado" "Reinicie o dispositivo para acessar a rede móvel." "Reiniciar" - "Para que seu novo SIM funcione corretamente, instale e abra um app da sua operadora." - "FAZER O DOWNLOAD DO APP" - "AGORA NÃO" + "Ativar serviço móvel" + "Faça o download do app da operadora para ativar seu novo SIM" + "Fazer download do app" "Novo SIM inserido" "Toque para configurar" "Definir hora" @@ -1211,23 +1211,15 @@ "Nenhuma permissão necessária" "isso pode lhe custar dinheiro" "OK" - - - - - - - - - - - - - - + "Carregando este dispositivo via USB" + "Carregando dispositivo conectado via USB" + "Transferência de arquivo via USB ativada" + "PTP via USB ativado" + "Tethering USB ativado" + "MIDI via USB ativado" + "Modo de acessório USB ativado" "Toque para ver mais opções." - - + "Carregando dispositivo conectado. Toque para ver mais opções." "Acessório de áudio analógico detectado" "O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais." "Depuração USB conectada" @@ -1830,8 +1822,7 @@ "Smartphone não autorizado para voz" "Janela pop-up" "Mais %1$d" - - + "A versão do app passou por downgrade ou não é compatível com esse atalho" "Não foi possível restaurar o atalho porque o app não é compatível com backup e restauração" "Não foi possível restaurar o atalho devido à incompatibilidade de assinatura de apps" "Não foi possível restaurar o atalho" @@ -1841,4 +1832,7 @@ "App nocivo detectado" "%1$s quer mostrar partes do app %2$s" "Editar" + "Alterações do sistema" + "O modo \"Não perturbe\" foi alterado" + "Toque para verificar suas configurações de comportamento para interrupções" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 04bd394f825..c9e0a605178 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -93,6 +93,7 @@ "Mensagens SMS" "Mensagens de correio de voz" "Chamadas Wi-Fi" + "Estado do SIM" "O par solicitou o modo COMPLETO de teletipo" "O par solicitou o modo HCO de teletipo" "O par solicitou o modo VCO de teletipo" @@ -238,7 +239,7 @@ "Definições" "Assistência" "Assist. de voz" - "Ativar bloqueio" + "Bloqueio" "999+" "Nova notificação" "Teclado virtual" @@ -497,10 +498,8 @@ "Demasiadas tentativas. Tente novamente mais tarde." "Demasiadas tentativas. Sensor de impressões digitais desativado." "Tente novamente." - - - - + "Nenhuma impressão digital registada." + "Este dispositivo não tem sensor de impressões digitais." "Dedo %d" @@ -753,12 +752,12 @@ "Consulte o Manual de utilizador ou contacte a Assistência a Clientes." "O cartão SIM está bloqueado." "A desbloquear cartão SIM..." - "Desenhou a sua sequência de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." + "Desenhou a sua padrão de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." "Escreveu a sua palavra-passe incorretamente %1$d vezes. \n\n Tente novamente dentro de %2$d segundos." "Escreveu o seu número PIN incorretamente %1$d vezes. \n\n Tente novamente dentro de %2$d segundos." - "Desenhou a sequência de desbloqueio incorretamente %1$d vezes. Após outras %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de %3$d segundos." - "O utilizador desenhou incorretamente a sua sequência de desbloqueio %1$d vezes. Após mais %2$d tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através do seu início de sessão Google.\n\n Tente novamente dentro de %3$d segundos." - "Desenhou a sequência de desbloqueio incorretamente %1$d vezes. Após outras %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de %3$d segundos." + "Desenhou o padrão de desbloqueio incorretamente %1$d vezes. Após outras %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de %3$d segundos." + "O utilizador desenhou incorretamente a sua padrão de desbloqueio %1$d vezes. Após mais %2$d tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através do seu início de sessão Google.\n\n Tente novamente dentro de %3$d segundos." + "Desenhou o padrão de desbloqueio incorretamente %1$d vezes. Após outras %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de %3$d segundos." "Tentou desbloquear o tablet %1$d vezes de forma incorreta. Após mais %2$d tentativa(s) sem êxito, as definições de origem do tablet serão repostas e todos os dados de utilizador serão perdidos." "O utilizador tentou desbloquear incorretamente a TV %1$d vezes. Após mais %2$d tentativas sem êxito, a TV é reposta para as predefinições de fábrica e todos os dados do utilizador são perdidos." "Tentou desbloquear o telemóvel %1$d vezes de forma incorreta. Após mais %2$d tentativa(s) sem êxito, as definições de origem do telemóvel serão repostas e todos os dados de utilizador serão perdidos." @@ -827,6 +826,7 @@ "Sugestão: toque duas vezes para aumentar ou diminuir o zoom." "Preenchimento Automático" "Configurar Preenchimento Automático" + "Preenchimento automático" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "Cartão SIM adicionado" "Reinicie o aparelho para aceder à rede de telemóvel." "Reiniciar" - "Para que o novo SIM funcione corretamente, tem de instalar e abrir uma aplicação do seu operador." - "OBTER A APLICAÇÃO" - "AGORA NÃO" + "Ativar o serviço móvel" + "Transfira a aplicação do operador para ativar o seu novo SIM." + "Transferir aplicação" "Novo SIM inserido" "Toque para configurar" "Definir hora" @@ -1211,23 +1211,15 @@ "Não são necessárias permissões" "isto poderá estar sujeito a custos" "OK" - - - - - - - - - - - - - - + "O dispositivo está a carregar por USB" + "A carregar o dispositivo ligado por USB" + "A transferência de ficheiros por USB está ativada" + "O PTP por USB está ativado" + "A ligação USB via telemóvel está ativada" + "O MIDI através de USB está ativado" + "O modo de acessório USB está ativado" "Toque para obter mais opções." - - + "A carregar o dispositivo ligado. Toque para obter mais opções." "Acessório de áudio analógico detetado" "O dispositivo ligado não é compatível com este telemóvel. Toque para saber mais." "Depuração USB ligada" @@ -1517,16 +1509,16 @@ "A verificar a conta…" "Escreveu o PIN incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." "Escreveu a palavra-passe incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." - "Desenhou a sua sequência de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." + "Desenhou a sua padrão de desbloqueio incorretamente %1$d vezes. \n\nTente novamente dentro de %2$d segundos." "Tentou desbloquear o tablet %1$d vezes de forma incorreta. Depois de mais %2$d tentativas sem êxito, as definições de origem do telemóvel serão repostas e todos os dados do utilizador serão perdidos." "O utilizador tentou desbloquear incorretamente a TV %1$d vezes. Após mais %2$d tentativas sem êxito, a TV é reposta para as predefinições de fábrica e todos os dados do utilizador são perdidos." "Tentou desbloquear o telemóvel %1$d vezes de forma incorreta. Depois de mais %2$d tentativas sem êxito, as definições de origem do telemóvel serão repostas e todos os dados do utilizador serão perdidos." "Tentou desbloquear o tablet %d vezes de forma incorreta, pelo que será reposta a predefinição de fábrica." "O utilizador tentou desbloquear incorretamente a TV %d vezes. A TV será agora reposta para as predefinições de fábrica." "Tentou desbloquear o telemóvel %d vezes de forma incorreta, pelo que será reposta a predefinição de fábrica." - "Desenhou a sequência de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." - "O utilizador desenhou incorretamente a sua sequência de desbloqueio %1$d vezes. Após mais %2$d tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." - "Desenhou a sequência de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." + "Desenhou o padrão de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." + "O utilizador desenhou incorretamente a sua padrão de desbloqueio %1$d vezes. Após mais %2$d tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." + "Desenhou o padrão de desbloqueio incorretamente %1$d vezes. Depois de mais %2$d tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de %3$d segundos." " - " "Remover" "Aumentar o volume acima do nível recomendado?\n\nOuvir com um volume elevado durante longos períodos poderá ser prejudicial para a sua audição." @@ -1667,7 +1659,7 @@ "2.º %1$s de trabalho" "3.º %1$s de trabalho" "Pedir PIN antes de soltar" - "Pedir sequência de desbloqueio antes de soltar" + "Pedir padrão de desbloqueio antes de soltar" "Pedir palavra-passe antes de soltar" "Instalado pelo seu gestor" "Atualizado pelo seu gestor" @@ -1830,8 +1822,7 @@ "Telemóvel não permitido para voz" "Janela pop-up" "+ %1$d" - - + "A aplicação foi alterada para a versão anterior ou não é compatível com este atalho." "Não foi possível restaurar o atalho porque a aplicação não é compatível com a funcionalidade de cópia de segurança e restauro." "Não foi possível restaurar o atalho devido a uma falha de correspondência entre as assinaturas das aplicações." "Não foi possível restaurar o atalho." @@ -1841,4 +1832,7 @@ "Aplicação prejudicial detetada" "A aplicação %1$s pretende mostrar partes da aplicação %2$s." "Editar" + "Alterações ao sistema" + "O modo Não incomodar foi alterado" + "Toque para verificar se existem interrupções nas suas definições de comportamento." diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 8fe4729d699..4c88bc6f29d 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -93,6 +93,7 @@ "Mensagens SMS" "Mensagens do correio de voz" "Chamadas por Wi-Fi" + "Status do SIM" "TTD modo COMPLETO solicitado" "TTD modo HCO solicitado" "TTD modo VCO solicitado" @@ -238,7 +239,7 @@ "Configurações" "Assistência" "Ajuda de voz" - "Bloqueio. total" + "Bloqueio total" ">999" "Nova notificação" "Teclado virtual" @@ -497,10 +498,8 @@ "Excesso de tentativas. Tente novamente mais tarde." "Excesso de tentativas. Sensor de impressão digital desativado." "Tente novamente." - - - - + "Nenhuma impressão digital registrada." + "Este dispositivo não tem um sensor de impressão digital" "Dedo %d" @@ -827,6 +826,7 @@ "Dica: toque duas vezes para aumentar e diminuir o zoom." "Preench. aut." "Conf. preench. aut." + "Preenchimento automático" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "Cartão SIM adicionado" "Reinicie o dispositivo para acessar a rede móvel." "Reiniciar" - "Para que seu novo SIM funcione corretamente, instale e abra um app da sua operadora." - "FAZER O DOWNLOAD DO APP" - "AGORA NÃO" + "Ativar serviço móvel" + "Faça o download do app da operadora para ativar seu novo SIM" + "Fazer download do app" "Novo SIM inserido" "Toque para configurar" "Definir hora" @@ -1211,23 +1211,15 @@ "Nenhuma permissão necessária" "isso pode lhe custar dinheiro" "OK" - - - - - - - - - - - - - - + "Carregando este dispositivo via USB" + "Carregando dispositivo conectado via USB" + "Transferência de arquivo via USB ativada" + "PTP via USB ativado" + "Tethering USB ativado" + "MIDI via USB ativado" + "Modo de acessório USB ativado" "Toque para ver mais opções." - - + "Carregando dispositivo conectado. Toque para ver mais opções." "Acessório de áudio analógico detectado" "O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais." "Depuração USB conectada" @@ -1830,8 +1822,7 @@ "Smartphone não autorizado para voz" "Janela pop-up" "Mais %1$d" - - + "A versão do app passou por downgrade ou não é compatível com esse atalho" "Não foi possível restaurar o atalho porque o app não é compatível com backup e restauração" "Não foi possível restaurar o atalho devido à incompatibilidade de assinatura de apps" "Não foi possível restaurar o atalho" @@ -1841,4 +1832,7 @@ "App nocivo detectado" "%1$s quer mostrar partes do app %2$s" "Editar" + "Alterações do sistema" + "O modo \"Não perturbe\" foi alterado" + "Toque para verificar suas configurações de comportamento para interrupções" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index defb40bb072..792e7e2cf25 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -94,6 +94,7 @@ "Mesaje SMS" "Mesaje din mesageria vocală" "Apelare prin Wi-Fi" + "Starea cardului SIM" "Cealaltă persoană a solicitat modul TTY cu setarea COMPLET" "Cealaltă persoană a solicitat modul TTY cu setarea HCO" "Cealaltă persoană a solicitat modul TTY cu setarea VCO" @@ -241,7 +242,7 @@ "Setări" "Asistență" "Asistent vocal" - "Introduceți blocarea" + "Blocați" "˃999" "Notificare nouă" "Tastatură virtuală" @@ -500,10 +501,8 @@ "Prea multe încercări. Încercați din nou mai târziu." "Prea multe încercări. Senzorul de amprentă este dezactivat." "Încercați din nou." - - - - + "Nu au fost înregistrate amprente." + "Acest dispozitiv nu are senzor de amprentă" "Degetul %d" @@ -830,6 +829,7 @@ "Sfat: măriți și micșorați prin dublă atingere." "Automat" "Conf.Compl.auto." + "Completare automată" " " "$1$2$3" ", " @@ -1219,9 +1219,9 @@ "Card SIM adăugat" "Reporniți dispozitivul pentru a accesa rețeaua mobilă." "Reporniți" - "Pentru ca noul SIM să funcționeze corect, va trebui să instalați și să deschideți o aplicație de la operatorul dvs." - "DESCĂRCAȚI APLICAȚIA" - "NU ACUM" + "Activați serviciul mobil" + "Descărcați aplicația operatorului pentru a vă activa noul card SIM" + "Descărcați aplicația" "S-a introdus un card SIM nou" "Atingeți pentru a-l configura" "Setați ora" @@ -1233,23 +1233,15 @@ "Nu se solicită nicio permisiune" "aceasta poate să genereze costuri" "OK" - - - - - - - - - - - - - - + "Se încarcă dispozitivul prin USB" + "Se încarcă dispozitivul conectat prin USB" + "Transferul de fișiere prin USB este activat" + "PTP prin USB este activat" + "Tetheringul prin USB este activat" + "MIDI prin USB este activat" + "Modul Accesoriu USB este activat" "Atingeți pentru mai multe opțiuni." - - + "Se încarcă dispozitivul conectat. Atingeți pentru mai multe opțiuni." "S-a detectat un accesoriu audio analogic" "Dispozitivul atașat nu este compatibil cu acest telefon. Atingeți pentru a afla mai multe." "Remedierea erorilor prin USB este conectată" @@ -1865,8 +1857,7 @@ "Telefonul nu este permis pentru voce" "Fereastră pop-up" "+ %1$d" - - + "Aplicația a trecut la o versiune inferioară sau nu este compatibilă cu această comandă rapidă" "Nu s-a putut restabili comanda rapidă deoarece aplicația nu acceptă backupul și restabilirea" "Nu s-a putut restabili comanda rapidă din cauza nepotrivirii semnăturii aplicației" "Nu s-a putut restabili comanda rapidă" @@ -1876,4 +1867,7 @@ "Aplicație dăunătoare detectată" "%1$s vrea să afișeze porțiuni din %2$s" "Editați" + "Modificări ale Sistem" + "Funcția Nu deranja s-a schimbat" + "Atingeți pentru a verifica setările de comportament pentru întreruperi" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 817cbf79dfa..0689833c425 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -95,6 +95,7 @@ "SMS" "Голосовые сообщения" "Звонки по Wi-Fi" + "Статус SIM-карты" "На устройстве абонента выбран режим телетайпа \"ВСЕ\"" "На устройстве абонента выбран режим телетайпа HCO" "На устройстве абонента выбран режим телетайпа VCO" @@ -244,7 +245,7 @@ "Настройки" "Помощник" "Аудиоподсказки" - "Заблокировать" + "Блокировка" ">999" "Новое уведомление" "Виртуальная клавиатура" @@ -503,10 +504,8 @@ "Слишком много попыток. Повторите позже." "Слишком много попыток. Сканер отпечатков пальцев отключен." "Повторите попытку." - - - - + "Нет отсканированных отпечатков пальцев" + "На этом устройстве нет сканера отпечатков пальцев" "Отпечаток %d" @@ -833,6 +832,7 @@ "Совет: нажмите дважды, чтобы увеличить и уменьшить масштаб." "Автозаполнение" "Настроить автозаполнение" + "Автозаполнение" " " "$1$2$3" ", " @@ -1241,9 +1241,9 @@ "SIM-карта добавлена" "Перезагрузите устройство для доступа к мобильной сети." "Перезапустить" - "Чтобы SIM-карта работала корректно, установите и запустите приложение оператора." - "СКАЧАТЬ" - "НЕ СЕЙЧАС" + "Включить мобильную связь" + "Скачайте приложение оператора, чтобы активировать новую SIM-карту" + "Скачать приложение" "Установлена новая SIM-карта" "Нажмите, чтобы настроить." "Настройка времени" @@ -1255,23 +1255,15 @@ "Не требуется разрешений" "это может стоить вам денег!" "ОК" - - - - - - - - - - - - - - + "Зарядка устройства через USB…" + "Зарядка устройства через USB…" + "Передача файлов через USB включена" + "Режим PTP включен" + "Режим USB-модема включен" + "Режим MIDI включен" + "USB-устройство подключено" "Нажмите, чтобы показать дополнительные параметры." - - + "Подключенное устройство заряжается. Нажмите, чтобы увидеть другие настройки." "Обнаружено аналоговое аудиоустройство" "Подсоединенное устройство несовместимо с этим телефоном. Нажмите, чтобы узнать подробности." "Отладка по USB разрешена" @@ -1900,8 +1892,7 @@ "Для телефона недоступны голосовые вызовы" "Всплывающее окно" "+ %1$d" - - + "Версия приложения устарела или несовместима с ярлыком" "Не удалось восстановить ярлык: приложение не поддерживает резервное копирование" "Не удалось восстановить ярлык: некорректная подпись приложения" "Не удалось восстановить ярлык" @@ -1911,4 +1902,7 @@ "Обнаружено вредоносное приложение" "Приложение \"%1$s\" запрашивает разрешение на показ фрагментов приложения \"%2$s\"." "Изменить" + "Системные изменения" + "Настройки режима \"Не беспокоить\" изменены" + "Нажмите, чтобы проверить их." diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index ab6924293f2..5db0730a402 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -93,6 +93,7 @@ "SMS පණිවිඩ" "හඬ තැපැල් පණිවිඩ" "Wi-Fi ඇමතීම" + "SIM තත්ත්වය" "සම ඉල්ලීම් කළ TTY ප්‍රකාරය පූර්ණයි" "සම ඉල්ලීම් කළ TTY ප්‍රකාරය HCO" "සම ඉල්ලීම් කළ TTY ප්‍රකාරය VCO" @@ -238,7 +239,7 @@ "සැකසීම්" "සහාය දීම" "හඬ සහායක" - "අගුලු දැමීමට යන්න" + "අගුලු දැමීම" "999+" "නව දැනුම්දීම" "අතථ්‍ය යතුරු පුවරුව" @@ -497,10 +498,8 @@ "උත්සාහයන් ඉතා වැඩි ගණනකි. කරුණාකර පසුව නැවත උත්සාහ කරන්න." "උත්සාහයන් ඉතා වැඩි ගණනකි. ඇඟිලි සලකුණු සංවේදකය අබල කරන ලදී." "නැවත උත්සාහ කරන්න." - - - - + "ඇඟිලි සලකුණු ඇතුළත් කර නොමැත." + "මෙම උපාංගයේ ඇඟිලි සලකුණු සංවේදකයක් නොමැත" "ඇඟිලි %d" @@ -829,6 +828,7 @@ "උපදෙස: විශාලනය කිරීමට සහ කුඩා කිරීමට දෙවරක් තට්ටු කරන්න." "ස්වයංක්‍රිය පිරවුම" "ස්වයංක්‍රිය පිරවුම සකසන්න" + "ස්වයං පිරවුම" " " "$1$2$3" ", " @@ -1199,9 +1199,9 @@ "SIM පතක් එකතු කරන ලදි" "ජංගම ජාලයට ප්‍රවේශ වීමට ඔබගේ උපාංගය නැවත අරඹන්න." "යළි අරඹන්න" - "ඔබේ නව SIM නිසි ලෙස වැඩ කිරීමට, ඔබ ඔබේ වාහකය වෙතින් යෙදුමක් ස්ථාපනය කර විවෘත කිරීම අවශ්‍යය." - "යෙදුම ලබා ගන්න" - "දැන්ම නොවේ" + "ජංගම සේවාව සක්‍රිය කරන්න" + "ඔබගේ නව SIM කාඩ්පත සක්‍රිය කිරීමට වාහක යෙදුම බාගන්න" + "යෙදුම බාගන්න" "නව SIM ඇතුළු කරන්න" "එය පිහිටුවීමට තට්ටු කරන්න" "වේලාව සකසන්න" @@ -1213,23 +1213,15 @@ "අවසර අවශ්‍ය නොමැත" "මෙමඟින් ඔබට මුදල් වැය විය හැක" "හරි" - - - - - - - - - - - - - - + "මෙම උපාංගය USB හරහා ආරෝපණය කරමින්" + "සම්බන්ධිත උපාංගය USB හරහා ආරෝපණය කරමින්" + "USB ගොනු මාරු කිරීම ක්‍රියාත්මකයි" + "USB හරහා PTP ක්‍රියාත්මකයි" + "USB ටෙදරින් ක්‍රියාත්මකයි" + "USB හරහා MIDI ක්‍රියාත්මකයි" + "USB උපාංග ප්‍රකාරය ක්‍රියාත්මකයි" "තවත් විකල්ප සඳහා තට්ටු කරන්න." - - + "සම්බන්ධිත උපාංගය ආරෝපණය කරමින්. තවත් විකල්ප සඳහා තට්ටු කරන්න." "ප්‍රතිසම ශ්‍රව්‍ය උපාංගය අනාවරණය කර ගන්නා ලදී" "මෙම දුරකථනය සමඟ සම්බන්ධිත උපාංගය නොගැළපෙයි. තව දැන ගැනීමට තට්ටු කරන්න." "USB නිදොස්කරණය සම්බන්ධිතයි" @@ -1832,8 +1824,7 @@ "දුරකථනය හඬ සඳහා ඉඩ නොදේ" "උත්පතන කවුළුව" "+ %1$d" - - + "යෙදුම් අනුවාදය අවශ්‍රේණි කර ඇත, නැතහොත් මෙම කෙටි මග සමඟ අනුකූල නොවේ" "යෙදුම උපස්ථ සහ ප්‍රතිසාධනය සඳහා සහාය නොදක්වන බැවින් කෙටි මග ප්‍රතිසාධනය කළ නොහැකි විය" "යෙදුම් අත්සන නොගැළපෙන බැවින් කෙටි මග ප්‍රතිසාධනය කළ නොහැකි විය" "කෙටි මග ප්‍රතිසාධනය කළ නොහැකි විය" @@ -1843,4 +1834,7 @@ "හානිකර යෙදුමක් අනාවරණය කර ගන්නා ලදී" "%1$s හට කොටස් %2$sක් පෙන්වීමට අවශ්‍යයි" "සංස්කරණය" + "පද්ධති වෙනස් කිරීම්" + "බාධා නොකරන්න වෙනස් කර ඇත" + "බාධා කිරීම් සඳහා ඔබේ හැසිරීම් සැකසීම් පරීක්ෂා කිරීමට තට්ටු කරන්න" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 8755d946369..4f7f5990422 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -95,6 +95,7 @@ "Správy SMS" "Správy hlasovej schránky" "Volanie cez Wi‑Fi" + "Stav SIM karty" "Používateľ, s ktorým komunikujete, požiadal o režim FULL textového telefónu" "Používateľ, s ktorým komunikujete, požiadal o režim HCO textového telefónu" "Používateľ, s ktorým komunikujete, požiadal o režim VCO textového telefónu" @@ -244,7 +245,7 @@ "Nastavenia" "Pomôcť" "Hlasový asistent" - "Uzamknúť" + "Uzamknúť" "999+" "Nové upozornenie" "Virtuálna klávesnica" @@ -270,10 +271,8 @@ "%1$s, %2$s" "Núdzový režim" "Systém Android" - - - - + "Prepnúť na osobný profil" + "Prepnúť na pracovný profil" "Kontakty" "prístup ku kontaktom" "Povoľte aplikácii <b>%1$s</b> prístup k vašim kontaktom" @@ -425,10 +424,8 @@ "Umožňuje aplikácii pristupovať k telefónnym funkciám zariadenia. Aplikácia s týmto povolením môže určiť telefónne číslo a ID zariadenia, či práve prebieha hovor, a vzdialené číslo, s ktorým je prostredníctvom hovoru nadviazané spojenie." "presmerovanie hovorov cez systém" "Umožňuje aplikácii presmerovať hovory cez systém na účely zlepšenia kvality hovorov." - - - - + "pokračovať v hovore z inej aplikácie" + "Umožňuje aplikácii pokračovať v hovore začatom v inej aplikácii." "čítanie telefónnych čísel" "Umožňuje aplikácii pristupovať k telefónnym číslam zariadenia." "zabránenie prechodu tabletu do režimu spánku" @@ -503,11 +500,12 @@ "Odtlačok prsta nie je možné uložiť. Odstráňte existujúci odtlačok." "Časový limit rozpoznania odtlačku vypršal. Skúste to znova." "Operácia týkajúca sa odtlačku prsta bola zrušená" - - + "Overenie odtlačku prsta zrušil používateľ." "Príliš veľa pokusov. Skúste to znova neskôr." "Príliš veľa pokusov. Senzor odtlačkov prstov bol deaktivovaný." "Skúste to znova" + "Neregistrovali ste žiadne odtlačky prstov." + "Toto zariadenie nemá senzor odtlačkov prstov" "Prst: %d" @@ -834,6 +832,7 @@ "Tip: Dvojitým klepnutím môžete zobrazenie priblížiť alebo oddialiť." "Aut.dop." "Nast. Aut. dop." + "Automatické dopĺňanie" " " "$1$2$3" ", " @@ -1040,12 +1039,9 @@ "Otvoriť" "Správa" "Pridať" - - - - - - + "Zobraziť" + "Naplánovať" + "Sledovať" "Nedostatok ukladacieho priestoru" "Niektoré systémové funkcie nemusia fungovať" "V úložisku nie je dostatok voľného miesta pre systém. Zaistite, aby ste mali 250 MB voľného miesta a zariadenie reštartujte." @@ -1175,8 +1171,7 @@ K dispozícii je verejná sieť Wi‑Fi "Pripojenie k otvorenej sieti Wi‑Fi" - - + "Pripojenie k sieti Wi‑Fi operátora" "Pripája sa k otvorenej sieti Wi‑Fi" "Pripojenie k sieti Wi‑Fi" "K sieti Wi‑Fi sa nepodarilo pripojiť" @@ -1246,9 +1241,9 @@ "Bola pridaná SIM karta" "Ak chcete získať prístup k mobilnej sieti, reštartujte svoje zariadenie." "Reštartovať" - "Ak chcete, aby vaša nová SIM karta fungovala správne, musíte nainštalovať a spustiť aplikáciu od operátora." - "ZÍSKAŤ APLIKÁCIU" - "TERAZ NIE" + "Aktivovať mobilnú službu" + "Ak chcete aktivovať novú SIM kartu, stiahnite si aplikáciu operátora" + "Stiahnuť aplikáciu" "Bola vložená nová SIM karta" "Nastavte ju klepnutím" "Nastaviť čas" @@ -1260,13 +1255,15 @@ "Nevyžadujú sa žiadne oprávnenia." "môžu sa vám účtovať poplatky" "OK" - "Zariadenie sa nabíja cez USB" - "Prebieha nabíjanie pripojeného zariadenia pomocou USB" - "USB na prenos súborov" - "USB na prenos fotiek" - "USB na pripojenie zariadenia MIDI" - "Pripojené k periférnemu zariadeniu USB" + "Toto zariadenie sa nabíja cez USB" + "Pripojené zariadenie sa nabíja cez USB" + "Bol aktivovaný prenos súborov cez USB" + "Bol zapnutý režim PTP cez USB" + "Bol zapnutý tethering cez USB" + "Bol zapnutý režim MIDI cez USB" + "Bol zapnutý režim príslušenstva USB" "Klepnutím zobrazíte ďalšie možnosti." + "Pripojené zariadenie sa nabíja. Ďalšie možností získate klepnutím." "Bolo zistené analógové zvukové príslušenstvo" "Pripojené zariadenie nie je kompatibilné s týmto telefónom. Ďalšie informácie zobrazíte klepnutím." "Ladenie cez USB pripojené" @@ -1711,9 +1708,6 @@ "Práca – %1$s" "2. %1$s do práce" "3. %1$s do práce" - "Ak chcete odopnúť túto obrazovku, klepnite na tlačidlá Späť a Prehľad a podržte ich" - "Obrazovka bola pripnutá" - "Obrazovka bola uvoľnená" "Pred uvoľnením požiadať o číslo PIN" "Pred uvoľnením požiadať o bezpečnostný vzor" "Pred uvoľnením požiadať o heslo" @@ -1825,15 +1819,11 @@ "Všetky jazyky" "Všetky regióny" "Vyhľadávanie" - - - - + "Zapnúť pracovný profil?" + "Pracovné aplikácie, upozornenia, dáta a ďalšie funkcie pracovného profilu sa zapnú" "Zapnúť" - - - - + "Táto aplikácia bola zostavená pre staršiu verziu Androidu a nemusí správne fungovať. Skúste skontrolovať dostupnosť aktualizácií alebo kontaktovať vývojára." + "Skontrolovať dostupnosť aktualizácie" "Máte nové správy." "Otvorte aplikáciu pre SMS a zobrazte správu" "Niektoré funkcie môžu byť obmedzené" @@ -1902,17 +1892,17 @@ "Telefón nie je povolený pre hlas" "Automaticky otvárané okno" "+ %1$d" - "Tento odkaz vyžaduje najnovšiu aplikáciu" + "Aplikácia prešla na staršiu verziu alebo nie je kompatibilná s touto skratkou" "Odkaz sa nepodarilo obnoviť, pretože aplikácia nepodporuje zálohovanie a obnovu" "Odkaz sa nepodarilo obnoviť pre nesúlad podpisov aplikácie" "Odkaz sa nepodarilo obnoviť" "Skratka je zakázaná" - - - - - - + "ODINŠTALOVAŤ" + "OTVORIŤ AJ TAK" + "Bola zistená škodlivá aplikácia" "%1$s chce zobrazovať rezy z aplikácie %2$s" "Upraviť" + "Zmeny systému" + "Nastavenie Nerušiť sa zmenilo" + "Klepnutím skontrolujete vyrušenia v nastaveniach správania" diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 5657fe5680e..dacff539b13 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -95,6 +95,8 @@ "Sporočila SMS" "Sporočila v odzivniku" "Klicanje prek Wi-Fi-ja" + + "Enakovredna naprava je zahtevala način TTY FULL" "Enakovredna naprava je zahtevala način TTY HCO" "Enakovredna naprava je zahtevala način TTY VCO" @@ -244,7 +246,8 @@ "Nastavitve" "Pomoč" "Glas. pomočnik" - "Vklopi zaklep" + + "999 +" "Novo obvestilo" "Navidezna tipkovnica" @@ -270,10 +273,8 @@ "%1$s, %2$s" "Varni način" "Sistem Android" - - - - + "Preklopi na osebni profil" + "Preklopi na delovni profil" "Stiki" "dostop do stikov" "Aplikaciji <b>%1$s</b> omogočite dostop do stikov" @@ -425,10 +426,8 @@ "Aplikaciji omogoča dostop do funkcij telefona v napravi. S tem dovoljenjem lahko aplikacija določi telefonsko številko in ID-je naprave, določi lahko tudi, ali je klic aktiven, in oddaljeno številko, s katero je klic povezan." "Usmeri klice prek sistema" "Dovoli, da aplikacija usmeri klice prek sistema, da se tako izboljša izkušnja klicanja." - - - - + "Nadaljevanje klica iz druge aplikacije" + "Aplikaciji dovoljuje nadaljevanje klica, ki se je začel v drugi aplikaciji." "branje telefonskih številk" "Aplikaciji dovoljuje dostop do telefonskih številk v napravi." "preprečitev prehoda tabličnega računalnika v stanje pripravljenosti" @@ -503,11 +502,12 @@ "Prstnega odtisa ni mogoče shraniti. Odstranite obstoječi prstni odtis." "Dosežena časovna omejitev za prstni odtis. Poskusite znova." "Dejanje s prstnim odtisom je bilo preklicano." - - + "Dejanje s prstnim odtisom je preklical uporabnik." "Preveč poskusov. Poskusite znova pozneje." "Preveč poskusov. Tipalo prstnih odtisov je onemogočeno." "Poskusite znova." + "Ni včlanjenih prstnih odtisov." + "Ta naprava nima tipala prstnih odtisov" "Prst %d" @@ -834,6 +834,8 @@ "Nasvet: Tapnite dvakrat, če želite povečati ali pomanjšati." "Samoizp." "Nastavi samoizp." + + " " "$1$2$3" ", " @@ -1040,12 +1042,9 @@ "Odpri" "Sporočilo" "Dodaj" - - - - - - + "Ogled" + "Dodaj na razpored" + "Sledenje" "Prostor za shranjevanje bo pošel" "Nekatere sistemske funkcije morda ne delujejo" "V shrambi ni dovolj prostora za sistem. Sprostite 250 MB prostora in znova zaženite napravo." @@ -1175,8 +1174,7 @@ Na voljo so odprta omrežja Wi-Fi "Vzpostavite povezavo z odprtim omrežjem Wi‑Fi" - - + "Vzpostavitev povezave z omrežjem Wi‑Fi operaterja" "Vzpostavljanje povezave z odprtim omrežjem Wi‑Fi" "Povezava z omrežjem Wi-Fi je vzpostavljena" "Povezave z omrežjem Wi-Fi ni bilo mogoče vzpostaviti" @@ -1246,9 +1244,12 @@ "Kartica SIM dodana" "Za dostop do mobilnega omrežja znova zaženite napravo." "Vnovičen zagon" - "Če želite, da bo nova kartica SIM pravilno delovala, morate namestiti in odpreti aplikacijo operaterja." - "PRENOS APLIKACIJE" - "NE ZDAJ" + + + + + + "Nova kartica SIM je vstavljena" "Dotaknite se za nastavitev" "Nastavi uro" @@ -1260,13 +1261,15 @@ "Ni zahtevanih dovoljenj" "to je lahko plačljivo" "V redu" - "Polnjenje akumulatorja v napravi prek USB-ja" - "Napajanje priključene naprave prek USB-ja" - "USB za prenos datotek" - "USB za prenos fotografij" - "USB za MIDI" - "Priključen na dodatek USB" + "Polnjenje akumulatorja v napravi prek USB-ja" + "Polnjenje akumulatorja v povezani napravi prek USB-ja" + "Vklopljen je prenos datotek prek USB-ja" + "Vklopljen je način PTP prek USB-ja" + "Vklopljen je internet prek USB-ja" + "Vklopljen je način MIDI prek USB-ja" + "Vklopljen je način dodatka USB" "Dotaknite se za več možnosti." + "Polnjenje akumulatorja v povezani napravi. Dotaknite se za več možnosti." "Zaznana je analogna dodatna zvočna oprema" "Priključena naprava ni združljiva s tem telefonom. Dotaknite se za več informacij." "Iskanje napak prek USB je povezano" @@ -1711,9 +1714,6 @@ "%1$s za delo" "2. službeni %1$s" "3. službeni %1$s" - "Če želite odpeti ta zaslon, se hkrati dotaknite gumbov za nazaj in za pregled ter ju pridržite." - "Zaslon je pripet" - "Zaslon je odpet" "Zahtevaj PIN pred odpenjanjem" "Pred odpenjanjem vprašaj za vzorec za odklepanje" "Pred odpenjanjem vprašaj za geslo" @@ -1825,15 +1825,11 @@ "Vsi jeziki" "Vse regije" "Išči" - - - - + "Želite vklopiti delovni profil?" + "Vklopili boste svoje delovne aplikacije, obvestila, podatke in druge funkcije delovnega profila" "Vklop" - - - - + "Ta aplikacija je bila zasnovana za starejšo različico Androida in morda ne bo delovala pravilno. Preverite, ali so na voljo posodobitve, ali pa se obrnite na razvijalca." + "Preveri, ali je na voljo posodobitev" "Imate nova sporočila." "Za ogled odprite aplikacijo za SMS-je" "Nekatere funkcije bodo omejene" @@ -1902,17 +1898,17 @@ "Telefon ne dovoljuje glasovnih klicev" "Pojavno okno" "in še %1$d" - "Za to bližnjico potrebujete najnovejšo aplikacijo" + "Zdaj imate prejšnjo različico aplikacije ali različico, ki ni združljiva s to bližnjico" "Bližnjice ni bilo mogoče obnoviti, ker aplikacija ne podpira varnostnega kopiranja in obnavljanja" "Bližnjice ni bilo mogoče obnoviti zaradi neujemanja podpisa aplikacije" "Bližnjice ni bilo mogoče obnoviti" "Bližnjica je onemogočena" - - - - - - + "ODSTRANI" + "VSEENO ODPRI" + "Zaznana je bila škodljiva aplikacija" "Aplikacija %1$s želi prikazati izreze aplikacije %2$s" "Urejanje" + "Sistemske spremembe" + "Način »ne moti« je spremenjen" + "Dotaknite se, da preverite nastavitve vedenja pri prekinitvah" diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 8309fe9a23e..f3b912d63d6 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -93,6 +93,8 @@ "Mesazhet SMS" "Mesazhet e postës zanore" "Telefonata me Wi-Fi" + + "Homologu yt kërkoi modalitet \"TTY\" të plotë" "Homologu kërkoi modalitet \"TTY\" të llojit \"HCO\"" "Homologu yt kërkoi modalitet \"TTY\" të llojit \"VCO\"" @@ -238,7 +240,8 @@ "Cilësimet" "Ndihma" "Ndihma zanore" - "Kyç" + + "999+" "Njoftim i ri" "Tastiera virtuale" @@ -417,10 +420,8 @@ "Lejon aplikacionin të hyjë në funksionet telefonike të pajisjes. Kjo leje i mundëson aplikacionit të përcaktojë numrin e telefonit dhe ID-të e pajisjes, nëse një telefonatë është aktive apo nëse numri në distancë është i lidhur me një telefonatë." "kalon telefonatat përmes sistemit" "Lejon që aplikacioni të kalojë telefonatat përmes sistemit për të përmirësuar përvojën e telefonatës." - - - - + "vazhdo një telefonatë nga një aplikacion tjetër" + "Lejon që aplikacioni të vazhdojë një telefonatë që është nisur në një aplikacion tjetër." "lexo numrat e telefonit" "Lejon që aplikacioni të ketë qasje te numrat e telefonit të pajisjes." "parandalo kalimin e tabletit në fjetje" @@ -499,6 +500,8 @@ "Keni bërë shumë tentativa. Provo përsëri më vonë." "Shumë përpjekje. Sensori i gjurmës së gishtit u çaktivizua." "Provo përsëri." + "Nuk ka asnjë gjurmë gishti të regjistruar." + "Kjo pajisje nuk ka një sensor të gjurmës së gishtit" "Gishti %d" @@ -825,6 +828,8 @@ "Këshillë! Trokit dy herë për të zmadhuar dhe zvogëluar." "Plotësim automatik" "Konfiguro plotësuesin automatik" + + " " "$1$2$3" ", " @@ -997,12 +1002,9 @@ "Hap" "Mesazh" "Shto" - - - - - - + "Shiko" + "Orari" + "Pjesë muzikore" "Hapësira ruajtëse po mbaron" "Disa funksione të sistemit mund të mos punojnë" "Nuk ka hapësirë të mjaftueshme ruajtjeje për sistemin. Sigurohu që të kesh 250 MB hapësirë të lirë dhe pastaj të rifillosh." @@ -1128,8 +1130,7 @@ Rrjet i hapur Wi-Fi në përdorim "Lidhu me rrjetin e hapur Wi‑Fi" - - + "Lidhu me rrjetin Wi‑Fi të operatorit" "Po lidhet me rrjetin e hapur Wi‑Fi" "Lidhur me rrjetin e hapur Wi‑Fi" "Nuk mund të lidhet me rrjetin Wi‑Fi" @@ -1200,9 +1201,12 @@ "Karta SIM u shtua" "Rinise pajisjen për të pasur qasje në rrjetin celular." "Rifillo" - "Që karta e re SIM të funksionojë siç duhet, duhet të instalosh dhe të hapësh një aplikacion nga operatori yt." - "MERR APLIKACIONIN" - "JO TANI" + + + + + + "Është futur kartë e re SIM" "Trokit për ta konfiguruar" "Cakto kohën" @@ -1214,13 +1218,15 @@ "Nuk kërkohen leje" "kjo mund të të kushtojë para" "Në rregull" - "Kjo pajisje ngarkohet me USB" - "Pajisja e lidhur furnizohet me enrgji me USB" - "USB për transferimin e skedarëve" - "USB për transferimin e fotografive" - "USB për MIDI" - "U lidh me një ndihmës USB-je" + "Kjo pajisje po ngarkohet nëpërmjet USB-së" + "Pajisja e lidhur po ngarkohet nëpërmjet USB-së" + "Transferimi i skedarëve nëpërmjet USB-së u aktivizua" + "PTP nëpërmjet USB-së u aktivizua" + "Ndarja e internetit nëpërmjet USB-së u aktivizua" + "MIDI nëpërmjet USB-së u aktivizua" + "Modaliteti i aksesorit me USB u aktivizua" "Trokit për më shumë opsione." + "Pajisja e lidhur po ngarkohet. Trokit për opsione të tjera." "U zbulua aksesor i audios analoge" "Pajisja e bashkuar nuk është e pajtueshme me këtë telefon. Trokit për të mësuar më shumë." "Korrigjuesi i USB-së i lidhur" @@ -1659,9 +1665,6 @@ "Puna %1$s" "%1$s i dytë i punës" "%1$s i tretë i punës" - "Për të hequr gozhdimin e ekranit, prek dhe mbaj butonat \"Prapa\" dhe \"Përmbledhja\"." - "Ekrani u gozhdua" - "Ekrani u hoq nga gozhdimi" "Zhgozhdimi kërkon PIN-in" "Kërko model shkyçjeje para heqjes së gozhdimit" "Kërko fjalëkalim para heqjes nga gozhdimi." @@ -1758,10 +1761,8 @@ "Të aktivizohet profili i punës?" "Aplikacionet e punës, njoftimet, të dhënat e tua dhe funksionet e tjera të profilit të punës do të aktivizohen" "Aktivizo" - - - - + "Ky aplikacion është ndërtuar për një version më të vjetër të Android dhe mund të mos funksionojë mirë. Provo të kontrollosh për përditësime ose kontakto me zhvilluesin." + "Kliko për përditësim" "Ke mesazhe të reja" "Hap aplikacionin SMS për ta parë" "Disa funksione mund të jenë të kufizuara" @@ -1828,17 +1829,17 @@ "Telefoni nuk lejohet për zërin" "Dritare kërcyese" "+ %1$d" - "Kjo shkurtore kërkon aplikacionin më të fundit" + "Versioni i aplikacionit u ul ose nuk është në përputhje me këtë shkurtore" "Nuk mund të restaurohej shkurtorja sepse aplikacioni nuk mbështet rezervimin dhe restaurimin" "Nuk mund të restaurohej shkurtorja për shkak të mospërputhjes së nënshkrimit të aplikacionit" "Nuk mund të restaurohej shkurtorja" "Shkurtorja është çaktivizuar" - - - - - - + "ÇINSTALO" + "HAPE GJITHSESI" + "U gjet aplikacion i dëmshëm" "%1$s dëshiron të shfaqë pjesë të %2$s" "Modifiko" + "Ndryshimet e sistemit" + "\"Mos shqetëso\" ka ndryshuar" + "Trokit për të kontrolluar cilësimet e sjelljes për ndërprerjet" diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 3dfebf5b82d..ced2b512550 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -94,6 +94,7 @@ "SMS-ови" "Поруке говорне поште" "Позивање преко Wi-Fi мреже" + "Статус SIM-а" "Корисник захтева ПОТПУН режим TTY" "Корисник захтева ПРЕНОС ЗВУКА за режим TTY" "Корисник захтева ПРЕНОС ГЛАСА за режим TTY" @@ -241,7 +242,7 @@ "Подешавања" "Помоћ" "Гласовна помоћ" - "Закључај" + "Закључавање" "999+" "Ново обавештење" "Виртуелна тастатура" @@ -267,10 +268,8 @@ "%1$s, %2$s" "Безбедни режим" "Android систем" - - - - + "Пређи на лични профил" + "Пређи на пословни профил" "Контакти" "приступи контактима" "Дозволите да <b>%1$s</b> приступа контактима" @@ -422,10 +421,8 @@ "Дозвољава апликацији да приступа функцијама телефона на уређају. Ова дозвола омогућава апликацији да утврди број телефона и ИД-ове уређаја, затим да ли је позив активан, као и број даљинског уређаја са којим је успостављен позив." "преусмеравање позива преко система" "Дозвољава апликацији да преусмерава позиве преко система да би побољшала доживљај позивања." - - - - + "настави позив у другој апликацији" + "Дозвољава апликацији да настави позив који је започет у другој апликацији." "читање бројева телефона" "Дозвољава апликацији да приступа бројевима телефона на уређају." "спречавање преласка таблета у стање спавања" @@ -500,11 +497,12 @@ "Није могуће сачувати отисак прста. Уклоните неки од постојећих отисака прстију." "Временско ограничење за отисак прста је истекло. Пробајте поново." "Радња са отиском прста је отказана." - - + "Корисник је отказао радњу са отиском прста." "Превише покушаја. Пробајте поново касније." "Превише покушаја. Сензор за отисак прста је онемогућен." "Пробајте поново." + "Није регистрован ниједан отисак прста." + "Овај уређај нема сензор за отисак прста" "Прст %d" @@ -831,6 +829,7 @@ "Савет: Додирните двапут да бисте увећали и умањили приказ." "Аутом. поп." "Подеш. аут. поп." + "Аутоматско попуњавање" " " "$1$2$3" ", " @@ -1020,18 +1019,15 @@ "Отвори" "Пошаљи SMS" "Додај" - - - - - - + "Прикажи" + "Закажи" + "Прати" "Меморијски простор је на измаку" "Неке системске функције можда не функционишу" "Нема довољно меморијског простора за систем. Уверите се да имате 250 MB слободног простора и поново покрените." "Апликација %1$s је покренута" "Додирните за више информација или заустављање апликације." - "Потврди" + "У реду" "Откажи" "Потврди" "Откажи" @@ -1153,8 +1149,7 @@ Отворене Wi-Fi мреже су доступне "Повежите се са отвореном Wi‑Fi мрежом" - - + "Повежите се на Wi-Fi мрежу мобилног оператера" "Повезујете се са отвореном Wi‑Fi мрежом" "Повезали сте се са Wi‑Fi мрежом" "Повезивање са Wi‑Fi мрежом није успело" @@ -1224,9 +1219,9 @@ "SIM картица је додата" "Рестартујте уређај да бисте могли да приступите мобилној мрежи." "Поново покрени" - "Да би нова SIM картица правилно функционисала, треба да инсталирате и отворите апликацију свог мобилног оператера." - "ПРЕУЗМИ АПЛИКАЦИЈУ" - "НЕ САДА" + "Активирајте мобилну услугу" + "Преузмите апликацију мобилног оператера да бисте активирали нови SIM" + "Преузмите апликацију" "Нова SIM картица је уметнута" "Додирните за подешавање" "Подешавање времена" @@ -1238,13 +1233,15 @@ "Није потребна ниједна дозвола" "ово ће вам можда бити наплаћено" "Потврди" - "USB пуни овај уређај" - "USB снабдева енергијом прикључени уређај" - "USB за пренос датотека" - "USB за пренос слика" - "USB за MIDI" - "Повезано са USB додатком" + "Овај уређај се пуни преко USB-а" + "Повезани уређај се пуни преко USB-а" + "USB пренос датотека је укључен" + "Режим PTP преко USB-а је укључен" + "USB привезивање је укључено" + "Режим MIDI преко USB-а је укључен" + "Режим USB додатка је укључен" "Додирните за још опција." + "Повезани уређај се пуни. Додирните за још опција." "Откривена је аналогна додатна опрема за аудио садржај" "Прикључени уређај није компатибилан са овим телефоном. Додирните да бисте сазнали више." "Отклањање грешака са USB-а је омогућено" @@ -1686,9 +1683,6 @@ "%1$s на послу" "2. пословни %1$s" "3. пословни имејл %1$s" - "Да бисте откачили овај екран, додирните и задржите дугмад Назад и Преглед" - "Екран је закачен" - "Екран је откачен" "Тражи PIN пре откачињања" "Тражи шаблон за откључавање пре откачињања" "Тражи лозинку пре откачињања" @@ -1791,15 +1785,11 @@ "Сви језици" "Сви региони" "Претражи" - - - - + "Да укључимо профил за Work?" + "Укључиће се пословне апликације, обавештења, подаци и друге функције профила за Work" "Укључи" - - - - + "Ова апликација је направљена за старију верзију Android-а, па можда неће радити исправно. Потражите ажурирања или контактирајте програмера." + "Потражи ажурирање" "Имате нове поруке" "Отворите апликацију за SMS да бисте прегледали" "Неке функције су можда ограничене" @@ -1867,17 +1857,17 @@ "Телефон није прилагођен за гласовне услуге" "Искачући прозор" "и још %1$d" - "Ова пречица захтева најновију апликацију" + "Апликација је враћена на старију верзију или није компатибилна са овом пречицом" "Враћање пречице није успело јер апликација не подржава прављење резервне копије и враћање" "Враћање пречице није успело јер се потписи апликација не подударају" "Враћање пречице није успело" "Пречица је онемогућена" - - - - - - + "ДЕИНСТАЛИРАЈ" + "ИПАК ОТВОРИ" + "Откривена је штетна апликација" "Апликација %1$s жели да приказује исечке из апликације %2$s" "Измени" + "Системске промене" + "Режим Не узнемиравај је промењен" + "Додирните да бисте проверили да ли подешавања понашања обухватају прекиде" diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index fee1a32eddb..be9e3dd230c 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -93,6 +93,8 @@ "Sms" "Röstmeddelanden" "Wi-Fi-samtal" + + "Peer-enheten begärde texttelefonläget FULL" "Peer-enheten begärde texttelefonläget HCO" "Peer-enheten begärde texttelefonläget VCO" @@ -238,7 +240,8 @@ "Inställningar" "Hjälp" "Voice Assist" - "Ange låsning" + + "999+" "Ny avisering" "Virtuellt tangentbord" @@ -264,10 +267,8 @@ "%1$s, %2$s" "Säkert läge" "Android-system" - - - - + "Byt till personlig profil" + "Byt till jobbprofilen" "Kontakter" "få tillgång till dina kontakter" "Ge <b>%1$s</b> åtkomstbehörighet till dina kontakter" @@ -419,10 +420,8 @@ "Tillåter att appen kommer åt enhetens telefonfunktioner. Med den här behörigheten tillåts appen att identifiera mobilens telefonnummer och enhets-ID, om ett samtal pågår och vilket nummer samtalet är kopplat till." "dirigera samtal via systemet" "Appen tillåts att dirigera samtal via systemet för att förbättra samtalsupplevelsen." - - - - + "fortsätta ett samtal från en annan app" + "Tillåter att appen fortsätter ett samtal som har startats i en annan app." "läsa telefonnummer" "Appen beviljas åtkomst till enhetens telefonnummer." "förhindra att surfplattan går in i viloläge" @@ -497,11 +496,12 @@ "Fingeravtrycket kan inte lagras. Ta bort ett befintligt fingeravtryck." "Tidsgränsen för fingeravtrycket har uppnåtts. Försök igen." "Fingeravtrycksåtgärden avbröts." - - + "Fingeravtrycksåtgärden avbröts av användaren." "Du har gjort för många försök. Försök igen senare." "Du har försökt för många gånger. Fingeravtryckssensorn har inaktiverats." "Försök igen." + "Inga fingeravtryck har registrerats." + "Enheten har ingen fingeravtryckssensor" "Finger %d" @@ -828,6 +828,8 @@ "Tips! Dubbelknacka om du vill zooma in eller ut." "Autofyll" "Ange Autofyll" + + " " "$1$2$3" ", " @@ -1000,12 +1002,9 @@ "Öppna" "Sms:a" "Lägg till" - - - - - - + "Visa" + "Schema" + "Spår" "Lagringsutrymmet börjar ta slut" "Det kan hända att vissa systemfunktioner inte fungerar" "Det finns inte tillräckligt med utrymme för systemet. Kontrollera att du har ett lagringsutrymme på minst 250 MB och starta om." @@ -1131,8 +1130,7 @@ Öppet Wi-Fi-nätverk är tillgängligt "Anslut till ett öppet Wi-Fi-nätverk" - - + "Anslut till operatörens Wi-Fi-nätverk" "Ansluter till ett öppet Wi-Fi-nätverk" "Ansluten till Wi-Fi-nätverket" "Det gick inte att ansluta till Wi‑Fi-nätverket" @@ -1202,9 +1200,12 @@ "SIM-kort lades till" "Du måste starta om enheten för att ansluta till det mobila nätverket." "Starta om" - "Du måste installera och öppna en app från operatören om SIM-kortet ska fungera korrekt." - "HÄMTA APPEN" - "INTE NU" + + + + + + "Nytt SIM-kort har satts in" "Tryck om du vill konfigurera" "Ange tid" @@ -1216,13 +1217,15 @@ "Inga behörigheter krävs" "detta kan kosta pengar" "OK" - "Enheten laddas via USB" - "En ansluten enhet strömförsörjs via USB" - "USB för överföring av filer" - "USB för överföring av foton" - "USB för MIDI" - "Ansluten till ett USB-tillbehör" + "Enheten laddas via USB" + "Den anslutna enheten laddas via USB" + "Filöverföring via USB har aktiverats" + "PTP via USB har aktiverats" + "Internetdelning via USB har aktiverats" + "MIDI via USB har aktiverats" + "Läget för USB-tillbehör har aktiverats" "Tryck för fler alternativ." + "Den anslutna enheten laddas. Tryck om du vill ha fler alternativ." "Ett tillbehör med analog ljudutgång hittades" "Den anslutna enheten är inte kompatibel med mobilen. Tryck här om du vill veta mer." "USB-felsökning ansluten" @@ -1661,9 +1664,6 @@ "%1$s för arbetet" "Andra %1$s för jobbet" "Tredje %1$s för jobbet" - "Om du vill lossa skärmen trycker du länge på knapparna Tillbaka och Översikt" - "Skärmen är fäst" - "Skärmen är inte längre fäst" "Be om pinkod innan skärmen slutar fästas" "Be om upplåsningsmönster innan skärmen slutar fästas" "Be om lösenord innan skärmen slutar fästas" @@ -1757,15 +1757,11 @@ "Alla språk" "Alla regioner" "Söka" - - - - + "Vill du aktivera jobbprofilen?" + "Jobbappar, aviseringar, data och andra funktioner i jobbprofilen aktiveras" "Aktivera" - - - - + "Appen har utvecklats för en äldre version av Android och kanske inte fungerar som den ska. Testa att söka efter uppdateringar eller kontakta utvecklaren." + "Sök efter uppdateringar" "Du har nya meddelanden" "Öppna sms-appen och visa meddelandet" "Vissa funktioner är begränsade" @@ -1832,17 +1828,17 @@ "Telefon tillåts inte för röst" "popup-fönster" "%1$d till" - "Den här genvägen kräver den senaste versionen av appen" + "Versionen av appen är nedgraderad eller så är den inte kompatibel med genvägen" "Det gick inte att återställa genvägen eftersom appen inte har stöd för säkerhetskopiering och återställning" "Det gick inte att återställa genvägen eftersom appens signatur inte stämmer" "Det gick inte att återställa genvägen" "Genvägen är inaktiverad" - - - - - - + "AVINSTALLERA" + "ÖPPNA ÄNDÅ" + "En skadlig app har upptäckts" "%1$s vill kunna visa bitar av %2$s" "Redigera" + "Systemändringar" + "Stör ej har ändrats" + "Tryck om du vill kontrollera avbrott i inställningarna" diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 66baaf4ecd3..1c9ae55a406 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -93,6 +93,7 @@ "Ujumbe wa SMS" "Ujumbe wa sauti" "Kupiga simu kupitia Wi-Fi" + "Hali ya SIM" "Hali ya TTY iliyoombwa na mtandao mwenza KAMILI" "Hali ya TTY iliyoombwa na mtandao mwenza HCO" "Hali ya TTY iliyoombwa na mtandao mwenza VCO" @@ -236,7 +237,7 @@ "Mipangilio" "Mapendekezo" "Usaidizi wa Sauti" - "Weka kipengele cha kufunga" + "Funga" "999+" "Arifa mpya" "Kibodi pepe" @@ -495,10 +496,8 @@ "Majaribio mengi mno. Jaribu tena baadaye." "Majaribio mengi mno. Kitambua alama ya kidole kimezimwa." "Jaribu tena." - - - - + "Hakuna alama za vidole zilizojumuishwa." + "Kifaa hiki hakina kitambua alama ya kidole" "Kitambulisho %d" @@ -825,6 +824,7 @@ "Kidokezo: Gusa mara mbili ili kukuza ndani na nje." "Kujaza kiotomatiki" "Weka uwezo wa kujaza kiotomatiki" + "Kujaza Kiotomatiki" " " "$1$2$3" ", " @@ -1195,9 +1195,9 @@ "SIM kadi imeongezwa" "Anzisha upya kifaa chako ili kufikia mtandao wa simu." "Anza upya" - "Ili SIM yako mpya ifanye kazi vizuri, utahitaji kusakinisha na kufungua programu kutoka kwa mtoa huduma wako." - "PATA PROGRAMU" - "SIYO SASA" + "Washa huduma ya simu za mkononi" + "Pakua programu ya mtoa huduma ili uwashe SIM yako mpya" + "Pakua programu" "SIM mpya imewekwa" "Gusa ili uiweke" "Weka saa" @@ -1209,23 +1209,15 @@ "Hakuna vibali vinavyohitajika" "huenda hii ikakugharimu pesa" "Sawa" - - - - - - - - - - - - - - + "Unachaji kifaa hiki kupitia USB" + "Inachaji kifaa kilichounganishwa kupitia USB" + "Umewasha hali ya uhamishaji wa faili kupitia USB" + "Umewasha hali ya PTP kupitia USB" + "Umewasha hali ya kusambaza mtandao ukitumia USB" + "Umewasha hali ya MIDI kupitia USB" + "Umewasha hali ya vifaa vya USB" "Gusa ili upate chaguo zaidi." - - + "Inachaji kifaa kilichounganishwa. Gusa ili upate chaguo zaidi." "Imetambua kifaa cha sauti ya analogi" "Kifaa ulichoambatisha hakitumiki kwenye simu hii. Gusa ili upate maelezo zaidi." "Utatuaji wa USB umeunganishwa" @@ -1828,8 +1820,7 @@ "Simu hairuhusiwi katika huduma ya sauti" "Dirisha Ibukizi" "+ %1$d" - - + "Toleo la programu limeshushwa kiwango au halioani na njia hii ya mkato" "Imeshindwa kurejesha njia ya mkato kwa sababu programu haitumii kipengele cha hifadhi rudufu na kurejesha upya" "Imeshindwa kurejesha njia ya mkato kwa sababu ufunguo wako wa kuambatisha cheti kwenye programu haulingani" "Imeshindwa kurejesha njia ya mkato" @@ -1839,4 +1830,7 @@ "Imetambua programu hatari" "%1$s inataka kuonyesha vipengee %2$s" "Badilisha" + "Mabadiliko kwenye mfumo" + "Kipengele cha Usinisumbue kimebadilishwa" + "Gusa ili uangilie mipangilio ya hali ya ukatizaji" diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 5afa7118614..f912b6d345d 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -93,6 +93,8 @@ "SMS செய்திகள்" "குரலஞ்சல் செய்திகள்" "வைஃபை அழைப்பு" + + "TTY Mode FULLஐ இணைச் செயல்பாடு கோரியது" "TTY Mode HCOஐ இணைச் செயல்பாடு கோரியது" "TTY Mode VCOஐ இணைச் செயல்பாடு கோரியது" @@ -238,7 +240,8 @@ "அமைப்பு" "உதவி" "குரல் உதவி" - "பூட்டினை அமை" + + "999+" "புதிய அறிவிப்பு" "விர்ச்சுவல் விசைப்பலகை" @@ -497,10 +500,8 @@ "அதிகமான முயற்சிகள். பிறகு முயற்சிக்கவும்." "பலமுறை முயன்றுவிட்டீர்கள். கைரேகை சென்சார் முடக்கப்பட்டது." "மீண்டும் முயற்சிக்கவும்." - - - - + "கைரேகைப் பதிவுகள் எதுவும் இல்லை." + "இந்தச் சாதனத்தில் கைரேகை உணர்வி இல்லை" "கைரேகை %d" @@ -827,6 +828,8 @@ "உதவிக்குறிப்பு: அளவைப் பெரிதாக்க மற்றும் குறைக்க இருமுறைத் தட்டவும்." "தன்னிரப்பி" "தன்னிரப்பியை அமை" + + " " "$1$2$3" ", " @@ -1198,9 +1201,12 @@ "சிம் கார்டு சேர்க்கப்பட்டது" "மொபைல் நெட்வொர்க்கை அணுக உங்கள் சாதனத்தை மறுதொடக்கம் செய்யவும்." "மீண்டும் தொடங்கு" - "புதிய சிம் சரியாக இயங்குவதற்கு, நீங்கள் பயன்படுத்தும் மொபைல் நிறுவனத்திலிருந்து ஒரு பயன்பாட்டை நிறுவி, திறக்க வேண்டும்." - "பயன்பாட்டைப் பெறுக" - "இப்போது வேண்டாம்" + + + + + + "புதிய சிம் செருகப்பட்டது" "அமைக்க, தட்டவும்" "நேரத்தை அமை" @@ -1212,23 +1218,15 @@ "அனுமதிகள் தேவையில்லை" "இதனால் நீங்கள் கட்டணம் செலுத்த வேண்டியிருக்கலாம்" "சரி" - - - - - - - - - - - - - - + "USB மூலமாக இந்தச் சாதனம் சார்ஜ் ஆகிறது" + "USB மூலமாக இணைக்கப்பட்ட சாதனம் சார்ஜ் ஆகிறது" + "USB மூலமாக ஃபைல் பரிமாற்றம் ஆன் செய்யப்பட்டது" + "USB மூலமாக PTP பயன்முறை ஆன் செய்யப்பட்டது" + "USB இணைப்பு முறை ஆன் செய்யப்பட்டது" + "USB மூலமாக MIDI பயன்முறை ஆன் செய்யப்பட்டது" + "USB கருவிப் பயன்முறை ஆன் செய்யப்பட்டுள்ளது" "மேலும் விருப்பங்களுக்கு, தட்டவும்." - - + "இணைக்கப்பட்ட சாதனத்தைச் சார்ஜ் செய்கிறது. கூடுதல் விருப்பங்களுக்கு, தட்டவும்." "அனலாக் ஆடியோ துணைக்கருவி கண்டறியப்பட்டது" "இணைத்துள்ள சாதனமானது இந்த மொபைலுடன் இணங்கவில்லை. மேலும் அறிய, தட்டவும்." "USB பிழைத் திருத்தம் இணைக்கப்பட்டது" @@ -1831,8 +1829,7 @@ "குரல் அழைப்பை மேற்கொள்ள இந்த ஃபோனுக்கு அனுமதி இல்லை" "பாப்அப் சாளரம்" "+ %1$d" - - + "பயன்பாடு முந்தையப் பதிப்பிற்கு மாற்றப்பட்டது, அல்லது இந்தக் குறுக்குவழி வேலை செய்யவில்லை" "காப்புப் பிரதி மற்றும் மீட்டமைவைப் பயன்பாடு ஆதரிக்காத காரணத்தால், ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை" "பயன்பாட்டுச் சான்றுகள் பொருந்தாத காரணத்தினால், ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை" "ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை" @@ -1842,4 +1839,7 @@ "தீங்கிழைக்கும் பயன்பாடு உள்ளது" "%2$s பயன்பாட்டின் விழிப்பூட்டல்களைக் காண்பிக்க, %1$s அனுமதி கேட்கிறது" "திருத்து" + "சிஸ்டம் மாற்றங்கள்" + "தொந்தரவு செய்ய வேண்டாம் அமைப்புகள் மாற்றப்பட்டன" + "உங்களுக்கு வரும் அறிவிப்புக் குறுக்கீடுகளின் செயல்பாட்டு அமைப்புகளைச் சரிபார்க்க, தட்டவும்" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index a08c483eee2..b123224bc5e 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -93,6 +93,8 @@ "SMS సందేశాలు" "వాయిస్ మెయిల్ సందేశాలు" "Wi-Fi కాలింగ్" + + "అవతలి వారు FULL TTY మోడ్‌ని అభ్యర్థించారు" "అవతలి వారు HCO TTY మోడ్‌ని అభ్యర్థించారు" "అవతలి వారు VCO TTY మోడ్‌ని అభ్యర్థించారు" @@ -238,7 +240,8 @@ "సెట్టింగ్‌లు" "సహాయం" "వాయిస్ అసిస్టెంట్" - "లాక్‌డౌన్ నమోదు చేయండి" + + "999+" "కొత్త నోటిఫికేషన్" "వర్చువల్ కీబోర్డ్" @@ -497,10 +500,8 @@ "చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి." "అనేకసార్లు ప్రయత్నించారు. వేలిముద్ర సెన్సార్ నిలిపివేయబడింది." "మళ్లీ ప్రయత్నించండి." - - - - + "వేలిముద్రలు నమోదు చేయబడలేదు." + "ఈ పరికరంలో వేలిముద్ర సెన్సార్ లేదు" "వేలు %d" @@ -827,6 +828,8 @@ "చిట్కా: దగ్గరకు మరియు దూరానికి జూమ్ చేయడానికి రెండు సార్లు నొక్కండి." "స్వీయ పూరింపు" "స్వీయ పూరణను సెటప్ చేయండి" + + " " "$1$2$3" ", " @@ -1198,9 +1201,12 @@ "సిమ్ కార్డు జోడించబడింది" "మొబైల్ నెట్‌వర్క్‌ను యాక్సెస్ చేయడానికి మీ పరికరాన్ని పునఃప్రారంభించండి." "పునఃప్రారంభించు" - "మీ SIM సక్రమంగా పని చేస్తుండటానికి, మీరు మీ క్యారియర్ నుండి ఒక అనువర్తనాన్ని ఇన్‌స్టాల్ చేసుకొని, తెరవాలి." - "అనువర్తనాన్ని పొందండి" - "ఇప్పుడు కాదు" + + + + + + "కొత్త SIM చొప్పించారు" "దీన్ని సెటప్ చేయడానికి నొక్కండి" "సమయాన్ని సెట్ చేయండి" @@ -1212,23 +1218,15 @@ "అనుమతులు అవసరం లేదు" "దీనికి మీకు డబ్బు ఖర్చు కావచ్చు" "సరే" - - - - - - - - - - - - - - + "USB ద్వారా ఈ పరికరాన్ని ఛార్జ్ చేస్తోంది" + "USB ద్వారా కనెక్ట్ చేయబడిన పరికరాన్ని ఛార్జ్ చేస్తోంది" + "USB ఫైల్ బదిలీ ఆన్ చేయబడింది" + "USB ద్వారా PTP ఆన్ చేయబడింది" + "USB టెథెరింగ్ ఆన్ చేయబడింది" + "USB ద్వారా MIDI ఆన్ చేయబడింది" + "USB ఉపకరణ మోడ్ ఆన్ చేయబడింది" "మరిన్ని ఎంపికల కోసం నొక్కండి." - - + "కనెక్ట్ చేయబడిన పరికరాన్ని ఛార్జ్ చేస్తోంది. మరిన్ని ఎంపికల కోసం నొక్కండి." "అనలాగ్ ఆడియో ఉపకరణం కనుగొనబడింది" "జోడించిన పరికరం ఈ ఫోన్‌కు అనుకూలంగా లేదు. మరింత తెలుసుకోవడానికి నొక్కండి." "USB డీబగ్గింగ్ కనెక్ట్ చేయబడింది" @@ -1831,8 +1829,7 @@ "వాయిస్ కోసం ఫోన్ అనుమతించబడదు" "పాప్అప్ విండో" "+ %1$d" - - + "యాప్ వెర్షన్ డౌన్‌గ్రేడ్ చేయబడింది లేదా ఈ సత్వరమార్గంతో అనుకూలంగా లేదు" "బ్యాకప్ మరియు పునరుద్ధరణకు యాప్ మద్దతు ఇవ్వని కారణంగా సత్వరమార్గాన్ని పునరుద్ధరించడం సాధ్యపడలేదు" "యాప్ సంతకం సరిపోలని కారణంగా సత్వరమార్గాన్ని పునరుద్ధరించడం సాధ్యపడలేదు" "సత్వరమార్గాన్ని పునరుద్ధరించడం సాధ్యపడలేదు" @@ -1842,4 +1839,7 @@ "హానికరమైన యాప్ గుర్తించబడింది" "%1$s %2$s స్లైస్‌లను చూపించాలనుకుంటోంది" "సవరించు" + "సిస్టమ్ మార్పులు" + "అంతరాయం కలిగించవద్దు మార్చబడింది" + "అంతరాయాల కోసం మీ ప్రవర్తన సెట్టింగ్‌లను తనిఖీ చేయడానికి నొక్కండి" diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 2d8509415ef..8444ff0496b 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -93,6 +93,7 @@ "ข้อความ SMS" "ข้อความเสียง" "การโทรผ่าน Wi-Fi" + "สถานะซิม" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"เต็ม\"" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"HCO\"" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"VCO\"" @@ -238,7 +239,7 @@ "การตั้งค่า" "ผู้ช่วย" "ตัวช่วยเสียง" - "ป้อนการปิดล็อก" + "ปิดล็อก" "999+" "การแจ้งเตือนใหม่" "แป้นพิมพ์เสมือน" @@ -264,10 +265,8 @@ "%1$s, %2$s" "โหมดปลอดภัย" "ระบบ Android" - - - - + "สลับไปใช้โปรไฟล์ส่วนตัว" + "สลับไปใช้โปรไฟล์งาน" "รายชื่อติดต่อ" "เข้าถึงรายชื่อติดต่อ" "อนุญาตให้ <b>%1$s</b> เข้าถึงรายชื่อติดต่อของคุณ" @@ -419,10 +418,8 @@ "อนุญาตให้แอปพลิเคชันเข้าถึงฟีเจอร์โทรศัพท์ของอุปกรณ์ การอนุญาตนี้ทำให้แอปพลิเคชันสามารถตรวจสอบหมายเลขโทรศัพท์และรหัสอุปกรณ์ ตรวจสอบว่ามีการโทรที่ทำงานอยู่หรือไม่ และตรวจสอบหมายเลขระยะไกลที่เชื่อมต่อด้วยการโทร" "กำหนดเส้นทางการโทรผ่านระบบ" "อนุญาตให้แอปกำหนดเส้นทางการโทรของแอปผ่านระบบเพื่อปรับปรุงประสบการณ์ในการโทร" - - - - + "ต่อสายจากแอปอื่น" + "อนุญาตให้แอปต่อสายที่เริ่มจากแอปอื่น" "อ่านหมายเลขโทรศัพท์" "อนุญาตให้แอปเข้าถึงหมายเลขโทรศัพท์ของอุปกรณ์นี้" "ป้องกันไม่ให้แท็บเล็ตเข้าสู่โหมดสลีป" @@ -497,11 +494,12 @@ "ไม่สามารถเก็บลายนิ้วมือได้ โปรดนำลายนิ้วมือที่มีอยู่ออก" "หมดเวลาใช้ลายนิ้วมือแล้ว โปรดลองอีกครั้ง" "ยกเลิกการทำงานของลายนิ้วมือ" - - + "ผู้ใช้ยกเลิกการทำงานของลายนิ้วมือ" "ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง" "ลองหลายครั้งเกินไป ปิดใช้เซ็นเซอร์ลายนิ้วมือแล้ว" "ลองอีกครั้ง" + "ไม่มีลายนิ้วมือที่ลงทะเบียน" + "อุปกรณ์นี้ไม่มีเซ็นเซอร์ลายนิ้วมือ" "นิ้ว %d" @@ -828,6 +826,7 @@ "เคล็ดลับ: แตะสองครั้งเพื่อขยายและย่อ" "ป้อนอัตโนมัติ" "ค่าป้อนอัตโนมัติ" + "ป้อนอัตโนมัติ" " " "$1$2$3" ", " @@ -1000,12 +999,9 @@ "เปิด" "ข้อความ" "เพิ่ม" - - - - - - + "ดู" + "กำหนดการ" + "แทร็ก" "พื้นที่จัดเก็บเหลือน้อย" "บางฟังก์ชันระบบอาจไม่ทำงาน" "พื้นที่เก็บข้อมูลไม่เพียงพอสำหรับระบบ โปรดตรวจสอบว่าคุณมีพื้นที่ว่าง 250 MB แล้วรีสตาร์ท" @@ -1131,8 +1127,7 @@ มี 1 เครือข่าย Wi-Fi สาธารณะที่ใช้งานได้ "เชื่อมต่อเครือข่าย Wi‑Fi แบบเปิด" - - + "เชื่อมต่อเครือข่าย Wi‑Fi ของผู้ให้บริการ" "กำลังเชื่อมต่อเครือข่าย Wi‑Fi แบบเปิด" "เชื่อมต่อเครือข่าย Wi-Fi แล้ว" "ไม่สามารถเชื่อมต่อเครือข่าย Wi‑Fi" @@ -1202,9 +1197,9 @@ "เพิ่มซิมการ์ดแล้ว" "รีสตาร์ทอุปกรณ์ของคุณเพื่อเข้าถึงเครือข่ายมือถือ" "รีสตาร์ท" - "เพื่อให้ซิมใหม่ทำงานได้อย่างถูกต้อง คุณจำเป็นต้องติดตั้งและเปิดแอปจากผู้ให้บริการของคุณ" - "ดาวน์โหลดแอป" - "ไว้ทีหลัง" + "เปิดใช้งานบริการมือถือ" + "ดาวน์โหลดแอปผู้ให้บริการเพื่อเปิดใช้งานซิมอันใหม่" + "ดาวน์โหลดแอป" "ใส่ซิมใหม่แล้ว" "แตะเพื่อตั้งค่า" "ตั้งเวลา" @@ -1216,13 +1211,15 @@ "ไม่ต้องการการอนุญาต" "รายการนี้อาจมีการเรียกเก็บเงิน" "ตกลง" - "กำลังชาร์จอุปกรณ์นี้ด้วย USB" - "กำลังจ่ายไฟให้อุปกรณ์ที่เชื่อมต่ออยู่ผ่าน USB" - "USB สำหรับการโอนไฟล์" - "USB สำหรับการโอนรูปภาพ" - "USB สำหรับ MIDI" - "เชื่อมต่อกับอุปกรณ์เสริม USB แล้ว" + "กำลังชาร์จอุปกรณ์นี้ผ่าน USB" + "กำลังชาร์จอุปกรณ์ที่เชื่อมต่อผ่าน USB" + "เปิดการถ่ายโอนไฟล์ USB" + "เปิดโหมด PTP ผ่าน USB" + "เปิดการเชื่อมต่ออินเทอร์เน็ตผ่าน USB" + "เปิดโหมด MIDI ผ่าน USB" + "เปิดโหมดอุปกรณ์เสริม USB" "แตะเพื่อดูตัวเลือกเพิ่มเติม" + "กำลังชาร์จอุปกรณ์ที่เชื่อมต่อ แตะเพื่อดูตัวเลือกเพิ่มเติม" "ตรวจพบอุปกรณ์เสริมสำหรับเสียงแบบแอนะล็อก" "อุปกรณ์ที่พ่วงไม่สามารถใช้งานร่วมกับโทรศัพท์นี้ แตะเพื่อเรียนรู้เพิ่มเติม" "เชื่อมต่อการแก้ไขข้อบกพร่องผ่าน USB แล้ว" @@ -1661,9 +1658,6 @@ "%1$sที่ทำงาน" "%1$s งานที่ 2" "%1$s งานที่ 3" - "หากต้องการเลิกตรึงหน้าจอนี้ ให้แตะปุ่ม \"กลับ\" และ \"ภาพรวม\" ค้างไว้" - "ตรึงหน้าจอแล้ว" - "เลิกตรึงหน้าจอแล้ว" "ขอ PIN ก่อนเลิกตรึง" "ขอรูปแบบการปลดล็อกก่อนเลิกตรึง" "ขอรหัสผ่านก่อนเลิกตรึง" @@ -1757,15 +1751,11 @@ "ทุกภาษา" "ภูมิภาคทั้งหมด" "ค้นหา" - - - - + "เปิดโปรไฟล์งานไหม" + "ระบบจะเปิดแอปงาน การแจ้งเตือน ข้อมูล และฟีเจอร์อื่นๆ ในโปรไฟล์งาน" "เปิด" - - - - + "แอปนี้สร้างขึ้นเพื่อ Android เวอร์ชันเก่าและอาจทำงานผิดปกติ โปรดลองตรวจหาการอัปเดตหรือติดต่อนักพัฒนาซอฟต์แวร์" + "ตรวจสอบอัปเดต" "คุณมีข้อความใหม่" "เปิดแอป SMS เพื่อดู" "อาจมีข้อจำกัดในบางฟังก์ชัน" @@ -1832,17 +1822,17 @@ "ไม่อนุญาตให้ใช้โทรศัพท์สำหรับเสียง" "หน้าต่างป๊อปอัป" "+ %1$d" - "ทางลัดนี้ต้องใช้แอปล่าสุด" + "มีการดาวน์เกรดเวอร์ชันของแอปหรือใช้กับทางลัดนี้ไม่ได้" "คืนค่าทางลัดไม่ได้เนื่องจากแอปไม่รองรับการสำรองข้อมูลและคืนค่า" "คืนค่าทางลัดไม่ได้เนื่องจากการลงนามแอปไม่ตรงกัน" "คืนค่าทางลัดไม่ได้" "ปิดใช้ทางลัดแล้ว" - - - - - - + "ถอนการติดตั้ง" + "เปิดต่อไป" + "ตรวจพบแอปที่เป็นอันตราย" "%1$s ต้องการแสดงส่วนต่างๆ ของ %2$s" "แก้ไข" + "การเปลี่ยนแปลงระบบ" + "เปลี่ยน \"ห้ามรบกวน\" แล้ว" + "แตะเพื่อตรวจหาการรบกวนในการตั้งค่าพฤติกรรม" diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index cf185a48112..6c8e47da173 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -93,6 +93,7 @@ "Mga mensaheng SMS" "Mga mensahe sa voicemail" "Pagtawag gamit ang Wi-Fi" + "Status ng SIM" "Hiniling ng peer ang TTY Mode FULL" "Hiniling ng peer ang TTY Mode HCO" "Hiniling ng peer ang TTY Mode VCO" @@ -238,7 +239,7 @@ "Mga Setting" "Tulong" "Voice Assist" - "Mag-lockdown" + "I-lockdown" "999+" "Bagong notification" "Virtual na keyboard" @@ -264,10 +265,8 @@ "%1$s, %2$s" "Safe mode" "Android System" - - - - + "Lumipat sa personal na profile" + "Lumipat sa profile sa trabaho" "Mga Contact" "i-access ang iyong mga contact" "Payagan ang <b>%1$s</b> na i-access ang iyong mga contact" @@ -419,10 +418,8 @@ "Pinapayagan ang app na i-access ang mga tampok ng telepono ng device. Pinapayagan ng pahintulot na ito ang app na tukuyin ang numero ng telepono at mga ID ng device, kung aktibo man ang isang tawag, at ang malayuang numerong ikinonekta ng isang tawag." "iruta ang mga tawag sa pamamagitan ng system" "Pinapayagan ang app na iruta ang mga tawag nito sa pamamagitan ng system upang mapahusay ang karanasan sa pagtawag." - - - - + "ipagpatuloy ang isang tawag mula sa ibang app" + "Pinapayagan ang app na ipagpatuloy ang isang tawag na sinimulan sa ibang app." "basahin ang mga numero ng telepono" "Pinapayagan ang app na i-access ang mga numero ng telepono ng device." "pigilan ang tablet mula sa pag-sleep" @@ -497,11 +494,12 @@ "Hindi maiimbak ang fingerprint. Mangyaring mag-alis ng umiiral nang fingerprint." "Nag-time out ang fingerprint. Subukang muli." "Nakansela ang operasyong ginagamitan ng fingerprint." - - + "Kinansela ng user ang operasyon sa fingerprint." "Masyadong maraming beses sumubok. Subukang muli sa ibang pagkakataon." "Masyadong maraming beses sumubok. Na-disable ang sensor para sa fingerprint." "Subukang muli." + "Walang naka-enroll na fingerprint." + "Walang sensor para sa fingerprint ang device na ito" "Daliri %d" @@ -828,6 +826,7 @@ "Tip: Mag-double tap upang mag-zoom in at out." "Autofill" "I-set up ang Autofill." + "I-autofill" " " "$1$2$3" ", " @@ -1000,12 +999,9 @@ "Buksan" "Padalhan ng Mensahe" "Magdagdag" - - - - - - + "Tingnan" + "Mag-iskedyul" + "Subaybayan" "Nauubusan na ang puwang ng storage" "Maaaring hindi gumana nang tama ang ilang paggana ng system" "Walang sapat na storage para sa system. Tiyaking mayroon kang 250MB na libreng espasyo at i-restart." @@ -1131,8 +1127,7 @@ Available ang mga bukas na Wi-Fi network "Kumonekta sa bukas na Wi‑Fi network" - - + "Kumonekta sa Wi‑Fi network ng carrier" "Kumokonekta sa bukas na Wi‑Fi network" "Nakakonekta sa Wi‑Fi network" "Hindi makakonekta sa Wi‑Fi network" @@ -1202,9 +1197,9 @@ "Idinagdag ang SIM card" "I-restart ang iyong device upang ma-access ang mobile network." "I-restart" - "Upang gumana nang maayos ang bago mong SIM, kakailanganin mong mag-install at magbukas ng app mula sa iyong carrier." - "KUNIN ANG APP" - "HINDI NGAYON" + "I-activate ang serbisyo sa mobile" + "I-download ang carrier app upang ma-activate ang iyong bagong SIM" + "I-download ang app" "Nakalagay na ang bagong SIM" "I-tap upang i-set up ito" "Magtakda ng oras" @@ -1216,13 +1211,15 @@ "Walang mga kinakailangang pahintulot" "maaari itong magdulot ng gastos sa iyo" "OK" - "China-charge sa USB ang device na ito" - "USB ang nagbibigay ng power sa nakakabit na device" - "USB para sa paglipat ng file" - "USB para sa paglipat ng larawan" - "USB para sa MIDI" - "Nakakonekta sa isang accessory ng USB" + "China-charge ang device na ito sa pamamagitan ng USB" + "China-charge ang nakakonektang device sa pamamagitan ng USB" + "Na-on ang paglipat ng USB file" + "Na-on ang PTP sa pamamagitan ng USB" + "Na-on ang pag-tether ng USB" + "Na-on ang MIDI sa pamamagitan ng USB" + "Na-on ang USB accessory mode" "I-tap para sa higit pang mga opsyon." + "China-charge ang nakakonektang device. Mag-tap para sa higit pang opsyon." "May na-detect na analog na audio accessory" "Hindi tugma sa teleponong ito ang naka-attach na device. I-tap upang matuto pa." "Konektado ang debugging ng USB" @@ -1661,9 +1658,6 @@ "%1$s sa Trabaho" "Pangalawang %1$s sa Trabaho" "Pangatlong %1$s sa Trabaho" - "Upang i-unpin ang screen na ito, pindutin nang matagal ang mga button na Bumalik at Pangkalahatang-ideya" - "Naka-pin ang screen" - "Naka-unpin ang screen" "Humingi ng PIN bago mag-unpin" "Humingi ng pattern sa pag-unlock bago mag-unpin" "Humingi ng password bago mag-unpin" @@ -1757,15 +1751,11 @@ "Lahat ng wika" "Lahat ng rehiyon" "Maghanap" - - - - + "I-on ang profile sa trabaho?" + "Mao-on ang iyong mga app sa trabaho, notification, data, at iba pang feature sa profile sa trabaho" "I-on" - - - - + "Ang app na ito ay ginawa para sa mas lumang bersyon ng Android at maaaring hindi gumana nang maayos. Subukang tingnan kung may mga update, o makipag-ugnayan sa developer." + "Tingnan kung may update" "Mayroon kang mga bagong mensahe" "Buksan ang SMS app upang tingnan" "Limitado ilang functionality" @@ -1832,17 +1822,17 @@ "Hindi pinapayagan ang telepono para sa boses" "Window ng Popup" "+ %1$d" - "Kinakailangan ng shortcut na ito ang pinakabagong app" + "Na-downgrade ang bersyon ng app, o hindi ito compatible sa shortcut na ito" "Hindi ma-restore ang shortcut dahil hindi sinusuportahan ng app ang pag-back up at pag-restore" "Hindi ma-restore ang shortcut dahil hindi magkatugma ang signature ng app" "Hindi ma-restore ang shortcut" "Naka-disable ang shortcut" - - - - - - + "I-UNINSTALL" + "BUKSAN PA RIN" + "May na-detect na mapaminsalang app" "Gustong ipakita ng %1$s ang mga slice ng %2$s" "I-edit" + "Mga pagbabago sa system" + "Binago ang Huwag Istorbohin" + "I-tap upang tingnan ang iyong mga setting ng gawi para sa mga pagkaantala" diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 9fea248e004..88583887a2c 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -93,6 +93,8 @@ "SMS mesajları" "Sesli mesajlar" "Kablosuz çağrı" + + "Karşı taraf TTY Modunu TAM yaptı" "Karşı taraf TTY Modunu HCO yaptı" "Karşı taraf TTY Modunu VCO yaptı" @@ -238,7 +240,8 @@ "Ayarlar" "Asist" "Sesli Yardım" - "Tam kilitlemeye geç" + + "999+" "Yeni bildirim" "Sanal klavye" @@ -497,10 +500,8 @@ "Çok fazla deneme yapıldı. Daha sonra tekrar deneyin." "Çok fazla deneme yapıldı. Parmak izi sensörü devre dışı bıraıldı." "Tekrar deneyin." - - - - + "Parmak izi kaydedilmedi." + "Bu cihazda parmak izi sensörü yok" "%d. parmak" @@ -827,6 +828,8 @@ "İpucu: Yakınlaştırmak ve uzaklaştırmak için iki kez dokunun." "Otomatik Doldur" "Otomatik doldurma ayarla" + + " " "$1$2$3" ", " @@ -1197,9 +1200,12 @@ "SIM kart eklendi" "Mobil ağa erişmek için cihazınızı yeniden başlatın." "Yeniden başlat" - "Yeni SIM kartınızın doğru çalışmasını sağlamak için operatörünüzden bir uygulama yüklemeniz ve bu uygulamayı açmanız gerekecektir." - "UYGULAMAYI AL" - "ŞİMDİ DEĞİL" + + + + + + "Yeni SIM kart takıldı" "Kurmak için dokunun" "Saati ayarlayın" @@ -1211,23 +1217,15 @@ "İzin gerektirmez" "bunun için sizden ücret alınabilir" "Tamam" - - - - - - - - - - - - - - + "Bu cihaz USB\'den şarj oluyor" + "Bağlı cihaz USB\'den şarj oluyor" + "USB dosya aktarımı açık" + "USB üzerinden PTP açık" + "USB tethering açık" + "USB üzerinden MIDI açık" + "USB aksesuarı modu açık" "Diğer seçenekler için dokunun." - - + "Bağlı cihaz şarj ediliyor. Diğer seçenekler için dokunun." "Analog ses aksesuarı algılandı" "Takılan cihaz bu telefonla uyumlu değil. Daha fazla bilgi edinmek için dokunun." "USB hata ayıklaması bağlandı" @@ -1796,7 +1794,7 @@ "dakika" "Saati ayarlayın" "Geçerli bir saat girin" - "Zamanı yazın" + "Saati yazın" "Zaman girişi için metin girişi moduna geçin." "Zaman girişi için saat moduna geçin." "Otomatik doldurma seçenekleri" @@ -1830,8 +1828,7 @@ "Ses için telefona izin verilmiyor" "Pop-up Pencere" "+ %1$d" - - + "Uygulama eski sürümüne geçirildi veya bu kısayol ile uyumlu değil" "Uygulama, yedekleme ve geri yüklemeyi desteklemediğinden kısayol geri yüklenemedi" "Uygulama imzası eşleşmediğinden kısayol geri yüklenemedi" "Kısayol geri yüklenemedi" @@ -1841,4 +1838,7 @@ "Zararlı uygulama tespit edildi" "%1$s uygulaması, %2$s dilimlerini göstermek istiyor" "Düzenle" + "Sistem değişiklikleri" + "Rahatsız Etmeyin modu değişti" + "Kesintilerle ilgili davranış ayarlarınızı kontrol etmek için dokunun" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 4ed3790a7f6..b9fba79cf45 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -95,6 +95,7 @@ "SMS-повідомлення" "Повідомлення голосової пошти" "Дзвінки через Wi-Fi" + "Статус SIM-карти" "Пристрій змінив режим TTY на FULL" "Пристрій змінив режим TTY на HCO" "Пристрій змінив режим TTY на VCO" @@ -244,7 +245,7 @@ "Налаштування" "Підказки" "Голос. підказки" - "Введіть код блокування" + "Блокування" "999+" "Нове сповіщення" "Віртуальна клавіатура" @@ -503,10 +504,8 @@ "Забагато спроб. Спробуйте пізніше." "Забагато спроб. Сканер відбитків пальців вимкнено." "Повторіть спробу." - - - - + "Відбитки пальців не зареєстровано." + "На цьому пристрої немає сканера відбитків пальців" "Відбиток пальця %d" @@ -833,6 +832,7 @@ "Порада: двічі торкніться для збільшення чи зменшення." "Автозап." "Налашт.автозап." + "Автозаповнення" " " "$1$2$3" ", " @@ -1098,7 +1098,7 @@ "Додаток %1$s не відповідає" "Процес \"%1$s\" не відповідає" "OK" - "Відгук" + "Звіт" "Чекати" "Сторінка не відповідає.\n\nЗакрити її?" "Програму переадресовано" @@ -1241,9 +1241,9 @@ "SIM-карту додано" "Перезапустіть пристрій, щоб отримати доступ до мобільної мережі." "Перезапуск" - "Щоб ваша нова SIM-карта працювала правильно, установіть і відкрийте додаток від оператора." - "ЗАВАНТАЖИТИ ДОДАТОК" - "НЕ ЗАРАЗ" + "Активувати мобільну службу" + "Завантажити додаток оператора, щоб активувати нову SIM-карту" + "Завантажити додаток" "Вставлено нову SIM-карту" "Торкніться, щоб налаштувати" "Установити час" @@ -1255,23 +1255,15 @@ "Дозвіл не потрібний" "це платна послуга" "OK" - - - - - - - - - - - - - - + "Пристрій заряджається через USB" + "Під’єднаний пристрій заряджається через USB" + "Передавання файлів через USB ввімкнено" + "Режим PTP через USB ввімкнено" + "Режим USB-модема ввімкнено" + "Режим MIDI через USB ввімкнено" + "Режим USB-аксесуара ввімкнено" "Торкніться, щоб переглянути більше опцій." - - + "Під’єднаний пристрій заряджається. Торкніться, щоб побачити більше опцій." "Виявлено аналоговий аксесуар для аудіо" "Під’єднаний пристрій несумісний із цим телефоном. Торкніться, щоб дізнатися більше." "Налагодження USB завершено" @@ -1900,8 +1892,7 @@ "Голосові дзвінки з телефона заборонено" "Спливаюче вікно" "+ %1$d" - - + "Версія додатка застаріла або несумісна з цим ярликом" "Не вдалося відновити ярлик, оскільки додаток не підтримує резервне копіювання та відновлення" "Не вдалося відновити ярлик, оскільки підписи додатків не збігаються" "Не вдалося відновити ярлик" @@ -1911,4 +1902,7 @@ "Виявлено шкідливий додаток" "%1$s хоче показати фрагменти додатка %2$s" "Редагувати" + "Системні зміни" + "Налаштування режиму \"Не турбувати\" змінено" + "Торкніться, щоб перевірити налаштування сповіщень" diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index bfaaba2be7a..f9e26ca7bda 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -93,6 +93,8 @@ "‏SMS پیغامات" "صوتی میل پیغامات" "‏Wi-Fi کالنگ" + + "‏ہمسر نے TTY وضع مکمل کی درخواست کی" "‏ہمسر نے TTY وضع HCO کی درخواست کی" "‏ہمسر نے TTY وضع VCO کی درخواست کی" @@ -238,7 +240,8 @@ "ترتیبات" "اسسٹ" "Voice Assist" - "مقفل درج کریں" + + "‎999+‎" "نئی اطلاع" "ورچوئل کی بورڈ" @@ -497,10 +500,8 @@ "کافی زیادہ کوششیں کی گئیں۔ بعد میں دوبارہ کوشش کریں۔" "کافی زیادہ کوششیں۔ فنگر پرنٹ سینسر غیر فعال ہو گیا۔" "دوبارہ کوشش کریں۔" - - - - + "کوئی فنگر پرنٹ مندرج شدہ نہیں ہے۔" + "اس آلہ میں فنگر پرنٹ سینسر نہیں ہے" "انگلی %d" @@ -827,6 +828,8 @@ "تجویز: زوم ان اور آؤٹ کیلئے دو بار تھپتھپائیں۔" "آٹوفل" "آٹوفل مقرر کریں" + + " " "$1$2$3" "، " @@ -1198,9 +1201,12 @@ "‏SIM شامل کیا گیا" "موبائل نیٹ ورک تک رسائی کیلئے اپنا آلہ دوبارہ سٹارٹ کریں۔" "دوبارہ شروع کریں" - "‏آپکی نئی SIM کو ٹھیک طرح سے کام کرنے کیلئے آپ کو اپنے کیرئیر سے کوئی ایپ انسٹال کرکے کھولنا ہوگی۔" - "ایپ حاصل کریں" - "ابھی نہیں" + + + + + + "‏نئی SIM داخل ہو گئی" "اسے سیٹ اپ کرنے کیلئے تھپتھپائیں" "وقت سیٹ کریں" @@ -1212,23 +1218,15 @@ "کوئی اجازتیں درکار نہیں ہیں" "اس میں آپ کا پیسہ خرچ ہو سکتا ہے" "ٹھیک ہے" - - - - - - - - - - - - - - + "‏USB کے ذریعے یہ آلہ چارج کیا جا رہا ہے" + "‏USB کے ذریعے منسلکہ آلہ کو چارج کیا جا رہا ہے" + "‏USB کے ذریعے فائل منتقلی آن ہے" + "‏USB کے ذریعے PTP آن ہے" + "‏USB ٹیدرنگ آن ہے" + "‏USB کے ذریعے MIDI آن ہے" + "‏USB لازمہ وضع آن ہے" "مزید اختیارات کیلئے تھپتھپائیں۔" - - + "منسلکہ آلہ کو چارج کیا جا رہا ہے۔ مزید اختیارات کے لئے تھپتھپائيں۔" "اینالاگ آڈیو کے لوازم کا پتہ چلا" "منسلک آلہ اس فون کے موافق نہیں ہے۔ مزید جاننے کے لیے تھپتھپائیں۔" "‏USB ڈیبگ کرنا مربوط ہو گیا" @@ -1831,8 +1829,7 @@ "آواز کیلئے فون کو اجازت نہیں ہے" "پاپ اپ ونڈو" "‎‎‎‎‎+ %1$d‎‎" - - + "ایپ کے ورژن کا درجہ کم ہے یا اس شارٹ کٹ کے ساتھ مطابقت پذیر نہیں ہے" "شارٹ کٹ کو بحال نہیں کیا جا سکا، کیونکہ ایپ بیک اپ اور بحالی کو سپورٹ نہیں کرتی ہے" "ایپ دستخط غیر مماثل ہونے کی وجہ سے شارٹ کٹ کو بحال نہیں کیا جا سکا" "شارٹ کٹ کو بحال نہیں کیا جا سکا" @@ -1842,4 +1839,7 @@ "ضرر رساں ایپ کا پتہ چلا" "%1$s %2$s کے سلائسز دکھانا چاہتی ہے" "ترمیم کریں" + "سسٹم کی تبدیلیاں" + "\'ڈسٹرب نہ کریں\' تبدیل ہو گيا" + "مداخلتوں کے مد نظر اپنے برتاؤ کی ترتیبات چیک کرنے کیلئے تھپتھپائیں" diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 5ac81d5faa3..735a66cef19 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -93,6 +93,7 @@ "SMS xabarlar" "Ovozli xabarlar" "Wi-Fi chaqiruv" + "SIM karta holati" "Teng huquqli ishtirokchi teletayp rejimini FULL (to‘liq) qilib o‘zgartirdi" "Teng huquqli ishtirokchi teletayp rejimini HCO (eshitadi, gapirolmaydi) qilib o‘zgartirdi" "Teng huquqli ishtirokchi teletayp rejimini VCO (gapiradi, eshitolmaydi) qilib o‘zgartirdi" @@ -238,7 +239,7 @@ "Sozlamalar" "Yordam" "Ovozli yordam" - "Bloklash" + "Bloklash" "999+" "Yangi bildirishnoma" "Virtual klaviatura" @@ -355,8 +356,6 @@ "Ilovaga o‘zining komponentlarini xotirada doimiy saqlashga ruxsat beradi. Bu mavjud xotirani cheklashi va planshetni sekin ishlashiga sabab bo‘lishi mumkin." "Ilovaga o‘zining muayyan qismlarining xotiraning turg‘un qismiga aylantirish huquqini beradi. Bunda, boshqa ilovalar uchun xotiradan ajratilgan joy cheklanib, televizorning ishlashi sekinlashishi mumkin." "Ilovaga o‘zining komponentlarini xotirada doimiy saqlashga ruxsat beradi. Bu mavjud xotirani cheklashi va telefonni sekin ishlashiga sabab bo‘lishi mumkin." - "faol xizmatlarni ishga tushirish" - "Ilovaga faol xizmatlardan foydalanishga ruxsat beradi." "ilovalar egallagan xotira joyini hisoblash" "Ilova o‘zining kodi, ma’lumotlari va kesh o‘lchami to‘g‘risidagi ma’lumotlarni olishi mumkin" "tizim sozlamalarini o‘zgartirish" @@ -827,6 +826,7 @@ "Maslahat: kattalashtirish va kichiklashtirish uchun ikki marta bosing." "Avtomatik to‘ldirish" "Avto-to‘ldirishni sozlash" + "Avto-to‘ldirish" " " "$1$2$3" ", " @@ -1198,9 +1198,9 @@ "SIM karta qo‘shildi" "Uyali tarmoqqa ulanish uchun qurilmangizni o‘chirib-yoqing." "O‘chirib yoqish" - "Yangi SIM karta to‘g‘ri ishlashi uchun operator ilovasini o‘rnatib, ochish kerak bo‘ladi." - "ILOVANI YUKLAB OLING" - "HOZIR EMAS" + "Mobil xizmatni faollashtirish" + "Yangi SIM kartani faollashtirish uchun aloqa operatori ilovasini yuklab oling" + "Ilovani yuklab olish" "Yangi SIM karta solindi" "Sozlash uchun bosing" "Vaqtni o‘rnatish" @@ -1833,4 +1833,7 @@ "Zararli ilova aniqlandi" "%1$s ilovasi %2$s ilovasidan fragmentlar ko‘rsatish uchun ruxsat so‘ramoqda" "Tahrirlash" + "Tizimda o‘zgartirishlar" + "Bezovta qilinmasin rejimi sozlamalari o‘zgartirildi" + "Ularni tekshirish uchun bosing." diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 7557acf1b33..303ef78731f 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -93,6 +93,8 @@ "Tin nhắn SMS" "Thư thoại" "Gọi qua Wi-Fi" + + "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ ĐẦY ĐỦ" "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ HCO" "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ VCO" @@ -238,7 +240,8 @@ "Cài đặt" "Hỗ trợ" "Trợ lý thoại" - "Nhập khóa" + + "999+" "Thông báo mới" "Bàn phím ảo" @@ -264,10 +267,8 @@ "%1$s, %2$s" "Chế độ an toàn" "Hệ thống Android" - - - - + "Chuyển sang hồ sơ cá nhân" + "Chuyển sang hồ sơ công việc" "Danh bạ" "truy cập vào danh bạ của bạn" "Cho phép <b>%1$s</b> truy cập vào danh bạ của bạn" @@ -358,7 +359,7 @@ "Cho phép ứng dụng làm cho các phần của ứng dụng trở nên ổn định trong bộ nhớ. Việc này có thể hạn chế bộ nhớ đối với các ứng dụng khác đang làm chậm TV." "Cho phép ứng dụng tạo sự đồng nhất cho các phần của mình trong bộ nhớ. Việc này có thể hạn chế bộ nhớ đối với các ứng dụng khác đang làm chậm điện thoại." "đo dung lượng lưu trữ ứng dụng" - "Cho phép ứng dụng truy xuất mã, dữ liệu và kích thước bộ nhớ cache của chính ứng dụng" + "Cho phép ứng dụng truy xuất mã, dữ liệu và kích thước bộ nhớ đệm của chính ứng dụng" "sửa đổi cài đặt hệ thống" "Cho phép ứng dụng sửa đổi dữ liệu cài đặt của hệ thống. Ứng dụng độc hại có thể làm hỏng cấu hình hệ thống của bạn." "chạy khi khởi động" @@ -419,10 +420,8 @@ "Cho phép ứng dụng truy cập vào các tính năng điện thoại của thiết bị. Quyền này cho phép ứng dụng xác định số điện thoại và ID thiết bị, cho dù cuộc gọi có hiện hoạt hay không và số từ xa có được kết nối bằng một cuộc gọi hay không." "định tuyến cuộc gọi thông qua hệ thống" "Cho phép ứng dụng định tuyến cuộc gọi thông qua hệ thống nhằm cải thiện trải nghiệm gọi điện." - - - - + "tiếp tục cuộc gọi từ một ứng dụng khác" + "Cho phép ứng dụng tiếp tục cuộc gọi được bắt đầu trong một ứng dụng khác." "đọc số điện thoại" "Cho phép ứng dụng truy cập số điện thoại của thiết bị." "ngăn máy tính bảng chuyển sang chế độ ngủ" @@ -497,11 +496,12 @@ "Không thể lưu vân tay. Vui lòng xóa vân tay hiện có." "Đã hết thời gian chờ vân tay. Hãy thử lại." "Thao tác dùng dấu vân tay bị hủy." - - + "Người dùng đã hủy thao tác dùng dấu vân tay." "Quá nhiều lần thử. Hãy thử lại sau." "Quá nhiều lần thử. Cảm biến vân tay đã bị tắt." "Thử lại." + "Chưa đăng ký vân tay." + "Thiết bị này không có cảm biến vân tay" "Ngón tay %d" @@ -828,6 +828,8 @@ "Mẹo: Nhấn đúp để phóng to và thu nhỏ." "Tự động điền" "Thiết lập Tự động điền" + + " " "$1$2$3" ", " @@ -1000,12 +1002,9 @@ "Mở" "Gửi tin nhắn" "Thêm" - - - - - - + "Xem" + "Lịch biểu" + "Theo dõi" "Sắp hết dung lượng lưu trữ" "Một số chức năng hệ thống có thể không hoạt động" "Không đủ bộ nhớ cho hệ thống. Đảm bảo bạn có 250 MB dung lượng trống và khởi động lại." @@ -1131,8 +1130,7 @@ Mở mạng Wi-Fi khả dụng "Kết nối với mạng Wi-Fi đang mở" - - + "Kết nối với mạng Wi‑Fi của nhà mạng" "Đang kết nối với mạng Wi‑Fi đang mở" "Đã kết nối với mạng Wi-Fi" "Không thể kết nối với mạng Wi‑Fi" @@ -1202,9 +1200,12 @@ "Đã thêm thẻ SIM" "Khởi động lại thiết bị của bạn để truy cập mạng di động." "Khởi động lại" - "Để SIM mới của bạn hoạt động bình thường, bạn cần phải cài đặt và mở một ứng dụng của nhà cung cấp dịch vụ." - "TẢI ỨNG DỤNG" - "KHÔNG PHẢI BÂY GIỜ" + + + + + + "Đã lắp SIM mới" "Nhấn để thiết lập" "Đặt giờ" @@ -1216,13 +1217,15 @@ "Không yêu cầu quyền" "bạn có thể mất tiền vì điều này" "OK" - "Sạc qua USB thiết bị này" - "Nguồn cấp điện qua USB cho thiết bị được kết nối" - "USB để truyền tệp" - "USB để truyền ảnh" - "USB cho MIDI" - "Đã kết nối với phụ kiện USB" + "Đang sạc thiết bị này qua USB" + "Đang sạc thiết bị được kết nối qua USB" + "Đã bật truyền tệp qua USB" + "Đã bật chế độ PTP qua USB" + "Đã bật chia sẻ kết nối qua USB" + "Đã bật chế độ MIDI qua USB" + "Đã bật chế độ phụ kiện USB" "Nhấn để biết thêm tùy chọn." + "Đang sạc thiết bị được kết nối. Hãy nhấn để biết thêm các tùy chọn." "Đã phát hiện phụ kiện âm thanh analog" "Thiết bị được kết nối không tương thích với điện thoại này. Nhấn để tìm hiểu thêm." "Đã kết nối gỡ lỗi USB" @@ -1661,9 +1664,6 @@ "%1$s làm việc" "Công việc thứ 2 %1$s" "Công việc thứ 2 %1$s" - "Để bỏ ghim màn hình này, chạm và giữ nút Quay lại và Tổng quan" - "Đã ghim màn hình" - "Đã bỏ ghim màn hình" "Hỏi mã PIN trước khi bỏ ghim" "Hỏi hình mở khóa trước khi bỏ ghim" "Hỏi mật khẩu trước khi bỏ ghim" @@ -1757,15 +1757,11 @@ "Tất cả ngôn ngữ" "Tất cả khu vực" "Tìm kiếm" - - - - + "Bạn muốn bật hồ sơ công việc?" + "Ứng dụng công việc, thông báo, dữ liệu và các tính năng khác của hồ sơ công việc sẽ được bật" "Bật" - - - - + "Ứng dụng này được xây dựng cho một phiên bản Android cũ hơn và có thể hoạt động không bình thường. Hãy thử kiểm tra các bản cập nhật hoặc liên hệ với nhà phát triển." + "Kiểm tra bản cập nhật" "Bạn có tin nhắn mới" "Mở ứng dụng SMS để xem" "Một số chức năng có thể bị hạn chế" @@ -1832,17 +1828,20 @@ "Điện thoại không được phép sử dụng tính năng thoại" "Cửa sổ bật lên" "+ %1$d" - "Lối tắt này yêu cầu ứng dụng mới nhất" + "Phiên bản của ứng dụng đã bị hạ cấp hoặc không tương thích với lối tắt này" "Không thể khôi phục lối tắt do ứng dụng không hỗ trợ sao lưu và khôi phục" "Không thể khôi phục lối tắt do không khớp chữ ký ứng dụng" "Không thể khôi phục lối tắt" "Đã vô hiệu hóa lối tắt" - + "GỠ CÀI ĐẶT" + "VẪN MỞ" + "Đã phát hiện ứng dụng độc hại" + "%1$s muốn hiển thị các lát của %2$s" + "Chỉnh sửa" + - + - + - "%1$s muốn hiển thị các lát của %2$s" - "Chỉnh sửa" diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index e52185e8f4d..2c430232a9a 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -93,6 +93,8 @@ "短信" "语音邮件" "WLAN 通话" + + "对方请求使用“TTY 完整”模式" "对方请求使用“TTY HCO”模式" "对方请求使用“TTY VCO”模式" @@ -238,7 +240,8 @@ "设置" "助理" "语音助理" - "进入锁定模式" + + "999+" "新通知" "虚拟键盘" @@ -264,10 +267,8 @@ "%1$s%2$s" "安全模式" "Android 系统" - - - - + "切换到个人资料" + "切换到工作资料" "通讯录" "访问您的通讯录" "允许<b>%1$s</b>访问您的通讯录" @@ -282,7 +283,7 @@ "允许<b>%1$s</b>发送和查看短信" "存储空间" "访问您设备上的照片、媒体内容和文件" - "允许<b>%1$s</b>访问您设备上的照片、媒体内容和文件" + "允许“<b>%1$s</b>”访问您设备上的照片、媒体内容和文件" "麦克风" "录制音频" "允许<b>%1$s</b>录音" @@ -419,10 +420,8 @@ "允许该应用访问设备的电话功能。此权限可让该应用确定本机号码和设备 ID、是否正处于通话状态以及拨打的号码。" "通过系统转接来电" "允许该应用通过系统转接来电,以改善通话体验。" - - - - + "继续进行来自其他应用的通话" + "允许该应用继续进行在其他应用中发起的通话。" "读取电话号码" "允许该应用访问设备上的电话号码。" "阻止平板电脑进入休眠状态" @@ -497,11 +496,12 @@ "无法存储指纹。请移除一个现有的指纹。" "指纹录入操作超时,请重试。" "指纹操作已取消。" - - + "用户取消了指纹操作。" "尝试次数过多,请稍后重试。" "尝试次数过多。指纹传感器已停用。" "请重试。" + "未注册任何指纹。" + "此设备没有指纹传感器" "手指 %d" @@ -828,6 +828,8 @@ "提示:点按两次可放大或缩小。" "自动填充" "设置自动填充" + + " " "$1$2$3" ", " @@ -890,7 +892,7 @@ "年份:%s" "天" "天" - "小时" + "点" "小时" "分钟" "分钟" @@ -1000,12 +1002,9 @@ "打开" "发短信" "添加" - - - - - - + "查看" + "排定时间" + "跟踪" "存储空间不足" "某些系统功能可能无法正常使用" "系统存储空间不足。请确保您有250MB的可用空间,然后重新启动。" @@ -1131,8 +1130,7 @@ 有可用的开放 WLAN 网络 "连接到开放的 WLAN 网络" - - + "连接到运营商 WLAN 网络" "正在连接到开放的 WLAN 网络" "已连接到 WLAN 网络" "无法连接到 WLAN 网络" @@ -1202,9 +1200,12 @@ "已添加SIM卡" "请重新启动您的设备,以便访问移动网络。" "重新启动" - "要让您的新 SIM 卡正常工作,您需要安装运营商提供的某个应用并打开该应用。" - "下载应用" - "以后再说" + + + + + + "已插入新 SIM 卡" "点按即可进行设置" "设置时间" @@ -1216,13 +1217,15 @@ "不需要任何权限" "这可能会产生费用" "确定" - "正在通过 USB 为此设备充电" - "正在通过 USB 为连接的设备充电" - "正在通过 USB 传输文件" - "正在通过 USB 传输照片" - "正在通过 USB 连接到 MIDI 接口" - "已连接到USB配件" + "正在通过 USB 为此设备充电" + "正在通过 USB 为连接的设备充电" + "已开启 USB 文件传输模式" + "已开启 USB PTP 模式" + "已开启 USB 网络共享模式" + "已开启 USB MIDI 模式" + "已开启 USB 配件模式" "点按即可查看更多选项。" + "正在为连接的设备充电。点按即可查看更多选项。" "检测到模拟音频配件" "连接的设备与此手机不兼容。点按即可了解详情。" "已连接到 USB 调试" @@ -1524,7 +1527,7 @@ "您已连续 %1$d 次画错解锁图案。如果再尝试 %2$d 次后仍不成功,系统就会要求您使用自己的电子邮件帐号解锁手机。\n\n请在 %3$d 秒后重试。" " — " "删除" - "要将音量调高到推荐水平以上吗?\n\n长时间保持高音量可能会损伤听力。" + "要将音量调高到建议的音量以上吗?\n\n长时间保持高音量可能会损伤听力。" "要使用无障碍快捷方式吗?" "开启快捷方式后,同时按下两个音量按钮 3 秒钟即可启动所设定的无障碍功能。\n\n当前设定的无障碍功能:\n%1$s\n\n如需更改设定的功能,请依次转到“设置”>“无障碍”。" "关闭快捷方式" @@ -1661,9 +1664,6 @@ "工作%1$s" "第二个工作%1$s" "第三个工作%1$s" - "要取消固定此屏幕,请触摸并按住“返回”和“概览”按钮" - "已固定屏幕" - "已取消固定屏幕" "取消时要求输入PIN码" "取消时要求绘制解锁图案" "取消时要求输入密码" @@ -1757,15 +1757,11 @@ "所有语言" "所有国家/地区" "搜索" - - - - + "要开启工作资料吗?" + "您的工作应用、通知、数据及其他工作资料功能将会开启" "开启" - - - - + "此应用专为旧版 Android 打造,因此可能无法正常运行。请尝试检查更新或与开发者联系。" + "检查更新" "您有新消息" "打开短信应用查看" "部分功能可能会受到限制" @@ -1794,7 +1790,7 @@ "办公" "设备存储空间" "USB 调试" - "小时" + "点" "分钟" "设置时间" "请输入有效的时间" @@ -1832,17 +1828,17 @@ "手机不支持语音" "弹出式窗口" "+ %1$d" - "您必须拥有最新版的应用才能使用此快捷方式" + "应用版本已降级或与此快捷方式不兼容" "无法恢复快捷方式,因为应用不支持备份和恢复功能" "无法恢复快捷方式,因为应用签名不相符" "无法恢复快捷方式" "快捷方式已停用" - - - - - - + "卸载" + "仍然打开" + "检测到有害应用" "“%1$s”想要显示“%2$s”图块" "编辑" + "系统更改" + "“勿扰”设置已更改" + "点按即可查看您的干扰行为设置" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index cba21c3d171..e837ae7219f 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -93,6 +93,8 @@ "短訊" "留言訊息" "Wi-Fi 通話" + + "對方曾要求 TTY 完整模式" "對方曾要求 TTY 模式 (HCO)" "對方曾要求 TTY 模式 (VCO)" @@ -238,7 +240,8 @@ "設定" "協助" "語音助手" - "輸入鎖定項目" + + "999+" "新通知" "虛擬鍵盤" @@ -264,10 +267,8 @@ "%1$s%2$s" "安全模式" "Android 系統" - - - - + "切換至個人設定檔" + "切換至工作設定檔" "通訊錄" "存取您的通訊錄" "允許 <b>%1$s</b> 存取您的聯絡人" @@ -419,10 +420,8 @@ "允許應用程式使用裝置的電話功能。這項權限允許應用程式確定手機號碼和裝置編號、是否正在通話中,以及所撥打的對方號碼。" "透過系統轉接來電" "允許應用程式透過系統轉接來電,以改善通話體驗。" - - - - + "繼續進行來自其他應用程式的通話" + "允許應用程式繼續進行在其他應用程式中開始的通話。" "讀取電話號碼" "允許應用程式存取裝置上的電話號碼。" "防止平板電腦進入休眠狀態" @@ -497,11 +496,12 @@ "指紋無法儲存。請移除現有指紋。" "指紋已逾時。請再試一次。" "指紋操作已取消。" - - + "使用者已取消指紋操作。" "嘗試次數過多,請稍後再試。" "嘗試次數過多,指紋感應器已停用。" "再試一次。" + "未註冊任何指紋" + "此裝置沒有指紋感應器" "手指 %d" @@ -828,6 +828,8 @@ "提示:輕按兩下即可放大縮小。" "自動填入" "設定自動填入功能" + + " " "$1$2$3" ", " @@ -1000,12 +1002,9 @@ "開啟" "短訊" "新增" - - - - - - + "查看" + "時間表" + "追蹤" "儲存空間即將用盡" "部分系統功能可能無法運作" "系統儲存空間不足。請確認裝置有 250 MB 的可用空間,然後重新啟動。" @@ -1131,8 +1130,7 @@ 有可用的公開 Wi-Fi 網絡 "連線至開放的 Wi-Fi 網絡" - - + "連接流動網絡供應商的 Wi‑Fi 網絡" "正在連線至開放的 Wi-Fi 網絡" "已連線至 Wi-Fi 網絡" "無法連線至 Wi-Fi 網絡" @@ -1202,9 +1200,12 @@ "SIM 卡已新增" "重新啟動裝置,才能使用流動網絡。" "重新啟動" - "為確保新的 SIM 卡正常運作,您必須先安裝並開啟流動網絡供應商提供的應用程式。" - "下載應用程式" - "暫時不要" + + + + + + "已插入新的 SIM 卡" "輕按即可設定" "設定時間" @@ -1216,13 +1217,15 @@ "不需授權" "這可能需要付費" "確定" - "正在透過 USB 為此裝置充電" - "正在透過 USB 為已連接的裝置供電" - "USB 檔案傳輸" - "USB 相片傳輸" - "USB MIDI" - "已連接到一個 USB 配件" + "正在透過 USB 為此裝置充電" + "正在透過 USB 為連接的裝置充電" + "已開啟 USB 檔案轉移模式" + "已開啟 USB PTP 模式" + "已開啟 USB 的網絡共享模式" + "已開啟 USB MIDI 模式" + "已開啟 USB 配件模式" "輕按即可查看更多選項。" + "正在為連接的裝置充電。輕按即可查看更多選項。" "偵測到模擬音頻配件" "連接的裝置與這部手機不兼容。輕按即可瞭解詳情。" "已連接 USB 偵錯工具" @@ -1661,9 +1664,6 @@ "公司%1$s" "第二個工作%1$s" "第三個工作%1$s" - "如要取消固定此畫面,請按住 [返回] 和 [概覽] 按鈕" - "螢幕已固定" - "已取消固定螢幕" "取消固定時必須輸入 PIN" "取消固定時必須提供解鎖圖形" "取消固定時必須輸入密碼" @@ -1757,15 +1757,11 @@ "所有語言" "所有國家/地區" "搜尋" - - - - + "要開啟工作設定檔嗎?" + "系統將開啟您的工作應用程式、通知、資料和其他工作設定檔功能" "開啟" - - - - + "此應用程式專為舊版 Android 打造,因此可能無法正常運作。請嘗試檢查更新,或與開發人員聯絡。" + "檢查更新" "您有新的訊息" "開啟短訊應用程式查看內容" "部分功能可能會受到限制" @@ -1832,17 +1828,20 @@ "手機不支援語音" "彈出式視窗" "+ %1$d" - "您需要最新的應用程式,才能使用這個捷徑" + "應用程式版本已降級或與此捷徑不兼容" "由於應用程式不支援備份和還原功能,因此無法還原捷徑" "由於應用程式簽署不相符,因此無法還原捷徑" "無法還原捷徑" "已停用捷徑" - + "解除安裝" + "仍要開啟" + "偵測到有害的應用程式" + "「%1$s」想顯示「%2$s」的快訊" + "編輯" + - + - + - "「%1$s」想顯示「%2$s」的快訊" - "編輯" diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index b781f3e8f34..2bff3884c25 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -93,6 +93,8 @@ "簡訊" "語音留言" "Wi-Fi 通話" + + "通訊對象要求使用 TTY 的 FULL 模式" "通訊對象要求使用 TTY 的 HCO 模式" "通訊對象要求使用 TTY 的 VCO 模式" @@ -238,7 +240,8 @@ "設定" "協助" "語音小幫手" - "輸入鎖定" + + "超過 999" "新通知" "虛擬鍵盤" @@ -497,10 +500,8 @@ "嘗試次數過多,請稍後再試。" "嘗試次數過多,指紋感應器已停用。" "請再試一次。" - - - - + "未註冊任何指紋。" + "這個裝置沒有指紋感應器" "手指 %d" @@ -827,6 +828,8 @@ "提示:輕觸兩下即可縮放。" "自動填入功能" "設定自動填入功能" + + " //*** Empty segment here as a separator ***//" "$1$2$3" ", " @@ -889,7 +892,7 @@ "於 %s 年" "天" "天" - "小時" + "點" "小時" "分鐘" "分鐘" @@ -1197,9 +1200,12 @@ "SIM 卡已新增" "請重新啟動裝置,才能使用行動網路。" "重新啟動" - "要讓新的 SIM 卡正常運作,你必須先安裝電信業者提供的應用程式,並開啟該應用程式。" - "取得應用程式" - "暫時不要" + + + + + + "已插入新的 SIM 卡" "輕觸這裡即可進行設定" "設定時間" @@ -1211,23 +1217,15 @@ "無須許可" "這可能需要付費" "確定" - - - - - - - - - - - - - - + "正在透過 USB 為這個裝置充電" + "正在透過 USB 為連接的裝置充電" + "已開啟 USB 檔案傳輸模式" + "已開啟 USB PTP 模式" + "已開啟 USB 數據連線模式" + "已開啟 USB MIDI 模式" + "已開啟 USB 配件模式" "輕觸即可查看更多選項。" - - + "正在為連接的裝置充電。輕觸即可查看更多選項。" "偵測到類比音訊配件" "此外接裝置與這支手機不相容。輕觸即可瞭解詳情。" "已連接 USB 偵錯工具" @@ -1792,7 +1790,7 @@ "生產應用" "裝置儲存空間" "USB 偵錯" - "小時" + "點" "分鐘" "設定時間" "請輸入有效的時間" @@ -1830,8 +1828,7 @@ "手機不支援語音" "彈出式視窗" "+ %1$d" - - + "應用程式版本已降級或與這個捷徑不相容" "應用程式不支援備份與還原功能,因此無法還原捷徑" "應用程式簽署不相符,因此無法還原捷徑" "無法還原捷徑" @@ -1841,4 +1838,10 @@ "偵測到有害應用程式" "「%1$s」想要顯示「%2$s」的區塊" "編輯" + + + + + + diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 9c486103374..e292e3af8e9 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -93,6 +93,7 @@ "Imilayezo ye-SMS" "Imilayezo yevoyisimeyili" "Ukushaya kwe-Wi-Fi" + "Isimo se-SIM" "Umngani ucele imodi ye-TTY ephelele" "Umngani ucele imodi ye-TTY HCO" "Umngani ucele imodi ye-TTY VCO" @@ -238,7 +239,7 @@ "Izilungiselelo" "Siza" "Isisekeli sezwi" - "Faka iukhiye" + "Khiya" "999+" "Isaziso esisha" "Ikhibhodi ebonakalayo" @@ -497,10 +498,8 @@ "Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi." "Imizamo eminingi kakhulu. Inzwa yezigxivizo zeminwe ikhutshaziwe." "Zama futhi." - - - - + "Azikho izigxivizo zeminwe ezibhalisiwe." + "Le divayisi ayinayo inzwa yezigxivizo zeminwe" "Umunwe ongu-%d" @@ -827,6 +826,7 @@ "Ithiphu: thepha kabili ukusondeza ngaphandle nangaphakathi." "Ukugcwalisa Ngokuzenzakalelayo" "Misa i-Autofill" + "Ukugcwalisa okuzenzakalelayo" " " "$1$2$3" ", " @@ -1197,9 +1197,9 @@ "Ikhadi le-SIM lengeziwe" "Kufanele uqalise kabusha idivaysi yakho ukuze ungene kuhleloxhumano yeselula." "Qala phansi" - "Ukuze wenze i-SIM yakho entsha isebenze kahle, kuzomele ufake uphinde uvule uhlelo lokusebenza kusukela kunkampani yakho yenethiwekhi." - "THOLA UHLELO LOKUSEBENZA" - "HHAYI MANJE" + "Yenza kusebenze isevisi yeselula" + "Landa uhlelo lokusebenza lwenkampani yenethiwekhi ukuze wenze kusebenze i-SIM yakho entsha" + "Landa uhlelo lokusebenza" "Kufakwe i-SIM entsha" "Thepha ukuze uyisethe" "Hlela isikhathi" @@ -1211,23 +1211,15 @@ "Ayikho imvume edingekayo" "lokhu kungakudlela imali" "KULUNGILE" - - - - - - - - - - - - - - + "Ishaja le divayisi nge-USB" + "Ishaja idivayisi exhunyiwe nge-USB" + "Ukudluliselwa kwefayela le-USB kuvuliwe" + "I-PTP nge-USB ivuliwe" + "Kuvulwe ukusebenzisa ifoni njengemodemu kwe-USB" + "I-MIDI nge-USB ivuliwe" + "Imodi yesisetshenziswa se-USB ivuliwe" "Thepha ngezinketho eziningi." - - + "Ishaja idivayisi exhunyiwe. Thepha ukuze uthole ezinye izinketho." "Kutholwe isisetshenziswa se-analog yomsindo" "Idivayisi enamathiselwe kwi-imeyili ayihambisani nale foni. Thepha ukuze ufunde kabanzi." "Ukulungisa iphutha le-USB kuxhunyiwe" @@ -1830,8 +1822,7 @@ "Ifoni ayivunyelwe izwi" "Iwindi lesigelekeqe" "+ %1$d" - - + "Inguqulo yohlelo lokusebenza yehliselwe phansi noma ayihambelani nalesi sinqamuleli" "Ayikwazanga ukubuyisa isinqamuleli ngoba uhlelo lokusebenza alusekeli isipele nokubuyisa" "Ayikwazanga ukubuyisa isinqamuleli ngoba isignisha yohlelo lokusebenza ayifani" "Ayikwazanga ukubuyisa isinqamuleli" @@ -1841,4 +1832,7 @@ "Uhlelo lokusebenza oluyingozi lutholakele" "I-%1$s ifuna ukubonisa izingcezu ze-%2$s" "Hlela" + "Ushintsho lwesistimu" + "Ukungaphazamisi kushintshile" + "Thepha ukuze uhlole izilungiselelo zokuziphatha zokuphazanyiswa" -- GitLab From 918e02f1e99ea7f53b3d9c8d27d143646cfe4017 Mon Sep 17 00:00:00 2001 From: Risan Date: Mon, 19 Feb 2018 16:22:10 +0900 Subject: [PATCH 072/386] Change libmojo_bp to libmojo Cleaning up since we have libmojo Android.bp target now. Bug: 72927715 Test: Compiled Change-Id: I6350ce53c6b97a2c43d53a45b8634bdc27409ab6 --- services/core/jni/Android.bp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 0b032815f1f..427b9d2da94 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -138,13 +138,12 @@ cc_defaults { product_variables: { arc: { - // TODO: remove the suffix "_bp" after finishing migration to Android.bp. shared_libs: [ "libarcbridge", "libarcbridgeservice", "libarcvideobridge", "libchrome", - "libmojo_bp", + "libmojo", ], } } -- GitLab From e08c97a38da31616571cb1bd5ced78c060046759 Mon Sep 17 00:00:00 2001 From: Hyundo Moon Date: Wed, 14 Feb 2018 11:22:52 +0900 Subject: [PATCH 073/386] MediaLibrarySession: Add notifySearchResultChanged Bug: 72786724 Test: Passed MediaBrowser2Test Change-Id: I3b232e1f959aa2d56fdc1caa46bf8d2775262bf1 --- media/java/android/media/MediaBrowser2.java | 16 ++++++++-------- .../java/android/media/MediaLibraryService2.java | 13 +++++++++++++ .../media/update/MediaBrowser2Provider.java | 6 +++--- .../update/MediaLibraryService2Provider.java | 6 ++++-- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/media/java/android/media/MediaBrowser2.java b/media/java/android/media/MediaBrowser2.java index 32d31621aa2..231a4a57d55 100644 --- a/media/java/android/media/MediaBrowser2.java +++ b/media/java/android/media/MediaBrowser2.java @@ -88,14 +88,15 @@ public class MediaBrowser2 extends MediaController2 { public void onItemLoaded(@NonNull String mediaId, @Nullable MediaItem2 result) { } /** - * Called when there's change in the search result. + * Called when there's change in the search result requested by the previous + * {@link MediaBrowser2#search(String, Bundle)}. * * @param query search query that you've specified with {@link #search(String, Bundle)} - * @param extras extra bundle that you've specified with {@link #search(String, Bundle)} - * @param totalItemCount The total item count for the search result + * @param extras extra bundle + * @param itemCount The item count for the search result */ public void onSearchResultChanged(@NonNull String query, @Nullable Bundle extras, - int totalItemCount) { } + int itemCount) { } /** * Called when the search result has been returned by the library service for the previous @@ -189,10 +190,9 @@ public class MediaBrowser2 extends MediaController2 { } /** - * Send a search request to the library service. When there's a change, - * {@link BrowserCallback#onSearchResultChanged(String, Bundle, int)} will be called with the - * bundle that you've specified. You should call - * {@link #getSearchResult(String, int, int, Bundle)} to get the actual search result. + * Send a search request to the library service. When the search result is changed, + * {@link BrowserCallback#onSearchResultChanged(String, Bundle, int)} will be called. You should + * call {@link #getSearchResult(String, int, int, Bundle)} to get the actual search result. * * @param query search query. Should not be an empty string. * @param extras extra bundle diff --git a/media/java/android/media/MediaLibraryService2.java b/media/java/android/media/MediaLibraryService2.java index 7a05d3c0724..95d83ee36b1 100644 --- a/media/java/android/media/MediaLibraryService2.java +++ b/media/java/android/media/MediaLibraryService2.java @@ -99,6 +99,19 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { public void notifyChildrenChanged(@NonNull String parentId, @Nullable Bundle extras) { mProvider.notifyChildrenChanged_impl(parentId, extras); } + + /** + * Notify controller about change in the search result. + * + * @param controller controller to notify + * @param query previously sent search query from the controller. + * @param extras extra bundle + * @param itemCount the number of items that have been found in the search. + */ + public void notifySearchResultChanged(@NonNull ControllerInfo controller, + @NonNull String query, @NonNull Bundle extras, int itemCount) { + mProvider.notifySearchResultChanged_impl(controller, query, extras, itemCount); + } } /** diff --git a/media/java/android/media/update/MediaBrowser2Provider.java b/media/java/android/media/update/MediaBrowser2Provider.java index f2e73132a13..eda4c7c1f36 100644 --- a/media/java/android/media/update/MediaBrowser2Provider.java +++ b/media/java/android/media/update/MediaBrowser2Provider.java @@ -24,11 +24,11 @@ import android.os.Bundle; public interface MediaBrowser2Provider extends MediaController2Provider { void getLibraryRoot_impl(Bundle rootHints); - void subscribe_impl(String parentId, Bundle options); - void unsubscribe_impl(String parentId, Bundle options); + void subscribe_impl(String parentId, Bundle extras); + void unsubscribe_impl(String parentId, Bundle extras); void getItem_impl(String mediaId); void getChildren_impl(String parentId, int page, int pageSize, Bundle extras); - void search_impl(String query, Bundle options); + void search_impl(String query, Bundle extras); void getSearchResult_impl(String query, int page, int pageSize, Bundle extras); } diff --git a/media/java/android/media/update/MediaLibraryService2Provider.java b/media/java/android/media/update/MediaLibraryService2Provider.java index 923551a226b..d8378334415 100644 --- a/media/java/android/media/update/MediaLibraryService2Provider.java +++ b/media/java/android/media/update/MediaLibraryService2Provider.java @@ -30,8 +30,10 @@ public interface MediaLibraryService2Provider extends MediaSessionService2Provid // Nothing new for now interface MediaLibrarySessionProvider extends MediaSession2Provider { - void notifyChildrenChanged_impl(ControllerInfo controller, String parentId, Bundle options); - void notifyChildrenChanged_impl(String parentId, Bundle options); + void notifyChildrenChanged_impl(ControllerInfo controller, String parentId, Bundle extras); + void notifyChildrenChanged_impl(String parentId, Bundle extras); + void notifySearchResultChanged_impl(ControllerInfo controller, String query, Bundle extras, + int itemCount); } interface LibraryRootProvider { -- GitLab From 75dfc140f858f7ebf199920c9b9c97be38056754 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Feb 2018 21:25:05 -0800 Subject: [PATCH 074/386] Import translations. DO NOT MERGE Change-Id: I28812b054833a230f367aa65375c8d8ae1c84a27 Auto-generated-cl: translation import --- .../SettingsLib/res/values-af/strings.xml | 9 +++----- .../SettingsLib/res/values-az/strings.xml | 9 +++----- .../res/values-b+sr+Latn/strings.xml | 9 +++----- .../SettingsLib/res/values-bs/strings.xml | 9 +++----- .../SettingsLib/res/values-ca/strings.xml | 9 +++----- .../SettingsLib/res/values-cs/strings.xml | 9 +++----- .../SettingsLib/res/values-da/strings.xml | 9 +++----- .../SettingsLib/res/values-de/strings.xml | 9 +++----- .../SettingsLib/res/values-en-rAU/strings.xml | 9 +++----- .../SettingsLib/res/values-en-rCA/strings.xml | 9 +++----- .../SettingsLib/res/values-en-rGB/strings.xml | 9 +++----- .../SettingsLib/res/values-en-rIN/strings.xml | 9 +++----- .../SettingsLib/res/values-en-rXC/strings.xml | 9 +++----- .../SettingsLib/res/values-es/strings.xml | 9 +++----- .../SettingsLib/res/values-eu/strings.xml | 9 +++----- .../SettingsLib/res/values-fa/strings.xml | 9 +++----- .../SettingsLib/res/values-fi/strings.xml | 9 +++----- .../SettingsLib/res/values-fr-rCA/strings.xml | 9 +++----- .../SettingsLib/res/values-fr/strings.xml | 9 +++----- .../SettingsLib/res/values-gl/strings.xml | 2 +- .../SettingsLib/res/values-hr/strings.xml | 9 +++----- .../SettingsLib/res/values-in/strings.xml | 9 +++----- .../SettingsLib/res/values-is/strings.xml | 9 +++----- .../SettingsLib/res/values-it/strings.xml | 9 +++----- .../SettingsLib/res/values-kk/strings.xml | 6 +++--- .../SettingsLib/res/values-km/strings.xml | 9 +++----- .../SettingsLib/res/values-lo/strings.xml | 9 +++----- .../SettingsLib/res/values-lt/strings.xml | 9 +++----- .../SettingsLib/res/values-mn/strings.xml | 9 +++----- .../SettingsLib/res/values-my/strings.xml | 21 ++++++++----------- .../SettingsLib/res/values-nl/strings.xml | 9 +++----- .../SettingsLib/res/values-pl/strings.xml | 9 +++----- .../SettingsLib/res/values-pt-rBR/strings.xml | 9 +++----- .../SettingsLib/res/values-pt-rPT/strings.xml | 11 ++++------ .../SettingsLib/res/values-pt/strings.xml | 9 +++----- .../SettingsLib/res/values-ro/strings.xml | 9 +++----- .../SettingsLib/res/values-ru/strings.xml | 9 +++----- .../SettingsLib/res/values-si/strings.xml | 9 +++----- .../SettingsLib/res/values-sk/strings.xml | 9 +++----- .../SettingsLib/res/values-sr/strings.xml | 9 +++----- .../SettingsLib/res/values-sw/strings.xml | 9 +++----- .../SettingsLib/res/values-th/strings.xml | 9 +++----- .../SettingsLib/res/values-tl/strings.xml | 9 +++----- .../SettingsLib/res/values-uk/strings.xml | 9 +++----- .../SettingsLib/res/values-uz/strings.xml | 9 +++----- .../SettingsLib/res/values-zu/strings.xml | 9 +++----- 46 files changed, 143 insertions(+), 275 deletions(-) diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index a2329db7a4d..c1660160496 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -75,10 +75,8 @@ "SIM-toegang" "HD-oudio: %1$s" "HD oudio" - - - - + "Gehoortoestel" + "Gekoppel aan gehoortoestel" "Gekoppel aan media-oudio" "Gekoppel aan foonoudio" "Gekoppel aan lêeroordragbediener" @@ -95,8 +93,7 @@ "Gebruik vir foonoudio" "Gebruik vir lêeroordrag" "Gebruik vir invoer" - - + "Gebruik vir gehoortoestel" "Bind saam" "BIND SAAM" "Kanselleer" diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 750f22566e7..97e35706d84 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -75,10 +75,8 @@ "SIM Girişi" "HD audio: %1$s" "HD audio" - - - - + "Qulaqlıq" + "Qulaqlığa qoşuldunuz" "Media audioya birləşdirilib" "Telefon audiosuna qoşulu" "Fayl transfer serverinə qoşulu" @@ -95,8 +93,7 @@ "Telefon audiosu istifadə edin" "Fayl transferi üçün istifadə edin" "Daxiletmə üçün istifadə edin" - - + "Qulaqlıq üçün istifadə edin" "Birləşdir" "CÜTLƏNDİR" "Ləğv et" diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index fc7300e4157..dd7043dc661 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -75,10 +75,8 @@ "Pristup SIM kartici" "HD zvuk: %1$s" "HD zvuk" - - - - + "Slušni aparat" + "Povezano sa slušnim aparatom" "Povezano sa zvukom medija" "Povezano sa zvukom telefona" "Povezano sa serverom za prenos datoteka" @@ -95,8 +93,7 @@ "Korišćenje za audio telefona" "Korišćenje za prenos datoteka" "Koristi za ulaz" - - + "Koristi za slušni aparat" "Upari" "UPARI" "Otkaži" diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index bbe4767b037..c54a5dc69e5 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -75,10 +75,8 @@ "Pristup SIM-u" "HD audio: %1$s" "HD audio" - - - - + "Slušni aparat" + "Povezano na slušni aparat" "Povezano sa zvukom medija" "Povezano na zvuk telefona" "Povezan na server za prijenos podataka" @@ -95,8 +93,7 @@ "Koristi za zvuk telefona" "Koristi za prijenos fajlova" "Koristi kao ulaz" - - + "Koristi za slušni aparat" "Upari" "UPARI" "Otkaži" diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 88f01df17c3..fc312cf27c4 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -75,10 +75,8 @@ "Accés a la SIM" "Àudio HD: %1$s" "Àudio HD" - - - - + "Audiòfon" + "S\'ha connectat a l\'audiòfon" "Connectat a l\'àudio del mitjà" "Connectat a àudio del telèfon" "Connectat al servidor de transferència de fitxers" @@ -95,8 +93,7 @@ "Utilitza-ho per a l\'àudio del telèfon" "Utilitza per a la transferència de fitxers" "Utilitza per a entrada" - - + "Utilitza per a l\'audiòfon" "Vincula" "VINCULA" "Cancel·la" diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index e5dde7e93de..e6000c1945a 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -75,10 +75,8 @@ "Přístup k SIM kartě" "HD zvuk: %1$s" "HD zvuk" - - - - + "Naslouchátko" + "Připojeno k naslouchátku" "Připojeno ke zvukovému médiu" "Připojeno k náhlavní soupravě" "Připojeno k serveru pro přenos dat" @@ -95,8 +93,7 @@ "Umožňuje připojení náhlavní soupravy" "Použít pro přenos souborů" "Použít pro vstup" - - + "Použít pro naslouchátko" "Párovat" "PÁROVAT" "Zrušit" diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 88125d985e8..aa3e6b4983f 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -75,10 +75,8 @@ "SIM-adgang" "HD-lyd: %1$s" "HD-lyd" - - - - + "Høreapparat" + "Der er oprettet forbindelse til høreapparat" "Forbundet til medielyd" "Forbundet til telefonlyd" "Forbundet til filoverførselsserver" @@ -95,8 +93,7 @@ "Brug til telefonlyd" "Brug til filoverførsel" "Brug til input" - - + "Anvend til høreapparat" "Par" "ACCEPTÉR PARRING" "Annuller" diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index aa4785b2074..5210419a6e9 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -75,10 +75,8 @@ "Zugriff auf SIM" "HD-Audio: %1$s" "HD-Audio" - - - - + "Hörhilfe" + "Mit Hörhilfe verbunden" "Verbunden mit Audiosystem von Medien" "Verbunden mit Audiosystem des Telefons" "Mit Dateiübertragungsserver verbunden" @@ -95,8 +93,7 @@ "Für Audiosystem des Telefons verwenden" "Für Dateiübertragung verwenden" "Für Eingabe verwenden" - - + "Für Hörhilfe verwenden" "Koppeln" "KOPPELN" "Abbrechen" diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 0dc380b1c4e..5b8adcfb481 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -75,10 +75,8 @@ "SIM Access" "HD audio: %1$s" "HD audio" - - - - + "Hearing Aid" + "Connected to Hearing Aid" "Connected to media audio" "Connected to phone audio" "Connected to file-transfer server" @@ -95,8 +93,7 @@ "Use for phone audio" "Use for file transfer" "Use for input" - - + "Use for Hearing Aid" "Pair" "PAIR" "Cancel" diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 0dc380b1c4e..5b8adcfb481 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -75,10 +75,8 @@ "SIM Access" "HD audio: %1$s" "HD audio" - - - - + "Hearing Aid" + "Connected to Hearing Aid" "Connected to media audio" "Connected to phone audio" "Connected to file-transfer server" @@ -95,8 +93,7 @@ "Use for phone audio" "Use for file transfer" "Use for input" - - + "Use for Hearing Aid" "Pair" "PAIR" "Cancel" diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 0dc380b1c4e..5b8adcfb481 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -75,10 +75,8 @@ "SIM Access" "HD audio: %1$s" "HD audio" - - - - + "Hearing Aid" + "Connected to Hearing Aid" "Connected to media audio" "Connected to phone audio" "Connected to file-transfer server" @@ -95,8 +93,7 @@ "Use for phone audio" "Use for file transfer" "Use for input" - - + "Use for Hearing Aid" "Pair" "PAIR" "Cancel" diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 0dc380b1c4e..5b8adcfb481 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -75,10 +75,8 @@ "SIM Access" "HD audio: %1$s" "HD audio" - - - - + "Hearing Aid" + "Connected to Hearing Aid" "Connected to media audio" "Connected to phone audio" "Connected to file-transfer server" @@ -95,8 +93,7 @@ "Use for phone audio" "Use for file transfer" "Use for input" - - + "Use for Hearing Aid" "Pair" "PAIR" "Cancel" diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index 2ccfe854301..b7ca84a2d11 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -75,10 +75,8 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‎‎‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎SIM Access‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‏‏‎‎‎‎‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‏‏‎HD audio: ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‏‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎HD audio‎‏‎‎‏‎" - - - - + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎‎‎‎‏‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎Hearing Aid‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‎‎‎‎‎‎‎‎‎‎‎‏‏‏‎‎‏‏‎‎‏‏‏‎‎‎‏‎‏‏‏‏‎Connected to Hearing Aid‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‎‎‏‏‎‎‏‏‏‎‏‎‏‏‎‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎Connected to media audio‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‎‎‏‏‎‎‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‏‏‏‏‏‎Connected to phone audio‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‏‎‏‎‎‏‎‏‎‎Connected to file transfer server‎‏‎‎‏‎" @@ -95,8 +93,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‏‏‎Use for phone audio‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‎‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‎‎‎‎‎‏‏‎‏‏‏‎‎‎Use for file transfer‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‏‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎Use for input‎‏‎‎‏‎" - - + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎‎Use for Hearing Aid‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‎‏‏‎‎‏‎‏‏‎Pair‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‏‏‎‎‏‏‏‎‏‎PAIR‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎Cancel‎‏‎‎‏‎" diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 1bf825f3b2f..5a9b8738014 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -75,10 +75,8 @@ "Acceso a tarjeta SIM" "Audio HD: %1$s" "Audio HD" - - - - + "Audífonos" + "Conectado a audífono" "Conectado al audio del medio" "Conectado al audio del teléfono" "Conectado con el servidor de transferencia de archivos" @@ -95,8 +93,7 @@ "Utilizar para audio del teléfono" "Uso de la transferencia de archivos" "Usar para entrada" - - + "Usar con audífonos" "Vincular" "VINCULAR" "Cancelar" diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index c49be3c0575..7da1e767be9 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -75,10 +75,8 @@ "SIM txartelerako sarbidea" "Kalitate handiko audioa: %1$s" "Kalitate handiko audioa" - - - - + "Audiofonoa" + "Audiofonora konektatuta" "Euskarriaren audiora konektatuta" "Telefonoaren audiora konektatuta" "Fitxategi-transferentziako zerbitzarira konektatuta" @@ -95,8 +93,7 @@ "Erabili telefonoaren audiorako" "Erabili fitxategi-transferentziarako" "Erabili idazketarako" - - + "Erabili audiofonorako" "Parekatu" "PAREKATU" "Utzi" diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 97ed86c155e..2e5d699fb60 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -75,10 +75,8 @@ "دسترسی سیم‌کارت" "‏صدای HD: %1$s" "‏صدای HD" - - - - + "سمعک" + "متصل به سمعک" "به رسانه صوتی متصل شد" "به تلفن صوتی متصل شد" "به سرور انتقال فایل متصل شد" @@ -95,8 +93,7 @@ "استفاده برای تلفن صوتی" "استفاده برای انتقال فایل" "استفاده برای چاپ" - - + "استفاده برای سمعک" "مرتبط‌سازی" "مرتبط‌سازی" "لغو" diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 30a47bd5f4a..28d14a5fb34 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -75,10 +75,8 @@ "SIM-kortin käyttö" "HD-ääni: %1$s" "HD-ääni" - - - - + "Kuulolaite" + "Kuulolaite yhdistetty" "Yhdistetty median ääneen" "Yhdistetty puhelimen ääneen" "Yhdistetty tiedostonsiirtopalvelimeen" @@ -95,8 +93,7 @@ "Käytä puhelimen äänille" "Käytä tiedostojen siirtoon" "Käytä syöttöön" - - + "Käytä kuulolaitteen kanssa" "Muodosta laitepari" "MUODOSTA LAITEPARI" "Peruuta" diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index e1313e05b09..ed6581db07b 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -75,10 +75,8 @@ "Accès à la carte SIM" "Audio HD : %1$s" "Audio HD" - - - - + "Prothèse auditive" + "Connecté à la prothèse auditive" "Connecté aux paramètres audio du média" "Connecté à l\'audio du téléphone" "Connexion au serveur de transfert de fichiers" @@ -95,8 +93,7 @@ "Utiliser pour les paramètres audio du téléphone" "Utiliser pour le transfert de fichiers" "Utiliser comme entrée" - - + "Utiliser avec la prothèse auditive" "Associer" "ASSOCIER" "Annuler" diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 8ad95716058..39d7aec06d3 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -75,10 +75,8 @@ "Accès à la carte SIM" "Audio HD : %1$s" "Audio HD" - - - - + "Assistance auditive" + "Connecté à la prothèse auditive" "Connecté aux paramètres audio du média" "Connecté aux paramètres audio du téléphone" "Connexion au serveur de transfert de fichiers" @@ -95,8 +93,7 @@ "Utiliser pour les paramètres audio du téléphone" "Utiliser pour le transfert de fichiers" "Utiliser comme entrée" - - + "Utiliser pour l\'assistance auditive" "Associer" "ASSOCIER" "Annuler" diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index f7a9a79db93..15fe55bff28 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -62,7 +62,7 @@ "Conectado a %2$s, batería ao %1$s" "Conectado a %2$s (sen teléfono), batería ao %1$s" "Conectado a %2$s (sen audio multimedia), batería ao %1$s" - "Conectado %2$s (sen teléfono nin audio multimedia), batería ao %1$s" + "Conectado a %2$s (sen teléfono nin audio multimedia), batería ao %1$s" "Audio multimedia" "Chamadas telefónicas" "Transferencia de ficheiros" diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index a9377e0b10f..f7d59f0d7f5 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -75,10 +75,8 @@ "Pristup SIM-u" "HD audio: %1$s" "HD audio" - - - - + "Slušni aparat" + "Povezano sa slušnim aparatom" "Povezano s medijskim zvukom" "Povezano sa telefonskim zvukom" "Povezano s poslužiteljem za prijenos datoteka" @@ -95,8 +93,7 @@ "Koristi za telefonski zvuk" "Koristi za prijenos datoteke" "Upotrijebi za ulaz" - - + "Upotrebljavaj za slušni aparat" "Upari" "UPARI" "Odustani" diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 5bf53b6a767..c02bd90426a 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -75,10 +75,8 @@ "Akses SIM" "Audio HD: %1$s" "Audio HD" - - - - + "Alat Bantu Dengar" + "Terhubung ke Alat Bantu Dengar" "Tersambung ke media audio" "Tersambung ke audio ponsel" "Sambungkan ke server transfer file" @@ -95,8 +93,7 @@ "Gunakan untuk audio ponsel" "Gunakan untuk transfer file" "Gunakan untuk masukan" - - + "Gunakan untuk Alat Bantu Dengar" "Sandingkan" "SANDINGKAN" "Batal" diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index c92dd258312..36baf6c89dd 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -75,10 +75,8 @@ "Aðgangur að SIM-korti" "HD-hljóð: %1$s" "HD-hljóð" - - - - + "Heyrnatæki" + "Tengt við heyrnartæki" "Tengt við hljóðspilun efnis" "Tengt við hljóð símans" "Tengt við skráaflutningsþjón" @@ -95,8 +93,7 @@ "Nota fyrir hljóð símans" "Nota við skráaflutning" "Nota fyrir inntak" - - + "Nota fyrir heyrnartæki" "Para" "PARA" "Hætta við" diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 4edb5b3e1d5..f19c14c2a76 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -75,10 +75,8 @@ "Accesso alla SIM" "Audio HD: %1$s" "Audio HD" - - - - + "Apparecchio acustico" + "Connesso all\'apparecchio acustico" "Collegato ad audio media" "Collegato ad audio telefono" "Collegato al server di trasferimento file" @@ -95,8 +93,7 @@ "Usa per audio telefono" "Usa per trasferimento file" "Utilizza per l\'input" - - + "Usa per l\'apparecchio acustico" "Accoppia" "ACCOPPIA" "Annulla" diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 7ac1f89bc7e..4e2dacbe248 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -362,8 +362,8 @@ "Пайдалану негізінде шамамен %1$s қалды" "Толық зарядқа %1$s қалды" "%1$s қалды" - "%1$s мәнінен аз қалды" - "%1$s%2$s мәнінен аз қалды" + "%1$s шамасынан аз қалды" + "%1$s%2$s шамасынан аз қалды" "%1$s%2$s үстінде қалды" "%1$s үстінде қалды" "телефон көп ұзамай өшуі мүмкін" @@ -432,5 +432,5 @@ "Мұны ертерек өшіріп қоймасаңыз, келесі дабыл (уақыты: %1$s) естілмейді" "Келесі дабылыңыз (уақыты: %1$s) естілмейді" "Уақыты: %1$s" - "Күні: %1$s" + "Уақыты: %1$s" diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index c3c5f829c2f..3da37587e82 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -75,10 +75,8 @@ "ការចូលដំណើរការស៊ីម" "សំឡេងកម្រិត HD៖ %1$s" "សំឡេងកម្រិត HD" - - - - + "ឧបករណ៍​ជំនួយការ​ស្ដាប់" + "បាន​ភ្ជាប់ទៅ​ឧបករណ៍​ជំនួយការ​ស្តាប់" "បា​ន​ភ្ជាប់​ទៅ​អូឌីយ៉ូ​មេឌៀ" "តភ្ជាប់​ទៅ​អូឌីយ៉ូ​ទូរស័ព្ទ" "បាន​តភ្ជាប់​ទៅ​ម៉ាស៊ីន​មេ​ផ្ទេរ​ឯកសារ" @@ -95,8 +93,7 @@ "ប្រើ​សម្រាប់​​អូឌីយ៉ូ​ទូរស័ព្ទ" "ប្រើ​សម្រាប់​ផ្ទេរ​ឯកសារ" "ប្រើ​សម្រាប់​បញ្ចូល" - - + "ប្រើ​សម្រាប់​ឧបករណ៍​ជំនួយការ​ស្តាប់" "ផ្គូផ្គង" "ផ្គូផ្គង" "បោះ​បង់​" diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 669b05539d4..a5c8d564d9c 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -75,10 +75,8 @@ "ການ​ເຂົ້າ​ເຖິງ SIM" "ສຽງ HD: %1$s" "ສຽງ HD" - - - - + "ເຄື່ອງຊ່ວຍຟັງ" + "ເຊື່ອມຕໍ່ຫາເຄື່ອງຊ່ວຍຟັງແລ້ວ" "ເຊື່ອມຕໍ່ກັບສື່ດ້ານສຽງແລ້ວ" "ເຊື່ອມຕໍ່ກັບສຽງໂທລະສັບແລ້ວ" "ເຊື່ອມຕໍ່ກັບເຊີບເວີໂອນຍ້າຍໄຟລ໌ແລ້ວ" @@ -95,8 +93,7 @@ "ໃຊ້ສຳລັບລະບົບສຽງຂອງໂທລະສັບ" "ໃຊ້ເພື່ອໂອນຍ້າຍໄຟລ໌" "ໃຊ້ສຳລັບການປ້ອນຂໍ້ມູນ" - - + "ໃຊ້ກັບເຄື່ອງຊ່ວຍຟັງ" "ຈັບຄູ່" "ຈັບຄູ່" "ຍົກເລີກ" diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 5341e03752c..8eced2de7f7 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -75,10 +75,8 @@ "SIM prieiga" "HD garsas: %1$s" "HD garsas" - - - - + "Klausos aparatas" + "Prisijungta prie klausos aparato" "Prijungta prie medijos garso įrašo" "Prijungta prie telefono garso" "Prijungta prie failų perkėlimo serverio" @@ -95,8 +93,7 @@ "Naudoti telefono garso įrašui" "Naudoti failų perkėlimui" "Naudoti įvedant" - - + "Klausos aparato naudojimas" "Susieti" "SUSIETI" "Atšaukti" diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index d4ee10d3e35..596d1039797 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -75,10 +75,8 @@ "SIM Хандалт" "HD аудио: %1$s" "HD аудио" - - - - + "Сонсголын төхөөрөмж" + "Сонсголын төхөөрөмжид холбогдсон" "Медиа аудиод холбогдсон" "Утасны аудид холбогдсон" "Файл дамжуулах серверт холбогдсон" @@ -95,8 +93,7 @@ "Утасны аудиод ашиглах" "Файл дамжуулахад ашиглах" "Оруулахад ашиглах" - - + "Сонсголын төхөөрөмжид ашиглах" "Хослуулах" "ХОСЛУУЛАХ" "Цуцлах" diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 4eb4044f023..c1ca0ab0331 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -55,10 +55,10 @@ "ချိတ်ဆက်နေသည်" "%1$s ချိတ်ဆက်ပြီးပြီ" "တွဲချိတ်ပါ" - "ချိတ်ဆက်ပြီးပြီ (ဖုန်းမရှိပါ)%1$s" - "ချိတ်ဆက်ပြီးပြီ (မီဒီယာ မရှိပါ)%1$s" - "ချိတ်ဆက်ပြီးပြီ (မက်ဆေ့ဂျ် သုံး၍မရပါ)%1$s" - "ချိတ်ပြီးပြီ (ဖုန်း (သို့) မီဒီယာ မရှိပါ)%1$s" + "%1$s ချိတ်ဆက်ပြီးပြီ (ဖုန်းမရှိပါ)" + "%1$s ချိတ်ဆက်ပြီးပြီ (မီဒီယာ မရှိပါ)" + "%1$s ချိတ်ဆက်ပြီးပြီ (မက်ဆေ့ဂျ် သုံး၍မရပါ)" + "%1$s ချိတ်ပြီးပြီ (ဖုန်း (သို့) မီဒီယာ မရှိပါ)" "ချိတ်ဆက်ပြီးပြီ၊ ဘက်ထရီ %1$s%2$s" "ချိတ်ဆက်ပြီးပြီ (ဖုန်းမရှိပါ)၊ ဘက်ထရီ %1$s%2$s" "ချိတ်ဆက်ပြီးပြီ (မီဒီယာ မရှိပါ)၊ ဘက်ထရီ %1$s%2$s" @@ -75,10 +75,8 @@ "SIM အသုံးပြုခြင်း" "HD အသံ- %1$s" "HD အသံ" - - - - + "နားကြားကိရိယာ" + "နားကြားကိရိယာသို့ ချိတ်ဆက်ထားသည်" "မီဒီယာအသံအား ချိတ်ဆက်ရန်" "ဖုန်းအသံအား ချိတ်ဆက်ရန်" "ဖိုင်လွှဲပြောင်းမည့်ဆာဗာနှင့် ချိတ်ဆက်ထားပြီး" @@ -95,8 +93,7 @@ "ဖုန်းအသံအားအသုံးပြုရန်" "ဖိုင်လွဲပြောင်းရန်အတွက်အသုံးပြုရန်" "ထည့်သွင်းရန်အသုံးပြုသည်" - - + "နားကြားကိရိယာအတွက် အသုံးပြုရန်" "အတူတွဲပါ" "ချိတ်တွဲရန်" "မလုပ်တော့" @@ -429,8 +426,8 @@ "ဘယ်တော့မှ" "ဦးစားပေးများသာ" "%1$s%2$s" - "သင်၏ နောက်ထပ်နှိုးစက် %1$s မတိုင်မီ ၎င်းကိုမပိတ်လျှင် ကြားမည်မဟုတ်ပါ" - "သင်၏ နောက်ထပ်နှိုးစက် %1$s ကို ကြားမည်မဟုတ်ပါ" + "သင်၏ နောက်ထပ် %1$s နှိုးစက် မတိုင်မီ ၎င်းကိုမပိတ်လျှင် ကြားမည်မဟုတ်ပါ" + "သင်၏ နောက်ထပ် %1$s နှိုးစက်ကို ကြားမည်မဟုတ်ပါ" "%1$s တွင်" "%1$s တွင်" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 7a92f024c10..c6577e6bb6f 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -75,10 +75,8 @@ "Sim-toegang" "HD-audio: %1$s" "HD-audio" - - - - + "Gehoorapparaat" + "Verbonden met gehoorapparaat" "Verbonden met audio van medium" "Verbonden met audio van telefoon" "Verbonden met server voor bestandsoverdracht" @@ -95,8 +93,7 @@ "Gebruiken voor audio van telefoon" "Gebruiken voor bestandsoverdracht" "Gebruiken voor invoer" - - + "Gebruiken voor gehoorapparaat" "Koppelen" "KOPPELEN" "Annuleren" diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 75c336a7770..c7deb569249 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -75,10 +75,8 @@ "Dostęp do karty SIM" "Dźwięk HD: %1$s" "Dźwięk HD" - - - - + "Aparat słuchowy" + "Po połączeniu z aparatem słuchowym" "Połączono z funkcją audio multimediów" "Połączono z funkcją audio telefonu" "Połączono z serwerem transferu plików" @@ -95,8 +93,7 @@ "Użyj dla funkcji audio telefonu" "Użyj do transferu plików" "Użyj do wprowadzania" - - + "Użyj dla funkcji aparatu słuchowego" "Sparuj" "SPARUJ" "Anuluj" diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 39ac1249c71..7693a542097 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -75,10 +75,8 @@ "Acesso SIM" "Áudio HD: %1$s" "Áudio HD" - - - - + "Aparelho auditivo" + "Conectado a um aparelho auditivo" "Conectado ao áudio da mídia" "Conectado ao áudio do smartphone" "Conectado ao servidor de transferência de arquivo" @@ -95,8 +93,7 @@ "Usar para áudio do smartphone" "Usado para transferência de arquivo" "Usar para entrada" - - + "Usar para aparelho auditivo" "Parear" "PAREAR" "Cancelar" diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index ec9de7c05e6..a4987a1edc8 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -75,10 +75,8 @@ "Acesso ao SIM" "Áudio HD: %1$s" "Áudio HD" - - - - + "Aparelho auditivo" + "Associar ao aparelho auditivo" "Ligado ao áudio de multimédia" "Ligado ao áudio do telefone" "Ligado ao servidor de transferência de ficheiros" @@ -95,8 +93,7 @@ "Utilizar para áudio do telefone" "Utilizar para transferência de ficheiros" "Utilizar para entrada" - - + "Utilizar com o aparelho auditivo" "Par" "SINCRONIZAR" "Cancelar" @@ -429,7 +426,7 @@ "Nunca" "Apenas prioridade" "%1$s. %2$s" - "Só vai ouvir o próximo alarme à(s) %1$s se desativar esta funcionalidade antes dessa hora." + "Só vai ouvir o próximo alarme %1$s se desativar esta funcionalidade antes dessa hora." "Não vai ouvir o próximo alarme à(s) %1$s." "à(s) %1$s" "no(a) %1$s" diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 39ac1249c71..7693a542097 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -75,10 +75,8 @@ "Acesso SIM" "Áudio HD: %1$s" "Áudio HD" - - - - + "Aparelho auditivo" + "Conectado a um aparelho auditivo" "Conectado ao áudio da mídia" "Conectado ao áudio do smartphone" "Conectado ao servidor de transferência de arquivo" @@ -95,8 +93,7 @@ "Usar para áudio do smartphone" "Usado para transferência de arquivo" "Usar para entrada" - - + "Usar para aparelho auditivo" "Parear" "PAREAR" "Cancelar" diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 61a88e3efe1..1db376e7cbf 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -75,10 +75,8 @@ "Acces la SIM" "Audio HD: %1$s" "Audio HD" - - - - + "Aparat auditiv" + "Conectat la aparatul auditiv" "Conectat la profilul pentru conținut media audio" "Conectat la componenta audio a telefonului" "Conectat la serverul de transfer de fișiere" @@ -95,8 +93,7 @@ "Utilizați pentru componenta audio a telefonului" "Utilizați pentru transferul de fișiere" "Utilizați pentru introducere date" - - + "Utilizați pentru aparatul auditiv" "Asociați" "CONECTAȚI" "Anulați" diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 8456cc321cd..be08b05ccae 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -75,10 +75,8 @@ "Доступ к SIM-карте" "HD Audio: %1$s" "HD Audio" - - - - + "Слуховой аппарат" + "Подключен к слуховому аппарату" "Подключено к мультимедийному аудиоустройству" "Подключено к аудиоустройству телефона" "Установлено подключение к серверу передачи файлов" @@ -95,8 +93,7 @@ "Использовать для аудиоустройства телефона" "Используется для передачи файлов" "Использовать для ввода" - - + "Использовать для слухового аппарата" "Добавить" "ДОБАВИТЬ" "Отмена" diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index b7557a0a57c..7d63e4776a1 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -75,10 +75,8 @@ "SIM ප්‍රවේශය" "HD ශ්‍රව්‍යය: %1$s" "HD ශ්‍රව්‍යය" - - - - + "ශ්‍රවණාධාරකය" + "ශ්‍රවණාධාරකයට සම්බන්ධයි" "මාධ්‍ය ශ්‍රව්‍යට සම්බන්ධ විය" "දුරකතනයේ ශ්‍රව්‍යට සම්බන්ධ විය" "ගොනු හුවමාරු සේවාදායකය සමග සම්බන්ධ විය" @@ -95,8 +93,7 @@ "දුරකථන ශ්‍රව්‍ය සඳහා භාවිතා කෙරේ" "ගොනු හුවමාරුව සඳහා භාවිතා කරන්න" "ආදානය සඳහා භාවිතා කරන්න" - - + "ශ්‍රවණාධාරකය සඳහා භාවිත කරන්න" "යුගල කරන්න" "යුගල කරන්න" "අවලංගු කරන්න" diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 65f612679bb..aa40fef7593 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -75,10 +75,8 @@ "Prístup k SIM karte" "HD zvuk: %1$s" "HD zvuk" - - - - + "Načúvacia pomôcka" + "Pripojené k načúvacej pomôcke" "Pripojené ku zvukovému médiu" "Pripojené ku zvuku telefónu" "Pripojené na server pre prenos údajov" @@ -95,8 +93,7 @@ "Použiť pre zvuk telefónu" "Použiť na prenos súborov" "Použiť pre vstup" - - + "Použitie načúvacej pomôcky" "Párovať" "PÁROVAŤ" "Zrušiť" diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index b76c4ddbd84..a01b0b6b71a 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -75,10 +75,8 @@ "Приступ SIM картици" "HD звук: %1$s" "HD звук" - - - - + "Слушни апарат" + "Повезано са слушним апаратом" "Повезано са звуком медија" "Повезано са звуком телефона" "Повезано са сервером за пренос датотека" @@ -95,8 +93,7 @@ "Коришћење за аудио телефона" "Коришћење за пренос датотека" "Користи за улаз" - - + "Користи за слушни апарат" "Упари" "УПАРИ" "Откажи" diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index ad8edccee9f..fd91e5b7842 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -75,10 +75,8 @@ "Ufikiaji wa SIM" "Sauti ya HD: %1$s" "Sauti ya HD" - - - - + "Visaidizi vya Kusikia" + "Imeunganishwa kwenye Visaidizi vya Kusikia" "Imeunganishwa kwenye sikika ya njia ya mawasiliano" "Imeunganishwa kwenye sauti ya simu" "Imeunganishwa kwenye seva ya kuhamisha faili" @@ -95,8 +93,7 @@ "Tumia kwa sauti ya simu" "Tumia kwa hali faili" "Tumia kwa kuingiza" - - + "Tumia katika Visaidizi vya Kusikia" "Oanisha" "OANISHA" "Ghairi" diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index ce2c143a68f..aab479e32c5 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -75,10 +75,8 @@ "การเข้าถึงซิม" "เสียง HD: %1$s" "เสียง HD" - - - - + "เครื่องช่วยการได้ยิน" + "เชื่อมต่อเครื่องช่วยการได้ยินแล้ว" "เชื่อมต่อกับระบบเสียงของสื่อแล้ว" "เชื่อมต่อกับระบบเสียงของโทรศัพท์แล้ว" "เชื่อมต่อกับเซิร์ฟเวอร์สำหรับโอนไฟล์แล้ว" @@ -95,8 +93,7 @@ "ใช้สำหรับระบบเสียงของโทรศัพท์" "ใช้สำหรับการโอนไฟล์" "ใช้สำหรับการป้อนข้อมูล" - - + "ใช้สำหรับเครื่องช่วยการได้ยิน" "จับคู่อุปกรณ์" "จับคู่อุปกรณ์" "ยกเลิก" diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index b6006fe0bdc..6403213bd0d 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -75,10 +75,8 @@ "Access sa SIM" "HD audio: %1$s" "HD audio" - - - - + "Hearing Aid" + "Nakakonekta sa Hearing Aid" "Konektado sa media audio" "Nakakonekta sa audio ng telepono" "Nakakonekta sa server sa paglilipat ng file" @@ -95,8 +93,7 @@ "Ginagamit para sa audio ng telepono" "Ginagamit para sa paglilipat ng file" "Gamitin para sa input" - - + "Gamitin para sa Hearing Aid" "Pares" "IPARES" "Kanselahin" diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 07fbb431ecc..1c85633fd35 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -75,10 +75,8 @@ "Доступ до SIM-карти" "HD-аудіо: %1$s" "HD-аудіо" - - - - + "Слуховий апарат" + "Під’єднано до слухового апарата" "Підключено до аудіоджерела" "Підключено до звуку телеф." "Підключ. до сервера передачі файлів" @@ -95,8 +93,7 @@ "Викор. для звуку тел." "Викор. для перед. файлів" "Викор. для введ." - - + "Використовувати для слухового апарата" "Підключити" "ПІДКЛЮЧИТИСЯ" "Скасувати" diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index ab6a1768c89..725d92f65b1 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -75,10 +75,8 @@ "SIM-kartaga kirish" "HD audio: %1$s" "HD audio" - - - - + "Eshitish apparati" + "Eshitish apparatiga ulangan" "Audio qurilmasiga ulangan" "Telefon karnayiga ulanildi" "Fayl almashinish serveriga ulanildi" @@ -95,8 +93,7 @@ "Dok’dan karnay sifatida foydalanish" "Fayl almashinish uchun foydalanish" "Kiritish qurilmasi sifatida foydalanish" - - + "Eshitish apparati uchun foydalanish" "Biriktirish" "ULANISH" "Bekor qilish" diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 1b04f4b6f46..5a4180c454d 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -75,10 +75,8 @@ "Ukufinyelela kwe-SIM" "Umsindo we-HD: %1$s" "Umsindo we-HD" - - - - + "Usizo lokuzwa" + "Ixhunywe kokokusiza ukuzwa" "Ixhume emsindweni wemidiya" "Ixhunywe kumsindo wefoni" "Ixhunywe kwiseva yokudlulisa ifayela" @@ -95,8 +93,7 @@ "Sebenziselwa umsindo wefoni" "Sebenziselwa ukudlulisa ifayela" "Isetshenziselwa okufakwayo" - - + "Sebenzisela usizo lokuzwa" "Bhangqa" "BHANQA" "Khansela" -- GitLab From dfbde9eab54aab8dae289b0e092bbcaeaa2208e6 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Feb 2018 21:39:40 -0800 Subject: [PATCH 075/386] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I2f3e741047207c9948bbda977800e4a10b5797c1 --- packages/SettingsLib/res/values-sw/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 815dbc7d2e0..d7420824e4c 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -195,7 +195,7 @@ "Kuongeza kasi kwa kutumia maunzi ili kusambaza mtandao" "Onyesha vifaa vya Bluetooth visivyo na majina" "Zima sauti kamili" - "Washa kipengele cha mlio wa simu katika kituo hicho hicho" + "Washa uchezaji wa mlio unaotumika kwenye simu" "Toleo la Bluetooth AVRCP" "Chagua Toleo la Bluetooth AVRCP" "Kodeki ya Sauti ya Bluetooth" @@ -235,7 +235,7 @@ "Kagua programu zilizosakinishwa kupitia ADB/ADT kwa tabia ya kudhuru." "Itaonyesha vifaa vya Bluetooth bila majina (anwani za MAC pekee)" "Huzima kipengele cha Bluetooth cha sauti kamili kunapotokea matatizo ya sauti katika vifaa vya mbali kama vile sauti ya juu mno au inaposhindikana kuidhibiti." - "Ruhusu milio ya simu kwenye simu ichezwe kwenye Vifaa vya sauti vya Bluetooth" + "Ruhusu bluetooth icheze milio iliyo kwenye simu" "Kituo cha karibu" "Washa programu ya mwisho inayotoa ufikiaji mkuu wa karibu" "Inakagua HDCP" -- GitLab From 68ae94fec42d5f25cd38ec98a1cf1a2fdd5a5bd1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 19 Feb 2018 22:09:16 -0800 Subject: [PATCH 076/386] Import translations. DO NOT MERGE Change-Id: Icb6608011b183f92dbdce57dfb6b5cdafff897ff Auto-generated-cl: translation import --- packages/SettingsProvider/res/values-af/defaults.xml | 1 + packages/SettingsProvider/res/values-am/defaults.xml | 1 + packages/SettingsProvider/res/values-ar/defaults.xml | 1 + packages/SettingsProvider/res/values-az/defaults.xml | 1 + packages/SettingsProvider/res/values-b+sr+Latn/defaults.xml | 1 + packages/SettingsProvider/res/values-be/defaults.xml | 1 + packages/SettingsProvider/res/values-bg/defaults.xml | 1 + packages/SettingsProvider/res/values-bn/defaults.xml | 1 + packages/SettingsProvider/res/values-bs/defaults.xml | 1 + packages/SettingsProvider/res/values-ca/defaults.xml | 1 + packages/SettingsProvider/res/values-cs/defaults.xml | 1 + packages/SettingsProvider/res/values-da/defaults.xml | 1 + packages/SettingsProvider/res/values-de/defaults.xml | 1 + packages/SettingsProvider/res/values-el/defaults.xml | 1 + packages/SettingsProvider/res/values-en-rAU/defaults.xml | 1 + packages/SettingsProvider/res/values-en-rCA/defaults.xml | 1 + packages/SettingsProvider/res/values-en-rGB/defaults.xml | 1 + packages/SettingsProvider/res/values-en-rIN/defaults.xml | 1 + packages/SettingsProvider/res/values-en-rXC/defaults.xml | 1 + packages/SettingsProvider/res/values-es-rUS/defaults.xml | 1 + packages/SettingsProvider/res/values-es/defaults.xml | 1 + packages/SettingsProvider/res/values-et/defaults.xml | 1 + packages/SettingsProvider/res/values-eu/defaults.xml | 1 + packages/SettingsProvider/res/values-fa/defaults.xml | 1 + packages/SettingsProvider/res/values-fi/defaults.xml | 1 + packages/SettingsProvider/res/values-fr-rCA/defaults.xml | 1 + packages/SettingsProvider/res/values-fr/defaults.xml | 1 + packages/SettingsProvider/res/values-gl/defaults.xml | 1 + packages/SettingsProvider/res/values-gu/defaults.xml | 1 + packages/SettingsProvider/res/values-hi/defaults.xml | 1 + packages/SettingsProvider/res/values-hr/defaults.xml | 1 + packages/SettingsProvider/res/values-hu/defaults.xml | 1 + packages/SettingsProvider/res/values-hy/defaults.xml | 1 + packages/SettingsProvider/res/values-in/defaults.xml | 1 + packages/SettingsProvider/res/values-is/defaults.xml | 1 + packages/SettingsProvider/res/values-it/defaults.xml | 1 + packages/SettingsProvider/res/values-iw/defaults.xml | 1 + packages/SettingsProvider/res/values-ja/defaults.xml | 1 + packages/SettingsProvider/res/values-ka/defaults.xml | 1 + packages/SettingsProvider/res/values-kk/defaults.xml | 1 + packages/SettingsProvider/res/values-km/defaults.xml | 1 + packages/SettingsProvider/res/values-kn/defaults.xml | 1 + packages/SettingsProvider/res/values-ko/defaults.xml | 1 + packages/SettingsProvider/res/values-ky/defaults.xml | 1 + packages/SettingsProvider/res/values-lo/defaults.xml | 1 + packages/SettingsProvider/res/values-lt/defaults.xml | 1 + packages/SettingsProvider/res/values-lv/defaults.xml | 1 + packages/SettingsProvider/res/values-mk/defaults.xml | 1 + packages/SettingsProvider/res/values-ml/defaults.xml | 1 + packages/SettingsProvider/res/values-mn/defaults.xml | 1 + packages/SettingsProvider/res/values-mr/defaults.xml | 1 + packages/SettingsProvider/res/values-ms/defaults.xml | 1 + packages/SettingsProvider/res/values-my/defaults.xml | 1 + packages/SettingsProvider/res/values-nb/defaults.xml | 1 + packages/SettingsProvider/res/values-ne/defaults.xml | 1 + packages/SettingsProvider/res/values-nl/defaults.xml | 1 + packages/SettingsProvider/res/values-pa/defaults.xml | 1 + packages/SettingsProvider/res/values-pl/defaults.xml | 1 + packages/SettingsProvider/res/values-pt-rBR/defaults.xml | 1 + packages/SettingsProvider/res/values-pt-rPT/defaults.xml | 1 + packages/SettingsProvider/res/values-pt/defaults.xml | 1 + packages/SettingsProvider/res/values-ro/defaults.xml | 1 + packages/SettingsProvider/res/values-ru/defaults.xml | 1 + packages/SettingsProvider/res/values-si/defaults.xml | 1 + packages/SettingsProvider/res/values-sk/defaults.xml | 1 + packages/SettingsProvider/res/values-sl/defaults.xml | 1 + packages/SettingsProvider/res/values-sq/defaults.xml | 1 + packages/SettingsProvider/res/values-sr/defaults.xml | 1 + packages/SettingsProvider/res/values-sv/defaults.xml | 1 + packages/SettingsProvider/res/values-sw/defaults.xml | 1 + packages/SettingsProvider/res/values-ta/defaults.xml | 1 + packages/SettingsProvider/res/values-te/defaults.xml | 1 + packages/SettingsProvider/res/values-th/defaults.xml | 1 + packages/SettingsProvider/res/values-tl/defaults.xml | 1 + packages/SettingsProvider/res/values-tr/defaults.xml | 1 + packages/SettingsProvider/res/values-uk/defaults.xml | 1 + packages/SettingsProvider/res/values-ur/defaults.xml | 1 + packages/SettingsProvider/res/values-uz/defaults.xml | 1 + packages/SettingsProvider/res/values-vi/defaults.xml | 1 + packages/SettingsProvider/res/values-zh-rCN/defaults.xml | 1 + packages/SettingsProvider/res/values-zh-rHK/defaults.xml | 1 + packages/SettingsProvider/res/values-zh-rTW/defaults.xml | 1 + packages/SettingsProvider/res/values-zu/defaults.xml | 1 + 83 files changed, 83 insertions(+) diff --git a/packages/SettingsProvider/res/values-af/defaults.xml b/packages/SettingsProvider/res/values-af/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-af/defaults.xml +++ b/packages/SettingsProvider/res/values-af/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-am/defaults.xml b/packages/SettingsProvider/res/values-am/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-am/defaults.xml +++ b/packages/SettingsProvider/res/values-am/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ar/defaults.xml b/packages/SettingsProvider/res/values-ar/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-ar/defaults.xml +++ b/packages/SettingsProvider/res/values-ar/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-az/defaults.xml b/packages/SettingsProvider/res/values-az/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-az/defaults.xml +++ b/packages/SettingsProvider/res/values-az/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-b+sr+Latn/defaults.xml b/packages/SettingsProvider/res/values-b+sr+Latn/defaults.xml index 16aed2ec05a..4a468adb67e 100644 --- a/packages/SettingsProvider/res/values-b+sr+Latn/defaults.xml +++ b/packages/SettingsProvider/res/values-b+sr+Latn/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-be/defaults.xml b/packages/SettingsProvider/res/values-be/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-be/defaults.xml +++ b/packages/SettingsProvider/res/values-be/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-bg/defaults.xml b/packages/SettingsProvider/res/values-bg/defaults.xml index 7a4c28c65a9..eb9acd0bb6d 100644 --- a/packages/SettingsProvider/res/values-bg/defaults.xml +++ b/packages/SettingsProvider/res/values-bg/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-bn/defaults.xml b/packages/SettingsProvider/res/values-bn/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-bn/defaults.xml +++ b/packages/SettingsProvider/res/values-bn/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-bs/defaults.xml b/packages/SettingsProvider/res/values-bs/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-bs/defaults.xml +++ b/packages/SettingsProvider/res/values-bs/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ca/defaults.xml b/packages/SettingsProvider/res/values-ca/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-ca/defaults.xml +++ b/packages/SettingsProvider/res/values-ca/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-cs/defaults.xml b/packages/SettingsProvider/res/values-cs/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-cs/defaults.xml +++ b/packages/SettingsProvider/res/values-cs/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-da/defaults.xml b/packages/SettingsProvider/res/values-da/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-da/defaults.xml +++ b/packages/SettingsProvider/res/values-da/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-de/defaults.xml b/packages/SettingsProvider/res/values-de/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-de/defaults.xml +++ b/packages/SettingsProvider/res/values-de/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-el/defaults.xml b/packages/SettingsProvider/res/values-el/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-el/defaults.xml +++ b/packages/SettingsProvider/res/values-el/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-en-rAU/defaults.xml b/packages/SettingsProvider/res/values-en-rAU/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-en-rAU/defaults.xml +++ b/packages/SettingsProvider/res/values-en-rAU/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-en-rCA/defaults.xml b/packages/SettingsProvider/res/values-en-rCA/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-en-rCA/defaults.xml +++ b/packages/SettingsProvider/res/values-en-rCA/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-en-rGB/defaults.xml b/packages/SettingsProvider/res/values-en-rGB/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-en-rGB/defaults.xml +++ b/packages/SettingsProvider/res/values-en-rGB/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-en-rIN/defaults.xml b/packages/SettingsProvider/res/values-en-rIN/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-en-rIN/defaults.xml +++ b/packages/SettingsProvider/res/values-en-rIN/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-en-rXC/defaults.xml b/packages/SettingsProvider/res/values-en-rXC/defaults.xml index 34f63e7abeb..b111b82023f 100644 --- a/packages/SettingsProvider/res/values-en-rXC/defaults.xml +++ b/packages/SettingsProvider/res/values-en-rXC/defaults.xml @@ -23,4 +23,5 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‏‎‏‎‎‎‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎%1$s‎‏‎‎‏‎" + diff --git a/packages/SettingsProvider/res/values-es-rUS/defaults.xml b/packages/SettingsProvider/res/values-es-rUS/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-es-rUS/defaults.xml +++ b/packages/SettingsProvider/res/values-es-rUS/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-es/defaults.xml b/packages/SettingsProvider/res/values-es/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-es/defaults.xml +++ b/packages/SettingsProvider/res/values-es/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-et/defaults.xml b/packages/SettingsProvider/res/values-et/defaults.xml index 37dab156c59..ec62e918719 100644 --- a/packages/SettingsProvider/res/values-et/defaults.xml +++ b/packages/SettingsProvider/res/values-et/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-eu/defaults.xml b/packages/SettingsProvider/res/values-eu/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-eu/defaults.xml +++ b/packages/SettingsProvider/res/values-eu/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-fa/defaults.xml b/packages/SettingsProvider/res/values-fa/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-fa/defaults.xml +++ b/packages/SettingsProvider/res/values-fa/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-fi/defaults.xml b/packages/SettingsProvider/res/values-fi/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-fi/defaults.xml +++ b/packages/SettingsProvider/res/values-fi/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-fr-rCA/defaults.xml b/packages/SettingsProvider/res/values-fr-rCA/defaults.xml index f439312cbfe..86329e486a1 100644 --- a/packages/SettingsProvider/res/values-fr-rCA/defaults.xml +++ b/packages/SettingsProvider/res/values-fr-rCA/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-fr/defaults.xml b/packages/SettingsProvider/res/values-fr/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-fr/defaults.xml +++ b/packages/SettingsProvider/res/values-fr/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-gl/defaults.xml b/packages/SettingsProvider/res/values-gl/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-gl/defaults.xml +++ b/packages/SettingsProvider/res/values-gl/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-gu/defaults.xml b/packages/SettingsProvider/res/values-gu/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-gu/defaults.xml +++ b/packages/SettingsProvider/res/values-gu/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-hi/defaults.xml b/packages/SettingsProvider/res/values-hi/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-hi/defaults.xml +++ b/packages/SettingsProvider/res/values-hi/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-hr/defaults.xml b/packages/SettingsProvider/res/values-hr/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-hr/defaults.xml +++ b/packages/SettingsProvider/res/values-hr/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-hu/defaults.xml b/packages/SettingsProvider/res/values-hu/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-hu/defaults.xml +++ b/packages/SettingsProvider/res/values-hu/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-hy/defaults.xml b/packages/SettingsProvider/res/values-hy/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-hy/defaults.xml +++ b/packages/SettingsProvider/res/values-hy/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-in/defaults.xml b/packages/SettingsProvider/res/values-in/defaults.xml index a63de85206e..ba521317533 100644 --- a/packages/SettingsProvider/res/values-in/defaults.xml +++ b/packages/SettingsProvider/res/values-in/defaults.xml @@ -25,4 +25,5 @@ + diff --git a/packages/SettingsProvider/res/values-is/defaults.xml b/packages/SettingsProvider/res/values-is/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-is/defaults.xml +++ b/packages/SettingsProvider/res/values-is/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-it/defaults.xml b/packages/SettingsProvider/res/values-it/defaults.xml index 16aed2ec05a..4a468adb67e 100644 --- a/packages/SettingsProvider/res/values-it/defaults.xml +++ b/packages/SettingsProvider/res/values-it/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-iw/defaults.xml b/packages/SettingsProvider/res/values-iw/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-iw/defaults.xml +++ b/packages/SettingsProvider/res/values-iw/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ja/defaults.xml b/packages/SettingsProvider/res/values-ja/defaults.xml index 16aed2ec05a..4a468adb67e 100644 --- a/packages/SettingsProvider/res/values-ja/defaults.xml +++ b/packages/SettingsProvider/res/values-ja/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ka/defaults.xml b/packages/SettingsProvider/res/values-ka/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-ka/defaults.xml +++ b/packages/SettingsProvider/res/values-ka/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-kk/defaults.xml b/packages/SettingsProvider/res/values-kk/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-kk/defaults.xml +++ b/packages/SettingsProvider/res/values-kk/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-km/defaults.xml b/packages/SettingsProvider/res/values-km/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-km/defaults.xml +++ b/packages/SettingsProvider/res/values-km/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-kn/defaults.xml b/packages/SettingsProvider/res/values-kn/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-kn/defaults.xml +++ b/packages/SettingsProvider/res/values-kn/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ko/defaults.xml b/packages/SettingsProvider/res/values-ko/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-ko/defaults.xml +++ b/packages/SettingsProvider/res/values-ko/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ky/defaults.xml b/packages/SettingsProvider/res/values-ky/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-ky/defaults.xml +++ b/packages/SettingsProvider/res/values-ky/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-lo/defaults.xml b/packages/SettingsProvider/res/values-lo/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-lo/defaults.xml +++ b/packages/SettingsProvider/res/values-lo/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-lt/defaults.xml b/packages/SettingsProvider/res/values-lt/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-lt/defaults.xml +++ b/packages/SettingsProvider/res/values-lt/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-lv/defaults.xml b/packages/SettingsProvider/res/values-lv/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-lv/defaults.xml +++ b/packages/SettingsProvider/res/values-lv/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-mk/defaults.xml b/packages/SettingsProvider/res/values-mk/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-mk/defaults.xml +++ b/packages/SettingsProvider/res/values-mk/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ml/defaults.xml b/packages/SettingsProvider/res/values-ml/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-ml/defaults.xml +++ b/packages/SettingsProvider/res/values-ml/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-mn/defaults.xml b/packages/SettingsProvider/res/values-mn/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-mn/defaults.xml +++ b/packages/SettingsProvider/res/values-mn/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-mr/defaults.xml b/packages/SettingsProvider/res/values-mr/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-mr/defaults.xml +++ b/packages/SettingsProvider/res/values-mr/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ms/defaults.xml b/packages/SettingsProvider/res/values-ms/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-ms/defaults.xml +++ b/packages/SettingsProvider/res/values-ms/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-my/defaults.xml b/packages/SettingsProvider/res/values-my/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-my/defaults.xml +++ b/packages/SettingsProvider/res/values-my/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-nb/defaults.xml b/packages/SettingsProvider/res/values-nb/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-nb/defaults.xml +++ b/packages/SettingsProvider/res/values-nb/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ne/defaults.xml b/packages/SettingsProvider/res/values-ne/defaults.xml index a63de85206e..ba521317533 100644 --- a/packages/SettingsProvider/res/values-ne/defaults.xml +++ b/packages/SettingsProvider/res/values-ne/defaults.xml @@ -25,4 +25,5 @@ + diff --git a/packages/SettingsProvider/res/values-nl/defaults.xml b/packages/SettingsProvider/res/values-nl/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-nl/defaults.xml +++ b/packages/SettingsProvider/res/values-nl/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-pa/defaults.xml b/packages/SettingsProvider/res/values-pa/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-pa/defaults.xml +++ b/packages/SettingsProvider/res/values-pa/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-pl/defaults.xml b/packages/SettingsProvider/res/values-pl/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-pl/defaults.xml +++ b/packages/SettingsProvider/res/values-pl/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-pt-rBR/defaults.xml b/packages/SettingsProvider/res/values-pt-rBR/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-pt-rBR/defaults.xml +++ b/packages/SettingsProvider/res/values-pt-rBR/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-pt-rPT/defaults.xml b/packages/SettingsProvider/res/values-pt-rPT/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-pt-rPT/defaults.xml +++ b/packages/SettingsProvider/res/values-pt-rPT/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-pt/defaults.xml b/packages/SettingsProvider/res/values-pt/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-pt/defaults.xml +++ b/packages/SettingsProvider/res/values-pt/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ro/defaults.xml b/packages/SettingsProvider/res/values-ro/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-ro/defaults.xml +++ b/packages/SettingsProvider/res/values-ro/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ru/defaults.xml b/packages/SettingsProvider/res/values-ru/defaults.xml index 16aed2ec05a..4a468adb67e 100644 --- a/packages/SettingsProvider/res/values-ru/defaults.xml +++ b/packages/SettingsProvider/res/values-ru/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-si/defaults.xml b/packages/SettingsProvider/res/values-si/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-si/defaults.xml +++ b/packages/SettingsProvider/res/values-si/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-sk/defaults.xml b/packages/SettingsProvider/res/values-sk/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-sk/defaults.xml +++ b/packages/SettingsProvider/res/values-sk/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-sl/defaults.xml b/packages/SettingsProvider/res/values-sl/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-sl/defaults.xml +++ b/packages/SettingsProvider/res/values-sl/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-sq/defaults.xml b/packages/SettingsProvider/res/values-sq/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-sq/defaults.xml +++ b/packages/SettingsProvider/res/values-sq/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-sr/defaults.xml b/packages/SettingsProvider/res/values-sr/defaults.xml index 16aed2ec05a..4a468adb67e 100644 --- a/packages/SettingsProvider/res/values-sr/defaults.xml +++ b/packages/SettingsProvider/res/values-sr/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-sv/defaults.xml b/packages/SettingsProvider/res/values-sv/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-sv/defaults.xml +++ b/packages/SettingsProvider/res/values-sv/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-sw/defaults.xml b/packages/SettingsProvider/res/values-sw/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-sw/defaults.xml +++ b/packages/SettingsProvider/res/values-sw/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ta/defaults.xml b/packages/SettingsProvider/res/values-ta/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-ta/defaults.xml +++ b/packages/SettingsProvider/res/values-ta/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-te/defaults.xml b/packages/SettingsProvider/res/values-te/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-te/defaults.xml +++ b/packages/SettingsProvider/res/values-te/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-th/defaults.xml b/packages/SettingsProvider/res/values-th/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-th/defaults.xml +++ b/packages/SettingsProvider/res/values-th/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-tl/defaults.xml b/packages/SettingsProvider/res/values-tl/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-tl/defaults.xml +++ b/packages/SettingsProvider/res/values-tl/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-tr/defaults.xml b/packages/SettingsProvider/res/values-tr/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-tr/defaults.xml +++ b/packages/SettingsProvider/res/values-tr/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-uk/defaults.xml b/packages/SettingsProvider/res/values-uk/defaults.xml index 71b29ef6648..c85d61aa5c9 100644 --- a/packages/SettingsProvider/res/values-uk/defaults.xml +++ b/packages/SettingsProvider/res/values-uk/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-ur/defaults.xml b/packages/SettingsProvider/res/values-ur/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-ur/defaults.xml +++ b/packages/SettingsProvider/res/values-ur/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-uz/defaults.xml b/packages/SettingsProvider/res/values-uz/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-uz/defaults.xml +++ b/packages/SettingsProvider/res/values-uz/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-vi/defaults.xml b/packages/SettingsProvider/res/values-vi/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-vi/defaults.xml +++ b/packages/SettingsProvider/res/values-vi/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-zh-rCN/defaults.xml b/packages/SettingsProvider/res/values-zh-rCN/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-zh-rCN/defaults.xml +++ b/packages/SettingsProvider/res/values-zh-rCN/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-zh-rHK/defaults.xml b/packages/SettingsProvider/res/values-zh-rHK/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-zh-rHK/defaults.xml +++ b/packages/SettingsProvider/res/values-zh-rHK/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-zh-rTW/defaults.xml b/packages/SettingsProvider/res/values-zh-rTW/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-zh-rTW/defaults.xml +++ b/packages/SettingsProvider/res/values-zh-rTW/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + diff --git a/packages/SettingsProvider/res/values-zu/defaults.xml b/packages/SettingsProvider/res/values-zu/defaults.xml index 2b8033c98c5..ea05c92db0a 100644 --- a/packages/SettingsProvider/res/values-zu/defaults.xml +++ b/packages/SettingsProvider/res/values-zu/defaults.xml @@ -23,4 +23,5 @@ "%1$s" + -- GitLab From 8b34ac657f1817166fff1eab616a67e6ac9fdf23 Mon Sep 17 00:00:00 2001 From: Naoyuki Konda Date: Fri, 16 Feb 2018 14:13:12 +0900 Subject: [PATCH 077/386] Hide APN, USER and Password from log in SETUP_DATA_CALL Some operators don't want to show apn, user, password. Test: manual Bug: 35411757 Change-Id: I357fd561d5b8aa9c6596786c9731e8f3cd9c532c --- telephony/java/android/telephony/data/DataProfile.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/telephony/java/android/telephony/data/DataProfile.java b/telephony/java/android/telephony/data/DataProfile.java index 41c1430e386..e8597b22139 100644 --- a/telephony/java/android/telephony/data/DataProfile.java +++ b/telephony/java/android/telephony/data/DataProfile.java @@ -17,6 +17,7 @@ package android.telephony.data; import android.annotation.SystemApi; +import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; @@ -230,8 +231,10 @@ public final class DataProfile implements Parcelable { @Override public String toString() { - return "DataProfile=" + mProfileId + "/" + mApn + "/" + mProtocol + "/" + mAuthType - + "/" + mUserName + "/" + mPassword + "/" + mType + "/" + mMaxConnsTime + return "DataProfile=" + mProfileId + "/" + mProtocol + "/" + mAuthType + + "/" + (Build.IS_USER ? "***/***/***" : + (mApn + "/" + mUserName + "/" + mPassword)) + + "/" + mType + "/" + mMaxConnsTime + "/" + mMaxConns + "/" + mWaitTime + "/" + mEnabled + "/" + mSupportedApnTypesBitmap + "/" + mRoamingProtocol + "/" + mBearerBitmap + "/" + mMtu + "/" + mMvnoType + "/" + mMvnoMatchData + "/" + mModemCognitive; -- GitLab From cfcd8a0578b3000ab2468ee4d84f9f8c2ac8f2dc Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Tue, 20 Feb 2018 11:59:10 +0000 Subject: [PATCH 078/386] One more API on hidden API light greylist Report from the wild. Bug: 64382372 Test: make Change-Id: Ia7285fc5240df1e3142a162f5bf71870383f3020 --- config/hiddenapi-light-greylist.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt index e45d66ec58a..f3997a43ea0 100644 --- a/config/hiddenapi-light-greylist.txt +++ b/config/hiddenapi-light-greylist.txt @@ -565,6 +565,7 @@ Landroid/content/res/ColorStateList$ColorStateListFactory;->(Landroid/cont Landroid/content/res/ColorStateList;->mColors:[I Landroid/content/res/ColorStateList;->mDefaultColor:I Landroid/content/res/ColorStateList;->mFactory:Landroid/content/res/ColorStateList$ColorStateListFactory; +Landroid/content/res/CompatibilityInfo;->applicationScale:F Landroid/content/res/CompatibilityInfo;->DEFAULT_COMPATIBILITY_INFO:Landroid/content/res/CompatibilityInfo; Landroid/content/res/DrawableCache;->getInstance(JLandroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable; Landroid/content/res/ObbInfo;->salt:[B -- GitLab From 34b769d32b41fc75cf93f504e7a2117095084a8d Mon Sep 17 00:00:00 2001 From: Michal Karpinski Date: Mon, 19 Feb 2018 13:55:23 +0000 Subject: [PATCH 079/386] Extend XML parser to allow optional requiredFlags attribute for rules in specification Give an app developer the option to include files based on the transport flags exposed by the transport. This allows conditionally including files as long as the transport identifies itself as for instance encrypted or device-to-device. Extend the parsing mechanism to read optional requiredFlags attributes, and extend existing structures to encompass that data for BackupAgent to retrieve and act on it based on FullBackupDataOutput#getTransportFlags(). Bug: 72484288 Test: runtest frameworks-core -c android.app.backup.FullBackupTest Test: make cts -j40 && cts-tradefed run cts -m CtsBackupHostTestCases -t android.cts.backup.FullbackupRulesHostSideTest Change-Id: Ibf12995796963f87ed19d9e357ae8546037e5f53 --- core/java/android/app/backup/BackupAgent.java | 60 ++++-- core/java/android/app/backup/FullBackup.java | 189 +++++++++++++----- .../android/app/backup/FullBackupTest.java | 183 ++++++++++++++--- 3 files changed, 336 insertions(+), 96 deletions(-) diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java index d36a794ac04..d1c957b8fed 100644 --- a/core/java/android/app/backup/BackupAgent.java +++ b/core/java/android/app/backup/BackupAgent.java @@ -18,6 +18,7 @@ package android.app.backup; import android.app.IBackupAgent; import android.app.QueuedWork; +import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags; import android.content.Context; import android.content.ContextWrapper; import android.content.pm.ApplicationInfo; @@ -343,8 +344,8 @@ public abstract class BackupAgent extends ContextWrapper { return; } - Map> manifestIncludeMap; - ArraySet manifestExcludeSet; + Map> manifestIncludeMap; + ArraySet manifestExcludeSet; try { manifestIncludeMap = backupScheme.maybeParseAndGetCanonicalIncludePaths(); @@ -514,14 +515,13 @@ public abstract class BackupAgent extends ContextWrapper { /** * Check whether the xml yielded any tag for the provided domainToken. * If so, perform a {@link #fullBackupFileTree} which backs up the file or recurses if the path - * is a directory. + * is a directory, but only if all the required flags of the include rule are satisfied by + * the transport. */ private void applyXmlFiltersAndDoFullBackupForDomain(String packageName, String domainToken, - Map> includeMap, - ArraySet filterSet, - ArraySet traversalExcludeSet, - FullBackupDataOutput data) - throws IOException { + Map> includeMap, + ArraySet filterSet, ArraySet traversalExcludeSet, + FullBackupDataOutput data) throws IOException { if (includeMap == null || includeMap.size() == 0) { // Do entire sub-tree for the provided token. fullBackupFileTree(packageName, domainToken, @@ -530,13 +530,22 @@ public abstract class BackupAgent extends ContextWrapper { } else if (includeMap.get(domainToken) != null) { // This will be null if the xml parsing didn't yield any rules for // this domain (there may still be rules for other domains). - for (String includeFile : includeMap.get(domainToken)) { - fullBackupFileTree(packageName, domainToken, includeFile, filterSet, - traversalExcludeSet, data); + for (PathWithRequiredFlags includeFile : includeMap.get(domainToken)) { + if (areIncludeRequiredTransportFlagsSatisfied(includeFile.getRequiredFlags(), + data.getTransportFlags())) { + fullBackupFileTree(packageName, domainToken, includeFile.getPath(), filterSet, + traversalExcludeSet, data); + } } } } + private boolean areIncludeRequiredTransportFlagsSatisfied(int includeFlags, + int transportFlags) { + // all bits that are set in includeFlags must also be set in transportFlags + return (transportFlags & includeFlags) == includeFlags; + } + /** * Write an entire file as part of a full-backup operation. The file's contents * will be delivered to the backup destination along with the metadata necessary @@ -683,7 +692,7 @@ public abstract class BackupAgent extends ContextWrapper { * @hide */ protected final void fullBackupFileTree(String packageName, String domain, String startingPath, - ArraySet manifestExcludes, + ArraySet manifestExcludes, ArraySet systemExcludes, FullBackupDataOutput output) { // Pull out the domain and set it aside to use when making the tarball. @@ -714,7 +723,8 @@ public abstract class BackupAgent extends ContextWrapper { filePath = file.getCanonicalPath(); // prune this subtree? - if (manifestExcludes != null && manifestExcludes.contains(filePath)) { + if (manifestExcludes != null + && manifestExcludesContainFilePath(manifestExcludes, filePath)) { continue; } if (systemExcludes != null && systemExcludes.contains(filePath)) { @@ -750,6 +760,17 @@ public abstract class BackupAgent extends ContextWrapper { } } + private boolean manifestExcludesContainFilePath( + ArraySet manifestExcludes, String filePath) { + for (PathWithRequiredFlags exclude : manifestExcludes) { + String excludePath = exclude.getPath(); + if (excludePath != null && excludePath.equals(filePath)) { + return true; + } + } + return false; + } + /** * Handle the data delivered via the given file descriptor during a full restore * operation. The agent is given the path to the file's original location as well @@ -796,8 +817,8 @@ public abstract class BackupAgent extends ContextWrapper { return false; } - Map> includes = null; - ArraySet excludes = null; + Map> includes = null; + ArraySet excludes = null; final String destinationCanonicalPath = destination.getCanonicalPath(); try { includes = bs.maybeParseAndGetCanonicalIncludePaths(); @@ -826,7 +847,7 @@ public abstract class BackupAgent extends ContextWrapper { // Rather than figure out the domain based on the path (a lot of code, and // it's a small list), we'll go through and look for it. boolean explicitlyIncluded = false; - for (Set domainIncludes : includes.values()) { + for (Set domainIncludes : includes.values()) { explicitlyIncluded |= isFileSpecifiedInPathList(destination, domainIncludes); if (explicitlyIncluded) { break; @@ -849,9 +870,10 @@ public abstract class BackupAgent extends ContextWrapper { * @return True if the provided file is either directly in the provided list, or the provided * file is within a directory in the list. */ - private boolean isFileSpecifiedInPathList(File file, Collection canonicalPathList) - throws IOException { - for (String canonicalPath : canonicalPathList) { + private boolean isFileSpecifiedInPathList(File file, + Collection canonicalPathList) throws IOException { + for (PathWithRequiredFlags canonical : canonicalPathList) { + String canonicalPath = canonical.getPath(); File fileFromList = new File(canonicalPath); if (fileFromList.isDirectory()) { if (file.isDirectory()) { diff --git a/core/java/android/app/backup/FullBackup.java b/core/java/android/app/backup/FullBackup.java index a5dd5bd30d6..fb1c2d085df 100644 --- a/core/java/android/app/backup/FullBackup.java +++ b/core/java/android/app/backup/FullBackup.java @@ -82,6 +82,9 @@ public class FullBackup { public static final String FULL_RESTORE_INTENT_ACTION = "fullrest"; public static final String CONF_TOKEN_INTENT_EXTRA = "conftoken"; + public static final String FLAG_REQUIRED_CLIENT_SIDE_ENCRYPTION = "clientSideEncryption"; + public static final String FLAG_REQUIRED_DEVICE_TO_DEVICE_TRANSFER = "deviceToDeviceTransfer"; + /** * @hide */ @@ -224,6 +227,9 @@ public class FullBackup { private final File EXTERNAL_DIR; + private final static String TAG_INCLUDE = "include"; + private final static String TAG_EXCLUDE = "exclude"; + final int mFullBackupContent; final PackageManager mPackageManager; final StorageManager mStorageManager; @@ -303,15 +309,45 @@ public class FullBackup { } /** - * A map of domain -> list of canonical file names in that domain that are to be included. - * We keep track of the domain so that we can go through the file system in order later on. - */ - Map> mIncludes; - /**e - * List that will be populated with the canonical names of each file or directory that is - * to be excluded. + * Represents a path attribute specified in an rule along with optional + * transport flags required from the transport to include file(s) under that path as + * specified by requiredFlags attribute. If optional requiredFlags attribute is not + * provided, default requiredFlags to 0. + * Note: since our parsing codepaths were the same for and tags, + * this structure is also used for tags to preserve that, however you can expect + * the getRequiredFlags() to always return 0 for exclude rules. + */ + public static class PathWithRequiredFlags { + private final String mPath; + private final int mRequiredFlags; + + public PathWithRequiredFlags(String path, int requiredFlags) { + mPath = path; + mRequiredFlags = requiredFlags; + } + + public String getPath() { + return mPath; + } + + public int getRequiredFlags() { + return mRequiredFlags; + } + } + + /** + * A map of domain -> set of pairs (canonical file; required transport flags) in that + * domain that are to be included if the transport has decared the required flags. + * We keep track of the domain so that we can go through the file system in order later on. + */ + Map> mIncludes; + + /** + * Set that will be populated with pairs (canonical file; requiredFlags=0) for each file or + * directory that is to be excluded. Note that for excludes, the requiredFlags attribute is + * ignored and the value should be always set to 0. */ - ArraySet mExcludes; + ArraySet mExcludes; BackupScheme(Context context) { mFullBackupContent = context.getApplicationInfo().fullBackupContent; @@ -356,13 +392,14 @@ public class FullBackup { } /** - * @return A mapping of domain -> canonical paths within that domain. Each of these paths - * specifies a file that the client has explicitly included in their backup set. If this - * map is empty we will back up the entire data directory (including managed external - * storage). + * @return A mapping of domain -> set of pairs (canonical file; required transport flags) + * in that domain that are to be included if the transport has decared the required flags. + * Each of these paths specifies a file that the client has explicitly included in their + * backup set. If this map is empty we will back up the entire data directory (including + * managed external storage). */ - public synchronized Map> maybeParseAndGetCanonicalIncludePaths() - throws IOException, XmlPullParserException { + public synchronized Map> + maybeParseAndGetCanonicalIncludePaths() throws IOException, XmlPullParserException { if (mIncludes == null) { maybeParseBackupSchemeLocked(); } @@ -370,9 +407,10 @@ public class FullBackup { } /** - * @return A set of canonical paths that are to be excluded from the backup/restore set. + * @return A set of (canonical paths; requiredFlags=0) that are to be excluded from the + * backup/restore set. */ - public synchronized ArraySet maybeParseAndGetCanonicalExcludePaths() + public synchronized ArraySet maybeParseAndGetCanonicalExcludePaths() throws IOException, XmlPullParserException { if (mExcludes == null) { maybeParseBackupSchemeLocked(); @@ -382,8 +420,8 @@ public class FullBackup { private void maybeParseBackupSchemeLocked() throws IOException, XmlPullParserException { // This not being null is how we know that we've tried to parse the xml already. - mIncludes = new ArrayMap>(); - mExcludes = new ArraySet(); + mIncludes = new ArrayMap>(); + mExcludes = new ArraySet(); if (mFullBackupContent == 0) { // android:fullBackupContent="true" which means that we'll do everything. @@ -415,8 +453,8 @@ public class FullBackup { @VisibleForTesting public void parseBackupSchemeFromXmlLocked(XmlPullParser parser, - Set excludes, - Map> includes) + Set excludes, + Map> includes) throws IOException, XmlPullParserException { int event = parser.getEventType(); // START_DOCUMENT while (event != XmlPullParser.START_TAG) { @@ -441,8 +479,7 @@ public class FullBackup { case XmlPullParser.START_TAG: validateInnerTagContents(parser); final String domainFromXml = parser.getAttributeValue(null, "domain"); - final File domainDirectory = - getDirectoryForCriteriaDomain(domainFromXml); + final File domainDirectory = getDirectoryForCriteriaDomain(domainFromXml); if (domainDirectory == null) { if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) { Log.v(TAG_XML_PARSER, "...parsing \"" + parser.getName() + "\": " @@ -457,12 +494,23 @@ public class FullBackup { break; } - Set activeSet = parseCurrentTagForDomain( + int requiredFlags = 0; // no transport flags are required by default + if (TAG_INCLUDE.equals(parser.getName())) { + // requiredFlags are only supported for tag, for + // we should always leave them as the default = 0 + requiredFlags = getRequiredFlagsFromString( + parser.getAttributeValue(null, "requireFlags")); + } + + // retrieve the include/exclude set we'll be adding this rule to + Set activeSet = parseCurrentTagForDomain( parser, excludes, includes, domainFromXml); - activeSet.add(canonicalFile.getCanonicalPath()); + activeSet.add(new PathWithRequiredFlags(canonicalFile.getCanonicalPath(), + requiredFlags)); if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) { Log.v(TAG_XML_PARSER, "...parsed " + canonicalFile.getCanonicalPath() - + " for domain \"" + domainFromXml + "\""); + + " for domain \"" + domainFromXml + "\", requiredFlags + \"" + + requiredFlags + "\""); } // Special case journal files (not dirs) for sqlite database. frowny-face. @@ -472,14 +520,16 @@ public class FullBackup { if ("database".equals(domainFromXml) && !canonicalFile.isDirectory()) { final String canonicalJournalPath = canonicalFile.getCanonicalPath() + "-journal"; - activeSet.add(canonicalJournalPath); + activeSet.add(new PathWithRequiredFlags(canonicalJournalPath, + requiredFlags)); if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) { Log.v(TAG_XML_PARSER, "...automatically generated " + canonicalJournalPath + ". Ignore if nonexistent."); } final String canonicalWalPath = canonicalFile.getCanonicalPath() + "-wal"; - activeSet.add(canonicalWalPath); + activeSet.add(new PathWithRequiredFlags(canonicalWalPath, + requiredFlags)); if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) { Log.v(TAG_XML_PARSER, "...automatically generated " + canonicalWalPath + ". Ignore if nonexistent."); @@ -491,7 +541,8 @@ public class FullBackup { !canonicalFile.getCanonicalPath().endsWith(".xml")) { final String canonicalXmlPath = canonicalFile.getCanonicalPath() + ".xml"; - activeSet.add(canonicalXmlPath); + activeSet.add(new PathWithRequiredFlags(canonicalXmlPath, + requiredFlags)); if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) { Log.v(TAG_XML_PARSER, "...automatically generated " + canonicalXmlPath + ". Ignore if nonexistent."); @@ -508,10 +559,12 @@ public class FullBackup { Log.v(TAG_XML_PARSER, " ...nothing specified (This means the entirety of app" + " data minus excludes)"); } else { - for (Map.Entry> entry : includes.entrySet()) { + for (Map.Entry> entry + : includes.entrySet()) { Log.v(TAG_XML_PARSER, " domain=" + entry.getKey()); - for (String includeData : entry.getValue()) { - Log.v(TAG_XML_PARSER, " " + includeData); + for (PathWithRequiredFlags includeData : entry.getValue()) { + Log.v(TAG_XML_PARSER, " path: " + includeData.getPath() + + " requiredFlags: " + includeData.getRequiredFlags()); } } } @@ -520,8 +573,9 @@ public class FullBackup { if (excludes.isEmpty()) { Log.v(TAG_XML_PARSER, " ...nothing to exclude."); } else { - for (String excludeData : excludes) { - Log.v(TAG_XML_PARSER, " " + excludeData); + for (PathWithRequiredFlags excludeData : excludes) { + Log.v(TAG_XML_PARSER, " path: " + excludeData.getPath() + + " requiredFlags: " + excludeData.getRequiredFlags()); } } @@ -531,20 +585,41 @@ public class FullBackup { } } - private Set parseCurrentTagForDomain(XmlPullParser parser, - Set excludes, - Map> includes, - String domain) + private int getRequiredFlagsFromString(String requiredFlags) { + int flags = 0; + if (requiredFlags == null || requiredFlags.length() == 0) { + // requiredFlags attribute was missing or empty in tag + return flags; + } + String[] flagsStr = requiredFlags.split("\\|"); + for (String f : flagsStr) { + switch (f) { + case FLAG_REQUIRED_CLIENT_SIDE_ENCRYPTION: + flags |= BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED; + break; + case FLAG_REQUIRED_DEVICE_TO_DEVICE_TRANSFER: + flags |= BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER; + break; + default: + Log.w(TAG, "Unrecognized requiredFlag provided, value: \"" + f + "\""); + } + } + return flags; + } + + private Set parseCurrentTagForDomain(XmlPullParser parser, + Set excludes, + Map> includes, String domain) throws XmlPullParserException { - if ("include".equals(parser.getName())) { + if (TAG_INCLUDE.equals(parser.getName())) { final String domainToken = getTokenForXmlDomain(domain); - Set includeSet = includes.get(domainToken); + Set includeSet = includes.get(domainToken); if (includeSet == null) { - includeSet = new ArraySet(); + includeSet = new ArraySet(); includes.put(domainToken, includeSet); } return includeSet; - } else if ("exclude".equals(parser.getName())) { + } else if (TAG_EXCLUDE.equals(parser.getName())) { return excludes; } else { // Unrecognised tag => hard failure. @@ -589,8 +664,8 @@ public class FullBackup { /** * * @param domain Directory where the specified file should exist. Not null. - * @param filePathFromXml parsed from xml. Not sanitised before calling this function so may be - * null. + * @param filePathFromXml parsed from xml. Not sanitised before calling this function so may + * be null. * @return The canonical path of the file specified or null if no such file exists. */ private File extractCanonicalFile(File domain, String filePathFromXml) { @@ -650,15 +725,27 @@ public class FullBackup { * Let's be strict about the type of xml the client can write. If we see anything untoward, * throw an XmlPullParserException. */ - private void validateInnerTagContents(XmlPullParser parser) - throws XmlPullParserException { - if (parser.getAttributeCount() > 2) { - throw new XmlPullParserException("At most 2 tag attributes allowed for \"" - + parser.getName() + "\" tag (\"domain\" & \"path\"."); + private void validateInnerTagContents(XmlPullParser parser) throws XmlPullParserException { + if (parser == null) { + return; } - if (!"include".equals(parser.getName()) && !"exclude".equals(parser.getName())) { - throw new XmlPullParserException("A valid tag is one of \"\" or" + - " \". You provided \"" + parser.getName() + "\""); + switch (parser.getName()) { + case TAG_INCLUDE: + if (parser.getAttributeCount() > 3) { + throw new XmlPullParserException("At most 3 tag attributes allowed for " + + "\"include\" tag (\"domain\" & \"path\"" + + " & optional \"requiredFlags\")."); + } + break; + case TAG_EXCLUDE: + if (parser.getAttributeCount() > 2) { + throw new XmlPullParserException("At most 2 tag attributes allowed for " + + "\"exclude\" tag (\"domain\" & \"path\"."); + } + break; + default: + throw new XmlPullParserException("A valid tag is one of \"\" or" + + " \". You provided \"" + parser.getName() + "\""); } } } diff --git a/core/tests/coretests/src/android/app/backup/FullBackupTest.java b/core/tests/coretests/src/android/app/backup/FullBackupTest.java index bc6fc15db16..58ee7a78358 100644 --- a/core/tests/coretests/src/android/app/backup/FullBackupTest.java +++ b/core/tests/coretests/src/android/app/backup/FullBackupTest.java @@ -19,6 +19,7 @@ package android.app.backup; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags; import android.content.Context; import android.support.test.filters.LargeTest; import android.test.AndroidTestCase; @@ -43,8 +44,8 @@ public class FullBackupTest extends AndroidTestCase { private XmlPullParser mXpp; private Context mContext; - Map> includeMap; - Set excludesSet; + Map> includeMap; + Set excludesSet; @Override public void setUp() throws Exception { @@ -52,8 +53,8 @@ public class FullBackupTest extends AndroidTestCase { mXpp = mFactory.newPullParser(); mContext = getContext(); - includeMap = new ArrayMap(); - excludesSet = new ArraySet(); + includeMap = new ArrayMap<>(); + excludesSet = new ArraySet<>(); } public void testparseBackupSchemeFromXml_onlyInclude() throws Exception { @@ -68,11 +69,127 @@ public class FullBackupTest extends AndroidTestCase { assertEquals("Excluding files when there was no tag.", 0, excludesSet.size()); assertEquals("Unexpected number of s", 1, includeMap.size()); - Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); + PathWithRequiredFlags include = fileDomainIncludes.iterator().next(); assertEquals("Invalid path parsed for ", new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(), - fileDomainIncludes.iterator().next()); + include.getPath()); + assertEquals("Invalid requireFlags parsed for ", 0, include.getRequiredFlags()); + } + + public void testparseBackupSchemeFromXml_onlyIncludeRequireEncryptionFlag() throws Exception { + mXpp.setInput(new StringReader( + "" + + "" + + "")); + + FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); + bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); + + assertEquals("Excluding files when there was no tag.", 0, excludesSet.size()); + assertEquals("Unexpected number of s", 1, includeMap.size()); + + Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); + PathWithRequiredFlags include = fileDomainIncludes.iterator().next(); + assertEquals("Invalid path parsed for ", + new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(), + include.getPath()); + assertEquals("Invalid requireFlags parsed for ", + BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED, + include.getRequiredFlags()); + } + + public void testparseBackupSchemeFromXml_onlyIncludeRequireD2DFlag() throws Exception { + mXpp.setInput(new StringReader( + "" + + "" + + "")); + + FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); + bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); + + assertEquals("Excluding files when there was no tag.", 0, excludesSet.size()); + assertEquals("Unexpected number of s", 1, includeMap.size()); + + Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); + PathWithRequiredFlags include = fileDomainIncludes.iterator().next(); + assertEquals("Invalid path parsed for ", + new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(), + include.getPath()); + assertEquals("Invalid requireFlags parsed for ", + BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER, + include.getRequiredFlags()); + } + + public void testparseBackupSchemeFromXml_onlyIncludeRequireEncryptionAndD2DFlags() + throws Exception { + mXpp.setInput(new StringReader( + "" + + "" + + "")); + + FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); + bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); + + assertEquals("Excluding files when there was no tag.", 0, excludesSet.size()); + assertEquals("Unexpected number of s", 1, includeMap.size()); + + Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); + PathWithRequiredFlags include = fileDomainIncludes.iterator().next(); + assertEquals("Invalid path parsed for ", + new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(), + include.getPath()); + assertEquals("Invalid requireFlags parsed for ", + BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED + | BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER, + include.getRequiredFlags()); + } + + public void testparseBackupSchemeFromXml_onlyIncludeRequireD2DFlagAndIngoreGarbage() + throws Exception { + mXpp.setInput(new StringReader( + "" + + "" + + "")); + + FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); + bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); + + assertEquals("Excluding files when there was no tag.", 0, excludesSet.size()); + assertEquals("Unexpected number of s", 1, includeMap.size()); + + Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); + PathWithRequiredFlags include = fileDomainIncludes.iterator().next(); + assertEquals("Invalid path parsed for ", + new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(), + include.getPath()); + assertEquals("Invalid requireFlags parsed for ", + BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER, + include.getRequiredFlags()); + } + + public void testparseBackupSchemeFromXml_onlyExcludeRequireFlagsNotSupported() + throws Exception { + mXpp.setInput(new StringReader( + "" + + "" + + "")); + + try { + FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); + bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); + fail("Having more than 3 attributes in exclude should throw an XmlPullParserException"); + } catch (XmlPullParserException expected) {} } public void testparseBackupSchemeFromXml_onlyExclude() throws Exception { @@ -88,7 +205,7 @@ public class FullBackupTest extends AndroidTestCase { assertEquals("Unexpected number of s", 1, excludesSet.size()); assertEquals("Invalid path parsed for ", new File(mContext.getFilesDir(), "onlyExclude.txt").getCanonicalPath(), - excludesSet.iterator().next()); + excludesSet.iterator().next().getPath()); } public void testparseBackupSchemeFromXml_includeAndExclude() throws Exception { @@ -101,16 +218,16 @@ public class FullBackupTest extends AndroidTestCase { FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); - Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); assertEquals("Invalid path parsed for ", new File(mContext.getFilesDir(), "include.txt").getCanonicalPath(), - fileDomainIncludes.iterator().next()); + fileDomainIncludes.iterator().next().getPath()); assertEquals("Unexpected number of s", 1, excludesSet.size()); assertEquals("Invalid path parsed for ", new File(mContext.getFilesDir(), "exclude.txt").getCanonicalPath(), - excludesSet.iterator().next()); + excludesSet.iterator().next().getPath()); } public void testparseBackupSchemeFromXml_lotsOfIncludesAndExcludes() throws Exception { @@ -126,61 +243,74 @@ public class FullBackupTest extends AndroidTestCase { "" + "")); - FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); - Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); assertEquals("Invalid path parsed for ", new File(mContext.getFilesDir(), "include1.txt").getCanonicalPath(), - fileDomainIncludes.iterator().next()); - - Set databaseDomainIncludes = includeMap.get(FullBackup.DATABASE_TREE_TOKEN); + fileDomainIncludes.iterator().next().getPath()); + + Set databaseDomainIncludes = + includeMap.get(FullBackup.DATABASE_TREE_TOKEN); + Set databaseDomainIncludesPaths = new ArraySet<>(); + for (PathWithRequiredFlags databaseInclude : databaseDomainIncludes) { + databaseDomainIncludesPaths.add(databaseInclude.getPath()); + } // Three expected here because of "-journal" and "-wal" files assertEquals("Didn't find expected database domain include.", 3, databaseDomainIncludes.size()); assertTrue("Invalid path parsed for ", - databaseDomainIncludes.contains( + databaseDomainIncludesPaths.contains( new File(mContext.getDatabasePath("foo").getParentFile(), "include2.txt") .getCanonicalPath())); assertTrue("Invalid path parsed for ", - databaseDomainIncludes.contains( + databaseDomainIncludesPaths.contains( new File( mContext.getDatabasePath("foo").getParentFile(), "include2.txt-journal") .getCanonicalPath())); assertTrue("Invalid path parsed for ", - databaseDomainIncludes.contains( + databaseDomainIncludesPaths.contains( new File( mContext.getDatabasePath("foo").getParentFile(), "include2.txt-wal") .getCanonicalPath())); - List sharedPrefDomainIncludes = new ArrayList( + List sharedPrefDomainIncludes = new ArrayList( includeMap.get(FullBackup.SHAREDPREFS_TREE_TOKEN)); - Collections.sort(sharedPrefDomainIncludes); + ArrayList sharedPrefDomainIncludesPaths = new ArrayList<>(); + for (PathWithRequiredFlags sharedPrefInclude : sharedPrefDomainIncludes) { + sharedPrefDomainIncludesPaths.add(sharedPrefInclude.getPath()); + } + // Sets are annoying to iterate over b/c order isn't enforced - convert to an array and + // sort lexicographically. + Collections.sort(sharedPrefDomainIncludesPaths); assertEquals("Didn't find expected sharedpref domain include.", 3, sharedPrefDomainIncludes.size()); assertEquals("Invalid path parsed for ", new File(mContext.getSharedPrefsFile("foo").getParentFile(), "include3") .getCanonicalPath(), - sharedPrefDomainIncludes.get(0)); + sharedPrefDomainIncludesPaths.get(0)); assertEquals("Invalid path parsed for ", new File(mContext.getSharedPrefsFile("foo").getParentFile(), "include3.xml") .getCanonicalPath(), - sharedPrefDomainIncludes.get(1)); + sharedPrefDomainIncludesPaths.get(1)); assertEquals("Invalid path parsed for ", new File(mContext.getSharedPrefsFile("foo").getParentFile(), "include4.xml") .getCanonicalPath(), - sharedPrefDomainIncludes.get(2)); + sharedPrefDomainIncludesPaths.get(2)); assertEquals("Unexpected number of s", 7, excludesSet.size()); // Sets are annoying to iterate over b/c order isn't enforced - convert to an array and // sort lexicographically. - List arrayedSet = new ArrayList(excludesSet); + ArrayList arrayedSet = new ArrayList<>(); + for (PathWithRequiredFlags exclude : excludesSet) { + arrayedSet.add(exclude.getPath()); + } Collections.sort(arrayedSet); assertEquals("Invalid path parsed for ", @@ -260,9 +390,10 @@ public class FullBackupTest extends AndroidTestCase { assertEquals("Didn't throw away invalid \"..\" path.", 0, includeMap.size()); - Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); assertNull("Didn't throw away invalid \"..\" path.", fileDomainIncludes); } + public void testDoubleDotInPath_isIgnored() throws Exception { mXpp.setInput(new StringReader( "" + @@ -274,7 +405,7 @@ public class FullBackupTest extends AndroidTestCase { assertEquals("Didn't throw away invalid \"..\" path.", 0, includeMap.size()); - Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + Set fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); assertNull("Didn't throw away invalid \"..\" path.", fileDomainIncludes); } -- GitLab From 366ee6269d4f35dadb475ae63a46c8b3066f9d62 Mon Sep 17 00:00:00 2001 From: Tony Mak Date: Mon, 12 Feb 2018 17:52:34 +0000 Subject: [PATCH 080/386] Update javadoc of PackageInstaller to mention the enterprise bit FIX: 70377922 Change-Id: I87fb995ff476448511076077ba99b1fe3d79b819 --- .../android/content/pm/PackageInstaller.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index d0be6c85402..25af1a76700 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -448,11 +448,17 @@ public class PackageInstaller { /** * Uninstall the given package, removing it completely from the device. This - * method is only available to the current "installer of record" for the - * package. + * method is available to: + *

    + *
  • the current "installer of record" for the package + *
  • the device owner + *
  • the affiliated profile owner + *
* * @param packageName The package to uninstall. * @param statusReceiver Where to deliver the result. + * + * @see android.app.admin.DevicePolicyManager */ @RequiresPermission(anyOf = { Manifest.permission.DELETE_PACKAGES, @@ -480,14 +486,22 @@ public class PackageInstaller { /** * Uninstall the given package with a specific version code, removing it - * completely from the device. This method is only available to the current - * "installer of record" for the package. If the version code of the package + * completely from the device. If the version code of the package * does not match the one passed in the versioned package argument this * method is a no-op. Use {@link PackageManager#VERSION_CODE_HIGHEST} to * uninstall the latest version of the package. + *

+ * This method is available to: + *

    + *
  • the current "installer of record" for the package + *
  • the device owner + *
  • the affiliated profile owner + *
* * @param versionedPackage The versioned package to uninstall. * @param statusReceiver Where to deliver the result. + * + * @see android.app.admin.DevicePolicyManager */ @RequiresPermission(anyOf = { Manifest.permission.DELETE_PACKAGES, @@ -941,9 +955,14 @@ public class PackageInstaller { * Once this method is called, the session is sealed and no additional * mutations may be performed on the session. If the device reboots * before the session has been finalized, you may commit the session again. + *

+ * If the installer is the device owner or the affiliated profile owner, there will be no + * user intervention. * * @throws SecurityException if streams opened through * {@link #openWrite(String, long, long)} are still open. + * + * @see android.app.admin.DevicePolicyManager */ public void commit(@NonNull IntentSender statusReceiver) { try { -- GitLab From a690ccffd46c2e123f680e54be9a3350e601d5e0 Mon Sep 17 00:00:00 2001 From: Amin Shaikh Date: Tue, 20 Feb 2018 10:22:40 -0500 Subject: [PATCH 081/386] Allow QS to be any height. Do not restrict the height of QS so that the security footer can be fully displayed. Previously with scrolling support, it was necessary to restrict the height of the QS panel so that it did not run off screen. Bug: 73055149 Bug: 73349811 Test: visual Change-Id: I341930ad4816391923d50b34b5e598d04fc5281a --- .../com/android/systemui/qs/QSContainerImpl.java | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java index 6ccb81772db..7da109de695 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java @@ -76,22 +76,11 @@ public class QSContainerImpl extends FrameLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - getDisplay().getRealSize(mSizePoint); - // Since we control our own bottom, be whatever size we want. // Otherwise the QSPanel ends up with 0 height when the window is only the // size of the status bar. - Configuration config = getResources().getConfiguration(); - boolean navBelow = config.smallestScreenWidthDp >= 600 - || config.orientation != Configuration.ORIENTATION_LANDSCAPE; - MarginLayoutParams params = (MarginLayoutParams) mQSPanel.getLayoutParams(); - int maxQs = mSizePoint.y - params.topMargin - params.bottomMargin - getPaddingBottom() - - getResources().getDimensionPixelSize(R.dimen.qs_notif_collapsed_space); - if (navBelow) { - maxQs -= getResources().getDimensionPixelSize(R.dimen.navigation_bar_height); - } - mQSPanel.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(maxQs, MeasureSpec.AT_MOST)); - + mQSPanel.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec( + MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.UNSPECIFIED)); int width = mQSPanel.getMeasuredWidth(); LayoutParams layoutParams = (LayoutParams) mQSPanel.getLayoutParams(); int height = layoutParams.topMargin + layoutParams.bottomMargin @@ -101,6 +90,7 @@ public class QSContainerImpl extends FrameLayout { // QSCustomizer will always be the height of the screen, but do this after // other measuring to avoid changing the height of the QS. + getDisplay().getRealSize(mSizePoint); mQSCustomizer.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(mSizePoint.y, MeasureSpec.EXACTLY)); } -- GitLab From 9b73804caed42ab3ed358a4a7ecfe384ed4e2b53 Mon Sep 17 00:00:00 2001 From: "Torne (Richard Coles)" Date: Fri, 16 Feb 2018 17:03:58 -0500 Subject: [PATCH 082/386] Add OWNERS for webview directories in framework. Bug: 73450992 Test: N/A Change-Id: I20e186eca8b02fa4e2d0eb729b94df8a36983906 --- core/java/android/webkit/OWNERS | 3 +++ core/tests/webkit/OWNERS | 3 +++ native/webview/OWNERS | 3 +-- services/core/java/com/android/server/webkit/OWNERS | 3 +++ .../tests/servicestests/src/com/android/server/webkit/OWNERS | 3 +++ 5 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 core/java/android/webkit/OWNERS create mode 100644 core/tests/webkit/OWNERS create mode 100644 services/core/java/com/android/server/webkit/OWNERS create mode 100644 services/tests/servicestests/src/com/android/server/webkit/OWNERS diff --git a/core/java/android/webkit/OWNERS b/core/java/android/webkit/OWNERS new file mode 100644 index 00000000000..00e540a46ab --- /dev/null +++ b/core/java/android/webkit/OWNERS @@ -0,0 +1,3 @@ +changwan@google.com +tobiasjs@google.com +torne@google.com diff --git a/core/tests/webkit/OWNERS b/core/tests/webkit/OWNERS new file mode 100644 index 00000000000..00e540a46ab --- /dev/null +++ b/core/tests/webkit/OWNERS @@ -0,0 +1,3 @@ +changwan@google.com +tobiasjs@google.com +torne@google.com diff --git a/native/webview/OWNERS b/native/webview/OWNERS index deee852093d..00e540a46ab 100644 --- a/native/webview/OWNERS +++ b/native/webview/OWNERS @@ -1,4 +1,3 @@ -boliu@google.com -sgurun@google.com +changwan@google.com tobiasjs@google.com torne@google.com diff --git a/services/core/java/com/android/server/webkit/OWNERS b/services/core/java/com/android/server/webkit/OWNERS new file mode 100644 index 00000000000..00e540a46ab --- /dev/null +++ b/services/core/java/com/android/server/webkit/OWNERS @@ -0,0 +1,3 @@ +changwan@google.com +tobiasjs@google.com +torne@google.com diff --git a/services/tests/servicestests/src/com/android/server/webkit/OWNERS b/services/tests/servicestests/src/com/android/server/webkit/OWNERS new file mode 100644 index 00000000000..00e540a46ab --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/webkit/OWNERS @@ -0,0 +1,3 @@ +changwan@google.com +tobiasjs@google.com +torne@google.com -- GitLab From 52230bc215c13f33cb63ff8c1bcb26e609e9ccb7 Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Fri, 16 Feb 2018 12:24:13 -0500 Subject: [PATCH 083/386] Remove Skia RenderPipeline saveLayer logic for software layers. Test: CtsUiRenderingTestCases:LayerTests Bug: 72052698 Change-Id: Ief845c409755e6bc61849a6ab3506ef60161f231 --- libs/hwui/RenderProperties.h | 5 ++--- libs/hwui/pipeline/skia/RenderNodeDrawable.cpp | 12 ------------ 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h index 55f4d895265..0742de9606c 100644 --- a/libs/hwui/RenderProperties.h +++ b/libs/hwui/RenderProperties.h @@ -56,11 +56,10 @@ class RenderProperties; // Keep in sync with View.java:LAYER_TYPE_* enum class LayerType { None = 0, - // Although we cannot build the software layer directly (must be done at - // record time), this information is used when applying alpha. + // We cannot build the software layer directly (must be done at record time) and all management + // of software layers is handled in Java. Software = 1, RenderLayer = 2, - // TODO: LayerTypeSurfaceTexture? Maybe? }; enum ClippingFlags { diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp index 77925fd87fc..6c04d786297 100644 --- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp +++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp @@ -226,18 +226,6 @@ void RenderNodeDrawable::drawContent(SkCanvas* canvas) const { canvas->drawRect(bounds, transparentPaint); } } - - // composing a software layer with alpha - } else if (properties.effectiveLayerType() == LayerType::Software) { - SkPaint paint; - bool needsLayer = layerNeedsPaint(layerProperties, alphaMultiplier, &paint); - if (needsLayer) { - canvas->saveLayer(bounds, &paint); - } - displayList->draw(canvas); - if (needsLayer) { - canvas->restore(); - } } else { if (alphaMultiplier < 1.0f) { // Non-layer draw for a view with getHasOverlappingRendering=false, will apply -- GitLab From 75885974477b15acd96ed943933014a7e27cbcb9 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Tue, 20 Feb 2018 17:16:34 +0100 Subject: [PATCH 084/386] DisplayCutout: Let dreams always extend under the cutout Change-Id: I4f1254afec1c99697a0ba51f5d4bbaabc404ae01 Fixes: 72757379 Test: Set lockscreen, disable "power key locks immediately", enable screensaver while plugged in, turn screen off while plugged in, verify cant see through cutout area. --- .../java/com/android/server/policy/PhoneWindowManager.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index e77dd7b90d5..be01eb16641 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2655,6 +2655,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; attrs.flags &= ~WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; break; + case TYPE_DREAM: + // Dreams don't have an app window token and can thus not be letterboxed. + // Hence always let them extend under the cutout. + attrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + break; case TYPE_STATUS_BAR: // If the Keyguard is in a hidden state (occluded by another window), we force to -- GitLab From 26465d267aa8ff969d359b575559d9954ebb607d Mon Sep 17 00:00:00 2001 From: Wyatt Riley Date: Mon, 12 Feb 2018 13:44:24 -0800 Subject: [PATCH 085/386] Handling concurrent location & SV status update Move handling of location and SV status updates to existing handler thread. Change SV status JNI output for thread safety. Synchronize updates to LocationExtras (many entry points) Adding some DeleteLocalRef cleanups Bug: 72481417 Fixes: 72949246 Fixes: 73090867 Test: GPS works on device, and adb shell dumpsys location shows extras Change-Id: I3eda8884597ad1cdf5aec6d1b7c33ab49401410f --- .../server/location/GnssLocationProvider.java | 149 ++++++++++-------- ...d_server_location_GnssLocationProvider.cpp | 110 ++++++------- 2 files changed, 133 insertions(+), 126 deletions(-) diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index 9d2a8e28a3a..0dab528bb99 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -215,6 +215,8 @@ public class GnssLocationProvider implements LocationProviderInterface { private static final int REQUEST_SUPL_CONNECTION = 14; private static final int RELEASE_SUPL_CONNECTION = 15; private static final int REQUEST_LOCATION = 16; + private static final int REPORT_LOCATION = 17; // HAL reports location + private static final int REPORT_SV_STATUS = 18; // HAL reports SV status // Request setid private static final int AGPS_RIL_REQUEST_SETID_IMSI = 1; @@ -266,7 +268,7 @@ public class GnssLocationProvider implements LocationProviderInterface { } } - // Simple class to hold stats reported in the Extras Bundle + // Threadsafe class to hold stats reported in the Extras Bundle private static class LocationExtras { private int mSvCount; private int mMeanCn0; @@ -278,9 +280,11 @@ public class GnssLocationProvider implements LocationProviderInterface { } public void set(int svCount, int meanCn0, int maxCn0) { - mSvCount = svCount; - mMeanCn0 = meanCn0; - mMaxCn0 = maxCn0; + synchronized(this) { + mSvCount = svCount; + mMeanCn0 = meanCn0; + mMaxCn0 = maxCn0; + } setBundle(mBundle); } @@ -291,14 +295,18 @@ public class GnssLocationProvider implements LocationProviderInterface { // Also used by outside methods to add to other bundles public void setBundle(Bundle extras) { if (extras != null) { - extras.putInt("satellites", mSvCount); - extras.putInt("meanCn0", mMeanCn0); - extras.putInt("maxCn0", mMaxCn0); + synchronized (this) { + extras.putInt("satellites", mSvCount); + extras.putInt("meanCn0", mMeanCn0); + extras.putInt("maxCn0", mMaxCn0); + } } } public Bundle getBundle() { - return mBundle; + synchronized (this) { + return new Bundle(mBundle); + } } } @@ -411,7 +419,6 @@ public class GnssLocationProvider implements LocationProviderInterface { private final Context mContext; private final NtpTrustedTime mNtpTime; private final ILocationManager mILocationManager; - private Location mLocation = new Location(LocationManager.GPS_PROVIDER); private final LocationExtras mLocationExtras = new LocationExtras(); private final GnssStatusListenerHelper mListenerHelper; private final GnssMeasurementsProvider mGnssMeasurementsProvider; @@ -758,8 +765,6 @@ public class GnssLocationProvider implements LocationProviderInterface { mNtpTime = NtpTrustedTime.getInstance(context); mILocationManager = ilocationManager; - mLocation.setExtras(mLocationExtras.getBundle()); - // Create a wake lock mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY); @@ -1726,6 +1731,10 @@ public class GnssLocationProvider implements LocationProviderInterface { * called from native code to update our position. */ private void reportLocation(boolean hasLatLong, Location location) { + sendMessage(REPORT_LOCATION, hasLatLong ? 1 : 0, location); + } + + private void handleReportLocation(boolean hasLatLong, Location location) { if (location.hasSpeed()) { mItarSpeedLimitExceeded = location.getSpeed() > ITAR_SPEED_LIMIT_METERS_PER_SECOND; } @@ -1739,18 +1748,15 @@ public class GnssLocationProvider implements LocationProviderInterface { if (VERBOSE) Log.v(TAG, "reportLocation " + location.toString()); - synchronized (mLocation) { - mLocation = location; - // It would be nice to push the elapsed real-time timestamp - // further down the stack, but this is still useful - mLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); - mLocation.setExtras(mLocationExtras.getBundle()); + // It would be nice to push the elapsed real-time timestamp + // further down the stack, but this is still useful + location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); + location.setExtras(mLocationExtras.getBundle()); - try { - mILocationManager.reportLocation(mLocation, false); - } catch (RemoteException e) { - Log.e(TAG, "RemoteException calling reportLocation"); - } + try { + mILocationManager.reportLocation(location, false); + } catch (RemoteException e) { + Log.e(TAG, "RemoteException calling reportLocation"); } mGnssMetrics.logReceivedLocationStatus(hasLatLong); @@ -1835,54 +1841,73 @@ public class GnssLocationProvider implements LocationProviderInterface { } } + // Helper class to carry data to handler for reportSvStatus + private static class SvStatusInfo { + public int mSvCount; + public int[] mSvidWithFlags; + public float[] mCn0s; + public float[] mSvElevations; + public float[] mSvAzimuths; + public float[] mSvCarrierFreqs; + } + /** * called from native code to update SV info */ - private void reportSvStatus() { - int svCount = native_read_sv_status(mSvidWithFlags, - mCn0s, - mSvElevations, - mSvAzimuths, - mSvCarrierFreqs); + private void reportSvStatus(int svCount, int[] svidWithFlags, float[] cn0s, + float[] svElevations, float[] svAzimuths, float[] svCarrierFreqs) { + SvStatusInfo svStatusInfo = new SvStatusInfo(); + svStatusInfo.mSvCount = svCount; + svStatusInfo.mSvidWithFlags = svidWithFlags; + svStatusInfo.mCn0s = cn0s; + svStatusInfo.mSvElevations = svElevations; + svStatusInfo.mSvAzimuths = svAzimuths; + svStatusInfo.mSvCarrierFreqs = svCarrierFreqs; + + sendMessage(REPORT_SV_STATUS, 0, svStatusInfo); + } + + private void handleReportSvStatus(SvStatusInfo info) { mListenerHelper.onSvStatusChanged( - svCount, - mSvidWithFlags, - mCn0s, - mSvElevations, - mSvAzimuths, - mSvCarrierFreqs); + info.mSvCount, + info.mSvidWithFlags, + info.mCn0s, + info.mSvElevations, + info.mSvAzimuths, + info.mSvCarrierFreqs); // Log CN0 as part of GNSS metrics - mGnssMetrics.logCn0(mCn0s, svCount); + mGnssMetrics.logCn0(info.mCn0s, info.mSvCount); if (VERBOSE) { - Log.v(TAG, "SV count: " + svCount); + Log.v(TAG, "SV count: " + info.mSvCount); } // Calculate number of satellites used in fix. int usedInFixCount = 0; int maxCn0 = 0; int meanCn0 = 0; - for (int i = 0; i < svCount; i++) { - if ((mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) != 0) { + for (int i = 0; i < info.mSvCount; i++) { + if ((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) != 0) { ++usedInFixCount; - if (mCn0s[i] > maxCn0) { - maxCn0 = (int) mCn0s[i]; + if (info.mCn0s[i] > maxCn0) { + maxCn0 = (int) info.mCn0s[i]; } - meanCn0 += mCn0s[i]; + meanCn0 += info.mCn0s[i]; } if (VERBOSE) { - Log.v(TAG, "svid: " + (mSvidWithFlags[i] >> GnssStatus.SVID_SHIFT_WIDTH) + - " cn0: " + mCn0s[i] + - " elev: " + mSvElevations[i] + - " azimuth: " + mSvAzimuths[i] + - " carrier frequency: " + mSvCarrierFreqs[i] + - ((mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA) == 0 + Log.v(TAG, "svid: " + (info.mSvidWithFlags[i] >> GnssStatus.SVID_SHIFT_WIDTH) + + " cn0: " + info.mCn0s[i] + + " elev: " + info.mSvElevations[i] + + " azimuth: " + info.mSvAzimuths[i] + + " carrier frequency: " + info.mSvCarrierFreqs[i] + + ((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA) == 0 ? " " : " E") + - ((mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_ALMANAC_DATA) == 0 + ((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_ALMANAC_DATA) == 0 ? " " : " A") + - ((mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) == 0 + ((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) == 0 ? "" : "U") + - ((mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY) == 0 + ((info.mSvidWithFlags[i] & + GnssStatus.GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY) == 0 ? "" : "F")); } } @@ -2479,6 +2504,12 @@ public class GnssLocationProvider implements LocationProviderInterface { case INITIALIZE_HANDLER: handleInitialize(); break; + case REPORT_LOCATION: + handleReportLocation(msg.arg1 == 1, (Location) msg.obj); + break; + case REPORT_SV_STATUS: + handleReportSvStatus((SvStatusInfo) msg.obj); + break; } if (msg.arg2 == 1) { // wakelock was taken for this message, release it @@ -2798,6 +2829,10 @@ public class GnssLocationProvider implements LocationProviderInterface { return "SUBSCRIPTION_OR_SIM_CHANGED"; case INITIALIZE_HANDLER: return "INITIALIZE_HANDLER"; + case REPORT_LOCATION: + return "REPORT_LOCATION"; + case REPORT_SV_STATUS: + return "REPORT_SV_STATUS"; default: return ""; } @@ -2862,15 +2897,6 @@ public class GnssLocationProvider implements LocationProviderInterface { } } - // for GPS SV statistics - private static final int MAX_SVS = 64; - - // preallocated arrays, to avoid memory allocation in reportStatus() - private int mSvidWithFlags[] = new int[MAX_SVS]; - private float mCn0s[] = new float[MAX_SVS]; - private float mSvElevations[] = new float[MAX_SVS]; - private float mSvAzimuths[] = new float[MAX_SVS]; - private float mSvCarrierFreqs[] = new float[MAX_SVS]; // preallocated to avoid memory allocation in reportNmea() private byte[] mNmeaBuffer = new byte[120]; @@ -2899,11 +2925,6 @@ public class GnssLocationProvider implements LocationProviderInterface { private native void native_delete_aiding_data(int flags); - // returns number of SVs - // mask[0] is ephemeris mask and mask[1] is almanac mask - private native int native_read_sv_status(int[] prnWithFlags, float[] cn0s, float[] elevations, - float[] azimuths, float[] carrierFrequencies); - private native int native_read_nmea(byte[] buffer, int bufferSize); private native void native_inject_best_location( diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index c2771e4b931..0c11bc110c7 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -393,10 +393,7 @@ struct GnssCallback : public IGnssCallback { // New in 1.1 Return gnssNameCb(const android::hardware::hidl_string& name) override; - static GnssSvInfo sGnssSvList[static_cast( - android::hardware::gnss::V1_0::GnssMax::SVS_COUNT)]; - static size_t sGnssSvListSize; - + // TODO(b/73306084): Reconsider allocation cost vs threadsafety on these statics static const char* sNmeaString; static size_t sNmeaStringLength; }; @@ -412,11 +409,8 @@ Return GnssCallback::gnssNameCb(const android::hardware::hidl_string& name return Void(); } -IGnssCallback::GnssSvInfo GnssCallback::sGnssSvList[static_cast( - android::hardware::gnss::V1_0::GnssMax::SVS_COUNT)]; const char* GnssCallback::sNmeaString = nullptr; size_t GnssCallback::sNmeaStringLength = 0; -size_t GnssCallback::sGnssSvListSize = 0; Return GnssCallback::gnssLocationCb(const GnssLocation& location) { JNIEnv* env = getJniEnv(); @@ -430,6 +424,7 @@ Return GnssCallback::gnssLocationCb(const GnssLocation& location) { boolToJbool(hasLatLong), jLocation); checkAndClearExceptionFromCallback(env, __FUNCTION__); + env->DeleteLocalRef(jLocation); return Void(); } @@ -443,20 +438,55 @@ Return GnssCallback::gnssStatusCb(const IGnssCallback::GnssStatusValue sta Return GnssCallback::gnssSvStatusCb(const IGnssCallback::GnssSvStatus& svStatus) { JNIEnv* env = getJniEnv(); - sGnssSvListSize = svStatus.numSvs; - if (sGnssSvListSize > static_cast( + uint32_t listSize = svStatus.numSvs; + if (listSize > static_cast( android::hardware::gnss::V1_0::GnssMax::SVS_COUNT)) { - ALOGD("Too many satellites %zd. Clamps to %u.", sGnssSvListSize, + ALOGD("Too many satellites %u. Clamps to %u.", listSize, static_cast(android::hardware::gnss::V1_0::GnssMax::SVS_COUNT)); - sGnssSvListSize = static_cast(android::hardware::gnss::V1_0::GnssMax::SVS_COUNT); + listSize = static_cast(android::hardware::gnss::V1_0::GnssMax::SVS_COUNT); } - // Copy GNSS SV info into sGnssSvList, if any. - if (svStatus.numSvs > 0) { - memcpy(sGnssSvList, svStatus.gnssSvList.data(), sizeof(GnssSvInfo) * sGnssSvListSize); + jintArray svidWithFlagArray = env->NewIntArray(listSize); + jfloatArray cn0Array = env->NewFloatArray(listSize); + jfloatArray elevArray = env->NewFloatArray(listSize); + jfloatArray azimArray = env->NewFloatArray(listSize); + jfloatArray carrierFreqArray = env->NewFloatArray(listSize); + + jint* svidWithFlags = env->GetIntArrayElements(svidWithFlagArray, 0); + jfloat* cn0s = env->GetFloatArrayElements(cn0Array, 0); + jfloat* elev = env->GetFloatArrayElements(elevArray, 0); + jfloat* azim = env->GetFloatArrayElements(azimArray, 0); + jfloat* carrierFreq = env->GetFloatArrayElements(carrierFreqArray, 0); + + /* + * Read GNSS SV info. + */ + for (size_t i = 0; i < listSize; ++i) { + enum ShiftWidth: uint8_t { + SVID_SHIFT_WIDTH = 8, + CONSTELLATION_TYPE_SHIFT_WIDTH = 4 + }; + + const IGnssCallback::GnssSvInfo& info = svStatus.gnssSvList.data()[i]; + svidWithFlags[i] = (info.svid << SVID_SHIFT_WIDTH) | + (static_cast(info.constellation) << CONSTELLATION_TYPE_SHIFT_WIDTH) | + static_cast(info.svFlag); + cn0s[i] = info.cN0Dbhz; + elev[i] = info.elevationDegrees; + azim[i] = info.azimuthDegrees; + carrierFreq[i] = info.carrierFrequencyHz; } - env->CallVoidMethod(mCallbacksObj, method_reportSvStatus); + env->ReleaseIntArrayElements(svidWithFlagArray, svidWithFlags, 0); + env->ReleaseFloatArrayElements(cn0Array, cn0s, 0); + env->ReleaseFloatArrayElements(elevArray, elev, 0); + env->ReleaseFloatArrayElements(azimArray, azim, 0); + env->ReleaseFloatArrayElements(carrierFreqArray, carrierFreq, 0); + + env->CallVoidMethod(mCallbacksObj, method_reportSvStatus, + static_cast(listSize), svidWithFlagArray, cn0Array, elevArray, azimArray, + carrierFreqArray); + checkAndClearExceptionFromCallback(env, __FUNCTION__); return Void(); } @@ -575,6 +605,7 @@ Return GnssGeofenceCallback::gnssGeofenceTransitionCb( timestamp); checkAndClearExceptionFromCallback(env, __FUNCTION__); + env->DeleteLocalRef(jLocation); return Void(); } @@ -590,6 +621,7 @@ Return GnssGeofenceCallback::gnssGeofenceStatusCb( status, jLocation); checkAndClearExceptionFromCallback(env, __FUNCTION__); + env->DeleteLocalRef(jLocation); return Void(); } @@ -1063,7 +1095,7 @@ static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env, method_reportLocation = env->GetMethodID(clazz, "reportLocation", "(ZLandroid/location/Location;)V"); method_reportStatus = env->GetMethodID(clazz, "reportStatus", "(I)V"); - method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "()V"); + method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "(I[I[F[F[F[F)V"); method_reportAGpsStatus = env->GetMethodID(clazz, "reportAGpsStatus", "(II[B)V"); method_reportNmea = env->GetMethodID(clazz, "reportNmea", "(J)V"); method_setEngineCapabilities = env->GetMethodID(clazz, "setEngineCapabilities", "(I)V"); @@ -1369,49 +1401,6 @@ static void android_location_GnssLocationProvider_delete_aiding_data(JNIEnv* /* } } -/* - * This enum is used by the read_sv_status method to combine the svid, - * constellation and svFlag fields. - */ -enum ShiftWidth: uint8_t { - SVID_SHIFT_WIDTH = 8, - CONSTELLATION_TYPE_SHIFT_WIDTH = 4 -}; - -static jint android_location_GnssLocationProvider_read_sv_status(JNIEnv* env, jobject /* obj */, - jintArray svidWithFlagArray, jfloatArray cn0Array, jfloatArray elevArray, - jfloatArray azumArray, jfloatArray carrierFreqArray) { - /* - * This method should only be called from within a call to reportSvStatus. - */ - jint* svidWithFlags = env->GetIntArrayElements(svidWithFlagArray, 0); - jfloat* cn0s = env->GetFloatArrayElements(cn0Array, 0); - jfloat* elev = env->GetFloatArrayElements(elevArray, 0); - jfloat* azim = env->GetFloatArrayElements(azumArray, 0); - jfloat* carrierFreq = env->GetFloatArrayElements(carrierFreqArray, 0); - - /* - * Read GNSS SV info. - */ - for (size_t i = 0; i < GnssCallback::sGnssSvListSize; ++i) { - const IGnssCallback::GnssSvInfo& info = GnssCallback::sGnssSvList[i]; - svidWithFlags[i] = (info.svid << SVID_SHIFT_WIDTH) | - (static_cast(info.constellation) << CONSTELLATION_TYPE_SHIFT_WIDTH) | - static_cast(info.svFlag); - cn0s[i] = info.cN0Dbhz; - elev[i] = info.elevationDegrees; - azim[i] = info.azimuthDegrees; - carrierFreq[i] = info.carrierFrequencyHz; - } - - env->ReleaseIntArrayElements(svidWithFlagArray, svidWithFlags, 0); - env->ReleaseFloatArrayElements(cn0Array, cn0s, 0); - env->ReleaseFloatArrayElements(elevArray, elev, 0); - env->ReleaseFloatArrayElements(azumArray, azim, 0); - env->ReleaseFloatArrayElements(carrierFreqArray, carrierFreq, 0); - return static_cast(GnssCallback::sGnssSvListSize); -} - static void android_location_GnssLocationProvider_agps_set_reference_location_cellid( JNIEnv* /* env */, jobject /* obj */, jint type, jint mcc, jint mnc, jint lac, jint cid) { IAGnssRil::AGnssRefLocation location; @@ -2057,9 +2046,6 @@ static const JNINativeMethod sMethods[] = { {"native_delete_aiding_data", "(I)V", reinterpret_cast(android_location_GnssLocationProvider_delete_aiding_data)}, - {"native_read_sv_status", - "([I[F[F[F[F)I", - reinterpret_cast(android_location_GnssLocationProvider_read_sv_status)}, {"native_read_nmea", "([BI)I", reinterpret_cast( android_location_GnssLocationProvider_read_nmea)}, {"native_inject_time", "(JJI)V", reinterpret_cast( -- GitLab From c861a3ddbc9b6cb193e71dbb5da6162d119e2e98 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Thu, 15 Feb 2018 10:34:49 -0500 Subject: [PATCH 086/386] Optionally supress status bar notifications in dnd If 'allow visual signals -> when the screen is on' is off. Test: runtest systemui-notification and manual - confirm triggering dnd hides icons of existing notifications; confirm icons return when dnd is turned off, verify new icons are hidden when dnd is on, confirm supressed notification doesn't re-alert when dnd turned off. Bug: 73455127 Change-Id: If6e5035d6563c70de77604196ea37a16118847a7 --- core/res/res/values/config.xml | 5 +- .../phone/NotificationIconAreaController.java | 5 + .../server/notification/BadgeExtractor.java | 5 + .../notification/ImportanceExtractor.java | 5 + .../NotificationAdjustmentExtractor.java | 5 + .../NotificationChannelExtractor.java | 5 + .../NotificationIntrusivenessExtractor.java | 5 + .../NotificationManagerService.java | 18 ++- .../NotificationSignalExtractor.java | 8 ++ .../notification/PriorityExtractor.java | 5 + .../server/notification/RankingHelper.java | 3 +- .../ValidateNotificationPeople.java | 12 +- .../notification/VisibilityExtractor.java | 5 + .../server/notification/ZenModeExtractor.java | 73 ++++++++++++ .../notification/RankingHelperTest.java | 4 +- .../notification/ZenModeExtractorTest.java | 107 ++++++++++++++++++ 16 files changed, 258 insertions(+), 12 deletions(-) create mode 100644 services/core/java/com/android/server/notification/ZenModeExtractor.java create mode 100644 services/tests/uiservicestests/src/com/android/server/notification/ZenModeExtractorTest.java diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 09112985873..9bfc6ad9283 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2368,7 +2368,7 @@ obtain user consent to access their location through other means. --> - @@ -2380,11 +2380,14 @@ com.android.server.notification.ValidateNotificationPeople com.android.server.notification.PriorityExtractor + + com.android.server.notification.ZenModeExtractor com.android.server.notification.ImportanceExtractor com.android.server.notification.NotificationIntrusivenessExtractor com.android.server.notification.VisibilityExtractor com.android.server.notification.BadgeExtractor + - - - - - \ No newline at end of file diff --git a/packages/SystemUI/res/layout/fingerprint_dialog.xml b/packages/SystemUI/res/layout/fingerprint_dialog.xml index 161f13fd945..f02c0ba35e7 100644 --- a/packages/SystemUI/res/layout/fingerprint_dialog.xml +++ b/packages/SystemUI/res/layout/fingerprint_dialog.xml @@ -35,131 +35,105 @@ android:layout_height="wrap_content" android:orientation="vertical" android:elevation="2dp" - android:background="@drawable/fingerprint_dialog_bg"> + android:background="@color/fingerprint_dialog_bg_color"> - - - - - + android:layout_marginEnd="24dp" + android:layout_marginStart="24dp" + android:layout_marginTop="24dp" + android:gravity="center" + android:textSize="20sp" + android:maxLines="1" + android:singleLine="true" + android:ellipsize="marquee" + android:marqueeRepeatLimit="marquee_forever" + android:textColor="@color/fingerprint_dialog_text_dark_color"/> - - - + + android:textColor="@color/fingerprint_dialog_text_dark_color"/> + android:layout_marginTop="32dp" + android:scaleType="fitXY" + android:contentDescription="@string/accessibility_fingerprint_dialog_fingerprint_icon" /> + android:textColor="@color/fingerprint_dialog_text_light_color"/> - - - - -