diff options
274 files changed, 5386 insertions, 1659 deletions
diff --git a/Android.mk b/Android.mk index d7c16d14656f..ec5fb841131e 100644 --- a/Android.mk +++ b/Android.mk @@ -276,8 +276,8 @@ non_base_dirs := \ framework_base_android_test_mock_src_files := \ $(call all-java-files-under, test-mock/src/android/test/mock) -framework_base_android_test_runner_excluding_mock_src_files := \ - $(filter-out $(framework_base_android_test_mock_src_files), $(call all-java-files-under, test-runner/src)) +framework_base_android_test_runner_src_files := \ + $(call all-java-files-under, test-runner/src) # Find all files in specific directories (relative to frameworks/base) # to document and check apis @@ -327,7 +327,7 @@ framework_docs_LOCAL_SRC_FILES := \ # These are relative to frameworks/base framework_docs_LOCAL_API_CHECK_SRC_FILES := \ $(framework_base_android_test_mock_src_files) \ - $(framework_base_android_test_runner_excluding_mock_src_files) \ + $(framework_base_android_test_runner_src_files) \ $(files_to_check_apis) \ $(common_src_files) \ diff --git a/api/current.txt b/api/current.txt index 22a6431a3839..321135bb825b 100644 --- a/api/current.txt +++ b/api/current.txt @@ -6562,6 +6562,7 @@ package android.app.admin { field public static final int KEYGUARD_DISABLE_TRUST_AGENTS = 16; // 0x10 field public static final int KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS = 8; // 0x8 field public static final int KEYGUARD_DISABLE_WIDGETS_ALL = 1; // 0x1 + field public static final int LEAVE_ALL_SYSTEM_APPS_ENABLED = 16; // 0x10 field public static final int LOCK_TASK_FEATURE_GLOBAL_ACTIONS = 16; // 0x10 field public static final int LOCK_TASK_FEATURE_HOME = 4; // 0x4 field public static final int LOCK_TASK_FEATURE_KEYGUARD = 32; // 0x20 @@ -30967,7 +30968,9 @@ package android.os { ctor public Build.VERSION(); field public static final java.lang.String BASE_OS; field public static final java.lang.String CODENAME; + field public static final int FIRST_SDK_INT; field public static final java.lang.String INCREMENTAL; + field public static final int MIN_SUPPORTED_TARGET_SDK_INT; field public static final int PREVIEW_SDK_INT; field public static final java.lang.String RELEASE; field public static final deprecated java.lang.String SDK; @@ -40234,6 +40237,7 @@ package android.telephony { field public static final java.lang.String KEY_SHOW_CDMA_CHOICES_BOOL = "show_cdma_choices_bool"; field public static final java.lang.String KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL = "show_iccid_in_sim_status_bool"; field public static final java.lang.String KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL = "show_onscreen_dial_button_bool"; + field public static final java.lang.String KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL = "show_signal_strength_in_sim_status_bool"; field public static final java.lang.String KEY_SIMPLIFIED_NETWORK_SETTINGS_BOOL = "simplified_network_settings_bool"; field public static final java.lang.String KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL = "sim_network_unlock_allow_dismiss_bool"; field public static final java.lang.String KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL = "sms_requires_destination_number_conversion_bool"; diff --git a/api/system-current.txt b/api/system-current.txt index 15f070a5d5dd..d87fcbca9f2e 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -613,7 +613,9 @@ package android.app.usage { public final class UsageStatsManager { method public int getAppStandbyBucket(java.lang.String); + method public java.util.Map<java.lang.String, java.lang.Integer> getAppStandbyBuckets(); method public void setAppStandbyBucket(java.lang.String, int); + method public void setAppStandbyBuckets(java.util.Map<java.lang.String, java.lang.Integer>); method public void whitelistAppTemporarily(java.lang.String, long, android.os.UserHandle); field public static final int STANDBY_BUCKET_EXEMPTED = 5; // 0x5 field public static final int STANDBY_BUCKET_NEVER = 50; // 0x32 diff --git a/api/test-current.txt b/api/test-current.txt index 27e585d0a828..3fc5cd6efc76 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -120,6 +120,7 @@ package android.app.usage { public class StorageStatsManager { method public boolean isQuotaSupported(java.util.UUID); + method public boolean isReservedSupported(java.util.UUID); } } diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk index 337aeaaf37ab..ef7d31b22d32 100644 --- a/cmds/statsd/Android.mk +++ b/cmds/statsd/Android.mk @@ -126,7 +126,7 @@ LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \ LOCAL_MODULE_CLASS := EXECUTABLES -#LOCAL_INIT_RC := statsd.rc +LOCAL_INIT_RC := statsd.rc include $(BUILD_EXECUTABLE) diff --git a/cmds/statsd/tools/loadtest/res/layout/activity_loadtest.xml b/cmds/statsd/tools/loadtest/res/layout/activity_loadtest.xml index 1e28f6730709..2a254df2302a 100644 --- a/cmds/statsd/tools/loadtest/res/layout/activity_loadtest.xml +++ b/cmds/statsd/tools/loadtest/res/layout/activity_loadtest.xml @@ -160,13 +160,6 @@ android:layout_width="1dp" android:layout_height="30dp"/> - <Button - android:id="@+id/display_output" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/display_output" - android:textSize="30dp"/> - <Space android:layout_width="1dp" android:layout_height="30dp"/> diff --git a/cmds/statsd/tools/loadtest/res/raw/loadtest_config b/cmds/statsd/tools/loadtest/res/raw/loadtest_config Binary files differindex 78223674285d..fbce0e870e57 100755 --- a/cmds/statsd/tools/loadtest/res/raw/loadtest_config +++ b/cmds/statsd/tools/loadtest/res/raw/loadtest_config diff --git a/cmds/statsd/tools/loadtest/res/values/strings.xml b/cmds/statsd/tools/loadtest/res/values/strings.xml index cb38298873f0..522337ee656d 100644 --- a/cmds/statsd/tools/loadtest/res/values/strings.xml +++ b/cmds/statsd/tools/loadtest/res/values/strings.xml @@ -20,7 +20,6 @@ <string name="app_name">Statsd Loadtest</string> <string name="bucket_label">bucket size (mins): </string> <string name="burst_label">burst: </string> - <string name="display_output">Show metrics data</string> <string name="placebo">placebo</string> <string name="period_label">logging period (secs): </string> <string name="replication_label">metric replication: </string> diff --git a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java index 522dea61d188..a72f72e60faf 100644 --- a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java +++ b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java @@ -15,6 +15,7 @@ */ package com.android.statsd.loadtest; +import android.annotation.Nullable; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; @@ -43,6 +44,10 @@ import android.widget.CheckBox; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; +import com.android.os.StatsLog.ConfigMetricsReport; +import com.android.os.StatsLog.ConfigMetricsReportList; +import com.android.os.StatsLog.StatsdStatsReport; +import java.util.List; /** * Runs a load test for statsd. @@ -191,13 +196,6 @@ public class LoadtestActivity extends Activity { } }); - findViewById(R.id.display_output).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - fetchAndDisplayData(); - } - }); - mAlarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); mStatsManager = (StatsManager) getSystemService("stats"); mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); @@ -239,6 +237,48 @@ public class LoadtestActivity extends Activity { super.onDestroy(); } + @Nullable + public StatsdStatsReport getMetadata() { + if (!statsdRunning()) { + return null; + } + if (mStatsManager != null) { + byte[] data = mStatsManager.getMetadata(); + if (data != null) { + StatsdStatsReport report = null; + boolean good = false; + try { + return StatsdStatsReport.parseFrom(data); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + Log.d(TAG, "Bad StatsdStatsReport"); + } + } + } + return null; + } + + @Nullable + public List<ConfigMetricsReport> getData() { + if (!statsdRunning()) { + return null; + } + if (mStatsManager != null) { + byte[] data = mStatsManager.getData(ConfigFactory.CONFIG_NAME); + if (data != null) { + ConfigMetricsReportList reports = null; + try { + reports = ConfigMetricsReportList.parseFrom(data); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + Log.d(TAG, "Invalid data"); + } + if (reports != null) { + return reports.getReportsList(); + } + } + } + return null; + } + private void onPerfAlarm() { if (mPerfData != null) { mPerfData.onAlarm(this); @@ -285,6 +325,9 @@ public class LoadtestActivity extends Activity { // Prepare to push a sequence of atoms to logd. mPusher = new SequencePusher(mBurst, mPlacebo); + // Force a data flush by requesting data. + getData(); + // Create a config and push it to statsd. if (!setConfig(mFactory.getConfig(mReplication, mBucketMins * 60 * 1000, mPlacebo))) { return; @@ -355,42 +398,6 @@ public class LoadtestActivity extends Activity { mPlaceboCheckBox.setEnabled(!mStarted); } - private void fetchAndDisplayData() { - if (!statsdRunning()) { - return; - } - if (mStatsManager != null) { - byte[] data = mStatsManager.getData(ConfigFactory.CONFIG_NAME); - if (data != null) { - displayData(data); - } else { - mReportText.setText("Failed to pull data"); - } - } - } - - private void displayData(byte[] data) { - com.android.os.StatsLog.ConfigMetricsReportList reports = null; - boolean good = false; - if (data != null) { - try { - reports = com.android.os.StatsLog.ConfigMetricsReportList.parseFrom(data); - good = true; - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - // display it in the text view. - } - } - int size = data == null ? 0 : data.length; - StringBuilder sb = new StringBuilder(); - sb.append(good ? "Proto parsing OK!" : "Proto parsing Error!"); - sb.append(" size:").append(size).append("\n"); - - if (good && reports != null) { - DisplayProtoUtils.displayLogReport(sb, reports); - mReportText.setText(sb.toString()); - } - } - private boolean statsdRunning() { if (IStatsManager.Stub.asInterface(ServiceManager.getService("stats")) == null) { Log.d(TAG, "Statsd not running"); diff --git a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/MemoryDataRecorder.java b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/MemoryDataRecorder.java index d82a0eadea65..d9513a15208a 100644 --- a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/MemoryDataRecorder.java +++ b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/MemoryDataRecorder.java @@ -39,7 +39,6 @@ public class MemoryDataRecorder extends PerfDataRecorder { @Override public void onAlarm(Context context) { - Log.d(TAG, "GOT ALARM IN MEM"); runDumpsysStats(context, DUMP_FILENAME, "meminfo"); readDumpData(context, DUMP_FILENAME, new MemInfoParser(mStartTimeMillis), mSb); } diff --git a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/NumericalWatcher.java b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/NumericalWatcher.java index 81a84f53b503..555e6dd2d99d 100644 --- a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/NumericalWatcher.java +++ b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/NumericalWatcher.java @@ -22,7 +22,7 @@ import android.widget.TextView; public abstract class NumericalWatcher implements TextWatcher { - private static final String TAG = "loadtest.NumericalWatcher"; + private static final String TAG = "loadtest.NumericalWatcher"; private final TextView mTextView; private final int mMin; @@ -45,9 +45,6 @@ public abstract class NumericalWatcher implements TextWatcher { } int unsanitized = Integer.parseInt(s); int newValue = sanitize(unsanitized); - - Log.d(TAG, "YOYO " + currentValue + " " + newValue + " " + unsanitized); - if (currentValue != newValue || unsanitized != newValue) { currentValue = newValue; editable.clear(); diff --git a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/PerfData.java b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/PerfData.java index 466524756c48..22ba9c5aca39 100644 --- a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/PerfData.java +++ b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/PerfData.java @@ -51,13 +51,17 @@ public class PerfData extends PerfDataRecorder { private final Set<PerfDataRecorder> mRecorders; - public PerfData(Context context, boolean placebo, int replication, long bucketMins, - long periodSecs, int burst) { + public PerfData(LoadtestActivity loadtestActivity, boolean placebo, int replication, + long bucketMins, long periodSecs, int burst) { super(placebo, replication, bucketMins, periodSecs, burst); mRecorders = new HashSet(); mRecorders.add(new BatteryDataRecorder(placebo, replication, bucketMins, periodSecs, burst)); mRecorders.add(new MemoryDataRecorder(placebo, replication, bucketMins, periodSecs, burst)); - mAlarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + mRecorders.add(new StatsdStatsRecorder(loadtestActivity, placebo, replication, bucketMins, + periodSecs, burst)); + mRecorders.add(new ValidationRecorder(loadtestActivity, placebo, replication, bucketMins, + periodSecs, burst)); + mAlarmMgr = (AlarmManager) loadtestActivity.getSystemService(Context.ALARM_SERVICE); } public void onDestroy() { diff --git a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/PerfDataRecorder.java b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/PerfDataRecorder.java index 15a8e5c87131..5b5ba3766d04 100644 --- a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/PerfDataRecorder.java +++ b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/PerfDataRecorder.java @@ -35,12 +35,12 @@ import java.util.Date; public abstract class PerfDataRecorder { private static final String TAG = "loadtest.PerfDataRecorder"; - protected final String mFileSuffix; + protected final String mTimeAsString; protected final String mColumnSuffix; protected PerfDataRecorder(boolean placebo, int replication, long bucketMins, long periodSecs, int burst) { - mFileSuffix = new SimpleDateFormat("YYYY_MM_dd_HH_mm_ss").format(new Date()); + mTimeAsString = new SimpleDateFormat("YYYY_MM_dd_HH_mm_ss").format(new Date()); mColumnSuffix = getColumnSuffix(placebo, replication, bucketMins, periodSecs, burst); } @@ -103,7 +103,7 @@ public abstract class PerfDataRecorder { /** Writes CSV data to a file. */ protected void writeData(Context context, String filePrefix, String columnPrefix, StringBuilder sb) { - File dataFile = new File(getStorageDir(), filePrefix + mFileSuffix + ".csv"); + File dataFile = new File(getStorageDir(), filePrefix + mTimeAsString + ".csv"); FileWriter writer = null; try { @@ -131,7 +131,7 @@ public abstract class PerfDataRecorder { private File getStorageDir() { File file = new File(Environment.getExternalStoragePublicDirectory( - Environment.DIRECTORY_DOCUMENTS), "loadtest"); + Environment.DIRECTORY_DOCUMENTS), "loadtest/" + mTimeAsString); if (!file.mkdirs()) { Log.e(TAG, "Directory not created"); } diff --git a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/StatsdStatsRecorder.java b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/StatsdStatsRecorder.java new file mode 100644 index 000000000000..4ef5dc2f6ca8 --- /dev/null +++ b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/StatsdStatsRecorder.java @@ -0,0 +1,61 @@ +/* + * 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 com.android.statsd.loadtest; + +import android.content.Context; +import android.util.Log; +import com.android.os.StatsLog.StatsdStatsReport; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class StatsdStatsRecorder extends PerfDataRecorder { + private static final String TAG = "loadtest.StatsdStatsRecorder"; + + private final LoadtestActivity mLoadtestActivity; + + public StatsdStatsRecorder(LoadtestActivity loadtestActivity, boolean placebo, int replication, + long bucketMins, long periodSecs, int burst) { + super(placebo, replication, bucketMins, periodSecs, burst); + mLoadtestActivity = loadtestActivity; + } + + @Override + public void startRecording(Context context) { + // Nothing to do. + } + + @Override + public void onAlarm(Context context) { + // Nothing to do. + } + + @Override + public void stopRecording(Context context) { + StatsdStatsReport metadata = mLoadtestActivity.getMetadata(); + if (metadata != null) { + int numConfigs = metadata.getConfigStatsCount(); + StringBuilder sb = new StringBuilder(); + StatsdStatsReport.ConfigStats configStats = metadata.getConfigStats(numConfigs - 1); + sb.append("metric_count,") + .append(configStats.getMetricCount() + "\n") + .append("condition_count,") + .append(configStats.getConditionCount() + "\n") + .append("matcher_count,") + .append(configStats.getMatcherCount() + "\n"); + writeData(context, "statsdstats_", "", sb); + } + } +} diff --git a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/ValidationRecorder.java b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/ValidationRecorder.java new file mode 100644 index 000000000000..4b614aa19492 --- /dev/null +++ b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/ValidationRecorder.java @@ -0,0 +1,95 @@ +/* + * 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 com.android.statsd.loadtest; + +import android.content.Context; +import android.util.Log; +import com.android.os.StatsLog.ConfigMetricsReport; +import com.android.os.StatsLog.EventMetricData; +import com.android.os.StatsLog.StatsLogReport; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Checks the correctness of the stats. + */ +public class ValidationRecorder extends PerfDataRecorder { + private static final String TAG = "loadtest.ValidationRecorder"; + + private final LoadtestActivity mLoadtestActivity; + + public ValidationRecorder(LoadtestActivity loadtestActivity, boolean placebo, int replication, + long bucketMins, long periodSecs, int burst) { + super(placebo, replication, bucketMins, periodSecs, burst); + mLoadtestActivity = loadtestActivity; + } + + @Override + public void startRecording(Context context) { + // Nothing to do. + } + + @Override + public void onAlarm(Context context) { + validateData(); + } + + @Override + public void stopRecording(Context context) { + validateData(); + } + + private void validateData() { + List<ConfigMetricsReport> reports = mLoadtestActivity.getData(); + if (reports != null) { + Log.d(TAG, "GOT DATA"); + for (ConfigMetricsReport report : reports) { + for (StatsLogReport logReport : report.getMetricsList()) { + if (!logReport.hasMetricName()) { + Log.e(TAG, "Metric missing name."); + continue; + } + String metricName = logReport.getMetricName(); + if (metricName.startsWith("EVENT_BATTERY_LEVEL_CHANGES_WHILE_SCREEN_IS_ON_")) { + validateEventBatteryLevelChangesWhileScreenIsOn(logReport); + continue; + } + if (metricName.startsWith("EVENT_BATTERY_LEVEL_CHANGES_")) { + validateEventBatteryLevelChanges(logReport); + continue; + } + } + } + } + } + + private void validateEventBatteryLevelChanges(StatsLogReport logReport) { + Log.d(TAG, "Validating " + logReport.getMetricName()); + if (logReport.hasEventMetrics()) { + Log.d(TAG, "Num events captured: " + logReport.getEventMetrics().getDataCount()); + for (EventMetricData data : logReport.getEventMetrics().getDataList()) { + Log.d(TAG, " Event : " + data.getAtom()); + } + } else { + Log.d(TAG, "Metric is invalid"); + } + } + + private void validateEventBatteryLevelChangesWhileScreenIsOn(StatsLogReport logReport) { + Log.d(TAG, "Validating " + logReport.getMetricName()); + } +} diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 2038898d77cd..cfff3614a8e4 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -3480,6 +3480,16 @@ public class DevicePolicyManager { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_START_ENCRYPTION = "android.app.action.START_ENCRYPTION"; + + /** + * Broadcast action: notify managed provisioning that new managed user is created. + * + * @hide + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_MANAGED_USER_CREATED = + "android.app.action.MANAGED_USER_CREATED"; + /** * Widgets are enabled in keyguard */ @@ -6205,20 +6215,25 @@ public class DevicePolicyManager { public static final int MAKE_USER_DEMO = 0x0004; /** - * Flag used by {@link #createAndManageUser} to specificy that the newly created user should be + * Flag used by {@link #createAndManageUser} to specify that the newly created user should be * started in the background as part of the user creation. */ - // TODO: Investigate solutions for the case where reboot happens before setup is completed. public static final int START_USER_IN_BACKGROUND = 0x0008; /** + * Flag used by {@link #createAndManageUser} to specify that the newly created user should skip + * the disabling of system apps during provisioning. + */ + public static final int LEAVE_ALL_SYSTEM_APPS_ENABLED = 0x0010; + + /** * @hide */ @IntDef( flag = true, - prefix = {"SKIP_", "MAKE_USER_", "START_"}, + prefix = {"SKIP_", "MAKE_USER_", "START_", "LEAVE_"}, value = {SKIP_SETUP_WIZARD, MAKE_USER_EPHEMERAL, MAKE_USER_DEMO, - START_USER_IN_BACKGROUND} + START_USER_IN_BACKGROUND, LEAVE_ALL_SYSTEM_APPS_ENABLED} ) @Retention(RetentionPolicy.SOURCE) public @interface CreateAndManageUserFlags {} @@ -8679,4 +8694,25 @@ public class DevicePolicyManager { */ void onApplicationUserDataCleared(String packageName, boolean succeeded); } + + /** + * Returns set of system apps that should be removed during provisioning. + * + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param userId ID of the user to be provisioned. + * @param provisioningAction action indicating type of provisioning, should be one of + * {@link #ACTION_PROVISION_MANAGED_DEVICE}, {@link #ACTION_PROVISION_MANAGED_PROFILE} or + * {@link #ACTION_PROVISION_MANAGED_USER}. + * + * @hide + */ + public Set<String> getDisallowedSystemApps(ComponentName admin, int userId, + String provisioningAction) { + try { + return new ArraySet<>( + mService.getDisallowedSystemApps(admin, userId, provisioningAction)); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 94b0868ae567..b76618b25e7d 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -376,4 +376,6 @@ interface IDevicePolicyManager { void setLogoutEnabled(in ComponentName admin, boolean enabled); boolean isLogoutEnabled(); + + List<String> getDisallowedSystemApps(in ComponentName admin, int userId, String provisioningAction); } diff --git a/core/java/android/app/usage/IStorageStatsManager.aidl b/core/java/android/app/usage/IStorageStatsManager.aidl index 15e5ea5f44ff..7eacc8996bb9 100644 --- a/core/java/android/app/usage/IStorageStatsManager.aidl +++ b/core/java/android/app/usage/IStorageStatsManager.aidl @@ -22,6 +22,7 @@ import android.app.usage.ExternalStorageStats; /** {@hide} */ interface IStorageStatsManager { boolean isQuotaSupported(String volumeUuid, String callingPackage); + boolean isReservedSupported(String volumeUuid, String callingPackage); long getTotalBytes(String volumeUuid, String callingPackage); long getFreeBytes(String volumeUuid, String callingPackage); long getCacheBytes(String volumeUuid, String callingPackage); diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl index 4fbbdf2a9281..f089c127d03f 100644 --- a/core/java/android/app/usage/IUsageStatsManager.aidl +++ b/core/java/android/app/usage/IUsageStatsManager.aidl @@ -19,6 +19,8 @@ package android.app.usage; import android.app.usage.UsageEvents; import android.content.pm.ParceledListSlice; +import java.util.Map; + /** * System private API for talking with the UsageStatsManagerService. * @@ -38,4 +40,6 @@ interface IUsageStatsManager { in String[] annotations, String action); int getAppStandbyBucket(String packageName, String callingPackage, int userId); void setAppStandbyBucket(String packageName, int bucket, int userId); + Map getAppStandbyBuckets(String callingPackage, int userId); + void setAppStandbyBuckets(in Map appBuckets, int userId); } diff --git a/core/java/android/app/usage/StorageStatsManager.java b/core/java/android/app/usage/StorageStatsManager.java index 3d187ec7cb50..a86c27a03358 100644 --- a/core/java/android/app/usage/StorageStatsManager.java +++ b/core/java/android/app/usage/StorageStatsManager.java @@ -78,6 +78,16 @@ public class StorageStatsManager { return isQuotaSupported(convert(uuid)); } + /** {@hide} */ + @TestApi + public boolean isReservedSupported(@NonNull UUID storageUuid) { + try { + return mService.isReservedSupported(convert(storageUuid), mContext.getOpPackageName()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Return the total size of the underlying physical media that is hosting * this storage volume. diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index d614b20a0788..1fc45c9fdb94 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -324,11 +324,11 @@ public final class UsageStatsManager { * state of the app based on app usage patterns. Standby buckets determine how much an app will * be restricted from running background tasks such as jobs, alarms and certain PendingIntent * callbacks. - * Restrictions increase progressively from {@link #STANDBY_BUCKET_ACTIVE} to + * <p>Restrictions increase progressively from {@link #STANDBY_BUCKET_ACTIVE} to * {@link #STANDBY_BUCKET_RARE}, with {@link #STANDBY_BUCKET_ACTIVE} being the least * restrictive. The battery level of the device might also affect the restrictions. * - * @return the current standby bucket of the calling app. + * @return the current standby bucket of the calling app. One of STANDBY_BUCKET_* constants. */ public @StandbyBuckets int getAppStandbyBucket() { try { @@ -359,7 +359,13 @@ public final class UsageStatsManager { /** * {@hide} - * Changes the app standby state to the provided bucket. + * Changes an app's standby bucket to the provided value. The caller can only set the standby + * bucket for a different app than itself. + * @param packageName the package name of the app to set the bucket for. A SecurityException + * will be thrown if the package name is that of the caller. + * @param bucket the standby bucket to set it to, which should be one of STANDBY_BUCKET_*. + * Setting a standby bucket outside of the range of STANDBY_BUCKET_ACTIVE to + * STANDBY_BUCKET_NEVER will result in a SecurityException. */ @SystemApi @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) @@ -373,6 +379,39 @@ public final class UsageStatsManager { /** * {@hide} + * Returns the current standby bucket of every app that has a bucket assigned to it. + * The caller must hold the permission android.permission.PACKAGE_USAGE_STATS. The key of the + * returned Map is the package name and the value is the bucket assigned to the package. + * @see #getAppStandbyBucket() + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) + public Map<String, Integer> getAppStandbyBuckets() { + try { + return (Map<String, Integer>) mService.getAppStandbyBuckets( + mContext.getOpPackageName(), mContext.getUserId()); + } catch (RemoteException e) { + } + return Collections.EMPTY_MAP; + } + + /** + * {@hide} + * Changes the app standby bucket for multiple apps at once. The Map is keyed by the package + * name and the value is one of STANDBY_BUCKET_*. + * @param appBuckets a map of package name to bucket value. + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) + public void setAppStandbyBuckets(Map<String, Integer> appBuckets) { + try { + mService.setAppStandbyBuckets(appBuckets, mContext.getUserId()); + } catch (RemoteException e) { + } + } + + /** + * {@hide} * Temporarily whitelist the specified app for a short duration. This is to allow an app * receiving a high priority message to be able to access the network and acquire wakelocks * even if the device is in power-save mode or the app is currently considered inactive. diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java index 46a230b50605..ebbc710922c2 100644 --- a/core/java/android/bluetooth/BluetoothProfile.java +++ b/core/java/android/bluetooth/BluetoothProfile.java @@ -254,4 +254,28 @@ public interface BluetoothProfile { */ public void onServiceDisconnected(int profile); } + + /** + * Convert an integer value of connection state into human readable string + * + * @param connectionState - One of {@link #STATE_DISCONNECTED}, {@link #STATE_CONNECTING}, + * {@link #STATE_CONNECTED}, or {@link #STATE_DISCONNECTED} + * @return a string representation of the connection state, STATE_UNKNOWN if the state + * is not defined + * @hide + */ + static String getConnectionStateName(int connectionState) { + switch (connectionState) { + case STATE_DISCONNECTED: + return "STATE_DISCONNECTED"; + case STATE_CONNECTING: + return "STATE_CONNECTING"; + case STATE_CONNECTED: + return "STATE_CONNECTED"; + case STATE_DISCONNECTING: + return "STATE_DISCONNECTING"; + default: + return "STATE_UNKNOWN"; + } + } } diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 84b1ff3219a2..c73b853a02cb 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -26,6 +26,7 @@ import android.content.Context; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.graphics.drawable.Drawable; +import android.os.Build; import android.os.Environment; import android.os.Parcel; import android.os.Parcelable; @@ -1582,6 +1583,11 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { return (privateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0; } + /** @hide */ + public boolean isTargetingDeprecatedSdkVersion() { + return targetSdkVersion < Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT; + } + /** * Returns whether or not this application was installed as a virtual preload. */ diff --git a/core/java/android/hardware/display/BrightnessConfiguration.aidl b/core/java/android/hardware/display/BrightnessConfiguration.aidl new file mode 100644 index 000000000000..5b6b4645fa45 --- /dev/null +++ b/core/java/android/hardware/display/BrightnessConfiguration.aidl @@ -0,0 +1,19 @@ +/* + * 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.hardware.display; + +parcelable BrightnessConfiguration; diff --git a/core/java/android/hardware/display/BrightnessConfiguration.java b/core/java/android/hardware/display/BrightnessConfiguration.java new file mode 100644 index 000000000000..6c3be816e87b --- /dev/null +++ b/core/java/android/hardware/display/BrightnessConfiguration.java @@ -0,0 +1,175 @@ +/* + * 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.hardware.display; + +import android.os.Parcel; +import android.os.Parcelable; +import android.util.Pair; + +import com.android.internal.util.Preconditions; + +import java.util.Arrays; + +/** @hide */ +public final class BrightnessConfiguration implements Parcelable { + private final float[] mLux; + private final float[] mNits; + + private BrightnessConfiguration(float[] lux, float[] nits) { + mLux = lux; + mNits = nits; + } + + /** + * Gets the base brightness as curve. + * + * The curve is returned as a pair of float arrays, the first representing all of the lux + * points of the brightness curve and the second representing all of the nits values of the + * brightness curve. + * + * @return the control points for the brightness curve. + */ + public Pair<float[], float[]> getCurve() { + return Pair.create(Arrays.copyOf(mLux, mLux.length), Arrays.copyOf(mNits, mNits.length)); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeFloatArray(mLux); + dest.writeFloatArray(mNits); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("BrightnessConfiguration{["); + final int size = mLux.length; + for (int i = 0; i < size; i++) { + if (i != 0) { + sb.append(", "); + } + sb.append("(").append(mLux[i]).append(", ").append(mNits[i]).append(")"); + } + sb.append("]}"); + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = result * 31 + Arrays.hashCode(mLux); + result = result * 31 + Arrays.hashCode(mNits); + return result; + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (!(o instanceof BrightnessConfiguration)) { + return false; + } + final BrightnessConfiguration other = (BrightnessConfiguration) o; + return Arrays.equals(mLux, other.mLux) && Arrays.equals(mNits, other.mNits); + } + + public static final Creator<BrightnessConfiguration> CREATOR = + new Creator<BrightnessConfiguration>() { + public BrightnessConfiguration createFromParcel(Parcel in) { + Builder builder = new Builder(); + float[] lux = in.createFloatArray(); + float[] nits = in.createFloatArray(); + builder.setCurve(lux, nits); + return builder.build(); + } + + public BrightnessConfiguration[] newArray(int size) { + return new BrightnessConfiguration[size]; + } + }; + + /** + * A builder class for {@link BrightnessConfiguration}s. + */ + public static class Builder { + private float[] mCurveLux; + private float[] mCurveNits; + + /** + * Sets the control points for the brightness curve. + * + * Brightness curves must have strictly increasing ambient brightness values in lux and + * monotonically increasing display brightness values in nits. In addition, the initial + * control point must be 0 lux. + * + * @throws IllegalArgumentException if the initial control point is not at 0 lux. + * @throws IllegalArgumentException if the lux levels are not strictly increasing. + * @throws IllegalArgumentException if the nit levels are not monotonically increasing. + */ + public Builder setCurve(float[] lux, float[] nits) { + Preconditions.checkNotNull(lux); + Preconditions.checkNotNull(nits); + if (lux.length == 0 || nits.length == 0) { + throw new IllegalArgumentException("Lux and nits arrays must not be empty"); + } + if (lux.length != nits.length) { + throw new IllegalArgumentException("Lux and nits arrays must be the same length"); + } + if (lux[0] != 0) { + throw new IllegalArgumentException("Initial control point must be for 0 lux"); + } + Preconditions.checkArrayElementsInRange(lux, 0, Float.MAX_VALUE, "lux"); + Preconditions.checkArrayElementsInRange(nits, 0, Float.MAX_VALUE, "nits"); + checkMonotonic(lux, true/*strictly increasing*/, "lux"); + checkMonotonic(nits, false /*strictly increasing*/, "nits"); + mCurveLux = lux; + mCurveNits = nits; + return this; + } + + /** + * Builds the {@link BrightnessConfiguration}. + * + * A brightness curve <b>must</b> be set before calling this. + */ + public BrightnessConfiguration build() { + if (mCurveLux == null || mCurveNits == null) { + throw new IllegalStateException("A curve must be set!"); + } + return new BrightnessConfiguration(mCurveLux, mCurveNits); + } + + private static void checkMonotonic(float[] vals, boolean strictlyIncreasing, String name) { + if (vals.length <= 1) { + return; + } + float prev = vals[0]; + for (int i = 1; i < vals.length; i++) { + if (prev > vals[i] || prev == vals[i] && strictlyIncreasing) { + String condition = strictlyIncreasing ? "strictly increasing" : "monotonic"; + throw new IllegalArgumentException(name + " values must be " + condition); + } + prev = vals[i]; + } + } + } +} diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 97ca231bf68c..7de667dcaa2b 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -27,6 +27,7 @@ import android.content.Context; import android.graphics.Point; import android.media.projection.MediaProjection; import android.os.Handler; +import android.os.UserHandle; import android.util.SparseArray; import android.view.Display; import android.view.Surface; @@ -634,6 +635,27 @@ public final class DisplayManager { } /** + * Sets the global display brightness configuration. + * + * @hide + */ + public void setBrightnessConfiguration(BrightnessConfiguration c) { + setBrightnessConfigurationForUser(c, UserHandle.myUserId()); + } + + /** + * Sets the global display brightness configuration for a specific user. + * + * Note this requires the INTERACT_ACROSS_USERS permission if setting the configuration for a + * user other than the one you're currently running as. + * + * @hide + */ + public void setBrightnessConfigurationForUser(BrightnessConfiguration c, int userId) { + mGlobal.setBrightnessConfigurationForUser(c, userId); + } + + /** * Listens for changes in available display devices. */ public interface DisplayListener { diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java index c3f82f56dad8..bf4cc1d826a9 100644 --- a/core/java/android/hardware/display/DisplayManagerGlobal.java +++ b/core/java/android/hardware/display/DisplayManagerGlobal.java @@ -487,6 +487,19 @@ public final class DisplayManagerGlobal { } } + /** + * Sets the global brightness configuration for a given user. + * + * @hide + */ + public void setBrightnessConfigurationForUser(BrightnessConfiguration c, int userId) { + try { + mDm.setBrightnessConfigurationForUser(c, userId); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + private final class DisplayManagerCallback extends IDisplayManagerCallback.Stub { @Override public void onDisplayEvent(int displayId, int event) { diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl index f2ed9e7571d3..8afae6ec9010 100644 --- a/core/java/android/hardware/display/IDisplayManager.aidl +++ b/core/java/android/hardware/display/IDisplayManager.aidl @@ -18,6 +18,7 @@ package android.hardware.display; import android.content.pm.ParceledListSlice; import android.graphics.Point; +import android.hardware.display.BrightnessConfiguration; import android.hardware.display.IDisplayManagerCallback; import android.hardware.display.IVirtualDisplayCallback; import android.hardware.display.WifiDisplay; @@ -89,4 +90,9 @@ interface IDisplayManager { // STOPSHIP remove when adaptive brightness code is updated to accept curves. // Requires BRIGHTNESS_SLIDER_USAGE permission. void setBrightness(int brightness); + + // Sets the global brightness configuration for a given user. Requires + // CONFIGURE_DISPLAY_BRIGHTNESS, and INTERACT_ACROSS_USER if the user being configured is not + // the same as the calling user. + void setBrightnessConfigurationForUser(in BrightnessConfiguration c, int userId); } diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index c1722d54c541..48f56847e88d 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -221,13 +221,31 @@ public class Build { public static final String SDK = getString("ro.build.version.sdk"); /** - * The user-visible SDK version of the framework; its possible - * values are defined in {@link Build.VERSION_CODES}. + * The SDK version of the software currently running on this hardware + * device. This value never changes while a device is booted, but it may + * increase when the hardware manufacturer provides an OTA update. + * <p> + * Possible values are defined in {@link Build.VERSION_CODES}. + * + * @see #FIRST_SDK_INT */ public static final int SDK_INT = SystemProperties.getInt( "ro.build.version.sdk", 0); /** + * The SDK version of the software that <em>initially</em> shipped on + * this hardware device. It <em>never</em> changes during the lifetime + * of the device, even when {@link #SDK_INT} increases due to an OTA + * update. + * <p> + * Possible values are defined in {@link Build.VERSION_CODES}. + * + * @see #SDK_INT + */ + public static final int FIRST_SDK_INT = SystemProperties + .getInt("ro.product.first_api_level", 0); + + /** * The developer preview revision of a prerelease SDK. This value will always * be <code>0</code> on production platform builds/devices. * @@ -270,6 +288,14 @@ public class Build { * @hide */ public static final int RESOURCES_SDK_INT = SDK_INT + ACTIVE_CODENAMES.length; + + /** + * The current lowest supported value of app target SDK. Applications targeting + * lower values will fail to install and run. Its possible values are defined + * in {@link Build.VERSION_CODES}. + */ + public static final int MIN_SUPPORTED_TARGET_SDK_INT = SystemProperties.getInt( + "ro.build.version.min_supported_target_sdk", 0); } /** diff --git a/core/java/android/os/UserManagerInternal.java b/core/java/android/os/UserManagerInternal.java index 9369eebfd984..6c9f1b25bf66 100644 --- a/core/java/android/os/UserManagerInternal.java +++ b/core/java/android/os/UserManagerInternal.java @@ -130,7 +130,8 @@ public abstract class UserManagerInternal { * <p>Called by the {@link com.android.server.devicepolicy.DevicePolicyManagerService} when * createAndManageUser is called by the device owner. */ - public abstract UserInfo createUserEvenWhenDisallowed(String name, int flags); + public abstract UserInfo createUserEvenWhenDisallowed(String name, int flags, + String[] disallowedPackages); /** * Same as {@link UserManager#removeUser(int userHandle)}, but bypasses the check for diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java index 52e53b074165..bc2953e0c0fe 100644 --- a/core/java/android/view/GestureDetector.java +++ b/core/java/android/view/GestureDetector.java @@ -520,162 +520,163 @@ public class GestureDetector { boolean handled = false; switch (action & MotionEvent.ACTION_MASK) { - case MotionEvent.ACTION_POINTER_DOWN: - mDownFocusX = mLastFocusX = focusX; - mDownFocusY = mLastFocusY = focusY; - // Cancel long press and taps - cancelTaps(); - break; - - case MotionEvent.ACTION_POINTER_UP: - mDownFocusX = mLastFocusX = focusX; - mDownFocusY = mLastFocusY = focusY; - - // Check the dot product of current velocities. - // If the pointer that left was opposing another velocity vector, clear. - mVelocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity); - final int upIndex = ev.getActionIndex(); - final int id1 = ev.getPointerId(upIndex); - final float x1 = mVelocityTracker.getXVelocity(id1); - final float y1 = mVelocityTracker.getYVelocity(id1); - for (int i = 0; i < count; i++) { - if (i == upIndex) continue; - - final int id2 = ev.getPointerId(i); - final float x = x1 * mVelocityTracker.getXVelocity(id2); - final float y = y1 * mVelocityTracker.getYVelocity(id2); - - final float dot = x + y; - if (dot < 0) { - mVelocityTracker.clear(); - break; + case MotionEvent.ACTION_POINTER_DOWN: + mDownFocusX = mLastFocusX = focusX; + mDownFocusY = mLastFocusY = focusY; + // Cancel long press and taps + cancelTaps(); + break; + + case MotionEvent.ACTION_POINTER_UP: + mDownFocusX = mLastFocusX = focusX; + mDownFocusY = mLastFocusY = focusY; + + // Check the dot product of current velocities. + // If the pointer that left was opposing another velocity vector, clear. + mVelocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity); + final int upIndex = ev.getActionIndex(); + final int id1 = ev.getPointerId(upIndex); + final float x1 = mVelocityTracker.getXVelocity(id1); + final float y1 = mVelocityTracker.getYVelocity(id1); + for (int i = 0; i < count; i++) { + if (i == upIndex) continue; + + final int id2 = ev.getPointerId(i); + final float x = x1 * mVelocityTracker.getXVelocity(id2); + final float y = y1 * mVelocityTracker.getYVelocity(id2); + + final float dot = x + y; + if (dot < 0) { + mVelocityTracker.clear(); + break; + } } - } - break; - - case MotionEvent.ACTION_DOWN: - if (mDoubleTapListener != null) { - boolean hadTapMessage = mHandler.hasMessages(TAP); - if (hadTapMessage) mHandler.removeMessages(TAP); - if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) && hadTapMessage && - isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev)) { - // This is a second tap - mIsDoubleTapping = true; - // Give a callback with the first tap of the double-tap - handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent); - // Give a callback with down event of the double-tap - handled |= mDoubleTapListener.onDoubleTapEvent(ev); - } else { - // This is a first tap - mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT); + break; + + case MotionEvent.ACTION_DOWN: + if (mDoubleTapListener != null) { + boolean hadTapMessage = mHandler.hasMessages(TAP); + if (hadTapMessage) mHandler.removeMessages(TAP); + if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) + && hadTapMessage + && isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev)) { + // This is a second tap + mIsDoubleTapping = true; + // Give a callback with the first tap of the double-tap + handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent); + // Give a callback with down event of the double-tap + handled |= mDoubleTapListener.onDoubleTapEvent(ev); + } else { + // This is a first tap + mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT); + } } - } - mDownFocusX = mLastFocusX = focusX; - mDownFocusY = mLastFocusY = focusY; - if (mCurrentDownEvent != null) { - mCurrentDownEvent.recycle(); - } - mCurrentDownEvent = MotionEvent.obtain(ev); - mAlwaysInTapRegion = true; - mAlwaysInBiggerTapRegion = true; - mStillDown = true; - mInLongPress = false; - mDeferConfirmSingleTap = false; - - if (mIsLongpressEnabled) { - mHandler.removeMessages(LONG_PRESS); - mHandler.sendEmptyMessageAtTime(LONG_PRESS, - mCurrentDownEvent.getDownTime() + LONGPRESS_TIMEOUT); - } - mHandler.sendEmptyMessageAtTime(SHOW_PRESS, - mCurrentDownEvent.getDownTime() + TAP_TIMEOUT); - handled |= mListener.onDown(ev); - break; + mDownFocusX = mLastFocusX = focusX; + mDownFocusY = mLastFocusY = focusY; + if (mCurrentDownEvent != null) { + mCurrentDownEvent.recycle(); + } + mCurrentDownEvent = MotionEvent.obtain(ev); + mAlwaysInTapRegion = true; + mAlwaysInBiggerTapRegion = true; + mStillDown = true; + mInLongPress = false; + mDeferConfirmSingleTap = false; - case MotionEvent.ACTION_MOVE: - if (mInLongPress || mInContextClick) { + if (mIsLongpressEnabled) { + mHandler.removeMessages(LONG_PRESS); + mHandler.sendEmptyMessageAtTime(LONG_PRESS, + mCurrentDownEvent.getDownTime() + LONGPRESS_TIMEOUT); + } + mHandler.sendEmptyMessageAtTime(SHOW_PRESS, + mCurrentDownEvent.getDownTime() + TAP_TIMEOUT); + handled |= mListener.onDown(ev); break; - } - final float scrollX = mLastFocusX - focusX; - final float scrollY = mLastFocusY - focusY; - if (mIsDoubleTapping) { - // Give the move events of the double-tap - handled |= mDoubleTapListener.onDoubleTapEvent(ev); - } else if (mAlwaysInTapRegion) { - final int deltaX = (int) (focusX - mDownFocusX); - final int deltaY = (int) (focusY - mDownFocusY); - int distance = (deltaX * deltaX) + (deltaY * deltaY); - int slopSquare = isGeneratedGesture ? 0 : mTouchSlopSquare; - if (distance > slopSquare) { + + case MotionEvent.ACTION_MOVE: + if (mInLongPress || mInContextClick) { + break; + } + final float scrollX = mLastFocusX - focusX; + final float scrollY = mLastFocusY - focusY; + if (mIsDoubleTapping) { + // Give the move events of the double-tap + handled |= mDoubleTapListener.onDoubleTapEvent(ev); + } else if (mAlwaysInTapRegion) { + final int deltaX = (int) (focusX - mDownFocusX); + final int deltaY = (int) (focusY - mDownFocusY); + int distance = (deltaX * deltaX) + (deltaY * deltaY); + int slopSquare = isGeneratedGesture ? 0 : mTouchSlopSquare; + if (distance > slopSquare) { + handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY); + mLastFocusX = focusX; + mLastFocusY = focusY; + mAlwaysInTapRegion = false; + mHandler.removeMessages(TAP); + mHandler.removeMessages(SHOW_PRESS); + mHandler.removeMessages(LONG_PRESS); + } + int doubleTapSlopSquare = isGeneratedGesture ? 0 : mDoubleTapTouchSlopSquare; + if (distance > doubleTapSlopSquare) { + mAlwaysInBiggerTapRegion = false; + } + } else if ((Math.abs(scrollX) >= 1) || (Math.abs(scrollY) >= 1)) { handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY); mLastFocusX = focusX; mLastFocusY = focusY; - mAlwaysInTapRegion = false; - mHandler.removeMessages(TAP); - mHandler.removeMessages(SHOW_PRESS); - mHandler.removeMessages(LONG_PRESS); } - int doubleTapSlopSquare = isGeneratedGesture ? 0 : mDoubleTapTouchSlopSquare; - if (distance > doubleTapSlopSquare) { - mAlwaysInBiggerTapRegion = false; + break; + + case MotionEvent.ACTION_UP: + mStillDown = false; + MotionEvent currentUpEvent = MotionEvent.obtain(ev); + if (mIsDoubleTapping) { + // Finally, give the up event of the double-tap + handled |= mDoubleTapListener.onDoubleTapEvent(ev); + } else if (mInLongPress) { + mHandler.removeMessages(TAP); + mInLongPress = false; + } else if (mAlwaysInTapRegion && !mIgnoreNextUpEvent) { + handled = mListener.onSingleTapUp(ev); + if (mDeferConfirmSingleTap && mDoubleTapListener != null) { + mDoubleTapListener.onSingleTapConfirmed(ev); + } + } else if (!mIgnoreNextUpEvent) { + + // A fling must travel the minimum tap distance + final VelocityTracker velocityTracker = mVelocityTracker; + final int pointerId = ev.getPointerId(0); + velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity); + final float velocityY = velocityTracker.getYVelocity(pointerId); + final float velocityX = velocityTracker.getXVelocity(pointerId); + + if ((Math.abs(velocityY) > mMinimumFlingVelocity) + || (Math.abs(velocityX) > mMinimumFlingVelocity)) { + handled = mListener.onFling(mCurrentDownEvent, ev, velocityX, velocityY); + } } - } else if ((Math.abs(scrollX) >= 1) || (Math.abs(scrollY) >= 1)) { - handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY); - mLastFocusX = focusX; - mLastFocusY = focusY; - } - break; - - case MotionEvent.ACTION_UP: - mStillDown = false; - MotionEvent currentUpEvent = MotionEvent.obtain(ev); - if (mIsDoubleTapping) { - // Finally, give the up event of the double-tap - handled |= mDoubleTapListener.onDoubleTapEvent(ev); - } else if (mInLongPress) { - mHandler.removeMessages(TAP); - mInLongPress = false; - } else if (mAlwaysInTapRegion && !mIgnoreNextUpEvent) { - handled = mListener.onSingleTapUp(ev); - if (mDeferConfirmSingleTap && mDoubleTapListener != null) { - mDoubleTapListener.onSingleTapConfirmed(ev); + if (mPreviousUpEvent != null) { + mPreviousUpEvent.recycle(); } - } else if (!mIgnoreNextUpEvent) { - - // A fling must travel the minimum tap distance - final VelocityTracker velocityTracker = mVelocityTracker; - final int pointerId = ev.getPointerId(0); - velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity); - final float velocityY = velocityTracker.getYVelocity(pointerId); - final float velocityX = velocityTracker.getXVelocity(pointerId); - - if ((Math.abs(velocityY) > mMinimumFlingVelocity) - || (Math.abs(velocityX) > mMinimumFlingVelocity)){ - handled = mListener.onFling(mCurrentDownEvent, ev, velocityX, velocityY); + // Hold the event we obtained above - listeners may have changed the original. + mPreviousUpEvent = currentUpEvent; + if (mVelocityTracker != null) { + // This may have been cleared when we called out to the + // application above. + mVelocityTracker.recycle(); + mVelocityTracker = null; } - } - if (mPreviousUpEvent != null) { - mPreviousUpEvent.recycle(); - } - // Hold the event we obtained above - listeners may have changed the original. - mPreviousUpEvent = currentUpEvent; - if (mVelocityTracker != null) { - // This may have been cleared when we called out to the - // application above. - mVelocityTracker.recycle(); - mVelocityTracker = null; - } - mIsDoubleTapping = false; - mDeferConfirmSingleTap = false; - mIgnoreNextUpEvent = false; - mHandler.removeMessages(SHOW_PRESS); - mHandler.removeMessages(LONG_PRESS); - break; - - case MotionEvent.ACTION_CANCEL: - cancel(); - break; + mIsDoubleTapping = false; + mDeferConfirmSingleTap = false; + mIgnoreNextUpEvent = false; + mHandler.removeMessages(SHOW_PRESS); + mHandler.removeMessages(LONG_PRESS); + break; + + case MotionEvent.ACTION_CANCEL: + cancel(); + break; } if (!handled && mInputEventConsistencyVerifier != null) { diff --git a/core/java/com/android/internal/util/Preconditions.java b/core/java/com/android/internal/util/Preconditions.java index e5d571672ce2..91c76afdf5b2 100644 --- a/core/java/com/android/internal/util/Preconditions.java +++ b/core/java/com/android/internal/util/Preconditions.java @@ -494,4 +494,38 @@ public class Preconditions { return value; } + + /** + * Ensures that all elements in the argument integer array are within the inclusive range + * + * @param value an integer array of values + * @param lower the lower endpoint of the inclusive range + * @param upper the upper endpoint of the inclusive range + * @param valueName the name of the argument to use if the check fails + * + * @return the validated integer array + * + * @throws IllegalArgumentException if any of the elements in {@code value} were out of range + * @throws NullPointerException if the {@code value} was {@code null} + */ + public static int[] checkArrayElementsInRange(int[] value, int lower, int upper, + String valueName) { + checkNotNull(value, valueName + " must not be null"); + + for (int i = 0; i < value.length; ++i) { + int v = value[i]; + + if (v < lower) { + throw new IllegalArgumentException( + String.format("%s[%d] is out of range of [%d, %d] (too low)", + valueName, i, lower, upper)); + } else if (v > upper) { + throw new IllegalArgumentException( + String.format("%s[%d] is out of range of [%d, %d] (too high)", + valueName, i, lower, upper)); + } + } + + return value; + } } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 09204261811d..15e439ed3586 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -407,6 +407,7 @@ <protected-broadcast android:name="android.internal.policy.action.BURN_IN_PROTECTION" /> <protected-broadcast android:name="android.app.action.SYSTEM_UPDATE_POLICY_CHANGED" /> <protected-broadcast android:name="android.app.action.DEVICE_OWNER_CHANGED" /> + <protected-broadcast android:name="android.app.action.MANAGED_USER_CREATED" /> <!-- Added in N --> <protected-broadcast android:name="android.intent.action.ANR" /> @@ -2923,6 +2924,11 @@ <permission android:name="android.permission.BRIGHTNESS_SLIDER_USAGE" android:protectionLevel="signature|privileged" /> + <!-- Allows an application to modify the display brightness configuration + @hide --> + <permission android:name="android.permission.CONFIGURE_DISPLAY_BRIGHTNESS" + android:protectionLevel="signature|privileged|development" /> + <!-- @SystemApi Allows an application to control VPN. <p>Not for use by third-party applications.</p> @hide --> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 0b38d1b1fca1..8377751f4236 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -963,12 +963,6 @@ --> <integer name="config_longPressOnBackBehavior">0</integer> - <!-- Control the behavior when the user panic presses the back button. - 0 - Nothing - 1 - Go to home - --> - <integer name="config_backPanicBehavior">0</integer> - <!-- Control the behavior when the user short presses the power button. 0 - Nothing 1 - Go to sleep (doze) @@ -1301,6 +1295,22 @@ <integer-array name="config_autoBrightnessLcdBacklightValues"> </integer-array> + <!-- Array of desired screen brightness in nits corresponding to the lux values + in the config_autoBrightnessLevels array. As with config_screenBrightnessMinimumNits and + config_screenBrightnessMaximumNits, the display brightness is defined as the measured + brightness of an all-white image. + + If this is defined then: + - config_autoBrightnessLcdBacklightValues should not be defined + - config_screenBrightnessMinimumNits must be defined + - config_screenBrightnessMaximumNits must be defined + + This array should have size one greater than the size of the config_autoBrightnessLevels + array. The brightness values must be non-negative and non-decreasing. This must be + overridden in platform specific overlays --> + <array name="config_autoBrightnessDisplayValuesNits"> + </array> + <!-- Array of output values for button backlight corresponding to the LUX values in the config_autoBrightnessLevels array. This array should have size one greater than the size of the config_autoBrightnessLevels array. @@ -1337,6 +1347,29 @@ <item>200</item> </integer-array> + <!-- The minimum brightness of the display in nits. On OLED displays this should be measured + with an all white image while the display is fully on and the backlight is set to + config_screenBrightnessSettingMinimum or config_screenBrightnessSettingDark, whichever + is darker. + + If this and config_screenBrightnessMinimumNits are set, then the display's brightness + range is assumed to be linear between + (config_screenBrightnessSettingMinimum, config_screenBrightnessMinimumNits) and + (config_screenBrightnessSettingMaximum, config_screenBrightnessMaximumNits). --> + <item name="config_screenBrightnessMinimumNits" format="float" type="dimen">-1.0</item> + + <!-- The maximum brightness of the display in nits. On OLED displays this should be measured + with an all white image while the display is fully on and the "backlight" is set to + config_screenBrightnessSettingMaximum. Note that this value should *not* reflect the + maximum brightness value for any high brightness modes but only the maximum brightness + value obtainable in a sustainable manner. + + If this and config_screenBrightnessMinimumNits are set to something non-negative, then the + display's brightness range is assumed to be linear between + (config_screenBrightnessSettingMinimum, config_screenBrightnessMaximumNits) and + (config_screenBrightnessSettingMaximum, config_screenBrightnessMaximumNits). --> + <item name="config_screenBrightnessMaximumNits" format="float" type="dimen">-1.0</item> + <!-- Array of ambient lux threshold values. This is used for determining hysteresis constraint values by calculating the index to use for lookup and then setting the constraint value to the corresponding value of the array. The new brightening hysteresis constraint value @@ -1387,6 +1420,9 @@ <!-- True if WallpaperService is enabled --> <bool name="config_enableWallpaperService">true</bool> + <!-- Class name of WallpaperManagerService. --> + <string name="config_wallpaperManagerServiceName">com.android.server.wallpaper.WallpaperManagerService</string> + <!-- Enables the TimeZoneRuleManager service. This is the master switch for the updateable time zone update mechanism. --> <bool name="config_enableUpdateableTimeZoneRules">false</bool> diff --git a/core/res/res/values/disallowed_apps_managed_device.xml b/core/res/res/values/disallowed_apps_managed_device.xml new file mode 100644 index 000000000000..8940b15ccabb --- /dev/null +++ b/core/res/res/values/disallowed_apps_managed_device.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be removed from the managed device. --> + <string-array name="disallowed_apps_managed_device"> + </string-array> +</resources> diff --git a/core/res/res/values/disallowed_apps_managed_profile.xml b/core/res/res/values/disallowed_apps_managed_profile.xml new file mode 100644 index 000000000000..e3a513f4f096 --- /dev/null +++ b/core/res/res/values/disallowed_apps_managed_profile.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be removed from the managed profile. --> + <string-array name="disallowed_apps_managed_profile"> + </string-array> +</resources> diff --git a/core/res/res/values/disallowed_apps_managed_user.xml b/core/res/res/values/disallowed_apps_managed_user.xml new file mode 100644 index 000000000000..b7b645dc0780 --- /dev/null +++ b/core/res/res/values/disallowed_apps_managed_user.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be removed from the managed user. --> + <string-array name="disallowed_apps_managed_user"> + </string-array> +</resources> diff --git a/core/res/res/values/required_apps_managed_device.xml b/core/res/res/values/required_apps_managed_device.xml new file mode 100644 index 000000000000..0ac706f51a70 --- /dev/null +++ b/core/res/res/values/required_apps_managed_device.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be retained on the managed device. + Takes precedence over the disallowed apps lists. --> + <string-array name="required_apps_managed_device"> + <item>com.android.settings</item> + <item>com.android.contacts</item> + <item>com.android.dialer</item> + <item>com.android.stk</item> <!-- Required by com.android.phone by certain carriers --> + <item>com.android.providers.downloads</item> + <item>com.android.providers.downloads.ui</item> + <item>com.android.documentsui</item> + </string-array> +</resources> diff --git a/core/res/res/values/required_apps_managed_profile.xml b/core/res/res/values/required_apps_managed_profile.xml new file mode 100644 index 000000000000..a0b8492644ee --- /dev/null +++ b/core/res/res/values/required_apps_managed_profile.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be retained in the managed profile. + Takes precedence over the disallowed apps lists. --> + <string-array name="required_apps_managed_profile"> + <item>com.android.contacts</item> + <item>com.android.settings</item> + <item>com.android.providers.downloads</item> + <item>com.android.providers.downloads.ui</item> + <item>com.android.documentsui</item> + </string-array> +</resources> diff --git a/core/res/res/values/required_apps_managed_user.xml b/core/res/res/values/required_apps_managed_user.xml new file mode 100644 index 000000000000..e8fdb210805c --- /dev/null +++ b/core/res/res/values/required_apps_managed_user.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be retained on the managed user. + Takes precedence over the disallowed apps lists. --> + <string-array name="required_apps_managed_user"> + <item>com.android.settings</item> + <item>com.android.contacts</item> + <item>com.android.dialer</item> + <item>com.android.stk</item> <!-- Required by com.android.phone by certain carriers --> + <item>com.android.providers.downloads</item> + <item>com.android.providers.downloads.ui</item> + <item>com.android.documentsui</item> + </string-array> +</resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index f659360199ef..be7ce5fc7e57 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -287,6 +287,7 @@ <java-symbol type="bool" name="split_action_bar_is_narrow" /> <java-symbol type="bool" name="config_useVolumeKeySounds" /> <java-symbol type="bool" name="config_enableWallpaperService" /> + <java-symbol type="string" name="config_wallpaperManagerServiceName" /> <java-symbol type="bool" name="config_enableUpdateableTimeZoneRules" /> <java-symbol type="bool" name="config_timeZoneRulesUpdateTrackingEnabled" /> <java-symbol type="string" name="config_timeZoneRulesUpdaterPackage" /> @@ -424,7 +425,6 @@ <java-symbol type="integer" name="config_veryLongPressOnPowerBehavior" /> <java-symbol type="integer" name="config_veryLongPressTimeout" /> <java-symbol type="integer" name="config_longPressOnBackBehavior" /> - <java-symbol type="integer" name="config_backPanicBehavior" /> <java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAdjust" /> <java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAbsolute" /> <java-symbol type="integer" name="config_max_pan_devices" /> @@ -1213,6 +1213,18 @@ <java-symbol type="array" name="config_telephonyHardware" /> <java-symbol type="array" name="config_keySystemUuidMapping" /> <java-symbol type="array" name="config_gpsParameters" /> + <java-symbol type="array" name="required_apps_managed_user" /> + <java-symbol type="array" name="required_apps_managed_profile" /> + <java-symbol type="array" name="required_apps_managed_device" /> + <java-symbol type="array" name="disallowed_apps_managed_user" /> + <java-symbol type="array" name="disallowed_apps_managed_profile" /> + <java-symbol type="array" name="disallowed_apps_managed_device" /> + <java-symbol type="array" name="vendor_required_apps_managed_user" /> + <java-symbol type="array" name="vendor_required_apps_managed_profile" /> + <java-symbol type="array" name="vendor_required_apps_managed_device" /> + <java-symbol type="array" name="vendor_disallowed_apps_managed_user" /> + <java-symbol type="array" name="vendor_disallowed_apps_managed_profile" /> + <java-symbol type="array" name="vendor_disallowed_apps_managed_device" /> <java-symbol type="drawable" name="default_wallpaper" /> <java-symbol type="drawable" name="default_lock_wallpaper" /> @@ -3173,4 +3185,8 @@ <java-symbol type="string" name="global_action_logout" /> <java-symbol type="drawable" name="ic_logout" /> + + <java-symbol type="dimen" name="config_screenBrightnessMinimumNits" /> + <java-symbol type="dimen" name="config_screenBrightnessMaximumNits" /> + <java-symbol type="array" name="config_autoBrightnessDisplayValuesNits" /> </resources> diff --git a/core/res/res/values/vendor_disallowed_apps_managed_device.xml b/core/res/res/values/vendor_disallowed_apps_managed_device.xml new file mode 100644 index 000000000000..c826d27d371e --- /dev/null +++ b/core/res/res/values/vendor_disallowed_apps_managed_device.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be removed from the managed device by a particular vendor. --> + <string-array name="vendor_disallowed_apps_managed_device"> + </string-array> +</resources> diff --git a/core/res/res/values/vendor_disallowed_apps_managed_profile.xml b/core/res/res/values/vendor_disallowed_apps_managed_profile.xml new file mode 100644 index 000000000000..5fcb2778b6bc --- /dev/null +++ b/core/res/res/values/vendor_disallowed_apps_managed_profile.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be removed from the managed profile by a particular vendor. --> + <string-array name="vendor_disallowed_apps_managed_profile"> + </string-array> +</resources> diff --git a/core/res/res/values/vendor_disallowed_apps_managed_user.xml b/core/res/res/values/vendor_disallowed_apps_managed_user.xml new file mode 100644 index 000000000000..3355d77aac6a --- /dev/null +++ b/core/res/res/values/vendor_disallowed_apps_managed_user.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be removed from the managed user by a particular vendor. --> + <string-array name="vendor_disallowed_apps_managed_user"> + </string-array> +</resources> diff --git a/core/res/res/values/vendor_required_apps_managed_device.xml b/core/res/res/values/vendor_required_apps_managed_device.xml new file mode 100644 index 000000000000..e684e22d8599 --- /dev/null +++ b/core/res/res/values/vendor_required_apps_managed_device.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be retained on the managed device by a particular vendor. + Takes precedence over the disallowed apps lists. --> + <string-array name="vendor_required_apps_managed_device"> + </string-array> +</resources> diff --git a/core/res/res/values/vendor_required_apps_managed_profile.xml b/core/res/res/values/vendor_required_apps_managed_profile.xml new file mode 100644 index 000000000000..4a3edf80c6e7 --- /dev/null +++ b/core/res/res/values/vendor_required_apps_managed_profile.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be retained in the managed profile by a particular vendor. + Takes precedence over the disallowed apps lists. --> + <string-array name="vendor_required_apps_managed_profile"> + </string-array> +</resources> diff --git a/core/res/res/values/vendor_required_apps_managed_user.xml b/core/res/res/values/vendor_required_apps_managed_user.xml new file mode 100644 index 000000000000..71dbd62f963c --- /dev/null +++ b/core/res/res/values/vendor_required_apps_managed_user.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * 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. + */ +--> +<resources> + <!-- A list of apps to be retained on the managed user by a particular vendor. + Takes precedence over the disallowed apps lists. --> + <string-array name="vendor_required_apps_managed_user"> + </string-array> +</resources> diff --git a/core/tests/coretests/assets/fonts/LineBreakingOverhangsTestFont.ttf b/core/tests/coretests/assets/fonts/LineBreakingOverhangsTestFont.ttf Binary files differdeleted file mode 100644 index cf769ed3e8a7..000000000000 --- a/core/tests/coretests/assets/fonts/LineBreakingOverhangsTestFont.ttf +++ /dev/null diff --git a/core/tests/coretests/assets/fonts/LineBreakingOverhangsTestFont.ttx b/core/tests/coretests/assets/fonts/LineBreakingOverhangsTestFont.ttx deleted file mode 100644 index 04d85922a977..000000000000 --- a/core/tests/coretests/assets/fonts/LineBreakingOverhangsTestFont.ttx +++ /dev/null @@ -1,234 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- 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. ---> -<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.9"> - - <GlyphOrder> - <!-- The 'id' attribute is only for humans; it is ignored when parsed. --> - <GlyphID id="0" name=".notdef"/> - <GlyphID id="1" name="space"/> - <GlyphID id="2" name="R"/> - <GlyphID id="3" name="a"/> - <GlyphID id="4" name="y"/> - </GlyphOrder> - - <head> - <!-- Most of this table will be recalculated by the compiler --> - <tableVersion value="1.0"/> - <fontRevision value="1.0"/> - <checkSumAdjustment value="0x26d0d624"/> - <magicNumber value="0x5f0f3cf5"/> - <flags value="00000000 00000011"/> - <unitsPerEm value="1000"/> - <created value="Tue Oct 3 23:00:00 2017"/> - <modified value="Tue Oct 3 23:33:15 2017"/> - <xMin value="-1500"/> - <yMin value="0"/> - <xMax value="5000"/> - <yMax value="1000"/> - <macStyle value="00000000 00000000"/> - <lowestRecPPEM value="7"/> - <fontDirectionHint value="2"/> - <indexToLocFormat value="0"/> - <glyphDataFormat value="0"/> - </head> - - <hhea> - <tableVersion value="0x00010000"/> - <ascent value="1000"/> - <descent value="-200"/> - <lineGap value="0"/> - <advanceWidthMax value="1000"/> - <minLeftSideBearing value="-1500"/> - <minRightSideBearing value="-4000"/> - <xMaxExtent value="5000"/> - <caretSlopeRise value="1"/> - <caretSlopeRun value="0"/> - <caretOffset value="0"/> - <reserved0 value="0"/> - <reserved1 value="0"/> - <reserved2 value="0"/> - <reserved3 value="0"/> - <metricDataFormat value="0"/> - <numberOfHMetrics value="1"/> - </hhea> - - <maxp> - <!-- Most of this table will be recalculated by the compiler --> - <tableVersion value="0x10000"/> - <numGlyphs value="5"/> - <maxPoints value="4"/> - <maxContours value="1"/> - <maxCompositePoints value="0"/> - <maxCompositeContours value="0"/> - <maxZones value="0"/> - <maxTwilightPoints value="0"/> - <maxStorage value="0"/> - <maxFunctionDefs value="0"/> - <maxInstructionDefs value="0"/> - <maxStackElements value="0"/> - <maxSizeOfInstructions value="0"/> - <maxComponentElements value="0"/> - <maxComponentDepth value="0"/> - </maxp> - - <OS_2> - <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex' - will be recalculated by the compiler --> - <version value="3"/> - <xAvgCharWidth value="594"/> - <usWeightClass value="400"/> - <usWidthClass value="5"/> - <fsType value="00000000 00001000"/> - <ySubscriptXSize value="650"/> - <ySubscriptYSize value="600"/> - <ySubscriptXOffset value="0"/> - <ySubscriptYOffset value="75"/> - <ySuperscriptXSize value="650"/> - <ySuperscriptYSize value="600"/> - <ySuperscriptXOffset value="0"/> - <ySuperscriptYOffset value="350"/> - <yStrikeoutSize value="50"/> - <yStrikeoutPosition value="300"/> - <sFamilyClass value="0"/> - <panose> - <bFamilyType value="0"/> - <bSerifStyle value="0"/> - <bWeight value="5"/> - <bProportion value="0"/> - <bContrast value="0"/> - <bStrokeVariation value="0"/> - <bArmStyle value="0"/> - <bLetterForm value="0"/> - <bMidline value="0"/> - <bXHeight value="0"/> - </panose> - <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/> - <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/> - <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/> - <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/> - <achVendID value="UKWN"/> - <fsSelection value="00000000 01000000"/> - <usFirstCharIndex value="32"/> - <usLastCharIndex value="121"/> - <sTypoAscender value="800"/> - <sTypoDescender value="-200"/> - <sTypoLineGap value="200"/> - <usWinAscent value="1000"/> - <usWinDescent value="200"/> - <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/> - <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/> - <sxHeight value="500"/> - <sCapHeight value="700"/> - <usDefaultChar value="0"/> - <usBreakChar value="32"/> - <usMaxContext value="0"/> - </OS_2> - - <hmtx> - <mtx name=".notdef" width="1000" lsb="0"/> - <mtx name="R" width="1000" lsb="0"/> - <mtx name="a" width="1000" lsb="0"/> - <mtx name="space" width="1000" lsb="0"/> - <mtx name="y" width="1000" lsb="-1500"/> - </hmtx> - - <cmap> - <tableVersion version="0"/> - <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="64" language="0" nGroups="4"> - <map code="0x20" name="space"/><!-- SPACE --> - <map code="0x52" name="R"/><!-- LATIN CAPITAL LETTER R --> - <map code="0x61" name="a"/><!-- LATIN SMALL LETTER A --> - <map code="0x79" name="y"/><!-- LATIN SMALL LETTER Y --> - </cmap_format_12> - </cmap> - - <loca> - <!-- The 'loca' table will be calculated by the compiler --> - </loca> - - <glyf> - - <!-- The xMin, yMin, xMax and yMax values - will be recalculated by the compiler. --> - - <TTGlyph name=".notdef"/><!-- contains no outline data --> - - <TTGlyph name="R" xMin="0" yMin="0" xMax="5000" yMax="1000"> - <contour> - <pt x="0" y="0" on="1"/> - <pt x="0" y="1000" on="1"/> - <pt x="5000" y="1000" on="1"/> - <pt x="5000" y="0" on="1"/> - </contour> - <instructions/> - </TTGlyph> - - <TTGlyph name="a"/><!-- contains no outline data --> - - <TTGlyph name="space"/><!-- contains no outline data --> - - <TTGlyph name="y" xMin="-1500" yMin="0" xMax="1000" yMax="1000"> - <contour> - <pt x="-1500" y="0" on="1"/> - <pt x="-1500" y="1000" on="1"/> - <pt x="1000" y="1000" on="1"/> - <pt x="1000" y="0" on="1"/> - </contour> - <instructions/> - </TTGlyph> - - </glyf> - - <name> - <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True"> - Font for LineBreakingOverhangsTest - </namerecord> - <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True"> - Regular - </namerecord> - <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True"> - Font for LineBreakingOverhangsTest - </namerecord> - <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True"> - SampleFont-Regular - </namerecord> - <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409"> - Sample Font - </namerecord> - <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409"> - Regular - </namerecord> - <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409"> - Sample Font - </namerecord> - <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409"> - SampleFont-Regular - </namerecord> - </name> - - <post> - <formatType value="3.0"/> - <italicAngle value="0.0"/> - <underlinePosition value="-75"/> - <underlineThickness value="50"/> - <isFixedPitch value="0"/> - <minMemType42 value="0"/> - <maxMemType42 value="0"/> - <minMemType1 value="0"/> - <maxMemType1 value="0"/> - </post> - -</ttFont> diff --git a/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java b/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java new file mode 100644 index 000000000000..bad0d258a54c --- /dev/null +++ b/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java @@ -0,0 +1,187 @@ +/* + * 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.hardware.display; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import android.os.Parcel; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import android.util.Pair; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.Arrays; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class BrightnessConfigurationTest { + private static final float[] LUX_LEVELS = { + 0f, + 10f, + 100f, + }; + + private static final float[] NITS_LEVELS = { + 0.5f, + 90f, + 100f, + }; + + @Test + public void testSetCurveIsUnmodified() { + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + builder.setCurve(LUX_LEVELS, NITS_LEVELS); + BrightnessConfiguration config = builder.build(); + Pair<float[], float[]> curve = config.getCurve(); + assertArrayEquals(LUX_LEVELS, curve.first, "lux"); + assertArrayEquals(NITS_LEVELS, curve.second, "nits"); + } + + @Test(expected = IllegalArgumentException.class) + public void testCurveMustHaveZeroLuxPoint() { + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + float[] lux = Arrays.copyOf(LUX_LEVELS, LUX_LEVELS.length); + lux[0] = 1f; + builder.setCurve(lux, NITS_LEVELS); + } + + @Test(expected = IllegalStateException.class) + public void testCurveMustBeSet() { + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + builder.build(); + } + + @Test(expected = NullPointerException.class) + public void testCurveMustNotHaveNullArrays() { + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + builder.setCurve(null, null); + } + + @Test(expected = IllegalArgumentException.class) + public void testCurveMustNotHaveEmptyArrays() { + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + builder.setCurve(new float[0], new float[0]); + } + + @Test + public void testCurveMustNotHaveArraysOfDifferentLengths() { + assertThrows(IllegalArgumentException.class, () -> { + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + float[] lux = Arrays.copyOf(LUX_LEVELS, LUX_LEVELS.length + 1); + lux[lux.length - 1] = lux[lux.length - 2] + 1; + boolean exceptionThrown = false; + builder.setCurve(lux, NITS_LEVELS); + }); + + assertThrows(IllegalArgumentException.class, () -> { + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + float[] nits = Arrays.copyOf(NITS_LEVELS, NITS_LEVELS.length + 1); + nits[nits.length - 1] = nits[nits.length - 2] + 1; + builder.setCurve(LUX_LEVELS, nits); + }); + } + + @Test + public void testCurvesMustNotContainNaN() { + assertThrows(IllegalArgumentException.class, () -> { + float[] lux = Arrays.copyOf(LUX_LEVELS, LUX_LEVELS.length); + lux[lux.length - 1] = Float.NaN; + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + builder.setCurve(lux, NITS_LEVELS); + }); + + assertThrows(IllegalArgumentException.class, () -> { + float[] nits = Arrays.copyOf(NITS_LEVELS, NITS_LEVELS.length); + nits[nits.length - 1] = Float.NaN; + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + builder.setCurve(LUX_LEVELS, nits); + }); + } + + + @Test + public void testParceledConfigIsEquivalent() { + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + builder.setCurve(LUX_LEVELS, NITS_LEVELS); + BrightnessConfiguration config = builder.build(); + Parcel p = Parcel.obtain(); + p.writeParcelable(config, 0 /*flags*/); + p.setDataPosition(0); + BrightnessConfiguration newConfig = + p.readParcelable(BrightnessConfiguration.class.getClassLoader()); + assertEquals(config, newConfig); + } + + @Test + public void testEquals() { + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + builder.setCurve(LUX_LEVELS, NITS_LEVELS); + BrightnessConfiguration baseConfig = builder.build(); + + builder = new BrightnessConfiguration.Builder(); + builder.setCurve(LUX_LEVELS, NITS_LEVELS); + BrightnessConfiguration identicalConfig = builder.build(); + assertEquals(baseConfig, identicalConfig); + assertEquals("hashCodes must be equal for identical configs", + baseConfig.hashCode(), identicalConfig.hashCode()); + + float[] lux = Arrays.copyOf(LUX_LEVELS, LUX_LEVELS.length); + lux[lux.length - 1] = lux[lux.length - 1] * 2; + builder = new BrightnessConfiguration.Builder(); + builder.setCurve(lux, NITS_LEVELS); + BrightnessConfiguration luxDifferConfig = builder.build(); + assertNotEquals(baseConfig, luxDifferConfig); + + float[] nits = Arrays.copyOf(NITS_LEVELS, NITS_LEVELS.length); + nits[nits.length - 1] = nits[nits.length - 1] * 2; + builder = new BrightnessConfiguration.Builder(); + builder.setCurve(LUX_LEVELS, nits); + BrightnessConfiguration nitsDifferConfig = builder.build(); + assertNotEquals(baseConfig, nitsDifferConfig); + } + + private static void assertArrayEquals(float[] expected, float[] actual, String name) { + assertEquals("Expected " + name + " arrays to be the same length!", + expected.length, actual.length); + for (int i = 0; i < expected.length; i++) { + assertEquals("Expected " + name + " arrays to be equivalent when value " + i + + "differs", expected[i], actual[i], 0.01 /*tolerance*/); + } + } + + private interface ExceptionRunnable { + void run() throws Exception; + } + + private static void assertThrows(Class<? extends Throwable> exceptionClass, + ExceptionRunnable r) { + try { + r.run(); + } catch (Throwable e) { + assertTrue("Expected exception type " + exceptionClass.getName() + " but got " + + e.getClass().getName(), exceptionClass.isAssignableFrom(e.getClass())); + return; + } + fail("Expected exception type " + exceptionClass.getName() + + ", but no exception was thrown"); + } +} diff --git a/core/tests/coretests/src/android/text/LineBreakingOverhangsTest.java b/core/tests/coretests/src/android/text/LineBreakingOverhangsTest.java deleted file mode 100644 index 4f18b0b4c7a4..000000000000 --- a/core/tests/coretests/src/android/text/LineBreakingOverhangsTest.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.text; - -import static org.junit.Assert.assertEquals; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.graphics.Typeface; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -@SmallTest -@RunWith(AndroidJUnit4.class) -public class LineBreakingOverhangsTest { - private static final int EM = 100; // Make 1em == 100px. - private static final TextPaint sTextPaint = new TextPaint(); - - static { - // The test font has following coverage and overhangs. - // All the characters have a width of 1em. - // space: no overhangs - // R: 4em overhang on the right - // a: no overhang - // y: 1.5em overhang on the left - sTextPaint.setTypeface(Typeface.createFromAsset( - InstrumentationRegistry.getTargetContext().getAssets(), - "fonts/LineBreakingOverhangsTestFont.ttf")); - sTextPaint.setTextSize(EM); - } - - private static void layout(@NonNull CharSequence source, @NonNull int[] breaks, double width, - @Nullable int[] leftPadding, @Nullable int[] rightPadding) { - layout(source, breaks, width, leftPadding, rightPadding, null /* indents */); - } - - private static void layout(@NonNull CharSequence source, @NonNull int[] breaks, double width, - @Nullable int[] leftPadding, @Nullable int[] rightPadding, @Nullable int[] indents) { - final StaticLayout staticLayout = StaticLayout.Builder - .obtain(source, 0, source.length(), sTextPaint, (int) width) - .setAvailablePaddings(leftPadding, rightPadding) - .setIndents(indents, indents) - .build(); - - final int lineCount = breaks.length + 1; - assertEquals("Number of lines", lineCount, staticLayout.getLineCount()); - - for (int line = 0; line < lineCount; line++) { - final int lineStart = staticLayout.getLineStart(line); - final int lineEnd = staticLayout.getLineEnd(line); - - if (line == 0) { - assertEquals("Line start for first line", 0, lineStart); - } else { - assertEquals("Line start for line " + line, breaks[line - 1], lineStart); - } - - if (line == lineCount - 1) { - assertEquals("Line end for last line", source.length(), lineEnd); - } else { - assertEquals("Line end for line " + line, breaks[line], lineEnd); - } - } - } - - private static final int[] NO_BREAK = new int[] {}; - - private static final int[] NO_PADDING = null; - // Maximum needed for left side of 'y'. - private static final int[] FULL_LEFT_PADDING = new int[] {(int) (1.5 * EM)}; - // Maximum padding needed for right side of 'R'. - private static final int[] FULL_RIGHT_PADDING = new int[] {4 * EM}; - - private static final int[] ONE_EM_PADDING = new int[] {1 * EM}; - private static final int[] HALF_EM_PADDING = new int[] {(int) (0.5 * EM)}; - private static final int[] QUARTER_EM_PADDING = new int[] {(int) (0.25 * EM)}; - - @Test - public void testRightOverhang() { - // The advance of "aaa R" is 5em, but the right-side overhang of 'R' would need 4em more, so - // we break the line if there's not enough overhang. - - // Enough right padding, so the whole line fits in 5em. - layout("aaa R", NO_BREAK, 5 * EM, NO_PADDING, FULL_RIGHT_PADDING); - - // No right padding, so we'd need 9em to fit the advance and the right padding of 'R'. - layout("aaa R", new int[] {4}, 8.9 * EM, NO_PADDING, NO_PADDING); - layout("aaa R", NO_BREAK, 9 * EM, NO_PADDING, NO_PADDING); - - // 1em of right padding means we can fit the string in 8em. - layout("aaa R", new int[] {4}, 7.9 * EM, NO_PADDING, ONE_EM_PADDING); - layout("aaa R", NO_BREAK, 8 * EM, NO_PADDING, ONE_EM_PADDING); - } - - @Test - public void testLeftOverhang() { - // The advance of "y a" is 3em, but the left-side overhang of 'y' would need 1.5em more, so - // we break the line if there's not enough overhang. - - // Enough left padding, so the whole line fits in 3em. - layout("y a", NO_BREAK, 3 * EM, FULL_LEFT_PADDING, NO_PADDING); - - // No right padding, so we'd need 4.5em to fit the advance and the left padding of 'y'. - layout("y a", new int[] {2}, 4.4 * EM, NO_PADDING, NO_PADDING); - layout("y a", NO_BREAK, 4.5 * EM, NO_PADDING, NO_PADDING); - - // 1em of left padding means we can fit the string in 3.5em. - layout("y a", new int[] {2}, 3.4 * EM, ONE_EM_PADDING, NO_PADDING); - layout("y a", NO_BREAK, 3.5 * EM, ONE_EM_PADDING, NO_PADDING); - } - - @Test - public void testBothSidesOverhang() { - // The advance of "y a R" is 5em, but the left-side overhang of 'y' would need 1.5em more, - // and the right side overhang or 'R' would need 4em more, so we break the line if there's - // not enough overhang. - - // Enough padding, so the whole line fits in 5em. - layout("y a R", NO_BREAK, 5 * EM, FULL_LEFT_PADDING, FULL_RIGHT_PADDING); - - // No padding, so we'd need 10.5em to fit the advance and the paddings. - layout("y a R", new int[] {4}, 10.4 * EM, NO_PADDING, NO_PADDING); - layout("y a R", NO_BREAK, 10.5 * EM, NO_PADDING, NO_PADDING); - - // 1em of padding on each side means we can fit the string in 8.5em. - layout("y a R", new int[] {4}, 8.4 * EM, ONE_EM_PADDING, ONE_EM_PADDING); - layout("y a R", NO_BREAK, 8.5 * EM, ONE_EM_PADDING, ONE_EM_PADDING); - } - - @Test - public void testIndentsDontAffectPaddings() { - // This is identical to the previous test, except that it applies wide indents of 4em on - // each side and thus needs an extra 8em of width. This test makes sure that indents and - // paddings are independent. - final int[] indents = new int[] {4 * EM}; - final int indentAdj = 8 * EM; - - // Enough padding, so the whole line fits in 5em. - layout("y a R", NO_BREAK, 5 * EM + indentAdj, FULL_LEFT_PADDING, FULL_RIGHT_PADDING, - indents); - - // No padding, so we'd need 10.5em to fit the advance and the paddings. - layout("y a R", new int[] {4}, 10.4 * EM + indentAdj, NO_PADDING, NO_PADDING, indents); - layout("y a R", NO_BREAK, 10.5 * EM + indentAdj, NO_PADDING, NO_PADDING, indents); - - // 1em of padding on each side means we can fit the string in 8.5em. - layout("y a R", new int[] {4}, 8.4 * EM + indentAdj, ONE_EM_PADDING, ONE_EM_PADDING, - indents); - layout("y a R", NO_BREAK, 8.5 * EM + indentAdj, ONE_EM_PADDING, ONE_EM_PADDING, indents); - } -} diff --git a/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java b/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java index 04a486eb7cda..f1a730a7a420 100644 --- a/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java +++ b/core/tests/coretests/src/android/text/SpannableStringBuilderTest.java @@ -20,13 +20,18 @@ package android.text; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; import android.text.style.BulletSpan; import android.text.style.QuoteSpan; import android.text.style.SubscriptSpan; import android.text.style.UnderlineSpan; import org.junit.Test; +import org.junit.runner.RunWith; +@SmallTest +@RunWith(AndroidJUnit4.class) public class SpannableStringBuilderTest extends SpannableTest { protected Spannable newSpannableWithText(String text) { diff --git a/core/tests/coretests/src/android/text/format/FormatterTest.java b/core/tests/coretests/src/android/text/format/FormatterTest.java index dee51dcbc7ff..2d9401686e81 100644 --- a/core/tests/coretests/src/android/text/format/FormatterTest.java +++ b/core/tests/coretests/src/android/text/format/FormatterTest.java @@ -189,7 +189,7 @@ public class FormatterTest { // Make sure it works on different locales. setLocale(new Locale("ru", "RU")); - assertEquals("1 мин", Formatter.formatShortElapsedTimeRoundingUpToMinutes( + assertEquals("1 мин.", Formatter.formatShortElapsedTimeRoundingUpToMinutes( mContext, 1 * SECOND)); } diff --git a/graphics/java/android/graphics/drawable/RippleComponent.java b/graphics/java/android/graphics/drawable/RippleComponent.java index 0e38826eb34b..626bcee9454b 100644 --- a/graphics/java/android/graphics/drawable/RippleComponent.java +++ b/graphics/java/android/graphics/drawable/RippleComponent.java @@ -93,12 +93,8 @@ abstract class RippleComponent { protected final void onHotspotBoundsChanged() { if (!mHasMaxRadius) { - final float halfWidth = mBounds.width() / 2.0f; - final float halfHeight = mBounds.height() / 2.0f; - final float targetRadius = (float) Math.sqrt(halfWidth * halfWidth - + halfHeight * halfHeight); - - onTargetRadiusChanged(targetRadius); + mTargetRadius = getTargetRadius(mBounds); + onTargetRadiusChanged(mTargetRadius); } } diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index 8b185f2b8903..734cff542c51 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -299,6 +299,12 @@ public class RippleDrawable extends LayerDrawable { onHotspotBoundsChanged(); } + final int count = mExitingRipplesCount; + final RippleForeground[] ripples = mExitingRipples; + for (int i = 0; i < count; i++) { + ripples[i].onBoundsChange(); + } + if (mBackground != null) { mBackground.onBoundsChange(); } @@ -560,8 +566,7 @@ public class RippleDrawable extends LayerDrawable { y = mHotspotBounds.exactCenterY(); } - final boolean isBounded = isBounded(); - mRipple = new RippleForeground(this, mHotspotBounds, x, y, isBounded, mForceSoftware); + mRipple = new RippleForeground(this, mHotspotBounds, x, y, mForceSoftware); } mRipple.setup(mState.mMaxRadius, mDensity); diff --git a/graphics/java/android/graphics/drawable/RippleForeground.java b/graphics/java/android/graphics/drawable/RippleForeground.java index 0b5020cbe55c..ecbf5780d67f 100644 --- a/graphics/java/android/graphics/drawable/RippleForeground.java +++ b/graphics/java/android/graphics/drawable/RippleForeground.java @@ -30,6 +30,7 @@ import android.view.DisplayListCanvas; import android.view.RenderNodeAnimator; import android.view.animation.AnimationUtils; import android.view.animation.LinearInterpolator; +import android.view.animation.PathInterpolator; import java.util.ArrayList; @@ -38,18 +39,14 @@ import java.util.ArrayList; */ class RippleForeground extends RippleComponent { private static final TimeInterpolator LINEAR_INTERPOLATOR = new LinearInterpolator(); - private static final TimeInterpolator DECELERATE_INTERPOLATOR = new LogDecelerateInterpolator( - 400f, 1.4f, 0); + // Matches R.interpolator.fast_out_slow_in but as we have no context we can't just import that + private static final TimeInterpolator DECELERATE_INTERPOLATOR = + new PathInterpolator(0.4f, 0f, 0.2f, 1f); - // Pixel-based accelerations and velocities. - private static final float WAVE_TOUCH_DOWN_ACCELERATION = 2048; - private static final float WAVE_OPACITY_DECAY_VELOCITY = 3; - - // Bounded ripple animation properties. - private static final int BOUNDED_ORIGIN_EXIT_DURATION = 300; - private static final int BOUNDED_RADIUS_EXIT_DURATION = 800; - private static final int BOUNDED_OPACITY_EXIT_DURATION = 400; - private static final float MAX_BOUNDED_RADIUS = 350; + // Time it takes for the ripple to expand + private static final int RIPPLE_ENTER_DURATION = 225; + // Time it takes for the ripple to slide from the touch to the center point + private static final int RIPPLE_ORIGIN_DURATION = 225; private static final int OPACITY_ENTER_DURATION = 75; private static final int OPACITY_EXIT_DURATION = 150; @@ -71,9 +68,6 @@ class RippleForeground extends RippleComponent { private float mTargetX = 0; private float mTargetY = 0; - /** Ripple target radius used when bounded. Not used for clamping. */ - private float mBoundedRadius = 0; - // Software rendering properties. private float mOpacity = 0; @@ -107,19 +101,13 @@ class RippleForeground extends RippleComponent { private float mStartRadius = 0; public RippleForeground(RippleDrawable owner, Rect bounds, float startingX, float startingY, - boolean isBounded, boolean forceSoftware) { + boolean forceSoftware) { super(owner, bounds); mForceSoftware = forceSoftware; mStartingX = startingX; mStartingY = startingY; - if (isBounded) { - mBoundedRadius = MAX_BOUNDED_RADIUS * 0.9f - + (float) (MAX_BOUNDED_RADIUS * Math.random() * 0.1); - } else { - mBoundedRadius = 0; - } // Take 60% of the maximum of the width and height, then divided half to get the radius. mStartRadius = Math.max(bounds.width(), bounds.height()) * 0.3f; } @@ -127,6 +115,7 @@ class RippleForeground extends RippleComponent { @Override protected void onTargetRadiusChanged(float targetRadius) { clampStartingPosition(); + switchToUiThreadAnimation(); } private void drawSoftware(Canvas c, Paint p) { @@ -228,16 +217,14 @@ class RippleForeground extends RippleComponent { } mRunningSwAnimators.clear(); - final int duration = getRadiusDuration(); - final ObjectAnimator tweenRadius = ObjectAnimator.ofFloat(this, TWEEN_RADIUS, 1); - tweenRadius.setDuration(duration); + tweenRadius.setDuration(RIPPLE_ENTER_DURATION); tweenRadius.setInterpolator(DECELERATE_INTERPOLATOR); tweenRadius.start(); mRunningSwAnimators.add(tweenRadius); final ObjectAnimator tweenOrigin = ObjectAnimator.ofFloat(this, TWEEN_ORIGIN, 1); - tweenOrigin.setDuration(duration); + tweenOrigin.setDuration(RIPPLE_ORIGIN_DURATION); tweenOrigin.setInterpolator(DECELERATE_INTERPOLATOR); tweenOrigin.start(); mRunningSwAnimators.add(tweenOrigin); @@ -267,20 +254,18 @@ class RippleForeground extends RippleComponent { final Paint paint = mOwner.getRipplePaint(); mPropPaint = CanvasProperty.createPaint(paint); - final int radiusDuration = getRadiusDuration(); - final RenderNodeAnimator radius = new RenderNodeAnimator(mPropRadius, mTargetRadius); - radius.setDuration(radiusDuration); + radius.setDuration(RIPPLE_ORIGIN_DURATION); radius.setInterpolator(DECELERATE_INTERPOLATOR); mPendingHwAnimators.add(radius); final RenderNodeAnimator x = new RenderNodeAnimator(mPropX, mTargetX); - x.setDuration(radiusDuration); + x.setDuration(RIPPLE_ORIGIN_DURATION); x.setInterpolator(DECELERATE_INTERPOLATOR); mPendingHwAnimators.add(x); final RenderNodeAnimator y = new RenderNodeAnimator(mPropY, mTargetY); - y.setDuration(radiusDuration); + y.setDuration(RIPPLE_ORIGIN_DURATION); y.setInterpolator(DECELERATE_INTERPOLATOR); mPendingHwAnimators.add(y); @@ -333,12 +318,6 @@ class RippleForeground extends RippleComponent { return MathUtils.lerp(mClampedStartingY - mBounds.exactCenterY(), mTargetY, mTweenY); } - private int getRadiusDuration() { - final float remainingRadius = mTargetRadius - getCurrentRadius(); - return (int) (1000 * Math.sqrt(remainingRadius / WAVE_TOUCH_DOWN_ACCELERATION * - mDensityScale) + 0.5); - } - private float getCurrentRadius() { return MathUtils.lerp(mStartRadius, mTargetRadius, mTweenRadius); } @@ -402,6 +381,14 @@ class RippleForeground extends RippleComponent { } } + private void clearHwProps() { + mPropPaint = null; + mPropRadius = null; + mPropX = null; + mPropY = null; + mUsingProperties = false; + } + private final AnimatorListenerAdapter mAnimationListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animator) { @@ -410,39 +397,20 @@ class RippleForeground extends RippleComponent { pruneSwFinished(); if (mRunningHwAnimators.isEmpty()) { - mPropPaint = null; - mPropRadius = null; - mPropX = null; - mPropY = null; + clearHwProps(); } } }; - /** - * Interpolator with a smooth log deceleration. - */ - private static final class LogDecelerateInterpolator implements TimeInterpolator { - private final float mBase; - private final float mDrift; - private final float mTimeScale; - private final float mOutputScale; - - public LogDecelerateInterpolator(float base, float timeScale, float drift) { - mBase = base; - mDrift = drift; - mTimeScale = 1f / timeScale; - - mOutputScale = 1f / computeLog(1f); - } - - private float computeLog(float t) { - return 1f - (float) Math.pow(mBase, -t * mTimeScale) + (mDrift * t); - } - - @Override - public float getInterpolation(float t) { - return computeLog(t) * mOutputScale; + private void switchToUiThreadAnimation() { + for (int i = 0; i < mRunningHwAnimators.size(); i++) { + Animator animator = mRunningHwAnimators.get(i); + animator.removeListener(mAnimationListener); + animator.end(); } + mRunningHwAnimators.clear(); + clearHwProps(); + invalidateSelf(); } /** diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp index 848c6a81d2b7..5b87e1013baf 100644 --- a/libs/hwui/renderthread/EglManager.cpp +++ b/libs/hwui/renderthread/EglManager.cpp @@ -239,9 +239,9 @@ void EglManager::loadConfigs() { if (!eglChooseConfig(mEglDisplay, attribs16F, &mEglConfigWideGamut, numConfigs, &numConfigs) || numConfigs != 1) { - LOG_ALWAYS_FATAL( - "Device claims wide gamut support, cannot find matching config, error = %s", + ALOGE("Device claims wide gamut support, cannot find matching config, error = %s", eglErrorString()); + EglExtensions.pixelFormatFloat = false; } } } diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml index eac6d36164da..5da31bde591a 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -56,8 +56,8 @@ <string name="print_select_printer" msgid="7388760939873368698">"Selecionar impressora"</string> <string name="print_forget_printer" msgid="5035287497291910766">"Esquecer impressora"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> - <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g> impressora encontrada</item> <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> impressoras encontradas</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g> impressora encontrada</item> </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> <string name="printer_info_desc" msgid="7181988788991581654">"Mais informações acerca desta impressora"</string> @@ -76,8 +76,8 @@ <string name="disabled_services_title" msgid="7313253167968363211">"Serviços desativados"</string> <string name="all_services_title" msgid="5578662754874906455">"Todos os serviços"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> - <item quantity="one">Instale para detetar <xliff:g id="COUNT_0">%1$s</xliff:g> impressora</item> <item quantity="other">Instale para detetar <xliff:g id="COUNT_1">%1$s</xliff:g> impressoras</item> + <item quantity="one">Instale para detetar <xliff:g id="COUNT_0">%1$s</xliff:g> impressora</item> </plurals> <string name="printing_notification_title_template" msgid="295903957762447362">"A imprimir <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"A cancelar <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 75a0a4238747..a5c2e41164a3 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -33,15 +33,13 @@ <string name="wifi_check_password_try_again" msgid="516958988102584767">"পাসওয়ার্ড দেখে আবার চেষ্টা করুন"</string> <string name="wifi_not_in_range" msgid="1136191511238508967">"পরিসরের মধ্যে নয়"</string> <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"স্বয়ংক্রিয়ভাবে সংযোগ করবে না"</string> - <!-- no translation found for wifi_no_internet (4663834955626848401) --> - <skip /> + <string name="wifi_no_internet" msgid="4663834955626848401">"ইন্টারনেট অ্যাক্সেস নেই"</string> <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> দ্বারা সেভ করা"</string> <string name="connected_via_network_scorer" msgid="5713793306870815341">"স্বয়ংক্রিয়ভাবে %1$s এর মাধ্যমে সংযুক্ত হয়েছে"</string> <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"নেটওয়ার্কের রেটিং প্রদানকারীর মাধ্যমে স্বয়ংক্রিয়ভাবে সংযুক্ত"</string> <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s মাধ্যমে সংযুক্ত হয়েছে"</string> <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s এর মাধ্যমে উপলব্ধ"</string> - <!-- no translation found for wifi_connected_no_internet (8202906332837777829) --> - <skip /> + <string name="wifi_connected_no_internet" msgid="8202906332837777829">"সংযুক্ত, ইন্টারনেট নেই"</string> <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"এই মুহূর্তে অ্যাক্সেস পয়েন্টের কোনও কানেকশন ফাঁকা নেই"</string> <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s এর মাধ্যমে সংযুক্ত হয়েছে"</string> <string name="available_via_carrier" msgid="1469036129740799053">"%1$s এর মাধ্যমে পাওয়া যাচ্ছে"</string> @@ -86,8 +84,7 @@ <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"ইনপুট ডিভাইসে সংযুক্ত"</string> <string name="bluetooth_pan_user_profile_summary_connected" msgid="6436258151814414028">"ইন্টারনেটের জন্য সংযুক্ত"</string> <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1322694224800769308">"স্থানীয় ইন্টারনেটে চলছে"</string> - <!-- no translation found for bluetooth_pan_profile_summary_use_for (5736111170225304239) --> - <skip /> + <string name="bluetooth_pan_profile_summary_use_for" msgid="5736111170225304239">"ইন্টারনেটের জন্য ব্যবহার করুন"</string> <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"মানচিত্রের জন্য ব্যবহার করুন"</string> <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"সিম -এর অ্যাক্সেসের জন্য ব্যবহার করুন"</string> <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"মিডিয়া অডিওয়ের জন্য ব্যবহার করুন"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index c52c7ca0f7ac..d12ac8a5cb69 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -128,8 +128,8 @@ <string name="running_process_item_user_label" msgid="3129887865552025943">"Nutzer: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="313159469856372621">"Einige Standardeinstellungen festgelegt"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"Keine Standardeinstellungen festgelegt"</string> - <string name="tts_settings" msgid="8186971894801348327">"Text-in-Sprache"</string> - <string name="tts_settings_title" msgid="1237820681016639683">"Text-in-Sprache-Ausgabe"</string> + <string name="tts_settings" msgid="8186971894801348327">"Sprachausgabe"</string> + <string name="tts_settings_title" msgid="1237820681016639683">"Sprachausgabe-Ausgabe"</string> <string name="tts_default_rate_title" msgid="6030550998379310088">"Sprechgeschwindigkeit"</string> <string name="tts_default_rate_summary" msgid="4061815292287182801">"Geschwindigkeit, mit der der Text gesprochen wird"</string> <string name="tts_default_pitch_title" msgid="6135942113172488671">"Tonlage"</string> @@ -143,7 +143,7 @@ <string name="tts_install_data_title" msgid="4264378440508149986">"Sprachdaten installieren"</string> <string name="tts_install_data_summary" msgid="5742135732511822589">"Sprachdaten für Sprachsynthese installieren"</string> <string name="tts_engine_security_warning" msgid="8786238102020223650">"Dieses Sprachsynthesemodul kann den gesamten gesprochenen Text erfassen, einschließlich personenbezogener Daten wie Passwörter und Kreditkartennummern. Es ist Teil der App \"<xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g>\". Möchtest du dieses Sprachsynthesemodul aktivieren?"</string> - <string name="tts_engine_network_required" msgid="1190837151485314743">"Für diese Sprache ist zur Text-in-Sprache-Ausgabe eine aktive Netzwerkverbindung erforderlich."</string> + <string name="tts_engine_network_required" msgid="1190837151485314743">"Für diese Sprache ist zur Sprachausgabe-Ausgabe eine aktive Netzwerkverbindung erforderlich."</string> <string name="tts_default_sample_string" msgid="4040835213373086322">"Dies ist ein Beispiel für Sprachsynthese."</string> <string name="tts_status_title" msgid="7268566550242584413">"Status der Standardsprache"</string> <string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> wird vollständig unterstützt."</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 826bab34d670..fcca9573d7b1 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -40,7 +40,7 @@ <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s के द्वारा उपलब्ध"</string> <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s के द्वारा उपलब्ध"</string> <string name="wifi_connected_no_internet" msgid="8202906332837777829">"कनेक्ट हो गया है, लेकिन इंटरनेट नहीं है"</string> - <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"एक्सेस पॉइंट फ़िलहाल भरा हुआ है"</string> + <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"एक्सेस प्वाइंट फ़िलहाल भरा हुआ है"</string> <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s के ज़रिए कनेक्ट"</string> <string name="available_via_carrier" msgid="1469036129740799053">"%1$s के ज़रिए उपलब्ध"</string> <string name="speed_label_very_slow" msgid="1867055264243608530">"अत्यधिक धीमी"</string> @@ -176,7 +176,7 @@ <string name="development_settings_not_available" msgid="4308569041701535607">"यह उपयोगकर्ता, डेवलपर के लिए सेटिंग और टूल का इस्तेमाल नहीं कर सकता"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं"</string> <string name="tethering_settings_not_available" msgid="6765770438438291012">"टेदरिंग सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं"</string> - <string name="apn_settings_not_available" msgid="7873729032165324000">"एक्सेस पॉइंट नाम सेटिंग इस उपयोगकर्ता के लिए मौजूद नहीं हैं"</string> + <string name="apn_settings_not_available" msgid="7873729032165324000">"एक्सेस प्वाइंट नाम सेटिंग इस उपयोगकर्ता के लिए मौजूद नहीं हैं"</string> <string name="enable_adb" msgid="7982306934419797485">"USB डीबग करना"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"डीबग मोड जब USB कनेक्ट किया गया हो"</string> <string name="clear_adb_keys" msgid="4038889221503122743">"USB डीबग करने की मंज़ूरी रद्द करें"</string> @@ -201,7 +201,7 @@ <string name="mobile_data_always_on" msgid="8774857027458200434">"मोबाइल डेटा हमेशा सक्रिय"</string> <string name="tethering_hardware_offload" msgid="7470077827090325814">"हार्डवेयर से तेज़ी लाने के लिए टेदर करें"</string> <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"बिना नाम वाले ब्लूटूथ डिवाइस दिखाएं"</string> - <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"पूर्ण वॉल्यूम अक्षम करें"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ब्लूटूथ से आवाज़ के नियंत्रण की सुविधा रोकें"</string> <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"इन-बैंड रिंग करना चालू करें"</string> <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ब्लूटूथ AVRCP वर्शन"</string> <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ब्लूटूथ AVRCP वर्शन चुनें"</string> @@ -247,7 +247,7 @@ <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB पर ऐप की पुष्टि करें"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"नुकसानदेह व्यवहार के लिए ADB/ADT के द्वारा इंस्टॉल किए गए ऐप्स जाँचें."</string> <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"बिना नाम वाले ब्लूटूथ डिवाइस (केवल MAC पते वाले) दिखाए जाएंगे"</string> - <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"दूरस्थ डिवाइस के साथ वॉल्यूम की समस्याओं जैसे अस्वीकार्य तेज़ वॉल्यूम या नियंत्रण की कमी की स्थिति में ब्लूटूथ पूर्ण वॉल्यूम सुविधा को अक्षम करता है."</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"दूर के डिवाइस पर आवाज़ बहुत बढ़ जाने या उससे नियंत्रण हटने जैसी समस्याएं होने पर, यह ब्लूटूथ के ज़रिए आवाज़ के नियंत्रण की सुविधा रोक देता है."</string> <string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"फ़ोन की रिंगटोन को ब्लूटूथ हेडसेट पर बजने दें"</string> <string name="enable_terminal_title" msgid="95572094356054120">"स्थानीय टर्मिनल"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"लोकल शेल तक पहुंचने की सुविधा देने वाले टर्मिनल ऐप को चालू करें"</string> @@ -317,8 +317,8 @@ <string name="enable_freeform_support" msgid="1461893351278940416">"फ़्रीफ़ॉर्म विंडो (एक साथ कई विंडो दिखाना) चालू करें"</string> <string name="enable_freeform_support_summary" msgid="8247310463288834487">"जाँच के लिए बनी फ़्रीफ़ॉर्म विंडो के लिए सहायता चालू करें."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"डेस्कटॉप बैकअप पासवर्ड"</string> - <string name="local_backup_password_summary_none" msgid="6951095485537767956">"डेस्कटॉप पूर्ण बैकअप वर्तमान में सुरक्षित नहीं हैं"</string> - <string name="local_backup_password_summary_change" msgid="5376206246809190364">"डेस्कटॉप के पूर्ण बैकअप का पासवर्ड बदलने या निकालने के लिए टैप करें"</string> + <string name="local_backup_password_summary_none" msgid="6951095485537767956">"डेस्कटॉप के पूरे बैक अप फ़िलहाल सुरक्षित नहीं हैं"</string> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"डेस्कटॉप के पूरे बैक अप का पासवर्ड बदलने या हटाने के लिए टैप करें"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"नया बैकअप पासवर्ड सेट किया गया"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"नया पासवर्ड तथा पुष्टि मेल नही खाते"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"सुरक्षित पासवर्ड सेट करने में विफल रहा"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index 2873fb68ce5b..9caff100cb9d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -135,7 +135,8 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> if (newProfileState == BluetoothProfile.STATE_CONNECTED) { if (profile instanceof MapProfile) { profile.setPreferred(mDevice, true); - } else if (!mProfiles.contains(profile)) { + } + if (!mProfiles.contains(profile)) { mRemovedProfiles.remove(profile); mProfiles.add(profile); if (profile instanceof PanProfile && diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java index 9cda669379dd..991d9221c796 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java @@ -25,6 +25,7 @@ import android.bluetooth.BluetoothHidHost; import android.bluetooth.BluetoothMap; import android.bluetooth.BluetoothMapClient; import android.bluetooth.BluetoothPan; +import android.bluetooth.BluetoothPbap; import android.bluetooth.BluetoothPbapClient; import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothUuid; @@ -140,9 +141,11 @@ public class LocalBluetoothProfileManager { BluetoothMap.ACTION_CONNECTION_STATE_CHANGED); } - //Create PBAP server profile, but do not add it to list of profiles - // as we do not need to monitor the profile as part of profile list + //Create PBAP server profile + if(DEBUG) Log.d(TAG, "Adding local PBAP profile"); mPbapProfile = new PbapServerProfile(context); + addProfile(mPbapProfile, PbapServerProfile.NAME, + BluetoothPbap.ACTION_CONNECTION_STATE_CHANGED); if (DEBUG) Log.d(TAG, "LocalBluetoothProfileManager construction complete"); } @@ -495,6 +498,13 @@ public class LocalBluetoothProfileManager { mMapProfile.setPreferred(device, true); } + if ((mPbapProfile != null) && + (mPbapProfile.getConnectionStatus(device) == BluetoothProfile.STATE_CONNECTED)) { + profiles.add(mPbapProfile); + removedProfiles.remove(mPbapProfile); + mPbapProfile.setPreferred(device, true); + } + if (mMapClientProfile != null) { profiles.add(mMapClientProfile); removedProfiles.remove(mMapClientProfile); @@ -503,8 +513,6 @@ public class LocalBluetoothProfileManager { if (mUsePbapPce) { profiles.add(mPbapClientProfile); removedProfiles.remove(mPbapClientProfile); - profiles.remove(mPbapProfile); - removedProfiles.add(mPbapProfile); } if (DEBUG) { diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml index c745fe8a0cd2..bf0d6799bfd1 100644 --- a/packages/SystemUI/res-keyguard/values-af/strings.xml +++ b/packages/SystemUI/res-keyguard/values-af/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Toestel is <xliff:g id="NUMBER_0">%d</xliff:g> uur lank nie ontsluit nie. Bevestig wagwoord.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nie herken nie"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Voer SIM-PIN in; jy het <xliff:g id="NUMBER_1">%d</xliff:g> pogings oor.</item> + <item quantity="one">Verkeerde SIM-PIN. Jy het <xliff:g id="NUMBER_0">%d</xliff:g> poging oor voordat jy jou diensverskaffer moet kontak om jou toestel te ontsluit.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het <xliff:g id="_NUMBER_1">%d</xliff:g> pogings oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede.</item> + <item quantity="one">SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het <xliff:g id="_NUMBER_0">%d</xliff:g> poging oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml index f4e3001b1a0d..340e5141c05d 100644 --- a/packages/SystemUI/res-keyguard/values-am/strings.xml +++ b/packages/SystemUI/res-keyguard/values-am/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">መሣሪያው ለ<xliff:g id="NUMBER_1">%d</xliff:g> ሰዓቶች አልተከፈተም ነበር። የይለፍ ቃል ያረጋግጡ።</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"አልታወቀም"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">የሲም ፒን ያስገቡ፣ <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item> + <item quantity="other">የሲም ፒን ያስገቡ፣ <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት <xliff:g id="_NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ።</item> + <item quantity="other">ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት <xliff:g id="_NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ።</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml index 839fb873113e..7027d6f2e86c 100644 --- a/packages/SystemUI/res-keyguard/values-ar/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml @@ -159,4 +159,20 @@ <item quantity="one">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_0">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"لم يتم التعرف عليها"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="zero">أدخل رقم التعريف الشخصي لشريحة SIM، وتتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولات.</item> + <item quantity="two">أدخل رقم التعريف الشخصي لشريحة SIM، وتتبقى لديك محاولتان (<xliff:g id="NUMBER_1">%d</xliff:g>).</item> + <item quantity="few">أدخل رقم التعريف الشخصي لشريحة SIM، وتتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولات.</item> + <item quantity="many">أدخل رقم التعريف الشخصي لشريحة SIM، وتتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولة.</item> + <item quantity="other">أدخل رقم التعريف الشخصي لشريحة SIM، وتتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولة.</item> + <item quantity="one">أدخل رقم التعريف الشخصي لشريحة SIM، وتتبقى لديك محاولة واحدة (<xliff:g id="NUMBER_0">%d</xliff:g>) يجب أن تتصل بعدها بمشغّل شبكة الجوّال لإلغاء قفل الجهاز.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="zero">تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك <xliff:g id="_NUMBER_1">%d</xliff:g> محاولة قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item> + <item quantity="two">تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك محاولتان (<xliff:g id="_NUMBER_1">%d</xliff:g>) قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item> + <item quantity="few">تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك <xliff:g id="_NUMBER_1">%d</xliff:g> محاولات قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item> + <item quantity="many">تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك <xliff:g id="_NUMBER_1">%d</xliff:g> محاولة قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item> + <item quantity="other">تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك <xliff:g id="_NUMBER_1">%d</xliff:g> محاولة قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item> + <item quantity="one">تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك محاولة واحدة (<xliff:g id="_NUMBER_0">%d</xliff:g>) قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml index a868b7cbb033..b0503eade599 100644 --- a/packages/SystemUI/res-keyguard/values-az/strings.xml +++ b/packages/SystemUI/res-keyguard/values-az/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Cihaz <xliff:g id="NUMBER_0">%d</xliff:g> saat kiliddən çıxarılmayıb. Parolu təsdiq edin.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tanınmır"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">SIM PIN-ni daxil edin, <xliff:g id="NUMBER_1">%d</xliff:g> cəhdiniz qalır.</item> + <item quantity="one">Yanlış SIM PIN kodu, cihazınızı kiliddən çıxarmaq üçün operatorunuzla əlaqə saxlamadan öncə <xliff:g id="NUMBER_0">%d</xliff:g> cəhdiniz qalır.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə <xliff:g id="_NUMBER_1">%d</xliff:g> cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın.</item> + <item quantity="one">SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə <xliff:g id="_NUMBER_0">%d</xliff:g> cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml index e24001ce56fa..079ba925b8c2 100644 --- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml @@ -141,4 +141,14 @@ <item quantity="other">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite lozinku.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nije prepoznat"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item> + <item quantity="few">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item> + <item quantity="other">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaj pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera.</item> + <item quantity="few">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera.</item> + <item quantity="other">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml index 359271d5abdc..a3a38154968b 100644 --- a/packages/SystemUI/res-keyguard/values-be/strings.xml +++ b/packages/SystemUI/res-keyguard/values-be/strings.xml @@ -147,4 +147,16 @@ <item quantity="other">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзіны. Увядзіце пароль.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Не распазнаны"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Увядзіце PIN-код SIM-карты. У вас ёсць яшчэ <xliff:g id="NUMBER_1">%d</xliff:g> спроба.</item> + <item quantity="few">Увядзіце PIN-код SIM-карты. У вас ёсць яшчэ <xliff:g id="NUMBER_1">%d</xliff:g> спробы.</item> + <item quantity="many">Увядзіце PIN-код SIM-карты. У вас ёсць яшчэ <xliff:g id="NUMBER_1">%d</xliff:g> спроб.</item> + <item quantity="other">Увядзіце PIN-код SIM-карты. У вас ёсць яшчэ <xliff:g id="NUMBER_1">%d</xliff:g> спробы.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спроба, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item> + <item quantity="few">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спробы, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item> + <item quantity="many">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спроб, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item> + <item quantity="other">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спробы, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index c098396bf8fd..87c7519fa91b 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Устройството не е отключвано от <xliff:g id="NUMBER_0">%d</xliff:g> час. Потвърдете паролата.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Не е разпознато"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Въведете ПИН кода за SIM картата – остават ви <xliff:g id="NUMBER_1">%d</xliff:g> опита.</item> + <item quantity="one">Въведете ПИН кода за SIM картата – остава ви <xliff:g id="NUMBER_0">%d</xliff:g> опит, преди да трябва да се свържете с оператора си, за да отключите устройството.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остават ви <xliff:g id="_NUMBER_1">%d</xliff:g> опита, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности.</item> + <item quantity="one">SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остава ви <xliff:g id="_NUMBER_0">%d</xliff:g> опит, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml index 22e67b8dc363..5df39895f501 100644 --- a/packages/SystemUI/res-keyguard/values-bn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml @@ -135,4 +135,6 @@ <item quantity="other">ডিভাইসটি <xliff:g id="NUMBER_1">%d</xliff:g> ঘন্টা ধরে আনলক করা হয় নি। পাসওয়ার্ড নিশ্চিত করুন।</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"স্বীকৃত নয়"</string> + <!-- no translation found for kg_password_default_pin_message (6203676909479972943) --> + <!-- no translation found for kg_password_default_puk_message (8744416410184198352) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index 527122873f23..b74a6184d1a2 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -141,4 +141,14 @@ <item quantity="other">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite lozinku.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nije prepoznat"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Unesite PIN kôd za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item> + <item quantity="few">Unesite PIN kôd za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item> + <item quantity="other">Unesite PIN kôd za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaj prije nego što SIM kartica postane trajno neupotrebljiva. Obratite se operateru za više informacija.</item> + <item quantity="few">SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Obratite se operateru za više informacija.</item> + <item quantity="other">SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Obratite se operateru za više informacija.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index 9aa8229d4a7b..dd2844abb6ec 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Fa <xliff:g id="NUMBER_0">%d</xliff:g> hora que no es desbloqueja el dispositiu. Confirma la contrasenya.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"No s\'ha reconegut"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Introdueix el PIN de la SIM. Et queden <xliff:g id="NUMBER_1">%d</xliff:g> intents.</item> + <item quantity="one">Introdueix el PIN de la SIM. Et queda <xliff:g id="NUMBER_0">%d</xliff:g> intent; si no l\'encertes, contacta amb l\'operador de telefonia mòbil per desbloquejar el dispositiu.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queden <xliff:g id="_NUMBER_1">%d</xliff:g> intents; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació.</item> + <item quantity="one">La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queda <xliff:g id="_NUMBER_0">%d</xliff:g> intent; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml index f5864cd5e0f3..cf7abf121301 100644 --- a/packages/SystemUI/res-keyguard/values-cs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml @@ -147,4 +147,16 @@ <item quantity="one">Zařízení již <xliff:g id="NUMBER_0">%d</xliff:g> hodinu nebylo odemknuto. Zadejte heslo.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nerozpoznáno"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="few">Zadejte PIN SIM karty. Zbývají <xliff:g id="NUMBER_1">%d</xliff:g> pokusy.</item> + <item quantity="many">Zadejte PIN SIM karty. Zbývá <xliff:g id="NUMBER_1">%d</xliff:g> pokusu.</item> + <item quantity="other">Zadejte PIN SIM karty. Zbývá <xliff:g id="NUMBER_1">%d</xliff:g> pokusů.</item> + <item quantity="one">Zadejte PIN SIM karty. Zbývá <xliff:g id="NUMBER_0">%d</xliff:g> pokus, poté bude muset zařízení odemknout operátor.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="few">SIM karta je nyní zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_1">%d</xliff:g> pokusy, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item> + <item quantity="many">SIM karta je nyní zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_1">%d</xliff:g> pokusu, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item> + <item quantity="other">SIM karta je nyní zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_1">%d</xliff:g> pokusů, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item> + <item quantity="one">SIM karta je nyní zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_0">%d</xliff:g> pokus, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml index cb9989fc2676..156da2e3cc2d 100644 --- a/packages/SystemUI/res-keyguard/values-da/strings.xml +++ b/packages/SystemUI/res-keyguard/values-da/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">Enheden blev sidst låst op for <xliff:g id="NUMBER_1">%d</xliff:g> timer siden. Bekræft adgangskoden.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ikke genkendt"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Indtast pinkoden til SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage.</item> + <item quantity="other">Indtast pinkoden til SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM-kortet er nu deaktiveret. Indtast PUK-koden for at fortsætte. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.</item> + <item quantity="other">SIM-kortet er nu deaktiveret. Indtast PUK-koden for at fortsætte. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml index 372ca1626d57..852a9c1d246c 100644 --- a/packages/SystemUI/res-keyguard/values-de/strings.xml +++ b/packages/SystemUI/res-keyguard/values-de/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Das Gerät wurde seit <xliff:g id="NUMBER_0">%d</xliff:g> Stunde nicht mehr entsperrt. Bitte bestätige das Passwort.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nicht erkannt"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Gib die PIN für die SIM-Karte ein. Du hast noch <xliff:g id="NUMBER_1">%d</xliff:g> Versuche.</item> + <item quantity="one">Gib die PIN für die SIM-Karte ein. Du hast noch <xliff:g id="NUMBER_0">%d</xliff:g> Versuch, bevor das Gerät vom Mobilfunkanbieter entsperrt werden muss.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch <xliff:g id="_NUMBER_1">%d</xliff:g> Versuche, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter.</item> + <item quantity="one">Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch <xliff:g id="_NUMBER_0">%d</xliff:g> Versuch, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml index 48faeba8c40c..0127ef163af9 100644 --- a/packages/SystemUI/res-keyguard/values-el/strings.xml +++ b/packages/SystemUI/res-keyguard/values-el/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Η συσκευή δεν έχει ξεκλειδωθεί εδώ και <xliff:g id="NUMBER_0">%d</xliff:g> ώρα. Επιβεβαιώστε τον κωδικό πρόσβασης.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Δεν αναγνωρίστηκε"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Καταχωρίστε τον αριθμό PIN της κάρτας SIM. Απομένουν <xliff:g id="NUMBER_1">%d</xliff:g> ακόμη προσπάθειες.</item> + <item quantity="one">Εσφαλμένος αριθμός PIN κάρτας SIM. Απομένει άλλη <xliff:g id="NUMBER_0">%d</xliff:g> προσπάθεια. Στη συνέχεια, θα πρέπει να επικοινωνήσετε με τον πάροχο κινητής τηλεφωνίας, για να ξεκλειδώσετε τη συσκευή.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένουν <xliff:g id="_NUMBER_1">%d</xliff:g> ακόμη προσπάθειες προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες.</item> + <item quantity="one">Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένει <xliff:g id="_NUMBER_0">%d</xliff:g> ακόμη προσπάθεια προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index b7c026f9caab..df0c45b54bbb 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Hace <xliff:g id="NUMBER_0">%d</xliff:g> hora que no se desbloquea el dispositivo. Confirma la contraseña.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"No se reconoció"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Ingresa el PIN de la SIM. Te quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos más.</item> + <item quantity="one">Ingresa el PIN de la SIM. Te queda <xliff:g id="NUMBER_0">%d</xliff:g> intento antes de que debas comunicarte con tu proveedor para desbloquear el dispositivo.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te quedan <xliff:g id="_NUMBER_1">%d</xliff:g> intentos más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles.</item> + <item quantity="one">Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te queda <xliff:g id="_NUMBER_0">%d</xliff:g> intento más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index ac99a84a0b83..ec36fd73966f 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">El dispositivo no se ha desbloqueado durante <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirma la contraseña.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"No reconocido"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Introduce el PIN de la tarjeta SIM. Te quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos.</item> + <item quantity="one">Introduce el PIN de la tarjeta SIM. Te queda <xliff:g id="NUMBER_0">%d</xliff:g> para tener que ponerte en contacto con tu operador para desbloquear el dispositivo.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te quedan <xliff:g id="_NUMBER_1">%d</xliff:g> intentos para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información.</item> + <item quantity="one">La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te queda <xliff:g id="_NUMBER_0">%d</xliff:g> intento para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml index b2c00bf5b7b8..bca98ef32af3 100644 --- a/packages/SystemUI/res-keyguard/values-et/strings.xml +++ b/packages/SystemUI/res-keyguard/values-et/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Seadet pole avatud <xliff:g id="NUMBER_0">%d</xliff:g> tund. Kinnitage parool.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ei tuvastatud"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Sisestage SIM-kaardi PIN-kood. Jäänud on <xliff:g id="NUMBER_1">%d</xliff:g> katset.</item> + <item quantity="one">Sisestage SIM-kaardi PIN-kood. Jäänud on <xliff:g id="NUMBER_0">%d</xliff:g> katse enne, kui peate seadme avamiseks ühendust võtma operaatoriga.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel <xliff:g id="_NUMBER_1">%d</xliff:g> katset enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt.</item> + <item quantity="one">SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel <xliff:g id="_NUMBER_0">%d</xliff:g> katse enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index c8eab84032f7..3d79ae2a4825 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Gailua ez da desblokeatu <xliff:g id="NUMBER_0">%d</xliff:g> orduz. Berretsi pasahitza.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ez da ezagutu"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Idatzi SIM txartelaren PIN kodea. <xliff:g id="NUMBER_1">%d</xliff:g> saiakera geratzen zaizkizu.</item> + <item quantity="one">Idatzi SIM txartelaren PIN kodea. <xliff:g id="NUMBER_0">%d</xliff:g> saiakera geratzen zaizu; oker idatziz gero, operadoreari eskatu beharko diozu gailua desblokeatzeko.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. <xliff:g id="_NUMBER_1">%d</xliff:g> saiakera geratzen zaizkizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan.</item> + <item quantity="one">Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. <xliff:g id="_NUMBER_0">%d</xliff:g> saiakera geratzen zaizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml index 819b0e86e8bd..ce46e6ae4b05 100644 --- a/packages/SystemUI/res-keyguard/values-fa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">قفل دستگاه <xliff:g id="NUMBER_1">%d</xliff:g> ساعت باز نشده است. گذرواژه را تأیید کنید.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"شناسایی نشد"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">پین سیمکارت را وارد کنید. <xliff:g id="NUMBER_1">%d</xliff:g> تلاش دیگری باقی مانده است.</item> + <item quantity="other">پین سیمکارت را وارد کنید. <xliff:g id="NUMBER_1">%d</xliff:g> تلاش دیگری باقی مانده است.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">سیمکارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. <xliff:g id="_NUMBER_1">%d</xliff:g> تلاش دیگر باقی مانده است و پس از آن سیمکارت برای همیشه غیرقابلاستفاده میشود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید.</item> + <item quantity="other">سیمکارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. <xliff:g id="_NUMBER_1">%d</xliff:g> تلاش دیگر باقی مانده است و پس از آن سیمکارت برای همیشه غیرقابلاستفاده میشود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml index dc2a4411b268..2b14e3c977bc 100644 --- a/packages/SystemUI/res-keyguard/values-fi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Laitteen lukitusta ei ole avattu <xliff:g id="NUMBER_0">%d</xliff:g> tuntiin. Vahvista salasana.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ei tunnistettu"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Anna SIM-kortin PIN-koodi. Sinulla on <xliff:g id="NUMBER_1">%d</xliff:g> yritystä jäljellä.</item> + <item quantity="one">Anna SIM-kortin PIN-koodi. <xliff:g id="NUMBER_0">%d</xliff:g> yrityksen jälkeen laite lukittuu, ja vain operaattori voi avata sen.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on <xliff:g id="_NUMBER_1">%d</xliff:g> yritystä jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi.</item> + <item quantity="one">SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on <xliff:g id="_NUMBER_0">%d</xliff:g> yritys jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index 8e614e04d560..b033311f37b9 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le mot de passe.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Doigt non reconnu"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Entrez le NIP de votre carte SIM. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative.</item> + <item quantity="other">Entrez le NIP de votre carte SIM. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item> + <item quantity="other">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index b3ed4c55598b..34b638e7a4c8 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le mot de passe.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Non reconnu"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Saisissez le code PIN de la carte SIM. <xliff:g id="NUMBER_1">%d</xliff:g> tentative restante.</item> + <item quantity="other">Saisissez le code PIN de la carte SIM. <xliff:g id="NUMBER_1">%d</xliff:g> tentatives restantes.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item> + <item quantity="other">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml index 7be5f41fa409..e21e8441f7f8 100644 --- a/packages/SystemUI/res-keyguard/values-gl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">O dispositivo non se desbloqueou durante <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirma o contrasinal.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Non se recoñece"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Introduce o código PIN da SIM. Quédanche <xliff:g id="NUMBER_1">%d</xliff:g> intentos.</item> + <item quantity="one">Introduce o código PIN da SIM. Quédache <xliff:g id="NUMBER_0">%d</xliff:g> intento antes de que teñas que contactar co operador para desbloquear o dispositivo.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">A SIM está desactivada. Introduce o código PUK para continuar. Quédanche <xliff:g id="_NUMBER_1">%d</xliff:g> intentos antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información.</item> + <item quantity="one">A SIM está desactivada. Introduce o código PUK para continuar. Quédache <xliff:g id="_NUMBER_0">%d</xliff:g> intento antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml index 48aa75b9f29a..a6ee9a65f424 100644 --- a/packages/SystemUI/res-keyguard/values-gu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml @@ -135,4 +135,6 @@ <item quantity="other">ઉપકરણને <xliff:g id="NUMBER_1">%d</xliff:g> કલાક માટે અનલૉક કરવામાં આવ્યું નથી. પાસવર્ડની પુષ્ટિ કરો.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"ઓળખાયેલ નથી"</string> + <!-- no translation found for kg_password_default_pin_message (6203676909479972943) --> + <!-- no translation found for kg_password_default_puk_message (8744416410184198352) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml index 40966c0bbaff..641c0727085a 100644 --- a/packages/SystemUI/res-keyguard/values-hi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">डिवाइस को <xliff:g id="NUMBER_1">%d</xliff:g> घंटों से अनलॉक नहीं किया गया है. पासवर्ड की पुष्टि करें.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"उंगली की पहचान नहीं हो सकी"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">सिम का पिन डालें, आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> मौके बचे हैं.</item> + <item quantity="other">सिम का पिन डालें, आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> मौके बचे हैं.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास <xliff:g id="_NUMBER_1">%d</xliff:g> मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</item> + <item quantity="other">सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास <xliff:g id="_NUMBER_1">%d</xliff:g> मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml index 4247ede73585..cfdf5cd8662f 100644 --- a/packages/SystemUI/res-keyguard/values-hr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml @@ -141,4 +141,14 @@ <item quantity="other">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite zaporku.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nije prepoznat"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item> + <item quantity="few">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item> + <item quantity="other">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaj prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera.</item> + <item quantity="few">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera.</item> + <item quantity="other">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml index 30ccb67a35e8..71f34a9b639f 100644 --- a/packages/SystemUI/res-keyguard/values-hu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Az eszköz zárolása <xliff:g id="NUMBER_0">%d</xliff:g> órája nem lett feloldva. Erősítse meg a jelszót.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nem sikerült felismerni"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Adja meg a SIM-kártya PIN-kódját. <xliff:g id="NUMBER_1">%d</xliff:g> próbálkozása maradt.</item> + <item quantity="one">Adja meg a SIM-kártya PIN-kódját. <xliff:g id="NUMBER_0">%d</xliff:g> próbálkozása maradt. Ha elfogynak a próbálkozási lehetőségek, az eszköz feloldásához fel kell vennie a kapcsolatot szolgáltatójával.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még <xliff:g id="_NUMBER_1">%d</xliff:g> próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz.</item> + <item quantity="one">A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még <xliff:g id="_NUMBER_0">%d</xliff:g> próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml index 7914b5f792a5..29369351f8a6 100644 --- a/packages/SystemUI/res-keyguard/values-hy/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">Սարքը չի ապակողպվել <xliff:g id="NUMBER_1">%d</xliff:g> ժամվա ընթացքում: Հաստատեք գաղտնաբառը:</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Չճանաչվեց"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Մուտքագրեք SIM քարտի PIN կոդը: Մնացել է <xliff:g id="NUMBER_1">%d</xliff:g> փորձ:</item> + <item quantity="other">Մուտքագրեք SIM քարտի PIN կոդը: Մնացել է <xliff:g id="NUMBER_1">%d</xliff:g> փորձ:</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է <xliff:g id="_NUMBER_1">%d</xliff:g> փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին:</item> + <item quantity="other">SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է <xliff:g id="_NUMBER_1">%d</xliff:g> փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին:</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml index e417a3f44918..ee3621c35932 100644 --- a/packages/SystemUI/res-keyguard/values-in/strings.xml +++ b/packages/SystemUI/res-keyguard/values-in/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Perangkat belum dibuka kuncinya selama <xliff:g id="NUMBER_0">%d</xliff:g> jam. Konfirmasi sandi.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tidak dikenali"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Masukkan PIN SIM, tersisa <xliff:g id="NUMBER_1">%d</xliff:g> percobaan.</item> + <item quantity="one">Masukkan PIN SIM, tersisa <xliff:g id="NUMBER_0">%d</xliff:g> percobaan sebelum Anda harus menghubungi operator untuk membuka kunci perangkat.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa <xliff:g id="_NUMBER_1">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya.</item> + <item quantity="one">SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa <xliff:g id="_NUMBER_0">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml index 6d92dbae3489..cead5c4c97f4 100644 --- a/packages/SystemUI/res-keyguard/values-is/strings.xml +++ b/packages/SystemUI/res-keyguard/values-is/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">Tækið hefur ekki verið tekið úr lás í <xliff:g id="NUMBER_1">%d</xliff:g> klukkustundir. Staðfestu aðgangsorðið.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Þekktist ekki"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Sláðu inn PIN-númer SIM-korts. Það er <xliff:g id="NUMBER_1">%d</xliff:g> tilraun eftir.</item> + <item quantity="other">Sláðu inn PIN-númer SIM-korts. Það eru <xliff:g id="NUMBER_1">%d</xliff:g> tilraunir eftir.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það er <xliff:g id="_NUMBER_1">%d</xliff:g> tilraun eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar.</item> + <item quantity="other">SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það eru <xliff:g id="_NUMBER_1">%d</xliff:g> tilraunir eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index f449202a13d9..001f90cff98c 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Il dispositivo non viene sbloccato da <xliff:g id="NUMBER_0">%d</xliff:g> ora. Conferma la password.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Non riconosciuta"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Inserisci il codice PIN della SIM. Hai ancora <xliff:g id="NUMBER_1">%d</xliff:g> tentativi a disposizione.</item> + <item quantity="one">Inserisci il codice PIN della SIM. Hai ancora <xliff:g id="NUMBER_0">%d</xliff:g> tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora <xliff:g id="_NUMBER_1">%d</xliff:g> tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Contatta l\'operatore per avere informazioni dettagliate.</item> + <item quantity="one">La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora <xliff:g id="_NUMBER_0">%d</xliff:g> tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. Contatta l\'operatore per avere informazioni dettagliate.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index cb61b7dffb8a..8be3a8922e95 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -147,4 +147,16 @@ <item quantity="one">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_0">%d</xliff:g> שעה. הזן את הסיסמה.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"לא זוהתה"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="two">יש להזין PIN של כרטיס SIM, נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות נוספים.</item> + <item quantity="many">יש להזין PIN של כרטיס SIM, נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות נוספים.</item> + <item quantity="other">יש להזין PIN של כרטיס SIM, נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות נוספים.</item> + <item quantity="one">יש להזין PIN של כרטיס SIM. נותר לך <xliff:g id="NUMBER_0">%d</xliff:g> ניסיון נוסף לפני שיהיה צורך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="two">כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך <xliff:g id="_NUMBER_1">%d</xliff:g> ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item> + <item quantity="many">כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך <xliff:g id="_NUMBER_1">%d</xliff:g> ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item> + <item quantity="other">כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך <xliff:g id="_NUMBER_1">%d</xliff:g> ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item> + <item quantity="one">כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותר לך <xliff:g id="_NUMBER_0">%d</xliff:g> ניסיון נוסף לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml index 8aa2e47eec98..6bdc20010b21 100644 --- a/packages/SystemUI/res-keyguard/values-ja/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">端末のロックが <xliff:g id="NUMBER_0">%d</xliff:g> 時間、解除されていません。パスワードを確認してください。</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"認識されませんでした"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">SIM PIN を入力してください。入力できるのはあと <xliff:g id="NUMBER_1">%d</xliff:g> 回です。</item> + <item quantity="one">SIM PIN を入力してください。入力できるのはあと <xliff:g id="NUMBER_0">%d</xliff:g> 回です。この回数を超えた場合は、携帯通信会社にお問い合わせください。</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと <xliff:g id="_NUMBER_1">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。</item> + <item quantity="one">SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと <xliff:g id="_NUMBER_0">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml index 1ff7a965c3de..31ccaae0d574 100644 --- a/packages/SystemUI/res-keyguard/values-ka/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">მოწყობილობა არ განბლოკილა <xliff:g id="NUMBER_0">%d</xliff:g> საათის განმავლობაში. დაადასტურეთ პაროლი.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"არ არის ამოცნობილი"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">შეიყვანეთ SIM ბარათის PIN-კოდი. თქვენ დაგრჩათ <xliff:g id="NUMBER_1">%d</xliff:g> მცდელობა.</item> + <item quantity="one">შეიყვანეთ SIM ბარათის PIN-კოდი. თქვენ დაგრჩათ <xliff:g id="NUMBER_0">%d</xliff:g> მცდელობა, რომლის შემდეგაც მოწყობილობის განსაბლოკად დაგჭირდებათ თქვენს ოპერატორთან დაკავშირება.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ <xliff:g id="_NUMBER_1">%d</xliff:g> მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს.</item> + <item quantity="one">SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ <xliff:g id="_NUMBER_0">%d</xliff:g> მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml index 4b0a7ff743f3..f9e12f115345 100644 --- a/packages/SystemUI/res-keyguard/values-kk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Құрылғы құлпы <xliff:g id="NUMBER_0">%d</xliff:g> сағаттан бері ашылмаған. Құпия сөзді растаңыз.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Анықталмады"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">SIM PIN кодын енгізіңіз. <xliff:g id="NUMBER_1">%d</xliff:g> мүмкіндік қалды.</item> + <item quantity="one">SIM PIN кодын енгізіңіз. <xliff:g id="NUMBER_0">%d</xliff:g> мүмкіндік қалды, одан кейін оператордан SIM картасының құлпын ашуды сұрауға тура келеді.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. <xliff:g id="_NUMBER_1">%d</xliff:g> мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз.</item> + <item quantity="one">SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. <xliff:g id="_NUMBER_0">%d</xliff:g> мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml index 6a48197af535..3bf437992a11 100644 --- a/packages/SystemUI/res-keyguard/values-km/strings.xml +++ b/packages/SystemUI/res-keyguard/values-km/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">ឧបករណ៍បានជាប់សោអស់រយៈពេល <xliff:g id="NUMBER_0">%d</xliff:g> ម៉ោងហើយ។ សូមបញ្ជាក់ពាក្យសម្ងាត់។</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"មិនអាចសម្គាល់បានទេ"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">បញ្ចូលកូដ PIN របស់ស៊ីម អ្នកនៅសល់ការព្យាយាម <xliff:g id="NUMBER_1">%d</xliff:g> ដងទៀត។</item> + <item quantity="one">បញ្ចូលកូដ PIN របស់ស៊ីម អ្នកនៅសល់ការព្យាយាម <xliff:g id="NUMBER_0">%d</xliff:g> ដងទៀត មុនពេលដែលអ្នកត្រូវទាក់ទងទៅក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នកដើម្បីដោះសោឧបករណ៍របស់អ្នក។</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="_NUMBER_1">%d</xliff:g> ដងទៀតមុនពេលស៊ីមមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។ ទាក់ទងទៅក្រុមហ៊ុនសេវាទូរសព្ទសម្រាប់ព័ត៌មានលម្អិត។</item> + <item quantity="one">ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="_NUMBER_0">%d</xliff:g> ដងទៀតមុនពេលស៊ីមមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។ ទាក់ទងទៅក្រុមហ៊ុនសេវាទូរសព្ទសម្រាប់ព័ត៌មានលម្អិត។</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index 093c5cbc791a..2ee30e9998f1 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -135,4 +135,6 @@ <item quantity="other">ಸಾಧನವನ್ನು <xliff:g id="NUMBER_1">%d</xliff:g> ಗಂಟೆಗಳವರೆಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿರಲಿಲ್ಲ. ಪಾಸ್ವರ್ಡ್ ಖಚಿತಪಡಿಸಿ.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string> + <!-- no translation found for kg_password_default_pin_message (6203676909479972943) --> + <!-- no translation found for kg_password_default_puk_message (8744416410184198352) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml index 9b48a4b1b564..1a34229a01af 100644 --- a/packages/SystemUI/res-keyguard/values-ko/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">기기가 <xliff:g id="NUMBER_0">%d</xliff:g>시간 동안 잠금 해제되지 않았습니다. 비밀번호를 입력하세요.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"인식할 수 없음"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">SIM PIN을 입력하세요. <xliff:g id="NUMBER_1">%d</xliff:g>번 더 시도할 수 있습니다.</item> + <item quantity="one">SIM PIN을 입력하세요. <xliff:g id="NUMBER_0">%d</xliff:g>번 더 실패하면 이동통신사에 문의하여 기기를 잠금 해제해야 합니다.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. <xliff:g id="_NUMBER_1">%d</xliff:g>번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요.</item> + <item quantity="one">SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. <xliff:g id="_NUMBER_0">%d</xliff:g>번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index d4054e8e8ce2..054ce7c01386 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Түзмөктүн кулпусу <xliff:g id="NUMBER_0">%d</xliff:g> саат бою ачылган жок. Сырсөздү ырастаңыз.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Таанылган жок"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">SIM-картанын PIN-кодун киргизиңиз, сизде <xliff:g id="NUMBER_1">%d</xliff:g> аракет калды.</item> + <item quantity="one">SIM-картанын PIN-кодун киргизиңиз, сизде <xliff:g id="NUMBER_0">%d</xliff:g> аракет калды. Эми түзмөктү бөгөттөн чыгаруу үчүн байланыш операторуңузга кайрылышыңыз керек.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгарына <xliff:g id="_NUMBER_1">%d</xliff:g> аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз.</item> + <item quantity="one">SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгарына <xliff:g id="_NUMBER_0">%d</xliff:g> аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index e72349bfe9db..545d32a249d1 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">ອຸປະກອນບໍ່ໄດ້ຖືກປົດລັອກເປັນເວລາ <xliff:g id="NUMBER_0">%d</xliff:g> ຊົ່ວໂມງ. ຢືນຢັນລະຫັດຜ່ານ.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"ບໍ່ຮັບຮູ້"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">ລະຫັດ PIN ຂອງ SIM ບໍ່ຖືກຕ້ອງ, ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ.</item> + <item quantity="one">ລະຫັດ PIN ຂອງ SIM ບໍ່ຖືກຕ້ອງ, ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອກ່ອນທີ່ທ່ານຈະຕ້ອງຕິດຕໍ່ຫາຜູ້ໃຫ້ບໍລິການຂອງທ່ານເພື່ອປົດລັອກອຸປະກອນທ່ານ.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="_NUMBER_1">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ.</item> + <item quantity="one">ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="_NUMBER_0">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml index 0f51f00f8d84..bf041a0912ef 100644 --- a/packages/SystemUI/res-keyguard/values-lt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml @@ -147,4 +147,16 @@ <item quantity="other">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandų. Patvirtinkite slaptažodį.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Neatpažinta"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Įveskite SIM kortelės PIN kodą. Jums liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymas.</item> + <item quantity="few">Įveskite SIM kortelės PIN kodą. Jums liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymai.</item> + <item quantity="many">Įveskite SIM kortelės PIN kodą. Jums liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymo.</item> + <item quantity="other">Įveskite SIM kortelės PIN kodą. Jums liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymų.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymas. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item> + <item quantity="few">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymai. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item> + <item quantity="many">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymo. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item> + <item quantity="other">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymų. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml index bdd5dd54cb00..475e9ce56fbe 100644 --- a/packages/SystemUI/res-keyguard/values-lv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml @@ -141,4 +141,14 @@ <item quantity="other">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundas. Apstipriniet paroli.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nav atpazīts"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="zero">Ievadiet SIM kartes PIN kodu. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizes.</item> + <item quantity="one">Ievadiet SIM kartes PIN kodu. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizi.</item> + <item quantity="other">Ievadiet SIM kartes PIN kodu. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizes.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="zero">SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl <xliff:g id="_NUMBER_1">%d</xliff:g> reizes. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru.</item> + <item quantity="one">SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl <xliff:g id="_NUMBER_1">%d</xliff:g> reizi. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru.</item> + <item quantity="other">SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl <xliff:g id="_NUMBER_1">%d</xliff:g> reizes. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml index e14989f08733..095178739d66 100644 --- a/packages/SystemUI/res-keyguard/values-mk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">Уредот не е отклучен веќе <xliff:g id="NUMBER_1">%d</xliff:g> часа. Потврдете ја лозинката.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Непознат"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Внесете PIN-код за SIM-картичката. Ви преостанува уште <xliff:g id="NUMBER_1">%d</xliff:g> обид.</item> + <item quantity="other">Внесете PIN-код за SIM-картичката. Ви преостануваат уште <xliff:g id="NUMBER_1">%d</xliff:g> обиди.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостанува уште <xliff:g id="_NUMBER_1">%d</xliff:g> обид пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали.</item> + <item quantity="other">SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостануваат уште <xliff:g id="_NUMBER_1">%d</xliff:g> обиди пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index 0b2123189559..7f0e9578e816 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -135,4 +135,6 @@ <item quantity="one">ഉപകരണം <xliff:g id="NUMBER_0">%d</xliff:g> മണിക്കൂറായി അൺലോക്ക് ചെയ്തിട്ടില്ല. പാസ്വേഡ് സ്ഥിരീകരിക്കുക.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"തിരിച്ചറിഞ്ഞില്ല"</string> + <!-- no translation found for kg_password_default_pin_message (6203676909479972943) --> + <!-- no translation found for kg_password_default_puk_message (8744416410184198352) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml index c8d0b2d6e970..5f9b63d9f76b 100644 --- a/packages/SystemUI/res-keyguard/values-mn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Төхөөрөмжийн түгжээг <xliff:g id="NUMBER_0">%d</xliff:g> цагийн турш тайлаагүй байна. Нууц үгээ баталгаажуулна уу.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Танигдахгүй байна"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">SIM-н ПИН кодыг оруулна уу. Танд <xliff:g id="NUMBER_1">%d</xliff:g> оролдлого үлдлээ.</item> + <item quantity="one">SIM-н ПИН кодыг оруулна уу. Танд оператор компанитайгаа холбогдохгүйгээр төхөөрөмжийн түгжээг тайлах <xliff:g id="NUMBER_0">%d</xliff:g> оролдлого үлдлээ.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл <xliff:g id="_NUMBER_1">%d</xliff:g> оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу.</item> + <item quantity="one">SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл <xliff:g id="_NUMBER_0">%d</xliff:g> оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml index cfda6cc1cd8d..7d04edc8b785 100644 --- a/packages/SystemUI/res-keyguard/values-mr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">डिव्हाइस <xliff:g id="NUMBER_1">%d</xliff:g> तासांसाठी अनलॉक केले गेले नाही. पासवर्डची खात्री करा.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"ओळखले नाही"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">सिम पिन टाका, तुमच्याकडे <xliff:g id="NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहे.</item> + <item quantity="other">सिम पिन टाका, तुमच्याकडे <xliff:g id="NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहेत.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहे. तपशीलांसाठी वाहकाशी संपर्क साधा.</item> + <item quantity="other">सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहेत. तपशीलांसाठी वाहकाशी संपर्क साधा.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml index 6b8c1e97b069..d37e7ee141e8 100644 --- a/packages/SystemUI/res-keyguard/values-ms/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Peranti tidak dibuka kuncinya selama <xliff:g id="NUMBER_0">%d</xliff:g> jam. Sahkan kata laluan.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tidak dikenali"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Masukkan PIN SIM, tinggal <xliff:g id="NUMBER_1">%d</xliff:g> percubaan lagi.</item> + <item quantity="one">Masukkan PIN SIM, tinggal <xliff:g id="NUMBER_0">%d</xliff:g> percubaan lagi sebelum anda harus menghubungi pembawa anda untuk membuka kunci peranti.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal <xliff:g id="_NUMBER_1">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran.</item> + <item quantity="one">Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal <xliff:g id="_NUMBER_0">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml index 46e8c2e341b5..6534fbb98ad9 100644 --- a/packages/SystemUI/res-keyguard/values-my/strings.xml +++ b/packages/SystemUI/res-keyguard/values-my/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">စက်ပစ္စည်းကို <xliff:g id="NUMBER_0">%d</xliff:g> နာရီကြာ လော့ခ်ဖွင့်ခဲ့ခြင်း မရှိပါ။ စကားဝှက်အား အတည်ပြုပါ။</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"မသိပါ"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">ဆင်းမ်ကဒ် ပင်နံပါတ် ထည့်သွင်းပါ၊ သင့်တွင် <xliff:g id="NUMBER_1">%d</xliff:g> ခါ ကြိုးစားခွင့် ကျန်ပါသေးသည်။</item> + <item quantity="one">ဆင်းမ်ကဒ် ပင်နံပါတ် ထည့်သွင်းပါ၊ သင့်စက်ကို ဖွင့်ရန် ဝန်ဆောင်မှုပေးသူသို့ မဆက်သွယ်မီ သင့်တွင် <xliff:g id="NUMBER_0">%d</xliff:g> ခါ ကြိုးစားခွင့် ကျန်ပါသေးသည်။</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ်ကို အပြီးသုံးမရအောင်မပြုမီ သင့်တွင် <xliff:g id="_NUMBER_1">%d</xliff:g> ခါ ကြိုးစားခွင့်ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။</item> + <item quantity="one">ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ်ကို အပြီးသုံးမရအောင်မပြုမီ သင့်တွင် <xliff:g id="_NUMBER_0">%d</xliff:g> ခါ ကြိုးစားခွင့်ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml index b2063956f187..ca51c968b410 100644 --- a/packages/SystemUI/res-keyguard/values-nb/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Enheten har ikke blitt låst opp på <xliff:g id="NUMBER_0">%d</xliff:g> time. Bekreft passordet.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ikke gjenkjent"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Skriv inn PIN-koden for SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøk igjen.</item> + <item quantity="one">Skriv inn PIN-koden for SIM-kortet. Du har <xliff:g id="NUMBER_0">%d</xliff:g> forsøk igjen før du må kontakte operatøren din for å låse opp enheten.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer.</item> + <item quantity="one">SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har <xliff:g id="_NUMBER_0">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index d5ac1d84212f..90d6c5cfc00c 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">यन्त्र <xliff:g id="NUMBER_0">%d</xliff:g> घन्टा देखि अनलक भएको छैन। पासवर्ड पुष्टि गर्नुहोस्।</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"पहिचान भएन"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">SIM को PIN प्रविष्ट गर्नुहोस् तपाईंसँग <xliff:g id="NUMBER_1">%d</xliff:g> प्रयासहरू बाँकी छन्।</item> + <item quantity="one">SIM को PIN प्रविष्ट गर्नुहोस्, तपाईंसँग <xliff:g id="NUMBER_0">%d</xliff:g> प्रयास बाँकी छ, त्यसपछि भने आफ्नो यन्त्र अनलक गर्नका लागि तपाईंले अनिवार्य रूपमा आफ्नो सेवा प्रदायकलाई सम्पर्क गर्नपर्ने हुन्छ।</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्ट गर्नुहोस्। तपाईंसँग <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयासहरू बाँकी छन्, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</item> + <item quantity="one">SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्ट गर्नुहोस्। तपाईंसँग <xliff:g id="_NUMBER_0">%d</xliff:g> प्रयास बाँकी छ, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index 6a1f3c92cd1a..85e0a95d3994 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Apparaat is al <xliff:g id="NUMBER_0">%d</xliff:g> uur niet ontgrendeld. Bevestig het wachtwoord.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Niet herkend"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Geef de pincode van de simkaart op. Je hebt nog <xliff:g id="NUMBER_1">%d</xliff:g> pogingen over.</item> + <item quantity="one">Geef de pincode van de simkaart op. Je hebt nog <xliff:g id="NUMBER_0">%d</xliff:g> poging over voordat je contact met je provider moet opnemen om het apparaat te ontgrendelen.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_1">%d</xliff:g> pogingen over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item> + <item quantity="one">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_0">%d</xliff:g> poging over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index 0bab97dd1959..dc0e53bae184 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -135,4 +135,6 @@ <item quantity="other">ਡੀਵਾਈਸ <xliff:g id="NUMBER_1">%d</xliff:g> ਘੰਟਿਆਂ ਤੋਂ ਅਣਲਾਕ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ। ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string> + <!-- no translation found for kg_password_default_pin_message (6203676909479972943) --> + <!-- no translation found for kg_password_default_puk_message (8744416410184198352) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index 59f441290208..ee6ad623a742 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -147,4 +147,16 @@ <item quantity="one">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_0">%d</xliff:g> godziny. Potwierdź hasło.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nie rozpoznano"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="few">Wpisz kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> próby.</item> + <item quantity="many">Wpisz kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> prób.</item> + <item quantity="other">Wpisz kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> próby.</item> + <item quantity="one">Wpisz kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_0">%d</xliff:g> próbę, zanim będzie trzeba skontaktować się z operatorem, by odblokować to urządzenie.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="few">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_1">%d</xliff:g> próby, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item> + <item quantity="many">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_1">%d</xliff:g> prób, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item> + <item quantity="other">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_1">%d</xliff:g> próby, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item> + <item quantity="one">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_0">%d</xliff:g> próbę, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index 362ffcf70852..bb547f157185 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a senha.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Informe o PIN do SIM. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativa restante.</item> + <item quantity="other">Informe o PIN do SIM. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativas restantes.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">O SIM agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativa restante antes de o SIM se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> + <item quantity="other">O SIM agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas restantes antes de o SIM se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index 70d13e67145f..6a0e6274b161 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme a palavra-passe.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Introduza o PIN do cartão SIM. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item> + <item quantity="one">Introduza o PIN do cartão SIM. Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de ser necessário contactar o operador para desbloquear o dispositivo.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.</item> + <item quantity="one">O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais <xliff:g id="_NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index 362ffcf70852..bb547f157185 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a senha.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Informe o PIN do SIM. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativa restante.</item> + <item quantity="other">Informe o PIN do SIM. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativas restantes.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">O SIM agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativa restante antes de o SIM se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> + <item quantity="other">O SIM agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas restantes antes de o SIM se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index d0dc17e567a6..341c95297733 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -141,4 +141,14 @@ <item quantity="one">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_0">%d</xliff:g> oră. Confirmați parola.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nu este recunoscută"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="few">Introduceți codul PIN pentru cardul SIM. V-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> încercări.</item> + <item quantity="other">Introduceți codul PIN pentru cardul SIM. V-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> de încercări.</item> + <item quantity="one">Introduceți codul PIN pentru cardul SIM. V-a mai rămas <xliff:g id="NUMBER_0">%d</xliff:g> încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="few">Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas <xliff:g id="_NUMBER_1">%d</xliff:g> încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii.</item> + <item quantity="other">Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas <xliff:g id="_NUMBER_1">%d</xliff:g> de încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii.</item> + <item quantity="one">Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-a mai rămas <xliff:g id="_NUMBER_0">%d</xliff:g> încercare până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml index f629957f0bc0..1a794ee0a7b4 100644 --- a/packages/SystemUI/res-keyguard/values-ru/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml @@ -147,4 +147,16 @@ <item quantity="other">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часа. Введите пароль ещё раз.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Не распознано"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Неверный PIN-код. Осталась <xliff:g id="NUMBER_1">%d</xliff:g> попытка.</item> + <item quantity="few">Неверный PIN-код. Осталось <xliff:g id="NUMBER_1">%d</xliff:g> попытки.</item> + <item quantity="many">Неверный PIN-код. Осталось <xliff:g id="NUMBER_1">%d</xliff:g> попыток.</item> + <item quantity="other">Неверный PIN-код. Осталось <xliff:g id="NUMBER_1">%d</xliff:g> попытки.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталась <xliff:g id="_NUMBER_1">%d</xliff:g> попытка. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item> + <item quantity="few">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось <xliff:g id="_NUMBER_1">%d</xliff:g> попытки. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item> + <item quantity="many">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось <xliff:g id="_NUMBER_1">%d</xliff:g> попыток. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item> + <item quantity="other">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось <xliff:g id="_NUMBER_1">%d</xliff:g> попытки. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml index 4981855325cd..d36e7520b6ad 100644 --- a/packages/SystemUI/res-keyguard/values-si/strings.xml +++ b/packages/SystemUI/res-keyguard/values-si/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">උපාංගය පැය <xliff:g id="NUMBER_1">%d</xliff:g>ක් අගුලු හැර නැත. මුරපදය තහවුරු කරන්න.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"හඳුනා නොගන්නා ලදී"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">SIM PIN ඇතුළු කරන්න, ඔබ සතුව උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item> + <item quantity="other">SIM PIN ඇතුළු කරන්න, ඔබ සතුව උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් <xliff:g id="_NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න.</item> + <item quantity="other">SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් <xliff:g id="_NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml index 99007eedc2ce..b69f50241b89 100644 --- a/packages/SystemUI/res-keyguard/values-sk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml @@ -147,4 +147,16 @@ <item quantity="one">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_0">%d</xliff:g> hodinu. Potvrďte heslo.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nerozpoznané"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="few">Zadajte kód PIN SIM karty. Zostávajú vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusy.</item> + <item quantity="many">Zadajte kód PIN SIM karty. Zostáva vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusu.</item> + <item quantity="other">Zadajte kód PIN SIM karty. Zostáva vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusov.</item> + <item quantity="one">Zadajte kód PIN SIM karty. Zostáva vám <xliff:g id="NUMBER_0">%d</xliff:g> pokus, potom budete musieť kontaktovať svojho operátora, aby odomkol zariadenie.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="few">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostávajú vám <xliff:g id="_NUMBER_1">%d</xliff:g> pokusy, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item> + <item quantity="many">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám <xliff:g id="_NUMBER_1">%d</xliff:g> pokusu, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item> + <item quantity="other">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám <xliff:g id="_NUMBER_1">%d</xliff:g> pokusov, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item> + <item quantity="one">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám <xliff:g id="_NUMBER_0">%d</xliff:g> pokus, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index 2a087650e944..cd53c6c67eed 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -147,4 +147,16 @@ <item quantity="other">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> ur. Potrdite geslo.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ni prepoznano"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Vnesite kodo PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskus.</item> + <item quantity="two">Vnesite kodo PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskusa.</item> + <item quantity="few">Vnesite kodo PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskuse.</item> + <item quantity="other">Vnesite kodo PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskusov.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskus. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item> + <item quantity="two">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskusa. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item> + <item quantity="few">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskuse. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item> + <item quantity="other">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskusov. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml index fd52d3951d45..0a55795d0b5e 100644 --- a/packages/SystemUI/res-keyguard/values-sq/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Pajisja nuk është shkyçur për <xliff:g id="NUMBER_0">%d</xliff:g> orë. Konfirmo fjalëkalimin.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nuk njihet"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Fut kodin PIN të kartës SIM, të kanë mbetur edhe <xliff:g id="NUMBER_1">%d</xliff:g> tentativa.</item> + <item quantity="one">Fut kodin PIN të kartës SIM, të ka mbetur edhe <xliff:g id="NUMBER_0">%d</xliff:g> tentativë para se të kontaktosh me operatorin tënd celular për ta shkyçur pajisjen.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të kanë mbetur edhe <xliff:g id="_NUMBER_1">%d</xliff:g> përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje.</item> + <item quantity="one">Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të ka mbetur edhe <xliff:g id="_NUMBER_0">%d</xliff:g> përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml index 9d06e008f7c5..08db0bd14844 100644 --- a/packages/SystemUI/res-keyguard/values-sr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml @@ -141,4 +141,14 @@ <item quantity="other">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сати. Потврдите лозинку.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Није препознат"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Унесите PIN за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушај.</item> + <item quantity="few">Унесите PIN за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушаја.</item> + <item quantity="other">Унесите PIN за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушаја.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још <xliff:g id="_NUMBER_1">%d</xliff:g> покушај пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера.</item> + <item quantity="few">SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још <xliff:g id="_NUMBER_1">%d</xliff:g> покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера.</item> + <item quantity="other">SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још <xliff:g id="_NUMBER_1">%d</xliff:g> покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml index dc41e0dfe4a3..54a1d0d1feb9 100644 --- a/packages/SystemUI/res-keyguard/values-sv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Enheten har inte låsts upp på <xliff:g id="NUMBER_0">%d</xliff:g> timme. Bekräfta lösenordet.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Identifierades inte"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Ange pinkod för SIM-kortet. <xliff:g id="NUMBER_1">%d</xliff:g> försök återstår.</item> + <item quantity="one">Ange pinkod för SIM-kortet. <xliff:g id="NUMBER_0">%d</xliff:g> försök återstår innan du måste kontakta operatören för att låsa upp enheten.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. <xliff:g id="_NUMBER_1">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information.</item> + <item quantity="one">SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. <xliff:g id="_NUMBER_0">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml index ff75819b04cd..7e85131783eb 100644 --- a/packages/SystemUI/res-keyguard/values-sw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Hujafungua kifaa kwa saa <xliff:g id="NUMBER_0">%d</xliff:g>. Thibitisha nenosiri.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Haikutambua alama ya kidole"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Weka PIN ya SIM, umesalia na majaribio <xliff:g id="NUMBER_1">%d</xliff:g>.</item> + <item quantity="one">PIN ya SIM uliyoweka si sahihi. Umesalia na jaribio <xliff:g id="NUMBER_0">%d</xliff:g> kabla ya kulazimika kuwasiliana na mtoa huduma wako ili afungue kifaa chako.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na majaribio <xliff:g id="_NUMBER_1">%d</xliff:g> kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo.</item> + <item quantity="one">Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na jaribio <xliff:g id="_NUMBER_0">%d</xliff:g> kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml index 0ba941cd59d4..727ea5beef46 100644 --- a/packages/SystemUI/res-keyguard/values-ta/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml @@ -135,4 +135,6 @@ <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> மணிநேரமாகச் சாதனம் திறக்கப்படவில்லை. கடவுச்சொல்லை உறுதிப்படுத்தவும்.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"அடையாளங்காண முடியவில்லை"</string> + <!-- no translation found for kg_password_default_pin_message (6203676909479972943) --> + <!-- no translation found for kg_password_default_puk_message (8744416410184198352) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index 73f709462af4..ddc5928347cc 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -135,4 +135,6 @@ <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> గంట పాటు పరికరాన్ని అన్లాక్ చేయలేదు. పాస్వర్డ్ని నమోదు చేయండి.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"గుర్తించలేదు"</string> + <!-- no translation found for kg_password_default_pin_message (6203676909479972943) --> + <!-- no translation found for kg_password_default_puk_message (8744416410184198352) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml index d802f018468a..aa33421b2549 100644 --- a/packages/SystemUI/res-keyguard/values-th/strings.xml +++ b/packages/SystemUI/res-keyguard/values-th/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">ไม่มีการปลดล็อกอุปกรณ์มา <xliff:g id="NUMBER_0">%d</xliff:g> ชั่วโมงแล้ว ยืนยันรหัสผ่าน</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"ไม่รู้จัก"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">ป้อน PIN ของซิม คุณพยายามได้อีก <xliff:g id="NUMBER_1">%d</xliff:g> ครั้ง</item> + <item quantity="one">PIN ของซิมไม่ถูกต้อง คุณพยายามได้อีก <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งก่อนที่จะต้องติดต่อผู้ให้บริการเพื่อปลดล็อกอุปกรณ์</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก <xliff:g id="_NUMBER_1">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ</item> + <item quantity="one">ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก <xliff:g id="_NUMBER_0">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml index 7e84d2ffe279..30657d4457f9 100644 --- a/packages/SystemUI/res-keyguard/values-tl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">Hindi na-unlock ang device sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> na oras. Kumpirmahin ang password.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Hindi nakilala"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Ilagay ang PIN ng SIM, mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> natitirang pagsubok.</item> + <item quantity="other">Ilagay ang PIN ng SIM, mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> na natitirang pagsubok.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang <xliff:g id="_NUMBER_1">%d</xliff:g> natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye.</item> + <item quantity="other">Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang <xliff:g id="_NUMBER_1">%d</xliff:g> na natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml index b80e4db816ce..ca53dfb8fd69 100644 --- a/packages/SystemUI/res-keyguard/values-tr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Cihazın kilidi son <xliff:g id="NUMBER_0">%d</xliff:g> saattir açılmadı. Şifreyi doğrulayın.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tanınmadı"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">SIM PIN\'inizi girin. <xliff:g id="NUMBER_1">%d</xliff:g> deneme hakkınız kaldı.</item> + <item quantity="one">SIM PIN\'inizi girin. Cihazınızın kilidini açmak için operatörünüzle bağlantı kurmak zorunda kalmadan önce <xliff:g id="NUMBER_0">%d</xliff:g> deneme hakkınız kaldı.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce <xliff:g id="_NUMBER_1">%d</xliff:g> deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun.</item> + <item quantity="one">SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce <xliff:g id="_NUMBER_0">%d</xliff:g> deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml index f25928abeefe..4b79744573d6 100644 --- a/packages/SystemUI/res-keyguard/values-uk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml @@ -147,4 +147,16 @@ <item quantity="other">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> години. Підтвердьте пароль.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Не розпізнано"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Введіть PIN-код SIM-карти. Залишилася <xliff:g id="NUMBER_1">%d</xliff:g> спроба.</item> + <item quantity="few">Введіть PIN-код SIM-карти. Залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроби.</item> + <item quantity="many">Введіть PIN-код SIM-карти. Залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроб.</item> + <item quantity="other">Введіть PIN-код SIM-карти. Залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроби.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилася <xliff:g id="_NUMBER_1">%d</xliff:g> спроба. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item> + <item quantity="few">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося <xliff:g id="_NUMBER_1">%d</xliff:g> спроби. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item> + <item quantity="many">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося <xliff:g id="_NUMBER_1">%d</xliff:g> спроб. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item> + <item quantity="other">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося <xliff:g id="_NUMBER_1">%d</xliff:g> спроби. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index 3bb59f01aa61..5440a87ff22f 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -135,4 +135,6 @@ <item quantity="one">آلہ <xliff:g id="NUMBER_0">%d</xliff:g> گھنٹہ سے غیر مقفل نہیں کیا گیا۔ پاسورڈ کی توثیق کریں۔</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"تسلیم شدہ نہیں ہے"</string> + <!-- no translation found for kg_password_default_pin_message (6203676909479972943) --> + <!-- no translation found for kg_password_default_puk_message (8744416410184198352) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml index 699ad6002760..ee11cffd09d2 100644 --- a/packages/SystemUI/res-keyguard/values-uz/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Qurilma <xliff:g id="NUMBER_0">%d</xliff:g> soatdan beri qulfdan chiqarilgani yo‘q. Parolni yana bir marta kiriting.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Barmoq izi aniqlanmadi"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">SIM PIN kodini kiriting, sizda <xliff:g id="NUMBER_1">%d</xliff:g> ta urinish bor.</item> + <item quantity="one">SIM PIN kodini kiriting, qurilmani qulfdan chiqarish uchun sizda <xliff:g id="NUMBER_0">%d</xliff:g> ta urinish bor.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana <xliff:g id="_NUMBER_1">%d</xliff:g> marta urinib ko‘rganingizdan keyin SIM kartadan umuman foydalanib bo‘lmaydi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling.</item> + <item quantity="one">SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana <xliff:g id="_NUMBER_0">%d</xliff:g> marta urinib ko‘rganingizdan keyin SIM kartadan umuman foydalanib bo‘lmaydi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml index 67af2bfdfe25..d20b87ecbf59 100644 --- a/packages/SystemUI/res-keyguard/values-vi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">Thiết bị đã không được mở khóa trong <xliff:g id="NUMBER_0">%d</xliff:g> giờ. Xác nhận mật khẩu.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Không nhận dạng được"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">Hãy nhập mã PIN của SIM, bạn còn <xliff:g id="NUMBER_1">%d</xliff:g> lần thử.</item> + <item quantity="one">Hãy nhập mã PIN của SIM, bạn còn <xliff:g id="NUMBER_0">%d</xliff:g> lần thử trước khi bạn phải liên hệ với nhà cung cấp dịch vụ để mở khóa thiết bị của mình.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn <xliff:g id="_NUMBER_1">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết.</item> + <item quantity="one">SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn <xliff:g id="_NUMBER_0">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không thể sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml index d523c20cc5ac..8ee5812f36aa 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">设备已保持锁定状态达 <xliff:g id="NUMBER_0">%d</xliff:g> 小时。请确认密码。</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"无法识别"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item> + <item quantity="one">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 <xliff:g id="_NUMBER_1">%d</xliff:g> 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。</item> + <item quantity="one">SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 <xliff:g id="_NUMBER_0">%d</xliff:g> 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index f34314178ebf..5b0754e6e344 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">裝置在過去 <xliff:g id="NUMBER_0">%d</xliff:g> 小時內未有解鎖,請確認密碼。</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"未能識別"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">輸入 SIM 卡的 PIN,您還可以再試 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item> + <item quantity="one">輸入 SIM 卡的 PIN,您還可以再試 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍然輸入錯誤,您必須聯絡流動網絡供應商解鎖您的裝置。</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 <xliff:g id="_NUMBER_1">%d</xliff:g> 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。</item> + <item quantity="one">SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 <xliff:g id="_NUMBER_0">%d</xliff:g> 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index 9e0165a90466..45ab5938a286 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -135,4 +135,12 @@ <item quantity="one">裝置已有 <xliff:g id="NUMBER_0">%d</xliff:g> 小時未解鎖。請確認密碼。</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"無法識別"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="other">請輸入 SIM 卡的 PIN 碼,你還可以再試 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item> + <item quantity="one">請輸入 SIM 卡的 PIN 碼,你還可以再試 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍然失敗,就必須請電信業者為裝置解鎖。</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="other">SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 <xliff:g id="_NUMBER_1">%d</xliff:g> 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。</item> + <item quantity="one">SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 <xliff:g id="_NUMBER_0">%d</xliff:g> 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。</item> + </plurals> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml index 2f456bd474f3..2329320bdf30 100644 --- a/packages/SystemUI/res-keyguard/values-zu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml @@ -135,4 +135,12 @@ <item quantity="other">Idivayisi ayikavulwa ngamahora angu-<xliff:g id="NUMBER_1">%d</xliff:g>. Qinisekisa iphasiwedi.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Akubonwa"</string> + <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943"> + <item quantity="one">Faka i-PIN ye-SIM, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele.</item> + <item quantity="other">Faka i-PIN ye-SIM, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele.</item> + </plurals> + <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352"> + <item quantity="one">I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-<xliff:g id="_NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane.</item> + <item quantity="other">I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-<xliff:g id="_NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane.</item> + </plurals> </resources> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index e5270893a453..b9a228f7d538 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Dubbele multitoonfrekwensie"</string> <string name="stream_accessibility" msgid="301136219144385106">"Toeganklikheid"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Lui"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibreer"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Demp"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tik om te ontdemp."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tik om op vibreer te stel. Toeganklikheidsdienste kan dalk gedemp wees."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tik om te demp. Toeganklikheidsdienste kan dalk gedemp wees."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Kitsprogramme"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Kitsprogramme hoef nie geïnstalleer te word nie."</string> <string name="app_info" msgid="6856026610594615344">"Programinligting"</string> - <string name="go_to_web" msgid="1106022723459948514">"Gaan na web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Gaan na blaaier"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobiele data"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi is af"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth is af"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 8ee77e149308..961ac4514477 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ብሉቱዝ"</string> <string name="stream_dtmf" msgid="2447177903892477915">"ድርብ ባለ በርካታ ቅላጼ ድግምግሞሽ"</string> <string name="stream_accessibility" msgid="301136219144385106">"ተደራሽነት"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ጥሪ"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ንዘር"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ድምጸ-ከል አድርግ"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s። ወደ ንዝረት ለማቀናበር መታ ያድርጉ። የተደራሽነት አገልግሎቶች ድምጸ-ከል ሊደረግባቸው ይችላል።"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ። የተደራሽነት አገልግሎቶች ድምጸ-ከል ሊደረግባቸው ይችላል።"</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"የቅጽበት መተግበሪያዎች"</string> <string name="instant_apps_message" msgid="8116608994995104836">"ቅጽበታዊ መተግበሪያዎች መጫን አያስፈልጋቸውም።"</string> <string name="app_info" msgid="6856026610594615344">"የመተግበሪያ መረጃ"</string> - <string name="go_to_web" msgid="1106022723459948514">"ወደ ድር ሂድ"</string> + <string name="go_to_web" msgid="2650669128861626071">"ወደ አሳሽ ሂድ"</string> <string name="mobile_data" msgid="7094582042819250762">"የተንቀሳቃሽ ስልክ ውሂብ"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ጠፍቷል"</string> <string name="bt_is_off" msgid="2640685272289706392">"ብሉቱዝ ጠፍቷል"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 48e8739f443b..8437705e3cd2 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -500,6 +500,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"بلوتوث"</string> <string name="stream_dtmf" msgid="2447177903892477915">"تردد ثنائي متعدد النغمات"</string> <string name="stream_accessibility" msgid="301136219144385106">"إمكانية الوصول"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"استصدار رنين"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"اهتزاز"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"كتم الصوت"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. انقر لإلغاء التجاهل."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. انقر للتعيين على الاهتزاز. قد يتم تجاهل خدمات إمكانية الوصول."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. انقر للتجاهل. قد يتم تجاهل خدمات إمكانية الوصول."</string> @@ -780,7 +783,7 @@ <string name="instant_apps" msgid="6647570248119804907">"التطبيقات الفورية"</string> <string name="instant_apps_message" msgid="8116608994995104836">"لا تتطلب التطبيقات الفورية إجراء التثبيت."</string> <string name="app_info" msgid="6856026610594615344">"معلومات عن التطبيق"</string> - <string name="go_to_web" msgid="1106022723459948514">"الانتقال إلى الويب"</string> + <string name="go_to_web" msgid="2650669128861626071">"الانتقال إلى المتصفح"</string> <string name="mobile_data" msgid="7094582042819250762">"بيانات الجوّال"</string> <string name="wifi_is_off" msgid="1838559392210456893">"تم إيقاف شبكة Wi-Fi"</string> <string name="bt_is_off" msgid="2640685272289706392">"تم إيقاف البلوتوث."</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index de9ffe1bb8c1..098b1cdc5d35 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Çoxsaylı ton olan ikili tezlik"</string> <string name="stream_accessibility" msgid="301136219144385106">"Münasiblik"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zəng"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrasiya"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Susdurun"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Səsli etmək üçün tıklayın."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Vibrasiyanı ayarlamaq üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiş ola bilər."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Səssiz etmək üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiş ola bilər."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Ani Tətbiqlər"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Ani tətbiqlər quraşdırma tələb etmir."</string> <string name="app_info" msgid="6856026610594615344">"Tətbiq məlumatı"</string> - <string name="go_to_web" msgid="1106022723459948514">"Vebə keçin"</string> + <string name="go_to_web" msgid="2650669128861626071">"Brauzerə daxil edin"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobil data"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi deaktivdir"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth deaktivdir"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 4e38e5dbe92e..ae3854fb95af 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Višestruka frekvencija dualnog tona"</string> <string name="stream_accessibility" msgid="301136219144385106">"Pristupačnost"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Aktiviraj zvono"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibriraj"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Isključi zvuk"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Dodirnite da biste uključili zvuk."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Dodirnite da biste podesili na vibraciju. Zvuk usluga pristupačnosti će možda biti isključen."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da biste isključili zvuk. Zvuk usluga pristupačnosti će možda biti isključen."</string> @@ -762,7 +765,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant aplikacije"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Instant aplikacije ne zahtevaju instalaciju."</string> <string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string> - <string name="go_to_web" msgid="1106022723459948514">"Idi na veb"</string> + <string name="go_to_web" msgid="2650669128861626071">"Idi na pregledač"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilni podaci"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je isključen"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je isključen"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index c077c0395523..3c9f83afc828 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -498,6 +498,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Двухтанальны шматчастотны"</string> <string name="stream_accessibility" msgid="301136219144385106">"Спецыяльныя магчымасці"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Званок"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Вібрацыя"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Гук выключаны"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Дакраніцеся, каб уключыць гук."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Дакраніцеся, каб уключыць вібрацыю. Можа быць адключаны гук службаў спецыяльных магчымасцей."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дакраніцеся, каб адключыць гук. Можа быць адключаны гук службаў спецыяльных магчымасцей."</string> @@ -770,7 +773,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Імгненныя праграмы"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Імгненныя праграмы не патрабуюць усталёўкі."</string> <string name="app_info" msgid="6856026610594615344">"Інфармацыя пра праграму"</string> - <string name="go_to_web" msgid="1106022723459948514">"Перайсці ў інтэрнэт"</string> + <string name="go_to_web" msgid="2650669128861626071">"Перайсці ў браўзер"</string> <string name="mobile_data" msgid="7094582042819250762">"Маб. перадача даных"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi выключаны"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth выключаны"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index c567adfff383..1cd4c910c54d 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Тонално набиране"</string> <string name="stream_accessibility" msgid="301136219144385106">"Достъпност"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Позвъняване"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Вибриране"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Без звук"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Докоснете, за да включите отново звука."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Докоснете, за да зададете вибриране. Възможно е звукът на услугите за достъпност да бъде заглушен."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Докоснете, за да заглушите звука. Възможно е звукът на услугите за достъпност да бъде заглушен."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Мигновени приложения"</string> <string name="instant_apps_message" msgid="8116608994995104836">"За мигновените приложения не се изисква инсталиране."</string> <string name="app_info" msgid="6856026610594615344">"Информация за приложението"</string> - <string name="go_to_web" msgid="1106022723459948514">"Към мрежата"</string> + <string name="go_to_web" msgid="2650669128861626071">"Към браузъра"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобилни данни"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Функцията за Wi‑Fi е изключена"</string> <string name="bt_is_off" msgid="2640685272289706392">"Функцията за Bluetooth е изключена"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 577077929352..c82352553f95 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -492,6 +492,12 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ব্লুটুথ"</string> <string name="stream_dtmf" msgid="2447177903892477915">"ডুয়েল মাল্টি টোন ফ্রিকোয়েন্সি"</string> <string name="stream_accessibility" msgid="301136219144385106">"অ্যাক্সেসযোগ্যতা"</string> + <!-- no translation found for volume_ringer_status_normal (4273142424125855384) --> + <skip /> + <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) --> + <skip /> + <!-- no translation found for volume_ringer_status_silent (6896394161022916369) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s। সশব্দ করতে আলতো চাপুন।"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s। কম্পন এ সেট করতে আলতো চাপুন। অ্যাক্সেসযোগ্যতার পরিষেবাগুলিকে নিঃশব্দ করা হতে পারে।"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। নিঃশব্দ করতে আলতো চাপুন। অ্যাক্সেসযোগ্যতার পরিষেবাগুলিকে নিঃশব্দ করা হতে পারে।"</string> @@ -756,8 +762,7 @@ <string name="instant_apps" msgid="6647570248119804907">"ঝটপট অ্যাপ"</string> <string name="instant_apps_message" msgid="8116608994995104836">"ঝটপট অ্যাপ ইনস্টল করার প্রয়োজন হয় না।"</string> <string name="app_info" msgid="6856026610594615344">"অ্যাপের তথ্য"</string> - <!-- no translation found for go_to_web (2650669128861626071) --> - <skip /> + <string name="go_to_web" msgid="2650669128861626071">"ব্রাউজারে যান"</string> <string name="mobile_data" msgid="7094582042819250762">"মোবাইল ডেটা"</string> <string name="wifi_is_off" msgid="1838559392210456893">"ওয়াই ফাই বন্ধ আছে"</string> <string name="bt_is_off" msgid="2640685272289706392">"ব্লুটুথ বন্ধ আছে"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 530c1a8b56aa..f09bb1f29c4b 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Dvostruka višemelodijska frekvencija"</string> <string name="stream_accessibility" msgid="301136219144385106">"Pristupačnost"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zvono"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibriranje"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Isključi zvuk"</string> <!-- String.format failed for translation --> <!-- no translation found for volume_stream_content_description_unmute (4436631538779230857) --> <skip /> @@ -764,8 +767,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant-aplikacije"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Za instant aplikacije nije potrebna instalacija"</string> <string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string> - <!-- no translation found for go_to_web (2650669128861626071) --> - <skip /> + <string name="go_to_web" msgid="2650669128861626071">"Idi na preglednik"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilni podaci"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi veza je isključena"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je isključen"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 1c5fe909ca9a..e87bb45247f5 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Marcatge per tons"</string> <string name="stream_accessibility" msgid="301136219144385106">"Accessibilitat"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Fes sonar"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibra"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Silencia"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toca per activar el so."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toca per activar la vibració. Pot ser que els serveis d\'accessibilitat se silenciïn."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca per silenciar el so. Pot ser que els serveis d\'accessibilitat se silenciïn."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Aplicacions instantànies"</string> <string name="instant_apps_message" msgid="8116608994995104836">"No cal instal·lar les aplicacions instantànies."</string> <string name="app_info" msgid="6856026610594615344">"Informació de l\'aplicació"</string> - <string name="go_to_web" msgid="1106022723459948514">"Ves al web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Ves al navegador"</string> <string name="mobile_data" msgid="7094582042819250762">"Dades mòbils"</string> <string name="wifi_is_off" msgid="1838559392210456893">"La Wi-Fi està desactivada"</string> <string name="bt_is_off" msgid="2640685272289706392">"El Bluetooth està desactivat"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index b1cddfb2a5cc..e0e14a16ce3b 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -498,6 +498,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Tónová volba"</string> <string name="stream_accessibility" msgid="301136219144385106">"Přístupnost"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Vyzvánění"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrace"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ztlumení"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Klepnutím zapnete zvuk."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Klepnutím aktivujete režim vibrací. Služby přístupnosti mohou být ztlumeny."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Klepnutím vypnete zvuk. Služby přístupnosti mohou být ztlumeny."</string> @@ -770,7 +773,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Okamžité aplikace"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Okamžité aplikace není třeba instalovat."</string> <string name="app_info" msgid="6856026610594615344">"O aplikaci"</string> - <string name="go_to_web" msgid="1106022723459948514">"Přejít na web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Přejít do prohlížeče"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilní data"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je vypnuta"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je vypnuto"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index e4198f3c157b..fb886fc6dd64 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Tonesignalfrekvens (DTMF)"</string> <string name="stream_accessibility" msgid="301136219144385106">"Hjælpefunktioner"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ring"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibration"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Slå lyden fra"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tryk for at slå lyden til."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tryk for at konfigurere til at vibrere. Tilgængelighedstjenester kan blive deaktiveret."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tryk for at slå lyden fra. Lyden i tilgængelighedstjenester kan blive slået fra."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Instant apps kræver ingen installation."</string> <string name="app_info" msgid="6856026610594615344">"Appinfo"</string> - <string name="go_to_web" msgid="1106022723459948514">"Gå til website"</string> + <string name="go_to_web" msgid="2650669128861626071">"Gå til en browser"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi er slået fra"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth er slået fra"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index e9c2f26dfb82..feb7064be29f 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -496,6 +496,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Doppelton-Mehrfrequenz"</string> <string name="stream_accessibility" msgid="301136219144385106">"Bedienungshilfen"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Klingeln lassen"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrieren"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Stummschalten"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Zum Aufheben der Stummschaltung tippen."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tippen, um Vibrieren festzulegen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Zum Stummschalten tippen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string> @@ -760,7 +763,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant-Apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Bei Instant-Apps ist keine vorherige Installation erforderlich."</string> <string name="app_info" msgid="6856026610594615344">"App-Informationen"</string> - <string name="go_to_web" msgid="1106022723459948514">"Web aufrufen"</string> + <string name="go_to_web" msgid="2650669128861626071">"Browser öffnen"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobile Daten"</string> <string name="wifi_is_off" msgid="1838559392210456893">"WLAN ist deaktiviert"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth ist deaktiviert"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 33df73b82030..1fe90101e41f 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Πολυσυχνότητα διπλού τόνου"</string> <string name="stream_accessibility" msgid="301136219144385106">"Προσβασιμότητα"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Κουδούνισμα"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Δόνηση"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Σίγαση"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Πατήστε για κατάργηση σίγασης."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Πατήστε για ενεργοποιήσετε τη δόνηση. Οι υπηρεσίες προσβασιμότητας ενδέχεται να τεθούν σε σίγαση."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Πατήστε για σίγαση. Οι υπηρεσίες προσβασιμότητας ενδέχεται να τεθούν σε σίγαση."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant Εφαρμογές"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Οι Instant Εφαρμογές δεν απαιτούν εγκατάσταση."</string> <string name="app_info" msgid="6856026610594615344">"Πληροφορίες εφαρμογής"</string> - <string name="go_to_web" msgid="1106022723459948514">"Μετάβαση στον ιστό"</string> + <string name="go_to_web" msgid="2650669128861626071">"Μετάβ. σε πρόγ. περ."</string> <string name="mobile_data" msgid="7094582042819250762">"Δεδομένα κινητής τηλεφωνίας"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Το Wi-Fi είναι ανενεργό"</string> <string name="bt_is_off" msgid="2640685272289706392">"Το Bluetooth είναι ανενεργό"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index c97f7d32ee26..4af3f5912d36 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Multifrecuencia de tono doble"</string> <string name="stream_accessibility" msgid="301136219144385106">"Accesibilidad"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Hacer sonar"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Silenciar"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Presiona para dejar de silenciar."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Presiona para establecer el modo vibración. Es posible que los servicios de accesibilidad estén silenciados."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Presiona para silenciar. Es posible que los servicios de accesibilidad estén silenciados."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Apps instantáneas"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Las Apps instantáneas no requieren instalación."</string> <string name="app_info" msgid="6856026610594615344">"Información de apps"</string> - <string name="go_to_web" msgid="1106022723459948514">"Ir a la Web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Ir al navegador"</string> <string name="mobile_data" msgid="7094582042819250762">"Datos móviles"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi desactivado"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth desactivado"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 94467d849204..14c28183c6de 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Multifrecuencia de tono dual"</string> <string name="stream_accessibility" msgid="301136219144385106">"Accesibilidad"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Hacer sonar"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Silenciar"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toca para activar el sonido."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toca para poner el dispositivo en vibración. Los servicios de accesibilidad pueden silenciarse."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca para silenciar. Los servicios de accesibilidad pueden silenciarse."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Aplicaciones Instantáneas"</string> <string name="instant_apps_message" msgid="8116608994995104836">"No es necesario instalar las Aplicaciones Instantáneas."</string> <string name="app_info" msgid="6856026610594615344">"Información de la aplicación"</string> - <string name="go_to_web" msgid="1106022723459948514">"Ir a la Web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Ir al navegador"</string> <string name="mobile_data" msgid="7094582042819250762">"Datos móviles"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi desactivado"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth desactivado"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 3a4eea6a1d67..27e4920b341e 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Kaks mitme tooniga sagedust"</string> <string name="stream_accessibility" msgid="301136219144385106">"Juurdepääsetavus"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Helisemine"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibreerimine"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Vaigistatud"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Puudutage vaigistuse tühistamiseks."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Puudutage värinarežiimi määramiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Puudutage vaigistamiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Installimata avatavad rakendused"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Installimata avatavaid rakendusi pole vaja installida."</string> <string name="app_info" msgid="6856026610594615344">"Rakenduse teave"</string> - <string name="go_to_web" msgid="1106022723459948514">"Avage veebis"</string> + <string name="go_to_web" msgid="2650669128861626071">"Ava brauser"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobiilne andmeside"</string> <string name="wifi_is_off" msgid="1838559392210456893">"WiFi on välja lülitatud"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth on välja lülitatud"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index b75548e55f81..5d4181e124fe 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth konexioa"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Tonu anitzeko maiztasun duala"</string> <string name="stream_accessibility" msgid="301136219144385106">"Erabilerraztasuna"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Jo tonua"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Dardara"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ez jo tonua"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Sakatu audioa aktibatzeko."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Sakatu dardara ezartzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sakatu audioa desaktibatzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Zuzeneko aplikazioak"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Zuzeneko aplikazioak ez dira instalatu behar."</string> <string name="app_info" msgid="6856026610594615344">"Aplikazioari buruzko informazioa"</string> - <string name="go_to_web" msgid="1106022723459948514">"Joan sarera"</string> + <string name="go_to_web" msgid="2650669128861626071">"Joan arakatzailera"</string> <string name="mobile_data" msgid="7094582042819250762">"Datu mugikorrak"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi konexioa desaktibatuta dago"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth konexioa desaktibatuta dago"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index d107fea93d3c..9360c1dfa614 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"بلوتوث"</string> <string name="stream_dtmf" msgid="2447177903892477915">"فرکانس دوتایی چند نوایی"</string> <string name="stream_accessibility" msgid="301136219144385106">"دسترسپذیری"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"زنگ زدن"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"لرزش"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"بیصدا"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. برای باصدا کردن ضربه بزنید."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. برای تنظیم روی لرزش ضربه بزنید. ممکن است سرویسهای دسترسپذیری بیصدا شوند."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. برای بیصدا کردن ضربه بزنید. ممکن است سرویسهای دسترسپذیری بیصدا شوند."</string> @@ -756,8 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"برنامههای فوری"</string> <string name="instant_apps_message" msgid="8116608994995104836">"برنامههای فوری نیاز به نصب ندارند."</string> <string name="app_info" msgid="6856026610594615344">"اطلاعات برنامه"</string> - <!-- no translation found for go_to_web (2650669128861626071) --> - <skip /> + <string name="go_to_web" msgid="2650669128861626071">"رفتن به مرورگر"</string> <string name="mobile_data" msgid="7094582042819250762">"داده تلفن همراه"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi خاموش است"</string> <string name="bt_is_off" msgid="2640685272289706392">"بلوتوث خاموش است"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index ccec4a62eb9b..864f8d0bb2f0 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Äänitaajuusvalinta"</string> <string name="stream_accessibility" msgid="301136219144385106">"Esteettömyys"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Soittoääni"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Värinä"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Äänetön"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Poista mykistys koskettamalla."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Siirry värinätilaan koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Mykistä koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Pikasovelluksia ei tarvitse asentaa."</string> <string name="app_info" msgid="6856026610594615344">"Sovelluksen tiedot"</string> - <string name="go_to_web" msgid="1106022723459948514">"Avaa verkossa"</string> + <string name="go_to_web" msgid="2650669128861626071">"Siirry selaimeen"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobiilitiedonsiirto"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi on pois käytöstä"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth ei ole käytössä"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index bdd01c211a06..5c4394b86726 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Fréquence double multi ton"</string> <string name="stream_accessibility" msgid="301136219144385106">"Accessibilité"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Sonnerie"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibration"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Sonnerie désactivée"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Touchez pour réactiver le son."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Touchez pour activer les vibrations. Il est possible de couper le son des services d\'accessibilité."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Touchez pour couper le son. Il est possible de couper le son des services d\'accessibilité."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Applications instantanées"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Les applications instantanées ne nécessitent pas d\'installation."</string> <string name="app_info" msgid="6856026610594615344">"Détails de l\'application"</string> - <string name="go_to_web" msgid="1106022723459948514">"Accéder au Web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Ouvrir le navigateur"</string> <string name="mobile_data" msgid="7094582042819250762">"Données cellulaires"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Le Wi-Fi est désactivé"</string> <string name="bt_is_off" msgid="2640685272289706392">"Le Bluetooth est désactivé"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index ee50e566e44e..21952aea6ea8 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"DTMF"</string> <string name="stream_accessibility" msgid="301136219144385106">"Accessibilité"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Sonnerie"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibreur"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Silencieux"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Appuyez pour ne plus ignorer."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Appuyez pour mettre en mode vibreur. Vous pouvez ignorer les services d\'accessibilité."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Appuyez pour ignorer. Vous pouvez ignorer les services d\'accessibilité."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Applis instantanées"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Les applis instantanées ne nécessitent pas d\'installation."</string> <string name="app_info" msgid="6856026610594615344">"Infos sur l\'appli"</string> - <string name="go_to_web" msgid="1106022723459948514">"Accéder au site Web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Accéder au navigateur"</string> <string name="mobile_data" msgid="7094582042819250762">"Données mobiles"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi désactivé"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth désactivé"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 558b98c29347..a3d580be0ad6 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Multifrecuencia de dobre ton"</string> <string name="stream_accessibility" msgid="301136219144385106">"Accesibilidade"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Facer soar"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Silenciar"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toca para activar o son."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toca para establecer a vibración. Pódense silenciar os servizos de accesibilidade."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca para silenciar. Pódense silenciar os servizos de accesibilidade."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Aplicacións instantáneas"</string> <string name="instant_apps_message" msgid="8116608994995104836">"As aplicacións instantáneas non precisan instalación."</string> <string name="app_info" msgid="6856026610594615344">"Info. da aplicación"</string> - <string name="go_to_web" msgid="1106022723459948514">"Acceder á web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Ir ao navegador"</string> <string name="mobile_data" msgid="7094582042819250762">"Datos móbiles"</string> <string name="wifi_is_off" msgid="1838559392210456893">"A wifi está desactivada"</string> <string name="bt_is_off" msgid="2640685272289706392">"O Bluetooth está desactivado"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 139ab827f4ef..83f789693518 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -34,17 +34,14 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"નોટિફિકેશનો"</string> <string name="battery_low_title" msgid="6456385927409742437">"બૅટરી ઓછી છે"</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> બાકી"</string> - <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) --> - <skip /> + <string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> બાકી. બૅટરી સેવર ચાલુ છે."</string> <string name="invalid_charger" msgid="4549105996740522523">"USB ચાર્જિંગ સમર્થિત નથી.\nફક્ત આપવામાં આવેલ ચાર્જરનો ઉપયોગ કરો."</string> <string name="invalid_charger_title" msgid="3515740382572798460">"USB ચાર્જિંગ સમર્થિત નથી."</string> <string name="invalid_charger_text" msgid="5474997287953892710">"ફક્ત પ્રદાન કરાયેલ ચાર્જરનો ઉપયોગ કરો."</string> <string name="battery_low_why" msgid="4553600287639198111">"સેટિંગ્સ"</string> - <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) --> - <skip /> + <string name="battery_saver_confirmation_title" msgid="2052100465684817154">"બૅટરી સેવર ચાલુ કરીએ?"</string> <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ચાલુ કરો"</string> - <!-- no translation found for battery_saver_start_action (8187820911065797519) --> - <skip /> + <string name="battery_saver_start_action" msgid="8187820911065797519">"બૅટરી સેવર ચાલુ કરો"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"સેટિંગ્સ"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"વાઇ-ફાઇ"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"સ્ક્રીનને આપમેળે ફેરવો"</string> @@ -402,11 +399,9 @@ <string name="user_remove_user_title" msgid="4681256956076895559">"વપરાશકર્તાને દૂર કરીએ?"</string> <string name="user_remove_user_message" msgid="1453218013959498039">"આ વપરાશકર્તાની તમામ ઍપ્લિકેશનો અને ડેટા કાઢી નાખવામાં આવશે."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"દૂર કરો"</string> - <!-- no translation found for battery_saver_notification_title (8614079794522291840) --> - <skip /> + <string name="battery_saver_notification_title" msgid="8614079794522291840">"બૅટરી સેવર ચાલુ છે"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"પ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે"</string> - <!-- no translation found for battery_saver_notification_action_text (132118784269455533) --> - <skip /> + <string name="battery_saver_notification_action_text" msgid="132118784269455533">"બૅટરી સેવર બંધ કરો"</string> <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> તમારી સ્ક્રીન પર જે પ્રદર્શિત થાય છે તે દરેક વસ્તુને કેપ્ચર કરવાનું પ્રારંભ કરશે."</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"ફરીથી બતાવશો નહીં"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"બધુ સાફ કરો"</string> @@ -497,6 +492,12 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"બ્લૂટૂથ"</string> <string name="stream_dtmf" msgid="2447177903892477915">"દ્વિ બહુ ટોન આવર્તન"</string> <string name="stream_accessibility" msgid="301136219144385106">"ઍક્સેસિબિલિટી"</string> + <!-- no translation found for volume_ringer_status_normal (4273142424125855384) --> + <skip /> + <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) --> + <skip /> + <!-- no translation found for volume_ringer_status_silent (6896394161022916369) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. અનમ્યૂટ કરવા માટે ટૅપ કરો."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. વાઇબ્રેટ પર સેટ કરવા માટે ટૅપ કરો. ઍક્સેસિબિલિટી સેવાઓ મ્યૂટ કરવામાં આવી શકે છે."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. મ્યૂટ કરવા માટે ટૅપ કરો. ઍક્સેસિબિલિટી સેવાઓ મ્યૂટ કરવામાં આવી શકે છે."</string> @@ -761,7 +762,7 @@ <string name="instant_apps" msgid="6647570248119804907">"ઝટપટ ઍપ્લિકેશનો"</string> <string name="instant_apps_message" msgid="8116608994995104836">"ઝટપટ ઍપ્લિકેશનો માટે ઇન્સ્ટૉલેશનની જરૂર નથી."</string> <string name="app_info" msgid="6856026610594615344">"ઍપ્લિકેશન માહિતી"</string> - <string name="go_to_web" msgid="1106022723459948514">"વેબ પર જાઓ"</string> + <string name="go_to_web" msgid="2650669128861626071">"બ્રાઉઝર પર જાઓ"</string> <string name="mobile_data" msgid="7094582042819250762">"મોબાઇલ ડેટા"</string> <string name="wifi_is_off" msgid="1838559392210456893">"વાઇ-ફાઇ બંધ છે"</string> <string name="bt_is_off" msgid="2640685272289706392">"બ્લૂટૂથ બંધ છે"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 1681c2eeee45..e7fc696dc89e 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ब्लूटूथ"</string> <string name="stream_dtmf" msgid="2447177903892477915">"दोहरी बहु टोन आवृत्ति"</string> <string name="stream_accessibility" msgid="301136219144385106">"सुलभता"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"आवाज़ चालू है"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"कंपन (वाइब्रेशन)"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"आवाज़ बंद है"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. अनम्यूट करने के लिए टैप करें."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. कंपन पर सेट करने के लिए टैप करें. सुलभता सेवाएं म्यूट हो सकती हैं."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. म्यूट करने के लिए टैप करें. सुलभता सेवाएं म्यूट हो सकती हैं."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"झटपट ऐप्स"</string> <string name="instant_apps_message" msgid="8116608994995104836">"झटपट ऐप्स के लिए इंस्टॉलेशन ज़रूरी नहीं है."</string> <string name="app_info" msgid="6856026610594615344">"ऐप की जानकारी"</string> - <string name="go_to_web" msgid="1106022723459948514">"वेब पर जाएं"</string> + <string name="go_to_web" msgid="2650669128861626071">"ब्राउज़र पर जाएं"</string> <string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string> <string name="wifi_is_off" msgid="1838559392210456893">"वाई-फ़ाई बंद है"</string> <string name="bt_is_off" msgid="2640685272289706392">"ब्लूटूथ बंद है"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 699efad0dc03..88f50973cf97 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"DTMF"</string> <string name="stream_accessibility" msgid="301136219144385106">"Pristupačnost"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zvonjenje"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibriranje"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Zvuk je isključen"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Dodirnite da biste uključili zvuk."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Dodirnite da biste postavili na vibraciju. Usluge pristupačnosti možda neće imati zvuk."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da biste isključili zvuk. Usluge pristupačnosti možda neće imati zvuk."</string> @@ -762,7 +765,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant aplikacije"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Instant aplikacije nije potrebno instalirati."</string> <string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string> - <string name="go_to_web" msgid="1106022723459948514">"Prijeđi na web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Otvori preglednik"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilni podaci"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je isključen"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je isključen"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index faa4a860f5f6..e81df8f54286 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Kéthangú többfrekvenciás jelzésátvitel (DTMF)"</string> <string name="stream_accessibility" msgid="301136219144385106">"Kisegítő lehetőségek"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Csörgés"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Rezgés"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Néma"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Koppintson a némítás megszüntetéséhez."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Koppintson a rezgés beállításához. Előfordulhat, hogy a kisegítő lehetőségek szolgáltatásai le vannak némítva."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Koppintson a némításhoz. Előfordulhat, hogy a kisegítő lehetőségek szolgáltatásai le vannak némítva."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Azonnali alkalmazások"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Az azonnali alkalmazásokat nem kell telepíteni."</string> <string name="app_info" msgid="6856026610594615344">"Alkalmazásinformáció"</string> - <string name="go_to_web" msgid="1106022723459948514">"Tovább az internetre"</string> + <string name="go_to_web" msgid="2650669128861626071">"Ugrás a böngészőbe"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobiladatok"</string> <string name="wifi_is_off" msgid="1838559392210456893">"A Wi-Fi ki van kapcsolva"</string> <string name="bt_is_off" msgid="2640685272289706392">"A Bluetooth ki van kapcsolva"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 074ca49a292e..2994b9b05e7b 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Կրկնակի բազմերանգ հաճախականություն"</string> <string name="stream_accessibility" msgid="301136219144385106">"Մատչելիություն"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Սովորական"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Թրթռազանգ"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Անձայն"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s: Հպեք՝ ձայնը միացնելու համար:"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s: Հպեք՝ թրթռումը միացնելու համար: Մատչելիության ծառայությունների ձայնը կարող է անջատվել:"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s: Հպեք՝ ձայնն անջատելու համար: Մատչելիության ծառայությունների ձայնը կարող է անջատվել:"</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Ակնթարթորեն գործարկվող հավելվածներ"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Ակնթարթորեն գործարկվող հավելվածները տեղադրում չեն պահանջում։"</string> <string name="app_info" msgid="6856026610594615344">"Հավելվածի տվյալներ"</string> - <string name="go_to_web" msgid="1106022723459948514">"Բացեք համացանցում"</string> + <string name="go_to_web" msgid="2650669128861626071">"Անցնել դիտարկիչ"</string> <string name="mobile_data" msgid="7094582042819250762">"Բջջային ինտերնետ"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi-ն անջատված է"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth-ն անջատված է"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index b4709bb4c77d..f8604e3e1b42 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Frekuensi multinada ganda"</string> <string name="stream_accessibility" msgid="301136219144385106">"Aksesibilitas"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Dering"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Getar"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Nonaktifkan"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ketuk untuk menyuarakan."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Ketuk untuk menyetel agar bergetar. Layanan aksesibilitas mungkin dibisukan."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ketuk untuk membisukan. Layanan aksesibilitas mungkin dibisukan."</string> @@ -756,8 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Aplikasi Instan"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Aplikasi instan tidak perlu diinstal."</string> <string name="app_info" msgid="6856026610594615344">"Info aplikasi"</string> - <!-- no translation found for go_to_web (2650669128861626071) --> - <skip /> + <string name="go_to_web" msgid="2650669128861626071">"Buka browser"</string> <string name="mobile_data" msgid="7094582042819250762">"Data seluler"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi nonaktif"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth nonaktif"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index f60a766530c1..1efc249e6337 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Tvítóna fjöltíðni"</string> <string name="stream_accessibility" msgid="301136219144385106">"Aðgengi"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Hringing"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Titringur"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Hljóð af"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ýttu til að hætta að þagga."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Ýttu til að stilla á titring. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ýttu til að þagga. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Skyndiforrit"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Skyndiforrit þurfa ekki uppsetningu."</string> <string name="app_info" msgid="6856026610594615344">"Forritsupplýsingar"</string> - <string name="go_to_web" msgid="1106022723459948514">"Fara á vefinn"</string> + <string name="go_to_web" msgid="2650669128861626071">"Opna vafra"</string> <string name="mobile_data" msgid="7094582042819250762">"Farsímagögn"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Slökkt á Wi-Fi"</string> <string name="bt_is_off" msgid="2640685272289706392">"Slökkt á Bluetooth"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index d4e6314715e9..c15e4b601222 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Frequenza multipla dual tone"</string> <string name="stream_accessibility" msgid="301136219144385106">"Accessibilità"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Suoneria"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrazione"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Disattiva audio"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tocca per riattivare l\'audio."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tocca per attivare la vibrazione. L\'audio dei servizi di accessibilità può essere disattivato."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tocca per disattivare l\'audio. L\'audio dei servizi di accessibilità può essere disattivato."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"App istantanee"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Le app istantanee non richiedono l\'installazione."</string> <string name="app_info" msgid="6856026610594615344">"Informazioni app"</string> - <string name="go_to_web" msgid="1106022723459948514">"Vai sul Web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Vai al browser"</string> <string name="mobile_data" msgid="7094582042819250762">"Dati mobili"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi disattivato"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth non attivo"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index f20275d1ca56..29271165a427 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -496,6 +496,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"טון זוגי מרובה תדרים (DTMF)"</string> <string name="stream_accessibility" msgid="301136219144385106">"נגישות"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"צלצול"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"רטט"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"השתקה"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. הקש כדי לבטל את ההשתקה."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. הקש כדי להגדיר רטט. ייתכן ששירותי הנגישות מושתקים."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. הקש כדי להשתיק. ייתכן ששירותי הנגישות מושתקים."</string> @@ -768,7 +771,7 @@ <string name="instant_apps" msgid="6647570248119804907">"אפליקציות אינסטנט"</string> <string name="instant_apps_message" msgid="8116608994995104836">"אפליקציות אינסטנט לא דורשות התקנה."</string> <string name="app_info" msgid="6856026610594615344">"פרטי אפליקציה"</string> - <string name="go_to_web" msgid="1106022723459948514">"התחבר לאינטרנט"</string> + <string name="go_to_web" msgid="2650669128861626071">"מעבר אל הדפדפן"</string> <string name="mobile_data" msgid="7094582042819250762">"נתונים סלולריים"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi כבוי"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth כבוי"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index ac83c2d2e1dc..38622c95e33b 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"デュアルトーン マルチ周波数"</string> <string name="stream_accessibility" msgid="301136219144385106">"ユーザー補助機能"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"着信音"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"バイブレーション"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ミュート"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s。タップしてミュートを解除します。"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s。タップしてバイブレーションに設定します。ユーザー補助機能サービスがミュートされる場合があります。"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。タップしてミュートします。ユーザー補助機能サービスがミュートされる場合があります。"</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Instant Apps はインストールせずに利用できます。"</string> <string name="app_info" msgid="6856026610594615344">"アプリ情報"</string> - <string name="go_to_web" msgid="1106022723459948514">"ウェブページを開く"</string> + <string name="go_to_web" msgid="2650669128861626071">"ブラウザに移動"</string> <string name="mobile_data" msgid="7094582042819250762">"モバイルデータ"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi は OFF です"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth は OFF です"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index e871c6abe9e3..933a5e312892 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"ტონალური აკრეფა"</string> <string name="stream_accessibility" msgid="301136219144385106">"მარტივი წვდომა"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"დარეკვა"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ვიბრაცია"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"დადუმება"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. შეეხეთ დადუმების გასაუქმებლად."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. შეეხეთ ვიბრაციაზე დასაყენებლად. შეიძლება დადუმდეს მარტივი წვდომის სერვისებიც."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. შეეხეთ დასადუმებლად. შეიძლება დადუმდეს მარტივი წვდომის სერვისებიც."</string> @@ -756,8 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"მყისიერი აპები"</string> <string name="instant_apps_message" msgid="8116608994995104836">"მყისიერი აპები ინსტალაციას არ საჭიროებს."</string> <string name="app_info" msgid="6856026610594615344">"აპის შესახებ"</string> - <!-- no translation found for go_to_web (2650669128861626071) --> - <skip /> + <string name="go_to_web" msgid="2650669128861626071">"ბრაუზერზე გადასვლა"</string> <string name="mobile_data" msgid="7094582042819250762">"მობილური ინტერნეტი"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi გამორთულია"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth გამორთულია"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index f2b4fc8f5a56..3f36c72feef4 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Қос үнді көп жиілік"</string> <string name="stream_accessibility" msgid="301136219144385106">"Арнайы мүмкіндіктер"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Шылдырлау"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Діріл"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Дыбысын өшіру"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Дыбысын қосу үшін түртіңіз."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Діріл режимін орнату үшін түртіңіз. Арнайы мүмкіндік қызметтерінің дыбысы өшуі мүмкін."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дыбысын өшіру үшін түртіңіз. Арнайы мүмкіндік қызметтерінің дыбысы өшуі мүмкін."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Лездік қолданбаларды орнатудың қажеті жоқ."</string> <string name="app_info" msgid="6856026610594615344">"Қолданба ақпараты"</string> - <string name="go_to_web" msgid="1106022723459948514">"Вебке өту"</string> + <string name="go_to_web" msgid="2650669128861626071">"Браузерге өту"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобильдік деректер"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi өшірулі"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth өшірулі"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index ad9b05799a8b..1d5d7d4ce9af 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ប៊្លូធូស"</string> <string name="stream_dtmf" msgid="2447177903892477915">"ហ្វ្រេកង់ពហុសំឡេងទ្វេ"</string> <string name="stream_accessibility" msgid="301136219144385106">"ភាពងាយស្រួល"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"រោទ៍"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ញ័រ"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"បិទ"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s។ ប៉ះដើម្បីបើកសំឡេង។"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s។ ប៉ះដើម្បីកំណត់ឲ្យញ័រ។ សេវាកម្មលទ្ធភាពប្រើប្រាស់អាចនឹងត្រូវបានបិទសំឡេង។"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s។ ប៉ះដើម្បីបិទសំឡេង។ សេវាកម្មលទ្ធភាពប្រើប្រាស់អាចនឹងត្រូវបានបិទសំឡេង។"</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"កម្មវិធីប្រើភ្លាមៗ"</string> <string name="instant_apps_message" msgid="8116608994995104836">"កម្មវិធីប្រើភ្លាមៗមិនតម្រូវឲ្យមានការដំឡើងទេ។"</string> <string name="app_info" msgid="6856026610594615344">"ព័ត៌មានកម្មវិធី"</string> - <string name="go_to_web" msgid="1106022723459948514">"ចូលទៅកាន់បណ្តាញ"</string> + <string name="go_to_web" msgid="2650669128861626071">"ចូលទៅកម្មវិធីរុករកតាមអ៊ីនធឺណិត"</string> <string name="mobile_data" msgid="7094582042819250762">"ទិន្នន័យទូរសព្ទចល័ត"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi បានបិទ"</string> <string name="bt_is_off" msgid="2640685272289706392">"ប៊្លូធូសបានបិទ"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index f4aad9648413..b2e9d8f1730d 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -492,6 +492,12 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ಬ್ಲೂಟೂತ್"</string> <string name="stream_dtmf" msgid="2447177903892477915">"ಡ್ಯುಯಲ್ ಬಹು ಟೋನ್ ಆವರ್ತನೆ"</string> <string name="stream_accessibility" msgid="301136219144385106">"ಪ್ರವೇಶಿಸುವಿಕೆ"</string> + <!-- no translation found for volume_ringer_status_normal (4273142424125855384) --> + <skip /> + <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) --> + <skip /> + <!-- no translation found for volume_ringer_status_silent (6896394161022916369) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ಅನ್ಮ್ಯೂಟ್ ಮಾಡುವುದಕ್ಕಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ಕಂಪನಕ್ಕೆ ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಬಹುದು."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಬಹುದು."</string> @@ -756,7 +762,7 @@ <string name="instant_apps" msgid="6647570248119804907">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳು"</string> <string name="instant_apps_message" msgid="8116608994995104836">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳಿಗೆ ಸ್ಥಾಪನೆಯ ಅಗತ್ಯವಿಲ್ಲ."</string> <string name="app_info" msgid="6856026610594615344">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string> - <string name="go_to_web" msgid="1106022723459948514">"ವೆಬ್ಗೆ ಹೋಗಿ"</string> + <string name="go_to_web" msgid="2650669128861626071">"ಬ್ರೌಸರ್ಗೆ ಹೋಗಿ"</string> <string name="mobile_data" msgid="7094582042819250762">"ಮೊಬೈಲ್ ಡೇಟಾ"</string> <string name="wifi_is_off" msgid="1838559392210456893">"ವೈ-ಫೈ ಆಫ್ ಆಗಿದೆ"</string> <string name="bt_is_off" msgid="2640685272289706392">"ಬ್ಲೂಟೂತ್ ಆಫ್ ಆಗಿದೆ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 43d171c01a79..83018be6883d 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"블루투스"</string> <string name="stream_dtmf" msgid="2447177903892477915">"듀얼 멀티 톤 주파수"</string> <string name="stream_accessibility" msgid="301136219144385106">"접근성"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"벨소리"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"진동"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"음소거"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. 탭하여 음소거를 해제하세요."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. 탭하여 진동으로 설정하세요. 접근성 서비스가 음소거될 수 있습니다."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. 탭하여 음소거로 설정하세요. 접근성 서비스가 음소거될 수 있습니다."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"인스턴트 앱"</string> <string name="instant_apps_message" msgid="8116608994995104836">"인스턴트 앱은 설치가 필요하지 않습니다."</string> <string name="app_info" msgid="6856026610594615344">"앱 정보"</string> - <string name="go_to_web" msgid="1106022723459948514">"웹으로 이동"</string> + <string name="go_to_web" msgid="2650669128861626071">"브라우저로 이동"</string> <string name="mobile_data" msgid="7094582042819250762">"모바일 데이터"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi가 사용 중지됨"</string> <string name="bt_is_off" msgid="2640685272289706392">"블루투스가 사용 중지됨"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 375d70de69ed..4aaae3c6e311 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Көп тондуу жыштык"</string> <string name="stream_accessibility" msgid="301136219144385106">"Атайын мүмкүнчүлүктөр"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Шыңгыратуу"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Дирилдөө"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Үнсүз"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Үнүн чыгаруу үчүн таптап коюңуз."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Дирилдөөгө коюу үчүн таптап коюңуз. Атайын мүмкүнчүлүктөр кызматынын үнүн өчүрүп койсо болот."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Үнүн өчүрүү үчүн таптап коюңуз. Атайын мүмкүнчүлүктөр кызматынын үнүн өчүрүп койсо болот."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Ыкчам ачылуучу колдонмолор"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Ыкчам ачылуучу колдонмолорду орнотуу талап кылынбайт."</string> <string name="app_info" msgid="6856026610594615344">"Колдонмо тууралуу"</string> - <string name="go_to_web" msgid="1106022723459948514">"Интернетке өтүү"</string> + <string name="go_to_web" msgid="2650669128861626071">"Серепчиге өтүү"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобилдик Интернет"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi өчүк"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth өчүк"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 064609e76f99..bc1e5b90957f 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ບຣູທູດ"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Dual multi tone frequency"</string> <string name="stream_accessibility" msgid="301136219144385106">"ການຊ່ວຍເຂົ້າເຖິງ"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ເຕືອນດ້ວຍສຽງ"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ສັ່ນເຕືອນ"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ປິດ"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ແຕະເພື່ອເຊົາປິດສຽງ."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ແຕະເພື່ອຕັ້ງເປັນສັ່ນ. ບໍລິການຊ່ວຍເຂົ້າເຖິງອາດຖືກປິດສຽງໄວ້."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ແຕະເພື່ອປິດສຽງ. ບໍລິການຊ່ວຍເຂົ້າເຖິງອາດຖືກປິດສຽງໄວ້."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"ອິນສະແຕນແອັບ"</string> <string name="instant_apps_message" msgid="8116608994995104836">"ອິນສະແຕນແອັບບໍ່ຈຳເປັນຕ້ອງມີການຕິດຕັ້ງ."</string> <string name="app_info" msgid="6856026610594615344">"ຂໍ້ມູນແອັບ"</string> - <string name="go_to_web" msgid="1106022723459948514">"ໄປທີ່ເວັບ"</string> + <string name="go_to_web" msgid="2650669128861626071">"ໄປທີ່ໂປຣແກຣມທ່ອງເວັບ"</string> <string name="mobile_data" msgid="7094582042819250762">"ອິນເຕີເນັດມືຖື"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ປິດຢູ່"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth ປິດຢູ່"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index f44b930b47f7..53ddcb3ecc30 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -496,6 +496,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Dvigubas kelių tonų dažnis"</string> <string name="stream_accessibility" msgid="301136219144385106">"Pritaikymas neįgaliesiems"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Skambinti"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibruoti"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Nutildyti"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Palieskite, kad įjungtumėte garsą."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Palieskite, kad nustatytumėte vibravimą. Gali būti nutildytos pritaikymo neįgaliesiems paslaugos."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Palieskite, kad nutildytumėte. Gali būti nutildytos pritaikymo neįgaliesiems paslaugos."</string> @@ -768,7 +771,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Akimirksniu įkeliamos programėlės"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Akimirksniu įkeliamų programėlių nereikia įdiegti."</string> <string name="app_info" msgid="6856026610594615344">"Programos informacija"</string> - <string name="go_to_web" msgid="1106022723459948514">"Eiti į žiniatinklį"</string> + <string name="go_to_web" msgid="2650669128861626071">"Eiti į naršyklę"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilieji duomenys"</string> <string name="wifi_is_off" msgid="1838559392210456893">"„Wi-Fi“ išjungtas"</string> <string name="bt_is_off" msgid="2640685272289706392">"„Bluetooth“ išjungtas"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 8c117b3cb860..b1c3db5b7841 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Divtoņu daudzfrekvenču signalizācija"</string> <string name="stream_accessibility" msgid="301136219144385106">"Pieejamība"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zvanīt"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrēt"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Izslēgt skaņu"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Pieskarieties, lai ieslēgtu skaņu."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Pieskarieties, lai iestatītu uz vibrozvanu. Var tikt izslēgti pieejamības pakalpojumu signāli."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Pieskarieties, lai izslēgtu skaņu. Var tikt izslēgti pieejamības pakalpojumu signāli."</string> @@ -762,7 +765,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Tūlītējās lietotnes"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Tūlītējām lietotnēm nav nepieciešama instalēšana."</string> <string name="app_info" msgid="6856026610594615344">"Lietotnes informācija"</string> - <string name="go_to_web" msgid="1106022723459948514">"Pāriet uz tīmekli"</string> + <string name="go_to_web" msgid="2650669128861626071">"Atvērt pārlūku"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilie dati"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ir izslēgts"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth ir izslēgts"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 195ddec75d8f..3986e168ec59 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Двојна повеќетонска фреквенција"</string> <string name="stream_accessibility" msgid="301136219144385106">"Пристапност"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ѕвони"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Вибрации"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Исклучи звук"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Допрете за да вклучите звук."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Допрете за да поставите на вибрации. Можеби ќе се исклучи звукот на услугите за достапност."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Допрете за да исклучите звук. Можеби ќе се исклучи звукот на услугите за достапност."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Инстант апликации"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликациите нема потреба да се инсталираат."</string> <string name="app_info" msgid="6856026610594615344">"Информации за апликација"</string> - <string name="go_to_web" msgid="1106022723459948514">"Одете на интернет"</string> + <string name="go_to_web" msgid="2650669128861626071">"Одете на прелистувач"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобилен интернет"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi е исклучено"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth е исклучен"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 3eb67dfb4cac..3dfde1302b2a 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -492,6 +492,12 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ബ്ലൂടൂത്ത്"</string> <string name="stream_dtmf" msgid="2447177903892477915">"ഡ്യുവൽ മൾട്ടി റ്റോൺ ഫ്രീക്വൻസി"</string> <string name="stream_accessibility" msgid="301136219144385106">"ഉപയോഗസഹായി"</string> + <!-- no translation found for volume_ringer_status_normal (4273142424125855384) --> + <skip /> + <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) --> + <skip /> + <!-- no translation found for volume_ringer_status_silent (6896394161022916369) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. അൺമ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. വൈബ്രേറ്റിലേക്ക് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം."</string> @@ -756,7 +762,7 @@ <string name="instant_apps" msgid="6647570248119804907">"ഇൻസ്റ്റന്റ് ആപ്പ്"</string> <string name="instant_apps_message" msgid="8116608994995104836">"ഇൻസ്റ്റന്റ് ആപ്പിന് ഇൻസ്റ്റലേഷൻ ആവശ്യമില്ല."</string> <string name="app_info" msgid="6856026610594615344">"ആപ്പ് വിവരം"</string> - <string name="go_to_web" msgid="1106022723459948514">"വെബിൽ പോവുക"</string> + <string name="go_to_web" msgid="2650669128861626071">"ബ്രൗസറിലേക്ക് പോവുക"</string> <string name="mobile_data" msgid="7094582042819250762">"മൊബൈൽ ഡാറ്റ"</string> <string name="wifi_is_off" msgid="1838559392210456893">"വൈഫൈ ഓഫാണ്"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth ഓഫാണ്"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 7ecf68350f43..9f09dadc141c 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -490,6 +490,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Олон дууны давтамж"</string> <string name="stream_accessibility" msgid="301136219144385106">"Хүртээмж"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Хонх дуугаргах"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Чичиргэх"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Хаах"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Дууг нь нээхийн тулд товшино уу."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Чичиргээнд тохируулахын тулд товшино уу. Хүртээмжийн үйлчилгээний дууг хаасан."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дууг нь хаахын тулд товшино уу. Хүртээмжийн үйлчилгээний дууг хаасан."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Шуурхай апп"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Шуурхай аппыг суулгах шаардлагагүй."</string> <string name="app_info" msgid="6856026610594615344">"Апп-н мэдээлэл"</string> - <string name="go_to_web" msgid="1106022723459948514">"Вэбэд очих"</string> + <string name="go_to_web" msgid="2650669128861626071">"Хөтчид очих"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобайл дата"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi унтраалттай байна"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth унтраалттай байна"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index a0c9b2c8e2f1..5b0984d68cbf 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -34,17 +34,14 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचना"</string> <string name="battery_low_title" msgid="6456385927409742437">"बॅटरी कमी आहे"</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> शिल्लक"</string> - <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) --> - <skip /> + <string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> शिल्लक. बॅटरी सेव्हर चालू आहे."</string> <string name="invalid_charger" msgid="4549105996740522523">"USB चार्जिंग समर्थित नाही.\nफक्त पुरवठा केलेले चार्जर वापरा."</string> <string name="invalid_charger_title" msgid="3515740382572798460">"USB चार्जिंग समर्थित नाही."</string> <string name="invalid_charger_text" msgid="5474997287953892710">"केवळ पुरविलेले चार्जर वापरा."</string> <string name="battery_low_why" msgid="4553600287639198111">"सेटिंग्ज"</string> - <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) --> - <skip /> + <string name="battery_saver_confirmation_title" msgid="2052100465684817154">"बॅटरी सेव्हर सुरू करायचा का?"</string> <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"चालू करा"</string> - <!-- no translation found for battery_saver_start_action (8187820911065797519) --> - <skip /> + <string name="battery_saver_start_action" msgid="8187820911065797519">"बॅटरी सेव्हर सुरू करा"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिंग्ज"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"वाय-फाय"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"स्वयं-फिरणारी स्क्रीन"</string> @@ -402,11 +399,9 @@ <string name="user_remove_user_title" msgid="4681256956076895559">"वापरकर्त्यास काढायचे?"</string> <string name="user_remove_user_message" msgid="1453218013959498039">"या वापरकर्त्याचे सर्व अॅप्स आणि डेटा काढून टाकला जाईल."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"काढा"</string> - <!-- no translation found for battery_saver_notification_title (8614079794522291840) --> - <skip /> + <string name="battery_saver_notification_title" msgid="8614079794522291840">"बॅटरी सेव्हर चालू आहे"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"कामगिरी आणि पार्श्वभूमीवरील डेटा कमी करते"</string> - <!-- no translation found for battery_saver_notification_action_text (132118784269455533) --> - <skip /> + <string name="battery_saver_notification_action_text" msgid="132118784269455533">"बॅटरी सेव्हर बंद करा"</string> <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपल्या स्क्रीनवर प्रदर्शित होणारी प्रत्येक गोष्ट कॅप्चर करणे प्रारंभ करेल."</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"पुन्हा दर्शवू नका"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"सर्व साफ करा"</string> @@ -497,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ब्लूटूथ"</string> <string name="stream_dtmf" msgid="2447177903892477915">"दुहेरी एकाधिक टोन वारंंवारता"</string> <string name="stream_accessibility" msgid="301136219144385106">"प्रवेशयोग्यता"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"रिंग करा"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"कंपन"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"म्युट करा"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. सशब्द करण्यासाठी टॅप करा."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. कंपन सेट करण्यासाठी टॅप करा. प्रवेशयोग्यता सेवा नि:शब्द केल्या जाऊ शकतात."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. नि:शब्द करण्यासाठी टॅप करा. प्रवेशक्षमता सेवा नि:शब्द केल्या जाऊ शकतात."</string> @@ -761,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"इन्सटंट अॅप्स"</string> <string name="instant_apps_message" msgid="8116608994995104836">"इन्सटंट अॅप्सना स्थापनेची आवश्यकता नसते."</string> <string name="app_info" msgid="6856026610594615344">"अॅप माहिती"</string> - <string name="go_to_web" msgid="1106022723459948514">"वेबवर जा"</string> + <string name="go_to_web" msgid="2650669128861626071">"ब्राउझरवर जा"</string> <string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string> <string name="wifi_is_off" msgid="1838559392210456893">"वाय-फाय बंद आहे"</string> <string name="bt_is_off" msgid="2640685272289706392">"ब्लूटूथ बंद आहे"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 78708f7d6251..2907761fc749 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Multifrekuensi dwinada"</string> <string name="stream_accessibility" msgid="301136219144385106">"Kebolehaksesan"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Dering"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Getar"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Redam"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ketik untuk menyahredam."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Ketik untuk menetapkan pada getar. Perkhidmatan kebolehaksesan mungkin diredamkan."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ketik untuk meredam. Perkhidmatan kebolehaksesan mungkin diredamkan."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Apl Segera"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Apl segera tidak memerlukan pemasangan."</string> <string name="app_info" msgid="6856026610594615344">"Maklumat apl"</string> - <string name="go_to_web" msgid="1106022723459948514">"Pergi ke web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Pergi ke penyemak imbas"</string> <string name="mobile_data" msgid="7094582042819250762">"Data mudah alih"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi dimatikan"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth dimatikan"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index a3ec0db8a3d5..22375b4322e9 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ဘလူးတုသ်"</string> <string name="stream_dtmf" msgid="2447177903892477915">"နှစ်လိုင်းပေါင်း အသံပေါင်းစုံ ကြိမ်နှုန်း"</string> <string name="stream_accessibility" msgid="301136219144385106">"အများသုံးစွဲနိုင်မှု"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"အသံမြည်သည်"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"တုန်ခါသည်"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"အသံတိတ်သည်"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s။ အသံပြန်ဖွင့်ရန် တို့ပါ။"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s။ တုန်ခါမှုကို သတ်မှတ်ရန် တို့ပါ။ အများသုံးစွဲနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s။ အသံပိတ်ရန် တို့ပါ။ အများသုံးစွဲနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"ချက်ခြင်းသုံးအက်ပ်များကို ထည့်သွင်းစရာမလိုပါ။"</string> <string name="app_info" msgid="6856026610594615344">"အက်ပ်အချက်အလက်"</string> - <string name="go_to_web" msgid="1106022723459948514">"ဝဘ်သို့ သွားရန်"</string> + <string name="go_to_web" msgid="2650669128861626071">"ဘရောင်ဇာသို့ သွားပါ"</string> <string name="mobile_data" msgid="7094582042819250762">"မိုဘိုင်းဒေတာ"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ကို ပိတ်ထားသည်"</string> <string name="bt_is_off" msgid="2640685272289706392">"ဘလူးတုသ်ကို ပိတ်ထားသည်"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index bebfad541236..51b3b0d6ddf3 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"DTMF (dual-tone multi-frequency)"</string> <string name="stream_accessibility" msgid="301136219144385106">"Tilgjengelighet"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ring"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrer"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ignorer"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Trykk for å slå på lyden."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Trykk for å angi vibrasjon. Lyden kan bli slått av for tilgjengelighetstjenestene."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Trykk for å slå av lyden. Lyden kan bli slått av for tilgjengelighetstjenestene."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Du trenger ikke å installere instant-apper."</string> <string name="app_info" msgid="6856026610594615344">"Info om appen"</string> - <string name="go_to_web" msgid="1106022723459948514">"Gå til nettstedet"</string> + <string name="go_to_web" msgid="2650669128861626071">"Gå til nettleser"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi er av"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth er av"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index bfe8f07fe817..0a63ce2177b7 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ब्लुटुथ"</string> <string name="stream_dtmf" msgid="2447177903892477915">"दोहोरो बहु टोनको फ्रिक्वेन्सी"</string> <string name="stream_accessibility" msgid="301136219144385106">"पहुँच"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"घन्टी"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"कम्पन"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"म्युट गर्नुहोस्"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s। अनम्यूट गर्नका लागि ट्याप गर्नुहोस्।"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s। कम्पनमा सेट गर्नका लागि ट्याप गर्नुहोस्। पहुँच सम्बन्धी सेवाहरू म्यूट हुन सक्छन्।"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। म्यूट गर्नका लागि ट्याप गर्नुहोस्। पहुँच सम्बन्धी सेवाहरू म्यूट हुन सक्छन्।"</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"तात्कालिक अनुप्रयोगहरू"</string> <string name="instant_apps_message" msgid="8116608994995104836">"तात्कालिक अनुप्रयोगहरूलाई स्थापना गर्नु पर्दैन|"</string> <string name="app_info" msgid="6856026610594615344">"अनुप्रयोगका बारे जानकारी"</string> - <string name="go_to_web" msgid="1106022723459948514">"वेबमा जानुहोस्"</string> + <string name="go_to_web" msgid="2650669128861626071">"ब्राउजरमा जानुहोस्"</string> <string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi‑Fi निष्क्रिय छ"</string> <string name="bt_is_off" msgid="2640685272289706392">"ब्लुटुथ निष्क्रिय छ"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 98ad14fe3f06..ca0fa073aea2 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Frequentie voor tweevoudige multitoon"</string> <string name="stream_accessibility" msgid="301136219144385106">"Toegankelijkheid"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Bellen"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Trillen"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Dempen"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tik om dempen op te heffen."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tik om in te stellen op trillen. Toegankelijkheidsservices kunnen zijn gedempt."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tik om te dempen. Toegankelijkheidsservices kunnen zijn gedempt."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant-apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Instant-apps hoeven niet te worden geïnstalleerd."</string> <string name="app_info" msgid="6856026610594615344">"App-info"</string> - <string name="go_to_web" msgid="1106022723459948514">"Ga naar internet"</string> + <string name="go_to_web" msgid="2650669128861626071">"Ga naar browser"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobiele data"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wifi is uitgeschakeld"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth is uitgeschakeld"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 870629869c22..c6475dcc361b 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -34,17 +34,14 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"ਸੂਚਨਾਵਾਂ"</string> <string name="battery_low_title" msgid="6456385927409742437">"ਬੈਟਰੀ ਘੱਟ ਹੈ"</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> ਬਾਕੀ"</string> - <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) --> - <skip /> + <string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> ਬਾਕੀ। ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ।"</string> <string name="invalid_charger" msgid="4549105996740522523">"USB ਚਾਰਜਿੰਗ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ।\nਕੇਵਲ ਸਪਲਾਈ ਕੀਤਾ ਚਾਰਜਰ ਵਰਤੋ।"</string> <string name="invalid_charger_title" msgid="3515740382572798460">"USB ਚਾਰਜਿੰਗ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ।"</string> <string name="invalid_charger_text" msgid="5474997287953892710">"ਕੇਵਲ ਸਪਲਾਈ ਕੀਤਾ ਚਾਰਜਰ ਵਰਤੋ।"</string> <string name="battery_low_why" msgid="4553600287639198111">"ਸੈਟਿੰਗਾਂ"</string> - <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) --> - <skip /> + <string name="battery_saver_confirmation_title" msgid="2052100465684817154">"ਕੀ ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string> <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ਚਾਲੂ ਕਰੋ"</string> - <!-- no translation found for battery_saver_start_action (8187820911065797519) --> - <skip /> + <string name="battery_saver_start_action" msgid="8187820911065797519">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਕਰੋ"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ਸੈਟਿੰਗਾਂ"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ਵਾਈ-ਫਾਈ"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ਸਕ੍ਰੀਨ ਆਪਣੇ-ਆਪ ਘੁੰਮਾਓ"</string> @@ -402,11 +399,9 @@ <string name="user_remove_user_title" msgid="4681256956076895559">"ਕੀ ਵਰਤੋਂਕਾਰ ਹਟਾਉਣਾ ਹੈ?"</string> <string name="user_remove_user_message" msgid="1453218013959498039">"ਇਸ ਉਪਭੋਗਤਾ ਦੇ ਸਾਰੇ ਐਪਸ ਅਤੇ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"ਹਟਾਓ"</string> - <!-- no translation found for battery_saver_notification_title (8614079794522291840) --> - <skip /> + <string name="battery_saver_notification_title" msgid="8614079794522291840">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਪਿਛੋਕੜ ਡਾਟਾ ਘੱਟ ਕਰਦਾ ਹੈ"</string> - <!-- no translation found for battery_saver_notification_action_text (132118784269455533) --> - <skip /> + <string name="battery_saver_notification_action_text" msgid="132118784269455533">"ਬੈਟਰੀ ਸੇਵਰ ਬੰਦ ਕਰੋ"</string> <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ਉਹ ਸਭ ਕੁਝ ਕੈਪਚਰ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰ ਦੇਵੇਗਾ, ਜੋ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਤੇ ਡਿਸਪਲੇ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।"</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string> @@ -497,6 +492,12 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ਬਲੂਟੁੱਥ"</string> <string name="stream_dtmf" msgid="2447177903892477915">"ਦੂਹਰੀ ਮਲਟੀ ਟੋਨ ਆਵਰਤੀ"</string> <string name="stream_accessibility" msgid="301136219144385106">"ਪਹੁੰਚਯੋਗਤਾ"</string> + <!-- no translation found for volume_ringer_status_normal (4273142424125855384) --> + <skip /> + <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) --> + <skip /> + <!-- no translation found for volume_ringer_status_silent (6896394161022916369) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s। ਅਣਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s। ਥਰਥਰਾਹਟ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਪਹੁੰਚਯੋਗਤਾ ਸੇਵਾਵਾਂ ਮਿਊਟ ਹੋ ਸਕਦੀਆਂ ਹਨ।"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। ਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਪਹੁੰਚਯੋਗਤਾ ਸੇਵਾਵਾਂ ਮਿਊਟ ਹੋ ਸਕਦੀਆਂ ਹਨ।"</string> @@ -761,7 +762,7 @@ <string name="instant_apps" msgid="6647570248119804907">"ਤਤਕਾਲ ਐਪਾਂ"</string> <string name="instant_apps_message" msgid="8116608994995104836">"ਤਤਕਾਲ ਐਪਾਂ ਨੂੰ ਸਥਾਪਨਾ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ।"</string> <string name="app_info" msgid="6856026610594615344">"ਐਪ ਜਾਣਕਾਰੀ"</string> - <string name="go_to_web" msgid="1106022723459948514">"ਵੈੱਬ \'ਤੇ ਜਾਓ"</string> + <string name="go_to_web" msgid="2650669128861626071">"ਬ੍ਰਾਊਜ਼ਰ \'ਤੇ ਜਾਓ"</string> <string name="mobile_data" msgid="7094582042819250762">"ਮੋਬਾਈਲ ਡਾਟਾ"</string> <string name="wifi_is_off" msgid="1838559392210456893">"ਵਾਈ-ਫਾਈ ਬੰਦ ਹੈ"</string> <string name="bt_is_off" msgid="2640685272289706392">"ਬਲੂਟੁੱਥ ਬੰਦ ਹੈ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 56a8e599115c..bc2a9545e526 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -496,6 +496,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"DTMF"</string> <string name="stream_accessibility" msgid="301136219144385106">"Ułatwienia dostępu"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Dzwonek"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Wibracje"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Wyciszenie"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Kliknij, by wyłączyć wyciszenie."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Kliknij, by włączyć wibracje. Ułatwienia dostępu mogą być wyciszone."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Kliknij, by wyciszyć. Ułatwienia dostępu mogą być wyciszone."</string> @@ -768,7 +771,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Aplikacje błyskawiczne"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Aplikacji błyskawicznych nie trzeba instalować."</string> <string name="app_info" msgid="6856026610594615344">"O aplikacji"</string> - <string name="go_to_web" msgid="1106022723459948514">"Wejdź na stronę internetową"</string> + <string name="go_to_web" msgid="2650669128861626071">"Otwórz przeglądarkę"</string> <string name="mobile_data" msgid="7094582042819250762">"Komórkowa transmisja danych"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi jest wyłączone"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth jest wyłączony"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index a7c3af123393..61aa901f90e6 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Multifrequência de dois tons"</string> <string name="stream_accessibility" msgid="301136219144385106">"Acessibilidade"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Tocar"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ignorar"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toque para ativar o som."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toque para configurar para vibrar. É possível que os serviços de acessibilidade sejam silenciados."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Os Instant Apps não requerem instalação."</string> <string name="app_info" msgid="6856026610594615344">"Informações do app"</string> - <string name="go_to_web" msgid="1106022723459948514">"Acessar a Web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Abrir o navegador"</string> <string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string> <string name="wifi_is_off" msgid="1838559392210456893">"O Wi-Fi está desativado"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth desativado"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index b5b3475b6ca1..7f2c6435612f 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Multifrequência de duas tonalidades"</string> <string name="stream_accessibility" msgid="301136219144385106">"Acessibilidade"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Toque"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Desativar som"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toque para reativar o som."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toque para ativar a vibração. Os serviços de acessibilidade podem ser silenciados."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para desativar o som. Os serviços de acessibilidade podem ser silenciados."</string> @@ -756,8 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Aplicações instantâneas"</string> <string name="instant_apps_message" msgid="8116608994995104836">"As Aplicações instantâneas não requerem instalação."</string> <string name="app_info" msgid="6856026610594615344">"Informações da aplicação"</string> - <!-- no translation found for go_to_web (2650669128861626071) --> - <skip /> + <string name="go_to_web" msgid="2650669128861626071">"Ir para o navegador"</string> <string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi desativado"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth desativado"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index a7c3af123393..61aa901f90e6 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Multifrequência de dois tons"</string> <string name="stream_accessibility" msgid="301136219144385106">"Acessibilidade"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Tocar"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ignorar"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toque para ativar o som."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toque para configurar para vibrar. É possível que os serviços de acessibilidade sejam silenciados."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Os Instant Apps não requerem instalação."</string> <string name="app_info" msgid="6856026610594615344">"Informações do app"</string> - <string name="go_to_web" msgid="1106022723459948514">"Acessar a Web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Abrir o navegador"</string> <string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string> <string name="wifi_is_off" msgid="1838559392210456893">"O Wi-Fi está desativado"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth desativado"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 4392efe88f32..21084556050a 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -496,6 +496,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Frecvență tonuri multiple duale"</string> <string name="stream_accessibility" msgid="301136219144385106">"Accesibilitate"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Sonerie"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrații"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Blocați"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Atingeți pentru a activa sunetul."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Atingeți pentru a seta vibrarea. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Atingeți pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string> @@ -764,7 +767,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Aplicații instantanee"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Aplicațiile instantanee nu necesită instalare."</string> <string name="app_info" msgid="6856026610594615344">"Informații despre aplicație"</string> - <string name="go_to_web" msgid="1106022723459948514">"Accesați pe web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Accesați browserul"</string> <string name="mobile_data" msgid="7094582042819250762">"Date mobile"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Conexiunea Wi-Fi este dezactivată"</string> <string name="bt_is_off" msgid="2640685272289706392">"Funcția Bluetooth este dezactivată"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index fd1d3be536a4..ac4f5fec55f2 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -498,6 +498,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Тональный набор"</string> <string name="stream_accessibility" msgid="301136219144385106">"Специальные возможности"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Со звуком"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Вибрация"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Без звука"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Нажмите, чтобы включить звук."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Нажмите, чтобы включить вибрацию. Специальные возможности могут прекратить работу."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Нажмите, чтобы выключить звук. Специальные возможности могут прекратить работу."</string> @@ -770,7 +773,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Приложения с мгновенным запуском"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Приложения с мгновенным запуском не требуется устанавливать."</string> <string name="app_info" msgid="6856026610594615344">"О приложении"</string> - <string name="go_to_web" msgid="1106022723459948514">"Перейти в браузер"</string> + <string name="go_to_web" msgid="2650669128861626071">"Перейти в браузер"</string> <string name="mobile_data" msgid="7094582042819250762">"Моб. Интернет"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Модуль Wi-Fi отключен"</string> <string name="bt_is_off" msgid="2640685272289706392">"Модуль Bluetooth отключен"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index fd636ad47235..12f4838f1cb2 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"බ්ලූටූත්"</string> <string name="stream_dtmf" msgid="2447177903892477915">"ද්විත්ව බහු ස්වර සංඛ්යාතය"</string> <string name="stream_accessibility" msgid="301136219144385106">"ප්රවේශ්යතාව"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"නාද කරන්න"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"කම්පනය කරන්න"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"නිහඬ කරන්න"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. නිහඬ කිරීම ඉවත් කිරීමට තට්ටු කරන්න."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. කම්පනය කිරීමට තට්ටු කරන්න. ප්රවේශ්යතා සේවා නිහඬ කළ හැකිය."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. නිහඬ කිරීමට තට්ටු කරන්න. ප්රවේශ්යතා සේවා නිහඬ කළ හැකිය."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"ක්ෂණික යෙදුම්"</string> <string name="instant_apps_message" msgid="8116608994995104836">"ක්ෂණික යෙදුම් ස්ථාපනය කිරීම අවශ්ය නොවේ."</string> <string name="app_info" msgid="6856026610594615344">"යෙදුම් තොරතුරු"</string> - <string name="go_to_web" msgid="1106022723459948514">"වෙබය වෙත යන්න"</string> + <string name="go_to_web" msgid="2650669128861626071">"බ්රවුසරය වෙත යන්න"</string> <string name="mobile_data" msgid="7094582042819250762">"ජංගම දත්ත"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ක්රියා විරහිතයි"</string> <string name="bt_is_off" msgid="2640685272289706392">"බ්ලූටූත් ක්රියා විරහිතයි"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index b7f54450176c..151c2b4e78b7 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -498,6 +498,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Dvojtónová multifrekvencia"</string> <string name="stream_accessibility" msgid="301136219144385106">"Dostupnosť"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Prezvoniť"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrovať"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Vypnúť zvuk"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Klepnutím zapnite zvuk."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Klepnutím aktivujte režim vibrovania. Služby dostupnosti je možné stlmiť."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Klepnutím vypnite zvuk. Služby dostupnosti je možné stlmiť."</string> @@ -770,7 +773,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Okamžité aplikácie"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Okamžité aplikácie nevyžadujú inštaláciu."</string> <string name="app_info" msgid="6856026610594615344">"Info o aplikácii"</string> - <string name="go_to_web" msgid="1106022723459948514">"Prejsť na internet"</string> + <string name="go_to_web" msgid="2650669128861626071">"Otvoriť prehliadač"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilné dáta"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Pripojenie Wi‑Fi je vypnuté"</string> <string name="bt_is_off" msgid="2640685272289706392">"Rozhranie Bluetooth je vypnuté"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 5a00c5355b8c..ee628e121636 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -498,6 +498,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Dvojna večtonska frekvenca"</string> <string name="stream_accessibility" msgid="301136219144385106">"Funkcije za ljudi s posebnimi potrebami"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zvonjenje"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibriranje"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Utišano"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Dotaknite se, če želite vklopiti zvok."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Dotaknite se, če želite nastaviti vibriranje. V storitvah za ljudi s posebnimi potrebami bo morda izklopljen zvok."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dotaknite se, če želite izklopiti zvok. V storitvah za ljudi s posebnimi potrebami bo morda izklopljen zvok."</string> @@ -770,7 +773,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Nenamestljive aplikacije"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Nenamestljivih aplikacij ni treba namestiti."</string> <string name="app_info" msgid="6856026610594615344">"Podatki o aplikaciji"</string> - <string name="go_to_web" msgid="1106022723459948514">"Pojdi v splet"</string> + <string name="go_to_web" msgid="2650669128861626071">"Odpri brskalnik"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobilni podatki"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je izklopljen"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je izklopljen"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 801ee90c0c1a..7641e6c6d29f 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Frekuenca e dyfishtë me shumë tone"</string> <string name="stream_accessibility" msgid="301136219144385106">"Qasshmëria"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Bjeri ziles"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Dridhje"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Pa zë"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Trokit për të aktivizuar."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Trokit për ta caktuar te dridhja. Shërbimet e qasshmërisë mund të çaktivizohen."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Trokit për të çaktivizuar. Shërbimet e qasshmërisë mund të çaktivizohen."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Aplikacionet e çastit"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Aplikacionet e çastit nuk kërkojnë instalim."</string> <string name="app_info" msgid="6856026610594615344">"Informacioni mbi aplikacionin"</string> - <string name="go_to_web" msgid="1106022723459948514">"Shko në ueb"</string> + <string name="go_to_web" msgid="2650669128861626071">"Shko te shfletuesi"</string> <string name="mobile_data" msgid="7094582042819250762">"Të dhënat celulare"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi është joaktiv"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth-i është joaktiv"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 7a76d4002f30..b5fab0d76028 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Вишеструка фреквенција дуалног тона"</string> <string name="stream_accessibility" msgid="301136219144385106">"Приступачност"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Активирај звоно"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Вибрирај"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Искључи звук"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Додирните да бисте укључили звук."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Додирните да бисте подесили на вибрацију. Звук услуга приступачности ће можда бити искључен."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Додирните да бисте искључили звук. Звук услуга приступачности ће можда бити искључен."</string> @@ -762,7 +765,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Инстант апликације"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликације не захтевају инсталацију."</string> <string name="app_info" msgid="6856026610594615344">"Информације о апликацији"</string> - <string name="go_to_web" msgid="1106022723459948514">"Иди на веб"</string> + <string name="go_to_web" msgid="2650669128861626071">"Иди на прегледач"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобилни подаци"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi је искључен"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth је искључен"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 9b978e2ff2b7..cc6f542a0b2c 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Tonval"</string> <string name="stream_accessibility" msgid="301136219144385106">"Tillgänglighet"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ringsignal"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibration"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Dölj"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tryck här om du vill slå på ljudet."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tryck här om du vill sätta på vibrationen. Tillgänglighetstjänster kanske inaktiveras."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tryck här om du vill stänga av ljudet. Tillgänglighetstjänsterna kanske inaktiveras."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Snabbappar behöver inte installeras."</string> <string name="app_info" msgid="6856026610594615344">"Info om appen"</string> - <string name="go_to_web" msgid="1106022723459948514">"Öppna webbplatsen"</string> + <string name="go_to_web" msgid="2650669128861626071">"Öppna webbläsaren"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi är inaktiverat"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth är inaktiverat"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index aa7c3f72aff8..b83f10f24819 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Masafa ya ishara ya kampuni ya simu"</string> <string name="stream_accessibility" msgid="301136219144385106">"Zana za walio na matatizo ya kuona au kusikia"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Piga"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Tetema"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Zima sauti"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Gusa ili urejeshe."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Gusa ili uweke mtetemo. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Gusa ili ukomeshe. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Programu Zinazofunguka Papo Hapo"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Huhitaji kusakinisha programu zinazofunguka papo hapo."</string> <string name="app_info" msgid="6856026610594615344">"Maelezo ya programu"</string> - <string name="go_to_web" msgid="1106022723459948514">"Nenda kwenye wavuti"</string> + <string name="go_to_web" msgid="2650669128861626071">"Tumia kivinjari"</string> <string name="mobile_data" msgid="7094582042819250762">"Data ya mtandao wa simu"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi imezimwa"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth imezimwa"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 4278d3683088..9d532e27e67a 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -34,17 +34,14 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"அறிவிப்புகள்"</string> <string name="battery_low_title" msgid="6456385927409742437">"பேட்டரி குறைவு"</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> உள்ளது"</string> - <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) --> - <skip /> + <string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> மீதமுள்ளது. பேட்டரி சேமிப்பான் ஆன் செய்யப்பட்டுள்ளது."</string> <string name="invalid_charger" msgid="4549105996740522523">"USB மூலம் சார்ஜ் செய்வது ஆதரிக்கப்படவில்லை.\nவழங்கப்பட்ட சார்ஜரை மட்டும் பயன்படுத்தவும்."</string> <string name="invalid_charger_title" msgid="3515740382572798460">"USB சார்ஜிங் ஆதரிக்கப்படவில்லை."</string> <string name="invalid_charger_text" msgid="5474997287953892710">"வழங்கப்பட்ட சார்ஜரை மட்டும் பயன்படுத்துக."</string> <string name="battery_low_why" msgid="4553600287639198111">"அமைப்பு"</string> - <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) --> - <skip /> + <string name="battery_saver_confirmation_title" msgid="2052100465684817154">"பேட்டரி சேமிப்பானை ஆன் செய்யவா?"</string> <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"இயக்கு"</string> - <!-- no translation found for battery_saver_start_action (8187820911065797519) --> - <skip /> + <string name="battery_saver_start_action" msgid="8187820911065797519">"பேட்டரி சேமிப்பானை ஆன் செய்"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"அமைப்பு"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"வைஃபை"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"திரையைத் தானாகச் சுழற்று"</string> @@ -402,11 +399,9 @@ <string name="user_remove_user_title" msgid="4681256956076895559">"பயனரை அகற்றவா?"</string> <string name="user_remove_user_message" msgid="1453218013959498039">"இந்தப் பயனரின் எல்லா பயன்பாடுகளும் தரவும் நீக்கப்படும்."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"அகற்று"</string> - <!-- no translation found for battery_saver_notification_title (8614079794522291840) --> - <skip /> + <string name="battery_saver_notification_title" msgid="8614079794522291840">"பேட்டரி சேமிப்பான் ஆன் செய்யப்பட்டுள்ளது"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"செயல்திறனையும் பின்புலத் தரவையும் குறைக்கிறது"</string> - <!-- no translation found for battery_saver_notification_action_text (132118784269455533) --> - <skip /> + <string name="battery_saver_notification_action_text" msgid="132118784269455533">"பேட்டரி சேமிப்பானை ஆஃப் செய்"</string> <string name="media_projection_dialog_text" msgid="3071431025448218928">"திரையில் காட்டப்படும் அனைத்தையும் <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> படமெடுக்கும்."</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"மீண்டும் காட்டாதே"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"எல்லாவற்றையும் அழி"</string> @@ -497,6 +492,12 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"புளூடூத்"</string> <string name="stream_dtmf" msgid="2447177903892477915">"டூயல் டோன் மல்டி ஃப்ரீக்வென்சி"</string> <string name="stream_accessibility" msgid="301136219144385106">"அணுகல்தன்மை"</string> + <!-- no translation found for volume_ringer_status_normal (4273142424125855384) --> + <skip /> + <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) --> + <skip /> + <!-- no translation found for volume_ringer_status_silent (6896394161022916369) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ஒலி இயக்க, தட்டவும்."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. அதிர்விற்கு அமைக்க, தட்டவும். அணுகல்தன்மை சேவைகள் ஒலியடக்கப்படக்கூடும்."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ஒலியடக்க, தட்டவும். அணுகல்தன்மை சேவைகள் ஒலியடக்கப்படக்கூடும்."</string> @@ -761,7 +762,7 @@ <string name="instant_apps" msgid="6647570248119804907">"இன்ஸ்டண்ட் பயன்பாடுகள்"</string> <string name="instant_apps_message" msgid="8116608994995104836">"இன்ஸ்டண்ட் பயன்பாடுகளுக்கு நிறுவல் தேவையில்லை."</string> <string name="app_info" msgid="6856026610594615344">"ஆப்ஸ் தகவல்"</string> - <string name="go_to_web" msgid="1106022723459948514">"இணையத்திற்குச் செல்"</string> + <string name="go_to_web" msgid="2650669128861626071">"உலாவிக்குக்குச் செல்"</string> <string name="mobile_data" msgid="7094582042819250762">"மொபைல் டேட்டா"</string> <string name="wifi_is_off" msgid="1838559392210456893">"வைஃபை முடக்கத்தில் உள்ளது"</string> <string name="bt_is_off" msgid="2640685272289706392">"புளூடூத் முடக்கத்தில் உள்ளது"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 60fe59a232c0..f1c66f5c942d 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -34,17 +34,14 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"నోటిఫికేషన్లు"</string> <string name="battery_low_title" msgid="6456385927409742437">"బ్యాటరీ తక్కువగా ఉంది"</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> మిగిలి ఉంది"</string> - <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) --> - <skip /> + <string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> మిగిలి ఉంది. బ్యాటరీ సేవర్ ఆన్లో ఉంది."</string> <string name="invalid_charger" msgid="4549105996740522523">"USB ఛార్జింగ్కు మద్దతు లేదు.\nఅందించిన ఛార్జర్ను మాత్రమే ఉపయోగించండి."</string> <string name="invalid_charger_title" msgid="3515740382572798460">"USB ఛార్జింగ్కి మద్దతు లేదు."</string> <string name="invalid_charger_text" msgid="5474997287953892710">"అందించిన ఛార్జర్ను మాత్రమే ఉపయోగించండి."</string> <string name="battery_low_why" msgid="4553600287639198111">"సెట్టింగ్లు"</string> - <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) --> - <skip /> + <string name="battery_saver_confirmation_title" msgid="2052100465684817154">"బ్యాటరీ సేవర్ను ఆన్ చేయాలా?"</string> <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ఆన్ చేయి"</string> - <!-- no translation found for battery_saver_start_action (8187820911065797519) --> - <skip /> + <string name="battery_saver_start_action" msgid="8187820911065797519">"బ్యాటరీ సేవర్ను ఆన్ చేయండి"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"సెట్టింగ్లు"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"స్క్రీన్ను స్వయంచాలకంగా తిప్పండి"</string> @@ -402,11 +399,9 @@ <string name="user_remove_user_title" msgid="4681256956076895559">"వినియోగదారుని తీసివేయాలా?"</string> <string name="user_remove_user_message" msgid="1453218013959498039">"ఈ వినియోగదారుకు సంబంధించిన అన్ని అనువర్తనాలు మరియు డేటా తొలగించబడతాయి."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"తీసివేయి"</string> - <!-- no translation found for battery_saver_notification_title (8614079794522291840) --> - <skip /> + <string name="battery_saver_notification_title" msgid="8614079794522291840">"బ్యాటరీ సేవర్ ఆన్లో ఉంది"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"పనితీరుని మరియు నేపథ్య డేటాను తగ్గిస్తుంది"</string> - <!-- no translation found for battery_saver_notification_action_text (132118784269455533) --> - <skip /> + <string name="battery_saver_notification_action_text" msgid="132118784269455533">"బ్యాటరీ సేవర్ను ఆఫ్ చేయండి"</string> <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> మీ స్క్రీన్పై కనిపించే ప్రతిదాన్ని క్యాప్చర్ చేయడం ప్రారంభిస్తుంది."</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"మళ్లీ చూపవద్దు"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"అన్నీ క్లియర్ చేయండి"</string> @@ -497,6 +492,12 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"బ్లూటూత్"</string> <string name="stream_dtmf" msgid="2447177903892477915">"డ్యూయల్ మల్టీ టోన్ ఫ్రీక్వెన్సీ"</string> <string name="stream_accessibility" msgid="301136219144385106">"యాక్సెస్ సామర్థ్యం"</string> + <!-- no translation found for volume_ringer_status_normal (4273142424125855384) --> + <skip /> + <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) --> + <skip /> + <!-- no translation found for volume_ringer_status_silent (6896394161022916369) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. అన్మ్యూట్ చేయడానికి నొక్కండి."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. వైబ్రేషన్కు సెట్ చేయడానికి నొక్కండి. యాక్సెస్ సామర్థ్య సేవలు మ్యూట్ చేయబడవచ్చు."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. మ్యూట్ చేయడానికి నొక్కండి. యాక్సెస్ సామర్థ్య సేవలు మ్యూట్ చేయబడవచ్చు."</string> @@ -761,7 +762,7 @@ <string name="instant_apps" msgid="6647570248119804907">"తక్షణ అనువర్తనాలు"</string> <string name="instant_apps_message" msgid="8116608994995104836">"తక్షణ అనువర్తనాలకు ఇన్స్టాలేషన్ అవసరం లేదు."</string> <string name="app_info" msgid="6856026610594615344">"యాప్ సమాచారం"</string> - <string name="go_to_web" msgid="1106022723459948514">"వెబ్కు వెళ్లు"</string> + <string name="go_to_web" msgid="2650669128861626071">"బ్రౌజర్కు వెళ్లండి"</string> <string name="mobile_data" msgid="7094582042819250762">"మొబైల్ డేటా"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ఆఫ్లో ఉంది"</string> <string name="bt_is_off" msgid="2640685272289706392">"బ్లూటూత్ ఆఫ్లో ఉంది"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 3dc4513b906e..ea61018db6c2 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"บลูทูธ"</string> <string name="stream_dtmf" msgid="2447177903892477915">"การส่งสัญญาณเสียงแบบ 2 เสียงพร้อมกัน"</string> <string name="stream_accessibility" msgid="301136219144385106">"การเข้าถึง"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ทำให้ส่งเสียง"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"สั่น"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ปิดเสียง"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s แตะเพื่อเปิดเสียง"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s แตะเพื่อตั้งค่าให้สั่น อาจมีการปิดเสียงบริการการเข้าถึง"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s แตะเพื่อปิดเสียง อาจมีการปิดเสียงบริการการเข้าถึง"</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant App"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Instant Apps ไม่ต้องใช้การติดตั้ง"</string> <string name="app_info" msgid="6856026610594615344">"ข้อมูลแอป"</string> - <string name="go_to_web" msgid="1106022723459948514">"ไปที่เว็บ"</string> + <string name="go_to_web" msgid="2650669128861626071">"ไปที่เบราว์เซอร์"</string> <string name="mobile_data" msgid="7094582042819250762">"ข้อมูลมือถือ"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ปิดอยู่"</string> <string name="bt_is_off" msgid="2640685272289706392">"บลูทูธปิดอยู่"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index f8f915985853..cdf28d6e5348 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Dual multi tone frequency"</string> <string name="stream_accessibility" msgid="301136219144385106">"Pagiging Naa-access"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ipa-ring"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"I-vibrate"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"I-mute"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. I-tap upang i-unmute."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. I-tap upang itakda na mag-vibrate. Maaaring i-mute ang mga serbisyo sa Accessibility."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. I-tap upang i-mute. Maaaring i-mute ang mga serbisyo sa Accessibility."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Hindi kailangang i-install ang mga instant na app."</string> <string name="app_info" msgid="6856026610594615344">"Impormasyon ng app"</string> - <string name="go_to_web" msgid="1106022723459948514">"Pumunta sa web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Pumunta sa browser"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Naka-off ang Wi-Fi"</string> <string name="bt_is_off" msgid="2640685272289706392">"Naka-off ang Bluetooth"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 249964511500..5dc81a1d7eaf 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Çift ton çoklu frekans"</string> <string name="stream_accessibility" msgid="301136219144385106">"Erişilebilirlik"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zili çaldır"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Titreşim"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Sesi kapat"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Sesi açmak için dokunun."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Titreşime ayarlamak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sesi kapatmak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Hazır Uygulamalar"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Hazır uygulamaların yüklenmesi gerekmez."</string> <string name="app_info" msgid="6856026610594615344">"Uygulama bilgileri"</string> - <string name="go_to_web" msgid="1106022723459948514">"Web\'e git"</string> + <string name="go_to_web" msgid="2650669128861626071">"Tarayıcıya git"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobil veriler"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Kablosuz bağlantı kapalı"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth kapalı"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 95cd2d078817..8fa1b72239b2 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -498,6 +498,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Двотональний багаточастотний аналоговий сигнал"</string> <string name="stream_accessibility" msgid="301136219144385106">"Спеціальні можливості"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Дзвінок"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Вібросигнал"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Без звуку"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Торкніться, щоб увімкнути звук."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Торкніться, щоб налаштувати вібросигнал. Спеціальні можливості може бути вимкнено."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Торкніться, щоб вимкнути звук. Спеціальні можливості може бути вимкнено."</string> @@ -770,8 +773,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Додатки з миттєвим запуском"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Додатки з миттєвим запуском не потрібно встановлювати."</string> <string name="app_info" msgid="6856026610594615344">"Про додаток"</string> - <!-- no translation found for go_to_web (2650669128861626071) --> - <skip /> + <string name="go_to_web" msgid="2650669128861626071">"Веб-переглядач"</string> <string name="mobile_data" msgid="7094582042819250762">"Мобільний трафік"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi вимкнено"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth вимкнено"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 04bd3401f79f..64980887907f 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -34,17 +34,14 @@ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"اطلاعات"</string> <string name="battery_low_title" msgid="6456385927409742437">"بیٹری کم ہے"</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> باقی ہے"</string> - <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) --> - <skip /> + <string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"<xliff:g id="PERCENTAGE">%s</xliff:g> باقی ہے۔ بیٹری سیور آن ہے۔"</string> <string name="invalid_charger" msgid="4549105996740522523">"USB چارجنگ تعاون یافتہ نہیں ہے.\nصرف فراہم کردہ چارجر کا ہی استعمال کریں۔"</string> <string name="invalid_charger_title" msgid="3515740382572798460">"USB چارجنگ تعاون یافتہ نہیں ہے۔"</string> <string name="invalid_charger_text" msgid="5474997287953892710">"صرف فراہم کردہ چارجر استعمال کریں۔"</string> <string name="battery_low_why" msgid="4553600287639198111">"ترتیبات"</string> - <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) --> - <skip /> + <string name="battery_saver_confirmation_title" msgid="2052100465684817154">"بیٹری سیور آن کریں؟"</string> <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"آن کریں"</string> - <!-- no translation found for battery_saver_start_action (8187820911065797519) --> - <skip /> + <string name="battery_saver_start_action" msgid="8187820911065797519">"بیٹری سیور آن کریں"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ترتیبات"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"سکرین کو خودکار طور پر گھمائیں"</string> @@ -402,11 +399,9 @@ <string name="user_remove_user_title" msgid="4681256956076895559">"صارف کو ہٹائیں؟"</string> <string name="user_remove_user_message" msgid="1453218013959498039">"اس صارف کی سبھی ایپس اور ڈیٹا حذف کر دیا جائے گا۔"</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"ہٹائیں"</string> - <!-- no translation found for battery_saver_notification_title (8614079794522291840) --> - <skip /> + <string name="battery_saver_notification_title" msgid="8614079794522291840">"بیٹری سیور آن ہے"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"کارکردگی اور پس منظر کا ڈیٹا کم کر دیتا ہے"</string> - <!-- no translation found for battery_saver_notification_action_text (132118784269455533) --> - <skip /> + <string name="battery_saver_notification_action_text" msgid="132118784269455533">"بیٹری سیور آف کریں"</string> <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> آپ کی اسکرین پر ڈسپلے ہونے والی ہر چیز کو کیپچر کرنا شروع کر دیگی۔"</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"دوبارہ نہ دکھائیں"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"سبھی کو صاف کریں"</string> @@ -497,6 +492,12 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"بلوٹوتھ"</string> <string name="stream_dtmf" msgid="2447177903892477915">"دوہری ملٹی ٹون فریکوئنسی"</string> <string name="stream_accessibility" msgid="301136219144385106">"ایکسیسبیلٹی"</string> + <!-- no translation found for volume_ringer_status_normal (4273142424125855384) --> + <skip /> + <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) --> + <skip /> + <!-- no translation found for volume_ringer_status_silent (6896394161022916369) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s۔ آواز چالو کرنے کیلئے تھپتھپائیں۔"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s۔ ارتعاش پر سیٹ کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔"</string> @@ -761,7 +762,7 @@ <string name="instant_apps" msgid="6647570248119804907">"فوری ایپس"</string> <string name="instant_apps_message" msgid="8116608994995104836">"فوری ایپس کو انسٹالیشن کی ضرورت نہیں ہے۔"</string> <string name="app_info" msgid="6856026610594615344">"ایپ کی معلومات"</string> - <string name="go_to_web" msgid="1106022723459948514">"ویب پر جائیں"</string> + <string name="go_to_web" msgid="2650669128861626071">"براؤزر پر جائیں"</string> <string name="mobile_data" msgid="7094582042819250762">"موبائل ڈیٹا"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi آف ہے"</string> <string name="bt_is_off" msgid="2640685272289706392">"بلوٹوتھ آف ہے"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index e66477fa652f..273079d7dcc2 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Ikkitali ko‘pchastotali ovoz"</string> <string name="stream_accessibility" msgid="301136219144385106">"Maxsus imkoniyatlar"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Jiringlatish"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Tebranish"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ovozsiz"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ovozini yoqish uchun ustiga bosing."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tebranishni yoqish uchun ustiga bosing. Maxsus imkoniyatlar ishlamasligi mumkin."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ovozini o‘chirish uchun ustiga bosing. Maxsus imkoniyatlar ishlamasligi mumkin."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Darhol ochiladigan ilovalar"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Darhol ochiladigan ilovalarni o‘rnatish shart emas."</string> <string name="app_info" msgid="6856026610594615344">"Ilova haqida"</string> - <string name="go_to_web" msgid="1106022723459948514">"Brauzerga o‘tish"</string> + <string name="go_to_web" msgid="2650669128861626071">"Brauzerni ochish"</string> <string name="mobile_data" msgid="7094582042819250762">"Mobil internet"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi o‘chiq"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth o‘chiq"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 237920de5146..df062984e2d3 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Tần số đa chuông kép"</string> <string name="stream_accessibility" msgid="301136219144385106">"Trợ năng"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Đổ chuông"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Rung"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Tắt tiếng"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Nhấn để bật tiếng."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Nhấn để đặt chế độ rung. Bạn có thể tắt tiếng dịch vụ trợ năng."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Nhấn để tắt tiếng. Bạn có thể tắt tiếng dịch vụ trợ năng."</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Ứng dụng tức thì"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Ứng dụng tức thì không yêu cầu cài đặt."</string> <string name="app_info" msgid="6856026610594615344">"Thông tin ứng dụng"</string> - <string name="go_to_web" msgid="1106022723459948514">"Truy cập web"</string> + <string name="go_to_web" msgid="2650669128861626071">"Đi tới trình duyệt"</string> <string name="mobile_data" msgid="7094582042819250762">"Dữ liệu di động"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi tắt"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth tắt"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index d80d1bf7d1e5..f7999a6d9789 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"蓝牙"</string> <string name="stream_dtmf" msgid="2447177903892477915">"双音多频"</string> <string name="stream_accessibility" msgid="301136219144385106">"无障碍"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"响铃"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"振动"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"静音"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s。点按即可取消静音。"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s。点按即可设为振动,但可能会同时将无障碍服务设为静音。"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。点按即可设为静音,但可能会同时将无障碍服务设为静音。"</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"免安装应用"</string> <string name="instant_apps_message" msgid="8116608994995104836">"免安装应用无需安装就能使用。"</string> <string name="app_info" msgid="6856026610594615344">"应用信息"</string> - <string name="go_to_web" msgid="1106022723459948514">"转到网页版"</string> + <string name="go_to_web" msgid="2650669128861626071">"转到浏览器"</string> <string name="mobile_data" msgid="7094582042819250762">"移动数据"</string> <string name="wifi_is_off" msgid="1838559392210456893">"WLAN 已关闭"</string> <string name="bt_is_off" msgid="2640685272289706392">"蓝牙已关闭"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 7da008d46704..188ad7cae870 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -494,6 +494,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"藍牙"</string> <string name="stream_dtmf" msgid="2447177903892477915">"雙音多頻訊號"</string> <string name="stream_accessibility" msgid="301136219144385106">"無障礙功能"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"鈴聲"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"震動"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"靜音"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s。輕按即可取消靜音。"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s。輕按即可設為震動。無障礙功能服務可能已經設為靜音。"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。輕按即可設為靜音。無障礙功能服務可能已經設為靜音。"</string> @@ -758,7 +761,7 @@ <string name="instant_apps" msgid="6647570248119804907">"即時應用程式"</string> <string name="instant_apps_message" msgid="8116608994995104836">"即時應用程式無需安裝即可使用。"</string> <string name="app_info" msgid="6856026610594615344">"應用程式資料"</string> - <string name="go_to_web" msgid="1106022723459948514">"前往網頁版"</string> + <string name="go_to_web" msgid="2650669128861626071">"前往瀏覽器"</string> <string name="mobile_data" msgid="7094582042819250762">"流動數據"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi 已關閉"</string> <string name="bt_is_off" msgid="2640685272289706392">"藍牙已關閉"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index efb48cda55e2..75f8015fda5a 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"藍牙"</string> <string name="stream_dtmf" msgid="2447177903892477915">"雙音多頻"</string> <string name="stream_accessibility" msgid="301136219144385106">"協助工具"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"鈴聲"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"震動"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"靜音"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s。輕觸即可取消靜音。"</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s。輕觸即可設為震動,但系統可能會將無障礙服務一併設為靜音。"</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。輕觸即可設為靜音,但系統可能會將無障礙服務一併設為靜音。"</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"免安裝應用程式"</string> <string name="instant_apps_message" msgid="8116608994995104836">"免安裝應用程式不必安裝就能使用。"</string> <string name="app_info" msgid="6856026610594615344">"應用程式資訊"</string> - <string name="go_to_web" msgid="1106022723459948514">"前往網頁版"</string> + <string name="go_to_web" msgid="2650669128861626071">"前往瀏覽器"</string> <string name="mobile_data" msgid="7094582042819250762">"行動數據"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi 已關閉"</string> <string name="bt_is_off" msgid="2640685272289706392">"藍牙已關閉"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 5094de9962a4..b3b26dcded84 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -492,6 +492,9 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"I-Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Ifrikhwensi yethoni engakuningi"</string> <string name="stream_accessibility" msgid="301136219144385106">"Ukufinyeleleka"</string> + <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Khalisa"</string> + <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Dlidlizela"</string> + <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Thulisa"</string> <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Thepha ukuze ususe ukuthula."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Thepha ukuze usethe ukudlidliza. Amasevisi okufinyelela angathuliswa."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Thepha ukuze uthulise. Amasevisi okufinyelela angathuliswa."</string> @@ -756,7 +759,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Izinhlelo zokusebenza ezisheshayo"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Izinhlelo zokusebenza ezisheshayo azidingi ukufakwa."</string> <string name="app_info" msgid="6856026610594615344">"Ulwazi lohlelo lokusebenza"</string> - <string name="go_to_web" msgid="1106022723459948514">"Iya kuwebhu"</string> + <string name="go_to_web" msgid="2650669128861626071">"Iya kusiphequluli"</string> <string name="mobile_data" msgid="7094582042819250762">"Idatha yeselula"</string> <string name="wifi_is_off" msgid="1838559392210456893">"I-Wi-Fi ivaliwe"</string> <string name="bt_is_off" msgid="2640685272289706392">"I-Bluetooth ivaliwe"</string> diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 83163316bac0..6db46b5917b6 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -38,7 +38,6 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; -import android.graphics.Canvas; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Matrix; @@ -58,10 +57,13 @@ import android.provider.MediaStore; import android.util.DisplayMetrics; import android.util.Slog; import android.view.Display; +import android.view.DisplayListCanvas; import android.view.LayoutInflater; import android.view.MotionEvent; +import android.view.RenderNode; import android.view.Surface; import android.view.SurfaceControl; +import android.view.ThreadedRenderer; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; @@ -153,7 +155,6 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> { int previewWidth = data.previewWidth; int previewHeight = data.previewheight; - Canvas c = new Canvas(); Paint paint = new Paint(); ColorMatrix desat = new ColorMatrix(); desat.setSaturation(0.25f); @@ -161,27 +162,17 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> { Matrix matrix = new Matrix(); int overlayColor = 0x40FFFFFF; - // Bitmaps created for screenshots are hardware bitmaps. Copy to a software bitmap in order - // to update size for previews. - Bitmap swBitmap = data.image.copy(Bitmap.Config.ARGB_8888, true); - - Bitmap picture = Bitmap.createBitmap(previewWidth, previewHeight, Bitmap.Config.ARGB_8888); matrix.setTranslate((previewWidth - mImageWidth) / 2, (previewHeight - mImageHeight) / 2); - c.setBitmap(picture); - c.drawBitmap(swBitmap, matrix, paint); - c.drawColor(overlayColor); - c.setBitmap(null); + Bitmap picture = generateAdjustedHwBitmap(data.image, previewWidth, previewHeight, matrix, + paint, overlayColor); // Note, we can't use the preview for the small icon, since it is non-square float scale = (float) iconSize / Math.min(mImageWidth, mImageHeight); - Bitmap icon = Bitmap.createBitmap(iconSize, iconSize, Bitmap.Config.ARGB_8888); matrix.setScale(scale, scale); matrix.postTranslate((iconSize - (scale * mImageWidth)) / 2, (iconSize - (scale * mImageHeight)) / 2); - c.setBitmap(icon); - c.drawBitmap(swBitmap, matrix, paint); - c.drawColor(overlayColor); - c.setBitmap(null); + Bitmap icon = generateAdjustedHwBitmap(data.image, iconSize, iconSize, matrix, paint, + overlayColor); // Show the intermediate notification mTickerAddSpace = !mTickerAddSpace; @@ -235,6 +226,22 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> { mNotificationStyle.bigLargeIcon((Bitmap) null); } + /** + * Generates a new hardware bitmap with specified values, copying the content from the passed + * in bitmap. + */ + private Bitmap generateAdjustedHwBitmap(Bitmap bitmap, int width, int height, Matrix matrix, + Paint paint, int color) { + RenderNode node = RenderNode.create("ScreenshotCanvas", null); + node.setLeftTopRightBottom(0, 0, width, height); + node.setClipToBounds(false); + DisplayListCanvas canvas = node.start(width, height); + canvas.drawColor(color); + canvas.drawBitmap(bitmap, matrix, paint); + node.end(canvas); + return ThreadedRenderer.createHardwareBitmap(node, width, height); + } + @Override protected Void doInBackground(Void... params) { if (isCancelled()) { diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index 0d4f5cb81b49..0ffc77923f1a 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -2118,13 +2118,14 @@ public class AccountManagerService userId)); } /* - * Only the system or authenticator should be allowed to remove accounts for that - * authenticator. This will let users remove accounts (via Settings in the system) but not - * arbitrary applications (like competing authenticators). + * Only the system, authenticator or profile owner should be allowed to remove accounts for + * that authenticator. This will let users remove accounts (via Settings in the system) but + * not arbitrary applications (like competing authenticators). */ UserHandle user = UserHandle.of(userId); if (!isAccountManagedByCaller(account.type, callingUid, user.getIdentifier()) - && !isSystemUid(callingUid)) { + && !isSystemUid(callingUid) + && !isProfileOwner(callingUid)) { String msg = String.format( "uid %s cannot remove accounts of type: %s", callingUid, diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 979323fc8408..54938eb05cf5 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -69,7 +69,9 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static android.app.ActivityManager.RESIZE_MODE_SYSTEM; import static android.app.ActivityManager.RESIZE_MODE_USER; @@ -1867,10 +1869,24 @@ final class ActivityManagerShellCommand extends ShellCommand { String value = getNextArgRequired(); int bucket = bucketNameToBucketValue(value); if (bucket < 0) return -1; + boolean multiple = peekNextArg() != null; + IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService( Context.USAGE_STATS_SERVICE)); - usm.setAppStandbyBucket(packageName, bucketNameToBucketValue(value), userId); + if (!multiple) { + usm.setAppStandbyBucket(packageName, bucketNameToBucketValue(value), userId); + } else { + HashMap<String, Integer> buckets = new HashMap<>(); + buckets.put(packageName, bucket); + while ((packageName = getNextArg()) != null) { + value = getNextArgRequired(); + bucket = bucketNameToBucketValue(value); + if (bucket < 0) continue; + buckets.put(packageName, bucket); + } + usm.setAppStandbyBuckets(buckets, userId); + } return 0; } @@ -1886,12 +1902,21 @@ final class ActivityManagerShellCommand extends ShellCommand { return -1; } } - String packageName = getNextArgRequired(); + String packageName = getNextArg(); IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService( Context.USAGE_STATS_SERVICE)); - int bucket = usm.getAppStandbyBucket(packageName, null, userId); - pw.println(bucket); + if (packageName != null) { + int bucket = usm.getAppStandbyBucket(packageName, null, userId); + pw.println(bucket); + } else { + Map<String, Integer> buckets = (Map<String, Integer>) usm.getAppStandbyBuckets( + SHELL_PACKAGE_NAME, userId); + for (Map.Entry<String, Integer> entry: buckets.entrySet()) { + pw.print(entry.getKey()); pw.print(": "); + pw.println(entry.getValue()); + } + } return 0; } diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 48737a54cadc..dabcbcdcbb7c 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -2376,8 +2376,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi activities.add(activity); } } else { - Slog.e(TAG, "restoreTask: Unexpected name=" + name); - XmlUtils.skipCurrentTag(in); + handleUnknownTag(name, in); } } } @@ -2441,5 +2440,11 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi if (DEBUG_RECENTS) Slog.d(TAG_RECENTS, "Restored task=" + task); return task; } + + void handleUnknownTag(String name, XmlPullParser in) + throws IOException, XmlPullParserException { + Slog.e(TAG, "restoreTask: Unexpected name=" + name); + XmlUtils.skipCurrentTag(in); + } } } diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 6bd599bb0198..14260c5fb105 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -926,10 +926,9 @@ class UserController implements Handler.Callback { final Integer userIdInt = userId; mUserLru.remove(userIdInt); mUserLru.add(userIdInt); - - if (unlockListener != null) { - uss.mUnlockProgress.addListener(unlockListener); - } + } + if (unlockListener != null) { + uss.mUnlockProgress.addListener(unlockListener); } if (updateUmState) { mInjector.getUserManagerInternal().setUserState(userId, uss.state); diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index c7a2f0b9264e..965159bdfd76 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -565,7 +565,7 @@ public class SyncManager { mLogger = SyncLogger.getInstance(); - SyncStorageEngine.init(context); + SyncStorageEngine.init(context, BackgroundThread.get().getLooper()); mSyncStorageEngine = SyncStorageEngine.getSingleton(); mSyncStorageEngine.setOnSyncRequestListener(new OnSyncRequestListener() { @Override diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java index 3591871f5386..e498666073ed 100644 --- a/services/core/java/com/android/server/content/SyncStorageEngine.java +++ b/services/core/java/com/android/server/content/SyncStorageEngine.java @@ -36,6 +36,7 @@ import android.database.sqlite.SQLiteQueryBuilder; import android.os.Bundle; import android.os.Environment; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.os.Parcel; import android.os.RemoteCallbackList; @@ -69,7 +70,7 @@ import java.util.TimeZone; * * @hide */ -public class SyncStorageEngine extends Handler { +public class SyncStorageEngine { private static final String TAG = "SyncManager"; private static final String TAG_FILE = "SyncManagerFile"; @@ -462,7 +463,10 @@ public class SyncStorageEngine extends Handler { private boolean mGrantSyncAdaptersAccountAccess; - private SyncStorageEngine(Context context, File dataDir) { + private final MyHandler mHandler; + + private SyncStorageEngine(Context context, File dataDir, Looper looper) { + mHandler = new MyHandler(looper); mContext = context; sSyncStorageEngine = this; @@ -491,15 +495,15 @@ public class SyncStorageEngine extends Handler { } public static SyncStorageEngine newTestInstance(Context context) { - return new SyncStorageEngine(context, context.getFilesDir()); + return new SyncStorageEngine(context, context.getFilesDir(), Looper.getMainLooper()); } - public static void init(Context context) { + public static void init(Context context, Looper looper) { if (sSyncStorageEngine != null) { return; } File dataDir = Environment.getDataDirectory(); - sSyncStorageEngine = new SyncStorageEngine(context, dataDir); + sSyncStorageEngine = new SyncStorageEngine(context, dataDir, looper); } public static SyncStorageEngine getSingleton() { @@ -527,14 +531,21 @@ public class SyncStorageEngine extends Handler { } } - @Override public void handleMessage(Message msg) { - if (msg.what == MSG_WRITE_STATUS) { - synchronized (mAuthorities) { - writeStatusLocked(); - } - } else if (msg.what == MSG_WRITE_STATISTICS) { - synchronized (mAuthorities) { - writeStatisticsLocked(); + private class MyHandler extends Handler { + public MyHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + if (msg.what == MSG_WRITE_STATUS) { + synchronized (mAuthorities) { + writeStatusLocked(); + } + } else if (msg.what == MSG_WRITE_STATISTICS) { + synchronized (mAuthorities) { + writeStatisticsLocked(); + } } } } @@ -1202,14 +1213,14 @@ public class SyncStorageEngine extends Handler { if (writeStatusNow) { writeStatusLocked(); - } else if (!hasMessages(MSG_WRITE_STATUS)) { - sendMessageDelayed(obtainMessage(MSG_WRITE_STATUS), + } else if (!mHandler.hasMessages(MSG_WRITE_STATUS)) { + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_WRITE_STATUS), WRITE_STATUS_DELAY); } if (writeStatisticsNow) { writeStatisticsLocked(); - } else if (!hasMessages(MSG_WRITE_STATISTICS)) { - sendMessageDelayed(obtainMessage(MSG_WRITE_STATISTICS), + } else if (!mHandler.hasMessages(MSG_WRITE_STATISTICS)) { + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_WRITE_STATISTICS), WRITE_STATISTICS_DELAY); } } @@ -2102,7 +2113,7 @@ public class SyncStorageEngine extends Handler { // The file is being written, so we don't need to have a scheduled // write until the next change. - removeMessages(MSG_WRITE_STATUS); + mHandler.removeMessages(MSG_WRITE_STATUS); FileOutputStream fos = null; try { @@ -2210,7 +2221,7 @@ public class SyncStorageEngine extends Handler { // The file is being written, so we don't need to have a scheduled // write until the next change. - removeMessages(MSG_WRITE_STATISTICS); + mHandler.removeMessages(MSG_WRITE_STATISTICS); FileOutputStream fos = null; try { diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index 9a6e609445a5..6c5bfc793330 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -24,6 +24,7 @@ import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; +import android.hardware.display.BrightnessConfiguration; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -34,7 +35,6 @@ import android.text.format.DateUtils; import android.util.EventLog; import android.util.MathUtils; import android.util.Slog; -import android.util.Spline; import android.util.TimeUtils; import java.io.PrintWriter; @@ -76,9 +76,8 @@ class AutomaticBrightnessController { // The light sensor, or null if not available or needed. private final Sensor mLightSensor; - // The auto-brightness spline adjustment. - // The brightness values have been scaled to a range of 0..1. - private final Spline mScreenAutoBrightnessSpline; + // The mapper to translate ambient lux to screen brightness in the range [0, 1.0]. + private final BrightnessMappingStrategy mBrightnessMapper; // The minimum and maximum screen brightnesses. private final int mScreenBrightnessRangeMinimum; @@ -186,7 +185,7 @@ class AutomaticBrightnessController { private float mBrightnessAdjustmentSampleOldGamma; public AutomaticBrightnessController(Callbacks callbacks, Looper looper, - SensorManager sensorManager, Spline autoBrightnessSpline, int lightSensorWarmUpTime, + SensorManager sensorManager, BrightnessMappingStrategy mapper, int lightSensorWarmUpTime, int brightnessMin, int brightnessMax, float dozeScaleFactor, int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig, long darkeningLightDebounceConfig, boolean resetAmbientLuxAfterWarmUpConfig, @@ -194,7 +193,7 @@ class AutomaticBrightnessController { HysteresisLevels dynamicHysteresis) { mCallbacks = callbacks; mSensorManager = sensorManager; - mScreenAutoBrightnessSpline = autoBrightnessSpline; + mBrightnessMapper = mapper; mScreenBrightnessRangeMinimum = brightnessMin; mScreenBrightnessRangeMaximum = brightnessMax; mLightSensorWarmUpTimeConfig = lightSensorWarmUpTime; @@ -228,15 +227,16 @@ class AutomaticBrightnessController { return mScreenAutoBrightness; } - public void configure(boolean enable, float adjustment, boolean dozing, - boolean userInitiatedChange) { + public void configure(boolean enable, @Nullable BrightnessConfiguration configuration, + float adjustment, boolean dozing, boolean userInitiatedChange) { // While dozing, the application processor may be suspended which will prevent us from // receiving new information from the light sensor. On some devices, we may be able to // switch to a wake-up light sensor instead but for now we will simply disable the sensor // and hold onto the last computed screen auto brightness. We save the dozing flag for // debugging purposes. mDozing = dozing; - boolean changed = setLightSensorEnabled(enable && !dozing); + boolean changed = setBrightnessConfiguration(configuration); + changed |= setLightSensorEnabled(enable && !dozing); if (enable && !dozing && userInitiatedChange) { prepareBrightnessAdjustmentSample(); } @@ -246,10 +246,13 @@ class AutomaticBrightnessController { } } + public boolean setBrightnessConfiguration(BrightnessConfiguration configuration) { + return mBrightnessMapper.setBrightnessConfiguration(configuration); + } + public void dump(PrintWriter pw) { pw.println(); pw.println("Automatic Brightness Controller Configuration:"); - pw.println(" mScreenAutoBrightnessSpline=" + mScreenAutoBrightnessSpline); pw.println(" mScreenBrightnessRangeMinimum=" + mScreenBrightnessRangeMinimum); pw.println(" mScreenBrightnessRangeMaximum=" + mScreenBrightnessRangeMaximum); pw.println(" mLightSensorWarmUpTimeConfig=" + mLightSensorWarmUpTimeConfig); @@ -274,9 +277,13 @@ class AutomaticBrightnessController { mInitialHorizonAmbientLightRingBuffer); pw.println(" mScreenAutoBrightness=" + mScreenAutoBrightness); pw.println(" mScreenAutoBrightnessAdjustment=" + mScreenAutoBrightnessAdjustment); - pw.println(" mScreenAutoBrightnessAdjustmentMaxGamma=" + mScreenAutoBrightnessAdjustmentMaxGamma); + pw.println(" mScreenAutoBrightnessAdjustmentMaxGamma=" + + mScreenAutoBrightnessAdjustmentMaxGamma); pw.println(" mLastScreenAutoBrightnessGamma=" + mLastScreenAutoBrightnessGamma); pw.println(" mDozing=" + mDozing); + + pw.println(); + mBrightnessMapper.dump(pw); } private boolean setLightSensorEnabled(boolean enable) { @@ -533,7 +540,7 @@ class AutomaticBrightnessController { return; } - float value = mScreenAutoBrightnessSpline.interpolate(mAmbientLux); + float value = mBrightnessMapper.getBrightness(mAmbientLux); float gamma = 1.0f; if (USE_SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT diff --git a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java new file mode 100644 index 000000000000..3b9d40fa0825 --- /dev/null +++ b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java @@ -0,0 +1,289 @@ +/* + * 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 com.android.server.display; + +import android.annotation.Nullable; +import android.hardware.display.BrightnessConfiguration; +import android.os.PowerManager; +import android.util.MathUtils; +import android.util.Pair; +import android.util.Slog; +import android.util.Spline; + +import com.android.internal.util.Preconditions; +import com.android.internal.annotations.VisibleForTesting; + +import java.io.PrintWriter; + +/** + * A utility to map from an ambient brightness to a display's "backlight" brightness based on the + * available display information and brightness configuration. + * + * Note that without a mapping from the nits to a display backlight level, any + * {@link BrightnessConfiguration}s that are set are just ignored. + */ +public abstract class BrightnessMappingStrategy { + private static final String TAG = "BrightnessMappingStrategy"; + private static final boolean DEBUG = false; + + @Nullable + public static BrightnessMappingStrategy create( + float[] luxLevels, int[] brightnessLevelsBacklight, float[] brightnessLevelsNits, + float[] nitsRange, int[] backlightRange) { + if (isValidMapping(nitsRange, backlightRange) + && isValidMapping(luxLevels, brightnessLevelsNits)) { + BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + builder.setCurve(luxLevels, brightnessLevelsNits); + return new PhysicalMappingStrategy(builder.build(), nitsRange, backlightRange); + } else if (isValidMapping(luxLevels, brightnessLevelsBacklight)) { + return new SimpleMappingStrategy(luxLevels, brightnessLevelsBacklight); + } else { + return null; + } + } + + private static boolean isValidMapping(float[] x, float[] y) { + if (x == null || y == null || x.length == 0 || y.length == 0) { + return false; + } + if (x.length != y.length) { + return false; + } + final int N = x.length; + float prevX = x[0]; + float prevY = y[0]; + if (prevX < 0 || prevY < 0 || Float.isNaN(prevX) || Float.isNaN(prevY)) { + return false; + } + for (int i = 1; i < N; i++) { + if (prevX >= x[i] || prevY > y[i]) { + return false; + } + if (Float.isNaN(x[i]) || Float.isNaN(y[i])) { + return false; + } + prevX = x[i]; + prevY = y[i]; + } + return true; + } + + private static boolean isValidMapping(float[] x, int[] y) { + if (x == null || y == null || x.length == 0 || y.length == 0) { + return false; + } + if (x.length != y.length) { + return false; + } + final int N = x.length; + float prevX = x[0]; + int prevY = y[0]; + if (prevX < 0 || prevY < 0 || Float.isNaN(prevX)) { + return false; + } + for (int i = 1; i < N; i++) { + if (prevX >= x[i] || prevY > y[i]) { + return false; + } + if (Float.isNaN(x[i])) { + return false; + } + prevX = x[i]; + prevY = y[i]; + } + return true; + } + + /** + * Sets the {@link BrightnessConfiguration}. + * + * @param config The new configuration. If {@code null} is passed, the default configuration is + * used. + * @return Whether the brightness configuration has changed. + */ + public abstract boolean setBrightnessConfiguration(@Nullable BrightnessConfiguration config); + + /** + * Returns the desired brightness of the display based on the current ambient lux. + * + * The returned brightness will be in the range [0, 1.0], where 1.0 is the display at max + * brightness and 0 is the display at minimum brightness. + * + * @param lux The current ambient brightness in lux. + * @return The desired brightness of the display compressed to the range [0, 1.0]. + */ + public abstract float getBrightness(float lux); + + public abstract void dump(PrintWriter pw); + + private static float normalizeAbsoluteBrightness(int brightness) { + brightness = MathUtils.constrain(brightness, + PowerManager.BRIGHTNESS_OFF, PowerManager.BRIGHTNESS_ON); + return (float) brightness / PowerManager.BRIGHTNESS_ON; + } + + + /** + * A {@link BrightnessMappingStrategy} that maps from ambient room brightness directly to the + * backlight of the display. + * + * Since we don't have information about the display's physical brightness, any brightness + * configurations that are set are just ignored. + */ + private static class SimpleMappingStrategy extends BrightnessMappingStrategy { + private final Spline mSpline; + + public SimpleMappingStrategy(float[] lux, int[] brightness) { + Preconditions.checkArgument(lux.length != 0 && brightness.length != 0, + "Lux and brightness arrays must not be empty!"); + Preconditions.checkArgument(lux.length == brightness.length, + "Lux and brightness arrays must be the same length!"); + Preconditions.checkArrayElementsInRange(lux, 0, Float.MAX_VALUE, "lux"); + Preconditions.checkArrayElementsInRange(brightness, + 0, Integer.MAX_VALUE, "brightness"); + + final int N = brightness.length; + float[] x = new float[N]; + float[] y = new float[N]; + for (int i = 0; i < N; i++) { + x[i] = lux[i]; + y[i] = normalizeAbsoluteBrightness(brightness[i]); + } + + mSpline = Spline.createSpline(x, y); + if (DEBUG) { + Slog.d(TAG, "Auto-brightness spline: " + mSpline); + for (float v = 1f; v < lux[lux.length - 1] * 1.25f; v *= 1.25f) { + Slog.d(TAG, String.format(" %7.1f: %7.1f", v, mSpline.interpolate(v))); + } + } + } + + @Override + public boolean setBrightnessConfiguration(@Nullable BrightnessConfiguration config) { + Slog.e(TAG, + "setBrightnessConfiguration called on device without display information."); + return false; + } + + @Override + public float getBrightness(float lux) { + return mSpline.interpolate(lux); + } + + @Override + public void dump(PrintWriter pw) { + pw.println("SimpleMappingStrategy"); + pw.println(" mSpline=" + mSpline); + } + } + + /** A {@link BrightnessMappingStrategy} that maps from ambient room brightness to the physical + * range of the display, rather than to the range of the backlight control (typically 0-255). + * + * By mapping through the physical brightness, the curve becomes portable across devices and + * gives us more resolution in the resulting mapping. + */ + @VisibleForTesting + static class PhysicalMappingStrategy extends BrightnessMappingStrategy { + // The current brightness configuration. + private BrightnessConfiguration mConfig; + + // A spline mapping from the current ambient light in lux to the desired display brightness + // in nits. + private Spline mBrightnessSpline; + + // A spline mapping from nits to the corresponding backlight value, normalized to the range + // [0, 1.0]. + private final Spline mBacklightSpline; + + // The default brightness configuration. + private final BrightnessConfiguration mDefaultConfig; + + public PhysicalMappingStrategy(BrightnessConfiguration config, + float[] nits, int[] backlight) { + Preconditions.checkArgument(nits.length != 0 && backlight.length != 0, + "Nits and backlight arrays must not be empty!"); + Preconditions.checkArgument(nits.length == backlight.length, + "Nits and backlight arrays must be the same length!"); + Preconditions.checkNotNull(config); + Preconditions.checkArrayElementsInRange(nits, 0, Float.MAX_VALUE, "nits"); + Preconditions.checkArrayElementsInRange(backlight, + PowerManager.BRIGHTNESS_OFF, PowerManager.BRIGHTNESS_ON, "backlight"); + + // Setup the backlight spline + final int N = nits.length; + float[] x = new float[N]; + float[] y = new float[N]; + for (int i = 0; i < N; i++) { + x[i] = nits[i]; + y[i] = normalizeAbsoluteBrightness(backlight[i]); + } + + mBacklightSpline = Spline.createSpline(x, y); + if (DEBUG) { + Slog.d(TAG, "Backlight spline: " + mBacklightSpline); + for (float v = 1f; v < nits[nits.length - 1] * 1.25f; v *= 1.25f) { + Slog.d(TAG, String.format( + " %7.1f: %7.1f", v, mBacklightSpline.interpolate(v))); + } + } + + mDefaultConfig = config; + setBrightnessConfiguration(config); + } + + @Override + public boolean setBrightnessConfiguration(@Nullable BrightnessConfiguration config) { + if (config == null) { + config = mDefaultConfig; + } + if (config.equals(mConfig)) { + if (DEBUG) { + Slog.d(TAG, "Tried to set an identical brightness config, ignoring"); + } + return false; + } + + Pair<float[], float[]> curve = config.getCurve(); + mBrightnessSpline = Spline.createSpline(curve.first /*lux*/, curve.second /*nits*/); + if (DEBUG) { + Slog.d(TAG, "Brightness spline: " + mBrightnessSpline); + final float[] lux = curve.first; + for (float v = 1f; v < lux[lux.length - 1] * 1.25f; v *= 1.25f) { + Slog.d(TAG, String.format( + " %7.1f: %7.1f", v, mBrightnessSpline.interpolate(v))); + } + } + mConfig = config; + return true; + } + + @Override + public float getBrightness(float lux) { + return mBacklightSpline.interpolate(mBrightnessSpline.interpolate(lux)); + } + + @Override + public void dump(PrintWriter pw) { + pw.println("PhysicalMappingStrategy"); + pw.println(" mConfig=" + mConfig); + pw.println(" mBrightnessSpline=" + mBrightnessSpline); + pw.println(" mBacklightSpline=" + mBacklightSpline); + } + } +} diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index c1bfa478ee89..9b97934cfc3b 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -29,6 +29,7 @@ import com.android.internal.util.IndentingPrintWriter; import android.Manifest; import android.annotation.NonNull; +import android.annotation.UserIdInt; import android.app.AppOpsManager; import android.content.Context; import android.content.pm.PackageManager; @@ -37,6 +38,7 @@ import android.content.res.Resources; import android.graphics.Point; import android.hardware.SensorManager; import android.hardware.display.BrightnessChangeEvent; +import android.hardware.display.BrightnessConfiguration; import android.hardware.display.DisplayManagerGlobal; import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayViewport; @@ -62,6 +64,7 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; +import android.os.UserManager; import android.text.TextUtils; import android.util.IntArray; import android.util.Slog; @@ -70,6 +73,7 @@ import android.view.Display; import android.view.DisplayInfo; import android.view.Surface; +import com.android.internal.util.Preconditions; import com.android.server.AnimationThread; import com.android.server.DisplayThread; import com.android.server.LocalServices; @@ -145,6 +149,7 @@ public final class DisplayManagerService extends SystemService { private static final int MSG_REQUEST_TRAVERSAL = 4; private static final int MSG_UPDATE_VIEWPORT = 5; private static final int MSG_REGISTER_BRIGHTNESS_TRACKER = 6; + private static final int MSG_LOAD_BRIGHTNESS_CONFIGURATION = 7; private final Context mContext; private final DisplayManagerHandler mHandler; @@ -219,6 +224,9 @@ public final class DisplayManagerService extends SystemService { // The virtual display adapter, or null if not registered. private VirtualDisplayAdapter mVirtualDisplayAdapter; + // The User ID of the current user + private @UserIdInt int mCurrentUserId; + // The stable device screen height and width. These are not tied to a specific display, even // the default display, because they need to be stable over the course of the device's entire // life, even if the default display changes (e.g. a new monitor is plugged into a PC-like @@ -278,17 +286,18 @@ public final class DisplayManagerService extends SystemService { mDisplayAdapterListener = new DisplayAdapterListener(); mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false); mDefaultDisplayDefaultColorMode = mContext.getResources().getInteger( - com.android.internal.R.integer.config_defaultDisplayDefaultColorMode); + com.android.internal.R.integer.config_defaultDisplayDefaultColorMode); PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mGlobalDisplayBrightness = pm.getDefaultScreenBrightnessSetting(); mBrightnessTracker = new BrightnessTracker(context, null); + mCurrentUserId = UserHandle.USER_SYSTEM; } public void setupSchedulerPolicies() { // android.display and android.anim is critical to user experience and we should make sure - // it is not in the default foregroup groups, add it to top-app to make sure it uses all the - // cores and scheduling settings for top-app when it runs. + // it is not in the default foregroup groups, add it to top-app to make sure it uses all + // the cores and scheduling settings for top-app when it runs. Process.setThreadGroupAndCpuset(DisplayThread.get().getThreadId(), Process.THREAD_GROUP_TOP_APP); Process.setThreadGroupAndCpuset(AnimationThread.get().getThreadId(), @@ -342,6 +351,19 @@ public final class DisplayManagerService extends SystemService { } } + @Override + public void onSwitchUser(@UserIdInt int newUserId) { + final int userSerial = getUserManager().getUserSerialNumber(newUserId); + synchronized (mSyncRoot) { + if (mCurrentUserId != newUserId) { + mCurrentUserId = newUserId; + BrightnessConfiguration config = + mPersistentDataStore.getBrightnessConfiguration(userSerial); + mDisplayPowerController.setBrightnessConfiguration(config); + } + } + } + // TODO: Use dependencies or a boot phase public void windowManagerAndInputReady() { synchronized (mSyncRoot) { @@ -985,6 +1007,30 @@ public final class DisplayManagerService extends SystemService { } } + private void setBrightnessConfigurationForUserInternal( + @NonNull BrightnessConfiguration c, @UserIdInt int userId) { + final int userSerial = getUserManager().getUserSerialNumber(userId); + synchronized (mSyncRoot) { + try { + mPersistentDataStore.setBrightnessConfigurationForUser(c, userSerial); + } finally { + mPersistentDataStore.saveIfNeeded(); + } + if (userId == mCurrentUserId) { + mDisplayPowerController.setBrightnessConfiguration(c); + } + } + } + + private void loadBrightnessConfiguration() { + synchronized (mSyncRoot) { + final int userSerial = getUserManager().getUserSerialNumber(mCurrentUserId); + BrightnessConfiguration config = + mPersistentDataStore.getBrightnessConfiguration(userSerial); + mDisplayPowerController.setBrightnessConfiguration(config); + } + } + // Updates all existing logical displays given the current set of display devices. // Removes invalid logical displays. // Sends notifications if needed. @@ -1229,6 +1275,10 @@ public final class DisplayManagerService extends SystemService { return mProjectionService; } + private UserManager getUserManager() { + return mContext.getSystemService(UserManager.class); + } + private void dumpInternal(PrintWriter pw) { pw.println("DISPLAY MANAGER (dumpsys display)"); @@ -1371,6 +1421,10 @@ public final class DisplayManagerService extends SystemService { case MSG_REGISTER_BRIGHTNESS_TRACKER: mBrightnessTracker.start(); break; + + case MSG_LOAD_BRIGHTNESS_CONFIGURATION: + loadBrightnessConfiguration(); + break; } } } @@ -1800,6 +1854,27 @@ public final class DisplayManagerService extends SystemService { } } + @Override // Binder call + public void setBrightnessConfigurationForUser( + BrightnessConfiguration c, @UserIdInt int userId) { + mContext.enforceCallingOrSelfPermission( + Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS, + "Permission required to change the display's brightness configuration"); + if (userId != UserHandle.getCallingUserId()) { + mContext.enforceCallingOrSelfPermission( + Manifest.permission.INTERACT_ACROSS_USERS, + "Permission required to change the display brightness" + + " configuration of another user"); + } + Preconditions.checkNotNull(c); + final long token = Binder.clearCallingIdentity(); + try { + setBrightnessConfigurationForUserInternal(c, userId); + } finally { + Binder.restoreCallingIdentity(token); + } + } + private boolean validatePackageName(int uid, String packageName) { if (packageName != null) { String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid); @@ -1871,18 +1946,24 @@ public final class DisplayManagerService extends SystemService { mDisplayPowerController = new DisplayPowerController( mContext, callbacks, handler, sensorManager, blanker); } + + mHandler.sendEmptyMessage(MSG_LOAD_BRIGHTNESS_CONFIGURATION); } @Override public boolean requestPowerState(DisplayPowerRequest request, boolean waitForNegativeProximity) { - return mDisplayPowerController.requestPowerState(request, - waitForNegativeProximity); + synchronized (mSyncRoot) { + return mDisplayPowerController.requestPowerState(request, + waitForNegativeProximity); + } } @Override public boolean isProximitySensorAvailable() { - return mDisplayPowerController.isProximitySensorAvailable(); + synchronized (mSyncRoot) { + return mDisplayPowerController.isProximitySensorAvailable(); + } } @Override diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 29a007a36d41..a2d954822e64 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -26,10 +26,12 @@ import android.animation.Animator; import android.animation.ObjectAnimator; import android.content.Context; import android.content.res.Resources; +import android.content.res.TypedArray; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; +import android.hardware.display.BrightnessConfiguration; import android.hardware.display.DisplayManagerInternal.DisplayPowerCallbacks; import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; import android.os.Handler; @@ -93,6 +95,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private static final int MSG_PROXIMITY_SENSOR_DEBOUNCED = 2; private static final int MSG_SCREEN_ON_UNBLOCKED = 3; private static final int MSG_SCREEN_OFF_UNBLOCKED = 4; + private static final int MSG_CONFIGURE_BRIGHTNESS = 5; + private static final int MSG_USER_SWITCH = 6; private static final int PROXIMITY_UNKNOWN = -1; private static final int PROXIMITY_NEGATIVE = 0; @@ -285,6 +289,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // The controller for the automatic brightness level. private AutomaticBrightnessController mAutomaticBrightnessController; + // The default brightness configuration. Used for whenever we don't have a valid brightness + // configuration set. This is typically seen with users that don't have a brightness + // configuration that's different from the default. + private BrightnessConfiguration mDefaultBrightnessConfiguration; + + // The current brightness configuration. + private BrightnessConfiguration mBrightnessConfiguration; + // Animators. private ObjectAnimator mColorFadeOnAnimator; private ObjectAnimator mColorFadeOffAnimator; @@ -333,7 +345,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call screenBrightnessSettingMinimum, mScreenBrightnessDimConfig), mScreenBrightnessDarkConfig); - mScreenBrightnessRangeMaximum = PowerManager.BRIGHTNESS_ON; + mScreenBrightnessRangeMaximum = clampAbsoluteBrightness(resources.getInteger( + com.android.internal.R.integer.config_screenBrightnessSettingMaximum)); mUseSoftwareAutoBrightnessConfig = resources.getBoolean( com.android.internal.R.bool.config_automatic_brightness_available); @@ -348,60 +361,60 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mSkipScreenOnBrightnessRamp = resources.getBoolean( com.android.internal.R.bool.config_skipScreenOnBrightnessRamp); - int lightSensorRate = resources.getInteger( - com.android.internal.R.integer.config_autoBrightnessLightSensorRate); - int initialLightSensorRate = resources.getInteger( - com.android.internal.R.integer.config_autoBrightnessInitialLightSensorRate); - if (initialLightSensorRate == -1) { - initialLightSensorRate = lightSensorRate; - } else if (initialLightSensorRate > lightSensorRate) { - Slog.w(TAG, "Expected config_autoBrightnessInitialLightSensorRate (" - + initialLightSensorRate + ") to be less than or equal to " - + "config_autoBrightnessLightSensorRate (" + lightSensorRate + ")."); - } - long brighteningLightDebounce = resources.getInteger( - com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce); - long darkeningLightDebounce = resources.getInteger( - com.android.internal.R.integer.config_autoBrightnessDarkeningLightDebounce); - boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean( - com.android.internal.R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp); - int ambientLightHorizon = resources.getInteger( - com.android.internal.R.integer.config_autoBrightnessAmbientLightHorizon); - float autoBrightnessAdjustmentMaxGamma = resources.getFraction( - com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma, - 1, 1); - - int[] brightLevels = resources.getIntArray( - com.android.internal.R.array.config_dynamicHysteresisBrightLevels); - int[] darkLevels = resources.getIntArray( - com.android.internal.R.array.config_dynamicHysteresisDarkLevels); - int[] luxLevels = resources.getIntArray( - com.android.internal.R.array.config_dynamicHysteresisLuxLevels); - HysteresisLevels dynamicHysteresis = new HysteresisLevels( - brightLevels, darkLevels, luxLevels); - if (mUseSoftwareAutoBrightnessConfig) { - int[] lux = resources.getIntArray( - com.android.internal.R.array.config_autoBrightnessLevels); - int[] screenBrightness = resources.getIntArray( + float[] luxLevels = getLuxLevels(resources.getIntArray( + com.android.internal.R.array.config_autoBrightnessLevels)); + int[] backlightValues = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLcdBacklightValues); - int lightSensorWarmUpTimeConfig = resources.getInteger( - com.android.internal.R.integer.config_lightSensorWarmupTime); + float[] brightnessValuesNits = getFloatArray(resources.obtainTypedArray( + com.android.internal.R.array.config_autoBrightnessDisplayValuesNits)); + + final float screenMinimumNits = resources.getFloat( + com.android.internal.R.dimen.config_screenBrightnessMinimumNits); + final float screenMaximumNits = resources.getFloat( + com.android.internal.R.dimen.config_screenBrightnessMaximumNits); + final float dozeScaleFactor = resources.getFraction( com.android.internal.R.fraction.config_screenAutoBrightnessDozeScaleFactor, 1, 1); - Spline screenAutoBrightnessSpline = createAutoBrightnessSpline(lux, screenBrightness); - if (screenAutoBrightnessSpline == null) { - Slog.e(TAG, "Error in config.xml. config_autoBrightnessLcdBacklightValues " - + "(size " + screenBrightness.length + ") " - + "must be monotic and have exactly one more entry than " - + "config_autoBrightnessLevels (size " + lux.length + ") " - + "which must be strictly increasing. " - + "Auto-brightness will be disabled."); - mUseSoftwareAutoBrightnessConfig = false; - } else { - int bottom = clampAbsoluteBrightness(screenBrightness[0]); + int[] brightLevels = resources.getIntArray( + com.android.internal.R.array.config_dynamicHysteresisBrightLevels); + int[] darkLevels = resources.getIntArray( + com.android.internal.R.array.config_dynamicHysteresisDarkLevels); + int[] luxHysteresisLevels = resources.getIntArray( + com.android.internal.R.array.config_dynamicHysteresisLuxLevels); + HysteresisLevels dynamicHysteresis = new HysteresisLevels( + brightLevels, darkLevels, luxHysteresisLevels); + + long brighteningLightDebounce = resources.getInteger( + com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce); + long darkeningLightDebounce = resources.getInteger( + com.android.internal.R.integer.config_autoBrightnessDarkeningLightDebounce); + boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean( + com.android.internal.R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp); + int ambientLightHorizon = resources.getInteger( + com.android.internal.R.integer.config_autoBrightnessAmbientLightHorizon); + float autoBrightnessAdjustmentMaxGamma = resources.getFraction( + com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma, + 1, 1); + + int lightSensorWarmUpTimeConfig = resources.getInteger( + com.android.internal.R.integer.config_lightSensorWarmupTime); + int lightSensorRate = resources.getInteger( + com.android.internal.R.integer.config_autoBrightnessLightSensorRate); + int initialLightSensorRate = resources.getInteger( + com.android.internal.R.integer.config_autoBrightnessInitialLightSensorRate); + if (initialLightSensorRate == -1) { + initialLightSensorRate = lightSensorRate; + } else if (initialLightSensorRate > lightSensorRate) { + Slog.w(TAG, "Expected config_autoBrightnessInitialLightSensorRate (" + + initialLightSensorRate + ") to be less than or equal to " + + "config_autoBrightnessLightSensorRate (" + lightSensorRate + ")."); + } + + if (backlightValues != null && backlightValues.length > 0) { + final int bottom = backlightValues[0]; if (mScreenBrightnessDarkConfig > bottom) { Slog.w(TAG, "config_screenBrightnessDark (" + mScreenBrightnessDarkConfig + ") should be less than or equal to the first value of " @@ -411,13 +424,24 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (bottom < screenBrightnessRangeMinimum) { screenBrightnessRangeMinimum = bottom; } + } + + float[] nitsRange = { screenMinimumNits, screenMaximumNits }; + int[] backlightRange = { screenBrightnessRangeMinimum, mScreenBrightnessRangeMaximum }; + + BrightnessMappingStrategy mapper = BrightnessMappingStrategy.create( + luxLevels, backlightValues, brightnessValuesNits, + nitsRange, backlightRange); + if (mapper != null) { mAutomaticBrightnessController = new AutomaticBrightnessController(this, - handler.getLooper(), sensorManager, screenAutoBrightnessSpline, - lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum, - mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate, - initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce, + handler.getLooper(), sensorManager, mapper, lightSensorWarmUpTimeConfig, + screenBrightnessRangeMinimum, mScreenBrightnessRangeMaximum, + dozeScaleFactor, lightSensorRate, initialLightSensorRate, + brighteningLightDebounce, darkeningLightDebounce, autoBrightnessResetAmbientLuxAfterWarmUp, ambientLightHorizon, autoBrightnessAdjustmentMaxGamma, dynamicHysteresis); + } else { + mUseSoftwareAutoBrightnessConfig = false; } } @@ -444,6 +468,25 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } + private static float[] getLuxLevels(int[] lux) { + // The first control point is implicit and always at 0 lux. + float[] levels = new float[lux.length + 1]; + for (int i = 0; i < lux.length; i++) { + levels[i + 1] = (float) lux[i]; + } + return levels; + } + + private static float[] getFloatArray(TypedArray array) { + final int N = array.length(); + float[] vals = new float[N]; + for (int i = 0; i < N; i++) { + vals[i] = array.getFloat(i, -1.0f); + } + array.recycle(); + return vals; + } + /** * Returns true if the proximity sensor screen-off function is available. */ @@ -512,7 +555,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (!mPendingUpdatePowerStateLocked) { mPendingUpdatePowerStateLocked = true; Message msg = mHandler.obtainMessage(MSG_UPDATE_POWER_STATE); - msg.setAsynchronous(true); mHandler.sendMessage(msg); } } @@ -691,8 +733,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final boolean userInitiatedChange = autoBrightnessAdjustmentChanged && mPowerRequest.brightnessSetByUser; mAutomaticBrightnessController.configure(autoBrightnessEnabled, - mPowerRequest.screenAutoBrightnessAdjustment, state != Display.STATE_ON, - userInitiatedChange); + mBrightnessConfiguration, mPowerRequest.screenAutoBrightnessAdjustment, + state != Display.STATE_ON, userInitiatedChange); } // Apply brightness boost. @@ -874,6 +916,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call sendUpdatePowerState(); } + public void setBrightnessConfiguration(BrightnessConfiguration c) { + Message msg = mHandler.obtainMessage(MSG_CONFIGURE_BRIGHTNESS, c); + msg.sendToTarget(); + } + private void blockScreenOn() { if (mPendingScreenOnUnblocker == null) { Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, SCREEN_ON_BLOCKED_TRACE_NAME, 0); @@ -1241,7 +1288,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Need to wait a little longer. // Debounce again later. We continue holding a wake lock while waiting. Message msg = mHandler.obtainMessage(MSG_PROXIMITY_SENSOR_DEBOUNCED); - msg.setAsynchronous(true); mHandler.sendMessageAtTime(msg, mPendingProximityDebounceTime); } } @@ -1402,39 +1448,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } - private static Spline createAutoBrightnessSpline(int[] lux, int[] brightness) { - if (lux == null || lux.length == 0 || brightness == null || brightness.length == 0) { - Slog.e(TAG, "Could not create auto-brightness spline."); - return null; - } - try { - final int n = brightness.length; - float[] x = new float[n]; - float[] y = new float[n]; - y[0] = normalizeAbsoluteBrightness(brightness[0]); - for (int i = 1; i < n; i++) { - x[i] = lux[i - 1]; - y[i] = normalizeAbsoluteBrightness(brightness[i]); - } - - Spline spline = Spline.createSpline(x, y); - if (DEBUG) { - Slog.d(TAG, "Auto-brightness spline: " + spline); - for (float v = 1f; v < lux[lux.length - 1] * 1.25f; v *= 1.25f) { - Slog.d(TAG, String.format(" %7.1f: %7.1f", v, spline.interpolate(v))); - } - } - return spline; - } catch (IllegalArgumentException ex) { - Slog.e(TAG, "Could not create auto-brightness spline.", ex); - return null; - } - } - - private static float normalizeAbsoluteBrightness(int value) { - return (float)clampAbsoluteBrightness(value) / PowerManager.BRIGHTNESS_ON; - } - private static int clampAbsoluteBrightness(int value) { return MathUtils.constrain(value, PowerManager.BRIGHTNESS_OFF, PowerManager.BRIGHTNESS_ON); } @@ -1467,6 +1480,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call updatePowerState(); } break; + case MSG_CONFIGURE_BRIGHTNESS: + BrightnessConfiguration c = (BrightnessConfiguration) msg.obj; + mBrightnessConfiguration = c != null ? c : mDefaultBrightnessConfiguration; + updatePowerState(); + break; } } } @@ -1492,17 +1510,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call @Override public void onScreenOn() { Message msg = mHandler.obtainMessage(MSG_SCREEN_ON_UNBLOCKED, this); - msg.setAsynchronous(true); mHandler.sendMessage(msg); } } private final class ScreenOffUnblocker implements WindowManagerPolicy.ScreenOffListener { - @Override public void onScreenOff() { Message msg = mHandler.obtainMessage(MSG_SCREEN_OFF_UNBLOCKED, this); - msg.setAsynchronous(true); mHandler.sendMessage(msg); } } diff --git a/services/core/java/com/android/server/display/PersistentDataStore.java b/services/core/java/com/android/server/display/PersistentDataStore.java index 34c8e22a9f1e..49b4465efac7 100644 --- a/services/core/java/com/android/server/display/PersistentDataStore.java +++ b/services/core/java/com/android/server/display/PersistentDataStore.java @@ -24,12 +24,17 @@ import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import android.graphics.Point; +import android.hardware.display.BrightnessConfiguration; import android.hardware.display.WifiDisplay; import android.util.AtomicFile; import android.util.Slog; +import android.util.SparseArray; +import android.util.Pair; import android.util.Xml; import android.view.Display; +import com.android.internal.annotations.VisibleForTesting; + import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; @@ -37,10 +42,12 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import libcore.io.IoUtils; @@ -57,14 +64,22 @@ import libcore.util.Objects; * <wifi-display deviceAddress="00:00:00:00:00:00" deviceName="XXXX" deviceAlias="YYYY" /> * <remembered-wifi-displays> * <display-states> - * <display> + * <display unique-id="XXXXXXX"> * <color-mode>0</color-mode> * </display> * </display-states> * <stable-device-values> - * <stable-display-height>1920<stable-display-height> - * <stable-display-width>1080<stable-display-width> + * <stable-display-height>1920</stable-display-height> + * <stable-display-width>1080</stable-display-width> * </stable-device-values> + * <brightness-configurations> + * <brightness-configuration user-id="0"> + * <brightness-curve> + * <brightness-point lux="0" nits="13.25"/> + * <brightness-point lux="20" nits="35.94"/> + * </brightness-curve> + * </brightness-configuration> + * </brightness-configurations> * </display-manager-state> * </code> * @@ -73,6 +88,31 @@ import libcore.util.Objects; final class PersistentDataStore { static final String TAG = "DisplayManager"; + private static final String TAG_DISPLAY_MANAGER_STATE = "display-manager-state"; + + private static final String TAG_REMEMBERED_WIFI_DISPLAYS = "remembered-wifi-displays"; + private static final String TAG_WIFI_DISPLAY = "wifi-display"; + private static final String ATTR_DEVICE_ADDRESS = "deviceAddress"; + private static final String ATTR_DEVICE_NAME = "deviceName"; + private static final String ATTR_DEVICE_ALIAS = "deviceAlias"; + + private static final String TAG_DISPLAY_STATES = "display-states"; + private static final String TAG_DISPLAY = "display"; + private static final String TAG_COLOR_MODE = "color-mode"; + private static final String ATTR_UNIQUE_ID = "unique-id"; + + private static final String TAG_STABLE_DEVICE_VALUES = "stable-device-values"; + private static final String TAG_STABLE_DISPLAY_HEIGHT = "stable-display-height"; + private static final String TAG_STABLE_DISPLAY_WIDTH = "stable-display-width"; + + private static final String TAG_BRIGHTNESS_CONFIGURATIONS = "brightness-configurations"; + private static final String TAG_BRIGHTNESS_CONFIGURATION = "brightness-configuration"; + private static final String TAG_BRIGHTNESS_CURVE = "brightness-curve"; + private static final String TAG_BRIGHTNESS_POINT = "brightness-point"; + private static final String ATTR_USER_SERIAL = "user-serial"; + private static final String ATTR_LUX = "lux"; + private static final String ATTR_NITS = "nits"; + // Remembered Wifi display devices. private ArrayList<WifiDisplay> mRememberedWifiDisplays = new ArrayList<WifiDisplay>(); @@ -83,8 +123,8 @@ final class PersistentDataStore { // Display values which should be stable across the device's lifetime. private final StableDeviceValues mStableDeviceValues = new StableDeviceValues(); - // The atomic file used to safely read or write the file. - private final AtomicFile mAtomicFile; + // Brightness configuration by user + private BrightnessConfigurations mBrightnessConfigurations = new BrightnessConfigurations(); // True if the data has been loaded. private boolean mLoaded; @@ -92,8 +132,16 @@ final class PersistentDataStore { // True if there are changes to be saved. private boolean mDirty; + // The interface for methods which should be replaced by the test harness. + private Injector mInjector; + public PersistentDataStore() { - mAtomicFile = new AtomicFile(new File("/data/system/display-manager-state.xml")); + this(new Injector()); + } + + @VisibleForTesting + PersistentDataStore(Injector injector) { + mInjector = injector; } public void saveIfNeeded() { @@ -225,6 +273,18 @@ final class PersistentDataStore { } } + public void setBrightnessConfigurationForUser(BrightnessConfiguration c, int userSerial) { + loadIfNeeded(); + if (mBrightnessConfigurations.setBrightnessConfigurationForUser(c, userSerial)) { + setDirty(); + } + } + + public BrightnessConfiguration getBrightnessConfiguration(int userSerial) { + loadIfNeeded(); + return mBrightnessConfigurations.getBrightnessConfiguration(userSerial); + } + private DisplayState getDisplayState(String uniqueId, boolean createIfAbsent) { loadIfNeeded(); DisplayState state = mDisplayStates.get(uniqueId); @@ -256,7 +316,7 @@ final class PersistentDataStore { final InputStream is; try { - is = mAtomicFile.openRead(); + is = mInjector.openRead(); } catch (FileNotFoundException ex) { return; } @@ -278,9 +338,9 @@ final class PersistentDataStore { } private void save() { - final FileOutputStream os; + final OutputStream os; try { - os = mAtomicFile.startWrite(); + os = mInjector.startWrite(); boolean success = false; try { XmlSerializer serializer = new FastXmlSerializer(); @@ -289,11 +349,7 @@ final class PersistentDataStore { serializer.flush(); success = true; } finally { - if (success) { - mAtomicFile.finishWrite(os); - } else { - mAtomicFile.failWrite(os); - } + mInjector.finishWrite(os, success); } } catch (IOException ex) { Slog.w(TAG, "Failed to save display manager persistent store data.", ex); @@ -302,18 +358,21 @@ final class PersistentDataStore { private void loadFromXml(XmlPullParser parser) throws IOException, XmlPullParserException { - XmlUtils.beginDocument(parser, "display-manager-state"); + XmlUtils.beginDocument(parser, TAG_DISPLAY_MANAGER_STATE); final int outerDepth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, outerDepth)) { - if (parser.getName().equals("remembered-wifi-displays")) { + if (parser.getName().equals(TAG_REMEMBERED_WIFI_DISPLAYS)) { loadRememberedWifiDisplaysFromXml(parser); } - if (parser.getName().equals("display-states")) { + if (parser.getName().equals(TAG_DISPLAY_STATES)) { loadDisplaysFromXml(parser); } - if (parser.getName().equals("stable-device-values")) { + if (parser.getName().equals(TAG_STABLE_DEVICE_VALUES)) { mStableDeviceValues.loadFromXml(parser); } + if (parser.getName().equals(TAG_BRIGHTNESS_CONFIGURATIONS)) { + mBrightnessConfigurations.loadFromXml(parser); + } } } @@ -321,10 +380,10 @@ final class PersistentDataStore { throws IOException, XmlPullParserException { final int outerDepth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, outerDepth)) { - if (parser.getName().equals("wifi-display")) { - String deviceAddress = parser.getAttributeValue(null, "deviceAddress"); - String deviceName = parser.getAttributeValue(null, "deviceName"); - String deviceAlias = parser.getAttributeValue(null, "deviceAlias"); + if (parser.getName().equals(TAG_WIFI_DISPLAY)) { + String deviceAddress = parser.getAttributeValue(null, ATTR_DEVICE_ADDRESS); + String deviceName = parser.getAttributeValue(null, ATTR_DEVICE_NAME); + String deviceAlias = parser.getAttributeValue(null, ATTR_DEVICE_ALIAS); if (deviceAddress == null || deviceName == null) { throw new XmlPullParserException( "Missing deviceAddress or deviceName attribute on wifi-display."); @@ -345,8 +404,8 @@ final class PersistentDataStore { throws IOException, XmlPullParserException { final int outerDepth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, outerDepth)) { - if (parser.getName().equals("display")) { - String uniqueId = parser.getAttributeValue(null, "unique-id"); + if (parser.getName().equals(TAG_DISPLAY)) { + String uniqueId = parser.getAttributeValue(null, ATTR_UNIQUE_ID); if (uniqueId == null) { throw new XmlPullParserException( "Missing unique-id attribute on display."); @@ -365,32 +424,35 @@ final class PersistentDataStore { private void saveToXml(XmlSerializer serializer) throws IOException { serializer.startDocument(null, true); serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); - serializer.startTag(null, "display-manager-state"); - serializer.startTag(null, "remembered-wifi-displays"); + serializer.startTag(null, TAG_DISPLAY_MANAGER_STATE); + serializer.startTag(null, TAG_REMEMBERED_WIFI_DISPLAYS); for (WifiDisplay display : mRememberedWifiDisplays) { - serializer.startTag(null, "wifi-display"); - serializer.attribute(null, "deviceAddress", display.getDeviceAddress()); - serializer.attribute(null, "deviceName", display.getDeviceName()); + serializer.startTag(null, TAG_WIFI_DISPLAY); + serializer.attribute(null, ATTR_DEVICE_ADDRESS, display.getDeviceAddress()); + serializer.attribute(null, ATTR_DEVICE_NAME, display.getDeviceName()); if (display.getDeviceAlias() != null) { - serializer.attribute(null, "deviceAlias", display.getDeviceAlias()); + serializer.attribute(null, ATTR_DEVICE_ALIAS, display.getDeviceAlias()); } - serializer.endTag(null, "wifi-display"); + serializer.endTag(null, TAG_WIFI_DISPLAY); } - serializer.endTag(null, "remembered-wifi-displays"); - serializer.startTag(null, "display-states"); + serializer.endTag(null, TAG_REMEMBERED_WIFI_DISPLAYS); + serializer.startTag(null, TAG_DISPLAY_STATES); for (Map.Entry<String, DisplayState> entry : mDisplayStates.entrySet()) { final String uniqueId = entry.getKey(); final DisplayState state = entry.getValue(); - serializer.startTag(null, "display"); - serializer.attribute(null, "unique-id", uniqueId); + serializer.startTag(null, TAG_DISPLAY); + serializer.attribute(null, ATTR_UNIQUE_ID, uniqueId); state.saveToXml(serializer); - serializer.endTag(null, "display"); + serializer.endTag(null, TAG_DISPLAY); } - serializer.endTag(null, "display-states"); - serializer.startTag(null, "stable-device-values"); + serializer.endTag(null, TAG_DISPLAY_STATES); + serializer.startTag(null, TAG_STABLE_DEVICE_VALUES); mStableDeviceValues.saveToXml(serializer); - serializer.endTag(null, "stable-device-values"); - serializer.endTag(null, "display-manager-state"); + serializer.endTag(null, TAG_STABLE_DEVICE_VALUES); + serializer.startTag(null, TAG_BRIGHTNESS_CONFIGURATIONS); + mBrightnessConfigurations.saveToXml(serializer); + serializer.endTag(null, TAG_BRIGHTNESS_CONFIGURATIONS); + serializer.endTag(null, TAG_DISPLAY_MANAGER_STATE); serializer.endDocument(); } @@ -411,6 +473,8 @@ final class PersistentDataStore { } pw.println(" StableDeviceValues:"); mStableDeviceValues.dump(pw, " "); + pw.println(" BrightnessConfigurations:"); + mBrightnessConfigurations.dump(pw, " "); } private static final class DisplayState { @@ -433,7 +497,7 @@ final class PersistentDataStore { final int outerDepth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, outerDepth)) { - if (parser.getName().equals("color-mode")) { + if (parser.getName().equals(TAG_COLOR_MODE)) { String value = parser.nextText(); mColorMode = Integer.parseInt(value); } @@ -441,9 +505,9 @@ final class PersistentDataStore { } public void saveToXml(XmlSerializer serializer) throws IOException { - serializer.startTag(null, "color-mode"); + serializer.startTag(null, TAG_COLOR_MODE); serializer.text(Integer.toString(mColorMode)); - serializer.endTag(null, "color-mode"); + serializer.endTag(null, TAG_COLOR_MODE); } public void dump(final PrintWriter pw, final String prefix) { @@ -472,10 +536,10 @@ final class PersistentDataStore { final int outerDepth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, outerDepth)) { switch (parser.getName()) { - case "stable-display-width": + case TAG_STABLE_DISPLAY_WIDTH: mWidth = loadIntValue(parser); break; - case "stable-display-height": + case TAG_STABLE_DISPLAY_HEIGHT: mHeight = loadIntValue(parser); break; } @@ -494,12 +558,12 @@ final class PersistentDataStore { public void saveToXml(XmlSerializer serializer) throws IOException { if (mWidth > 0 && mHeight > 0) { - serializer.startTag(null, "stable-display-width"); + serializer.startTag(null, TAG_STABLE_DISPLAY_WIDTH); serializer.text(Integer.toString(mWidth)); - serializer.endTag(null, "stable-display-width"); - serializer.startTag(null, "stable-display-height"); + serializer.endTag(null, TAG_STABLE_DISPLAY_WIDTH); + serializer.startTag(null, TAG_STABLE_DISPLAY_HEIGHT); serializer.text(Integer.toString(mHeight)); - serializer.endTag(null, "stable-display-height"); + serializer.endTag(null, TAG_STABLE_DISPLAY_HEIGHT); } } @@ -508,4 +572,158 @@ final class PersistentDataStore { pw.println(prefix + "StableDisplayHeight=" + mHeight); } } + + private static final class BrightnessConfigurations { + // Maps from a user ID to the users' given brightness configuration + private SparseArray<BrightnessConfiguration> mConfigurations; + + public BrightnessConfigurations() { + mConfigurations = new SparseArray<>(); + } + + private boolean setBrightnessConfigurationForUser(BrightnessConfiguration c, + int userSerial) { + BrightnessConfiguration currentConfig = mConfigurations.get(userSerial); + if (currentConfig == null || !currentConfig.equals(c)) { + mConfigurations.put(userSerial, c); + return true; + } + return false; + } + + public BrightnessConfiguration getBrightnessConfiguration(int userSerial) { + return mConfigurations.get(userSerial); + } + + public void loadFromXml(XmlPullParser parser) throws IOException, XmlPullParserException { + final int outerDepth = parser.getDepth(); + while (XmlUtils.nextElementWithin(parser, outerDepth)) { + if (TAG_BRIGHTNESS_CONFIGURATION.equals(parser.getName())) { + int userSerial; + try { + userSerial = Integer.parseInt( + parser.getAttributeValue(null, ATTR_USER_SERIAL)); + } catch (NumberFormatException nfe) { + userSerial= -1; + Slog.e(TAG, "Failed to read in brightness configuration", nfe); + } + + try { + BrightnessConfiguration config = loadConfigurationFromXml(parser); + if (userSerial>= 0 && config != null) { + mConfigurations.put(userSerial, config); + } + } catch (IllegalArgumentException iae) { + Slog.e(TAG, "Failed to load brightness configuration!", iae); + } + } + } + } + + private static BrightnessConfiguration loadConfigurationFromXml(XmlPullParser parser) + throws IOException, XmlPullParserException { + final int outerDepth = parser.getDepth(); + final BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(); + while (XmlUtils.nextElementWithin(parser, outerDepth)) { + if (TAG_BRIGHTNESS_CURVE.equals(parser.getName())) { + Pair<float[], float[]> curve = loadCurveFromXml(parser, builder); + builder.setCurve(curve.first /*lux*/, curve.second /*nits*/); + } + } + return builder.build(); + } + + private static Pair<float[], float[]> loadCurveFromXml(XmlPullParser parser, + BrightnessConfiguration.Builder builder) + throws IOException, XmlPullParserException { + final int outerDepth = parser.getDepth(); + List<Float> luxLevels = new ArrayList<>(); + List<Float> nitLevels = new ArrayList<>(); + while (XmlUtils.nextElementWithin(parser, outerDepth)) { + if (TAG_BRIGHTNESS_POINT.equals(parser.getName())) { + luxLevels.add(loadFloat(parser.getAttributeValue(null, ATTR_LUX))); + nitLevels.add(loadFloat(parser.getAttributeValue(null, ATTR_NITS))); + } + } + final int N = luxLevels.size(); + float[] lux = new float[N]; + float[] nits = new float[N]; + for (int i = 0; i < N; i++) { + lux[i] = luxLevels.get(i); + nits[i] = nitLevels.get(i); + } + return Pair.create(lux, nits); + } + + private static float loadFloat(String val) { + try { + return Float.parseFloat(val); + } catch (NullPointerException | NumberFormatException e) { + Slog.e(TAG, "Failed to parse float loading brightness config", e); + return Float.NEGATIVE_INFINITY; + } + } + + public void saveToXml(XmlSerializer serializer) throws IOException { + for (int i = 0; i < mConfigurations.size(); i++) { + final int userSerial= mConfigurations.keyAt(i); + final BrightnessConfiguration config = mConfigurations.valueAt(i); + + serializer.startTag(null, TAG_BRIGHTNESS_CONFIGURATION); + serializer.attribute(null, ATTR_USER_SERIAL, Integer.toString(userSerial)); + saveConfigurationToXml(serializer, config); + serializer.endTag(null, TAG_BRIGHTNESS_CONFIGURATION); + } + } + + private static void saveConfigurationToXml(XmlSerializer serializer, + BrightnessConfiguration config) throws IOException { + serializer.startTag(null, TAG_BRIGHTNESS_CURVE); + final Pair<float[], float[]> curve = config.getCurve(); + for (int i = 0; i < curve.first.length; i++) { + serializer.startTag(null, TAG_BRIGHTNESS_POINT); + serializer.attribute(null, ATTR_LUX, Float.toString(curve.first[i])); + serializer.attribute(null, ATTR_NITS, Float.toString(curve.second[i])); + serializer.endTag(null, TAG_BRIGHTNESS_POINT); + } + serializer.endTag(null, TAG_BRIGHTNESS_CURVE); + } + + public void dump(final PrintWriter pw, final String prefix) { + for (int i = 0; i < mConfigurations.size(); i++) { + final int userSerial= mConfigurations.keyAt(i); + pw.println(prefix + "User " + userSerial + ":"); + pw.println(prefix + " " + mConfigurations.valueAt(i)); + } + } + } + + @VisibleForTesting + static class Injector { + private final AtomicFile mAtomicFile; + + public Injector() { + mAtomicFile = new AtomicFile(new File("/data/system/display-manager-state.xml")); + } + + public InputStream openRead() throws FileNotFoundException { + return mAtomicFile.openRead(); + } + + public OutputStream startWrite() throws IOException { + return mAtomicFile.startWrite(); + } + + public void finishWrite(OutputStream os, boolean success) { + if (!(os instanceof FileOutputStream)) { + throw new IllegalArgumentException("Unexpected OutputStream as argument: " + os); + } + FileOutputStream fos = (FileOutputStream) os; + if (success) { + mAtomicFile.finishWrite(fos); + } else { + mAtomicFile.failWrite(fos); + } + } + } } diff --git a/core/java/android/security/recoverablekeystore/RecoverableKeyGenerator.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator.java index 4125f0baf49d..40c788997ba5 100644 --- a/core/java/android/security/recoverablekeystore/RecoverableKeyGenerator.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.security.recoverablekeystore; +package com.android.server.locksettings.recoverablekeystore; import android.security.keystore.AndroidKeyStoreSecretKey; import android.security.keystore.KeyProperties; diff --git a/core/java/android/security/recoverablekeystore/RecoverableKeyStorage.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStorage.java index c239e006c23b..cd85a97c3522 100644 --- a/core/java/android/security/recoverablekeystore/RecoverableKeyStorage.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStorage.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.security.recoverablekeystore; +package com.android.server.locksettings.recoverablekeystore; import android.security.keystore.KeyProtection; diff --git a/core/java/android/security/recoverablekeystore/RecoverableKeyStorageImpl.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStorageImpl.java index b9926dd9cf8d..4e0751b2ad95 100644 --- a/core/java/android/security/recoverablekeystore/RecoverableKeyStorageImpl.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStorageImpl.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.security.recoverablekeystore; +package com.android.server.locksettings.recoverablekeystore; import android.security.keystore.KeyProtection; diff --git a/core/java/android/security/recoverablekeystore/WrappedKey.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/WrappedKey.java index 51665ae2931d..c97c66ef9016 100644 --- a/core/java/android/security/recoverablekeystore/WrappedKey.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/WrappedKey.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.security.recoverablekeystore; +package com.android.server.locksettings.recoverablekeystore; import java.security.InvalidKeyException; import java.security.KeyStoreException; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 159419e957a8..f106391f5916 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -47,6 +47,7 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK; import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION; import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY; +import static android.content.pm.PackageManager.INSTALL_FAILED_NEWER_SDK; import static android.content.pm.PackageManager.INSTALL_FAILED_PACKAGE_CHANGED; import static android.content.pm.PackageManager.INSTALL_FAILED_REPLACE_COULDNT_DELETE; import static android.content.pm.PackageManager.INSTALL_FAILED_SANDBOX_VERSION_DOWNGRADE; @@ -16283,6 +16284,16 @@ public class PackageManagerService extends IPackageManager.Stub Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } + // App targetSdkVersion is below min supported version + if (!forceSdk && pkg.applicationInfo.isTargetingDeprecatedSdkVersion()) { + Slog.w(TAG, "App " + pkg.packageName + " targets deprecated sdk"); + + res.setError(INSTALL_FAILED_NEWER_SDK, + "App is targeting deprecated sdk (targetSdkVersion should be at least " + + Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT + ")."); + return; + } + // Instant apps must have target SDK >= O and have targetSanboxVersion >= 2 if (instantApp && pkg.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.N_MR1) { Slog.w(TAG, "Instant app package " + pkg.packageName + " does not target O"); diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index dc481ca11c7b..03cd4f1d3269 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -3702,8 +3702,10 @@ public class UserManagerService extends IUserManager.Stub { } @Override - public UserInfo createUserEvenWhenDisallowed(String name, int flags) { - UserInfo user = createUserInternalUnchecked(name, flags, UserHandle.USER_NULL, null); + public UserInfo createUserEvenWhenDisallowed(String name, int flags, + String[] disallowedPackages) { + UserInfo user = createUserInternalUnchecked(name, flags, UserHandle.USER_NULL, + disallowedPackages); // Keep this in sync with UserManager.createUser if (user != null && !user.isAdmin() && !user.isDemo()) { setUserRestriction(UserManager.DISALLOW_SMS, true, user.id); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 61591bbef08d..5f03dd262fa4 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -321,11 +321,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final int LONG_PRESS_BACK_NOTHING = 0; static final int LONG_PRESS_BACK_GO_TO_VOICE_ASSIST = 1; - // Number of presses needed before we induce panic press behavior on the back button - static final int PANIC_PRESS_BACK_COUNT = 4; - static final int PANIC_PRESS_BACK_NOTHING = 0; - static final int PANIC_PRESS_BACK_HOME = 1; - // These need to match the documentation/constant in // core/res/res/values/config.xml static final int LONG_PRESS_HOME_NOTHING = 0; @@ -520,7 +515,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { volatile boolean mBackKeyHandled; volatile boolean mBeganFromNonInteractive; volatile int mPowerKeyPressCounter; - volatile int mBackKeyPressCounter; volatile boolean mEndCallKeyHandled; volatile boolean mCameraGestureTriggeredDuringGoingToSleep; volatile boolean mGoingToSleep; @@ -582,7 +576,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { int mDoublePressOnPowerBehavior; int mTriplePressOnPowerBehavior; int mLongPressOnBackBehavior; - int mPanicPressOnBackBehavior; int mShortPressOnSleepBehavior; int mShortPressOnWindowBehavior; volatile boolean mAwake; @@ -800,16 +793,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { private static final int MSG_SHOW_PICTURE_IN_PICTURE_MENU = 17; private static final int MSG_BACK_LONG_PRESS = 18; private static final int MSG_DISPOSE_INPUT_CONSUMER = 19; - private static final int MSG_BACK_DELAYED_PRESS = 20; - private static final int MSG_ACCESSIBILITY_SHORTCUT = 21; - private static final int MSG_BUGREPORT_TV = 22; - private static final int MSG_ACCESSIBILITY_TV = 23; - private static final int MSG_DISPATCH_BACK_KEY_TO_AUTOFILL = 24; - private static final int MSG_SYSTEM_KEY_PRESS = 25; - private static final int MSG_HANDLE_ALL_APPS = 26; - private static final int MSG_LAUNCH_ASSIST = 27; - private static final int MSG_LAUNCH_ASSIST_LONG_PRESS = 28; - private static final int MSG_POWER_VERY_LONG_PRESS = 29; + private static final int MSG_ACCESSIBILITY_SHORTCUT = 20; + private static final int MSG_BUGREPORT_TV = 21; + private static final int MSG_ACCESSIBILITY_TV = 22; + private static final int MSG_DISPATCH_BACK_KEY_TO_AUTOFILL = 23; + private static final int MSG_SYSTEM_KEY_PRESS = 24; + private static final int MSG_HANDLE_ALL_APPS = 25; + private static final int MSG_LAUNCH_ASSIST = 26; + private static final int MSG_LAUNCH_ASSIST_LONG_PRESS = 27; + private static final int MSG_POWER_VERY_LONG_PRESS = 28; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1; @@ -887,15 +879,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { break; case MSG_BACK_LONG_PRESS: backLongPress(); - finishBackKeyPress(); break; case MSG_DISPOSE_INPUT_CONSUMER: disposeInputConsumer((InputConsumer) msg.obj); break; - case MSG_BACK_DELAYED_PRESS: - backMultiPressAction(msg.arg1); - finishBackKeyPress(); - break; case MSG_ACCESSIBILITY_SHORTCUT: accessibilityShortcutActivated(); break; @@ -1181,14 +1168,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Reset back key state for long press mBackKeyHandled = false; - // Cancel multi-press detection timeout. - if (hasPanicPressOnBackBehavior()) { - if (mBackKeyPressCounter != 0 - && mBackKeyPressCounter < PANIC_PRESS_BACK_COUNT) { - mHandler.removeMessages(MSG_BACK_DELAYED_PRESS); - } - } - if (hasLongPressOnBackBehavior()) { Message msg = mHandler.obtainMessage(MSG_BACK_LONG_PRESS); msg.setAsynchronous(true); @@ -1202,21 +1181,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Cache handled state boolean handled = mBackKeyHandled; - if (hasPanicPressOnBackBehavior()) { - // Check for back key panic press - ++mBackKeyPressCounter; - - final long eventTime = event.getDownTime(); - - if (mBackKeyPressCounter <= PANIC_PRESS_BACK_COUNT) { - // This could be a multi-press. Wait a little bit longer to confirm. - Message msg = mHandler.obtainMessage(MSG_BACK_DELAYED_PRESS, - mBackKeyPressCounter, 0, eventTime); - msg.setAsynchronous(true); - mHandler.sendMessageDelayed(msg, ViewConfiguration.getMultiPressTimeout()); - } - } - // Reset back long press state cancelPendingBackKeyAction(); @@ -1394,10 +1358,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - private void finishBackKeyPress() { - mBackKeyPressCounter = 0; - } - private void cancelPendingPowerKeyAction() { if (!mPowerKeyHandled) { mPowerKeyHandled = true; @@ -1415,18 +1375,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - private void backMultiPressAction(int count) { - if (count >= PANIC_PRESS_BACK_COUNT) { - switch (mPanicPressOnBackBehavior) { - case PANIC_PRESS_BACK_NOTHING: - break; - case PANIC_PRESS_BACK_HOME: - launchHomeFromHotKey(); - break; - } - } - } - private void powerPress(long eventTime, boolean interactive, int count) { if (mScreenOnEarly && !mScreenOnFully) { Slog.i(TAG, "Suppressed redundant power key press while " @@ -1642,10 +1590,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { return mLongPressOnBackBehavior != LONG_PRESS_BACK_NOTHING; } - private boolean hasPanicPressOnBackBehavior() { - return mPanicPressOnBackBehavior != PANIC_PRESS_BACK_NOTHING; - } - private void interceptScreenshotChord() { if (mScreenshotChordEnabled && mScreenshotChordVolumeDownKeyTriggered && mScreenshotChordPowerKeyTriggered @@ -2036,8 +1980,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { mLongPressOnBackBehavior = mContext.getResources().getInteger( com.android.internal.R.integer.config_longPressOnBackBehavior); - mPanicPressOnBackBehavior = mContext.getResources().getInteger( - com.android.internal.R.integer.config_backPanicBehavior); mShortPressOnPowerBehavior = mContext.getResources().getInteger( com.android.internal.R.integer.config_shortPressOnPowerBehavior); @@ -8296,9 +8238,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print("mLongPressOnBackBehavior="); pw.println(longPressOnBackBehaviorToString(mLongPressOnBackBehavior)); pw.print(prefix); - pw.print("mPanicPressOnBackBehavior="); - pw.println(panicPressOnBackBehaviorToString(mPanicPressOnBackBehavior)); - pw.print(prefix); pw.print("mLongPressOnHomeBehavior="); pw.println(longPressOnHomeBehaviorToString(mLongPressOnHomeBehavior)); pw.print(prefix); @@ -8498,17 +8437,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - private static String panicPressOnBackBehaviorToString(int behavior) { - switch (behavior) { - case PANIC_PRESS_BACK_NOTHING: - return "PANIC_PRESS_BACK_NOTHING"; - case PANIC_PRESS_BACK_HOME: - return "PANIC_PRESS_BACK_HOME"; - default: - return Integer.toString(behavior); - } - } - private static String longPressOnHomeBehaviorToString(int behavior) { switch (behavior) { case LONG_PRESS_HOME_NOTHING: diff --git a/services/core/java/com/android/server/timezone/PackageStatusStorage.java b/services/core/java/com/android/server/timezone/PackageStatusStorage.java index 5601c91a78e7..251a27763fd2 100644 --- a/services/core/java/com/android/server/timezone/PackageStatusStorage.java +++ b/services/core/java/com/android/server/timezone/PackageStatusStorage.java @@ -82,12 +82,16 @@ final class PackageStatusStorage { PackageStatusStorage(File storageDir) { mPackageStatusFile = new AtomicFile(new File(storageDir, "package-status.xml")); + } + + /** + * Initialize any storage, as needed. + * + * @throws IOException if the storage could not be initialized + */ + void initialize() throws IOException { if (!mPackageStatusFile.getBaseFile().exists()) { - try { - insertInitialPackageStatus(); - } catch (IOException e) { - throw new IllegalStateException(e); - } + insertInitialPackageStatus(); } } @@ -342,13 +346,13 @@ final class PackageStatusStorage { } /** Only used during tests to force a known table state. */ - public void forceCheckStateForTests(int checkStatus, PackageVersions packageVersions) { + public void forceCheckStateForTests(int checkStatus, PackageVersions packageVersions) + throws IOException { synchronized (this) { try { - int optimisticLockId = getCurrentOptimisticLockId(); - writePackageStatusWithOptimisticLockCheck(optimisticLockId, optimisticLockId, - checkStatus, packageVersions); - } catch (IOException | ParseException e) { + final int initialOptimisticLockId = (int) System.currentTimeMillis(); + writePackageStatusLocked(checkStatus, initialOptimisticLockId, packageVersions); + } catch (IOException e) { throw new IllegalStateException(e); } } diff --git a/services/core/java/com/android/server/timezone/PackageTracker.java b/services/core/java/com/android/server/timezone/PackageTracker.java index c362c800a83d..0e8d8bc8e411 100644 --- a/services/core/java/com/android/server/timezone/PackageTracker.java +++ b/services/core/java/com/android/server/timezone/PackageTracker.java @@ -28,6 +28,7 @@ import android.provider.TimeZoneRulesDataContract; import android.util.Slog; import java.io.File; +import java.io.IOException; import java.io.PrintWriter; import java.time.Clock; @@ -97,10 +98,6 @@ public class PackageTracker { Clock elapsedRealtimeClock = SystemClock.elapsedRealtimeClock(); PackageTrackerHelperImpl helperImpl = new PackageTrackerHelperImpl(context); File storageDir = FileUtils.createDir(Environment.getDataSystemDirectory(), "timezone"); - if (!storageDir.exists()) { - storageDir.mkdir(); - } - return new PackageTracker( elapsedRealtimeClock /* elapsedRealtimeClock */, helperImpl /* configHelper */, @@ -121,11 +118,11 @@ public class PackageTracker { } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) - protected synchronized void start() { + protected synchronized boolean start() { mTrackingEnabled = mConfigHelper.isTrackingEnabled(); if (!mTrackingEnabled) { Slog.i(TAG, "Time zone updater / data package tracking explicitly disabled."); - return; + return false; } mUpdateAppPackageName = mConfigHelper.getUpdateAppPackageName(); @@ -143,6 +140,14 @@ public class PackageTracker { mCheckTriggered = false; mCheckFailureCount = 0; + // Initialize the storage, as needed. + try { + mPackageStatusStorage.initialize(); + } catch (IOException e) { + Slog.w(TAG, "PackageTracker storage could not be initialized.", e); + return false; + } + // Initialize the intent helper. mIntentHelper.initialize(mUpdateAppPackageName, mDataAppPackageName, this); @@ -152,6 +157,7 @@ public class PackageTracker { mIntentHelper.scheduleReliabilityTrigger(mDelayBeforeReliabilityCheckMillis); Slog.i(TAG, "Time zone updater / data package tracking enabled"); + return true; } /** diff --git a/services/core/java/com/android/server/timezone/RulesManagerService.java b/services/core/java/com/android/server/timezone/RulesManagerService.java index 52b49baf1073..30fc63c2a1b0 100644 --- a/services/core/java/com/android/server/timezone/RulesManagerService.java +++ b/services/core/java/com/android/server/timezone/RulesManagerService.java @@ -121,6 +121,7 @@ public final class RulesManagerService extends IRulesManager.Stub { } public void start() { + // Return value deliberately ignored: no action required on failure to start. mPackageTracker.start(); } diff --git a/services/core/java/com/android/server/wallpaper/IWallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/IWallpaperManagerService.java new file mode 100644 index 000000000000..60b08dd3093c --- /dev/null +++ b/services/core/java/com/android/server/wallpaper/IWallpaperManagerService.java @@ -0,0 +1,35 @@ +/* + * 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 com.android.server.wallpaper; + +import android.app.IWallpaperManager; +import android.os.IBinder; + +/** + * Extended IWallpaperManager which can receive SystemService's lifetime events. + */ +interface IWallpaperManagerService extends IWallpaperManager, IBinder { + /** + * @see com.android.server.SystemService#onBootPhase(int) + */ + void onBootPhase(int phase); + + /** + * @see com.android.server.SystemService#onUnlockUser(int) + */ + void onUnlockUser(final int userId); +}
\ No newline at end of file diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index b888ec21e708..7b0ed0d06739 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -99,6 +99,7 @@ import com.android.server.EventLogTags; import com.android.server.FgThread; import com.android.server.SystemService; +import java.lang.reflect.InvocationTargetException; import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; @@ -119,14 +120,16 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; +import com.android.internal.R; -public class WallpaperManagerService extends IWallpaperManager.Stub { +public class WallpaperManagerService extends IWallpaperManager.Stub + implements IWallpaperManagerService { static final String TAG = "WallpaperManagerService"; static final boolean DEBUG = false; static final boolean DEBUG_LIVE = DEBUG || true; public static class Lifecycle extends SystemService { - private WallpaperManagerService mService; + private IWallpaperManagerService mService; public Lifecycle(Context context) { super(context); @@ -134,22 +137,30 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { @Override public void onStart() { - mService = new WallpaperManagerService(getContext()); - publishBinderService(Context.WALLPAPER_SERVICE, mService); + try { + final Class<? extends IWallpaperManagerService> klass = + (Class<? extends IWallpaperManagerService>)Class.forName( + getContext().getResources().getString( + R.string.config_wallpaperManagerServiceName)); + mService = klass.getConstructor(Context.class).newInstance(getContext()); + publishBinderService(Context.WALLPAPER_SERVICE, mService); + } catch (Exception exp) { + Slog.wtf(TAG, "Failed to instantiate WallpaperManagerService", exp); + } } @Override public void onBootPhase(int phase) { - if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) { - mService.systemReady(); - } else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) { - mService.switchUser(UserHandle.USER_SYSTEM, null); + if (mService != null) { + mService.onBootPhase(phase); } } @Override public void onUnlockUser(int userHandle) { - mService.onUnlockUser(userHandle); + if (mService != null) { + mService.onUnlockUser(userHandle); + } } } @@ -1255,7 +1266,17 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { mLockWallpaperMap.remove(userId); } - void onUnlockUser(final int userId) { + @Override + public void onBootPhase(int phase) { + if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) { + systemReady(); + } else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) { + switchUser(UserHandle.USER_SYSTEM, null); + } + } + + @Override + public void onUnlockUser(final int userId) { synchronized (mLock) { if (mCurrentUserId == userId) { if (mWaitingForUnlock) { diff --git a/services/core/java/com/android/server/wm/DragDropController.java b/services/core/java/com/android/server/wm/DragDropController.java index 65951dc634f8..28b4c1dbeb8e 100644 --- a/services/core/java/com/android/server/wm/DragDropController.java +++ b/services/core/java/com/android/server/wm/DragDropController.java @@ -40,6 +40,7 @@ import android.view.View; import com.android.internal.util.Preconditions; import com.android.server.input.InputWindowHandle; import com.android.server.wm.WindowManagerInternal.IDragDropCallback; +import java.util.concurrent.atomic.AtomicReference; /** * Managing drag and drop operations initiated by View#startDragAndDrop. @@ -67,42 +68,10 @@ class DragDropController { private final Handler mHandler; /** - * Lock to preserve the order of state updates. - * The lock is used to process drag and drop state updates in order without having the window - * manager lock. - * - * Suppose DragDropController invokes a callback method A, then processes the following update - * A'. Same for a callback method B and the following update B'. The callback wants - * DragDropController to processes the updates in the order of A' then B'. - * - * Without mWriteLock: the following race can happen. - * - * 1. Thread a calls A. - * 2. Thread b calls B. - * 3. Thread b acquires the window manager lock - * 4. thread b processes the update B' - * 5. Thread a acquires the window manager lock - * 6. thread a processes the update A' - * - * With mWriteLock we can ensure the order of A' and B' - * - * 1. Thread a acquire mWriteLock - * 2. Thread a calls A - * 3. Thread a acquire the window manager lock - * 4. Thread a processes A' - * 5. Thread b acquire mWriteLock - * 6. Thread b calls B - * 7. Thread b acquire the window manager lock - * 8. Thread b processes B' - * - * Don't acquire the lock while holding the window manager lock, otherwise it causes a deadlock. - */ - private final Object mWriteLock = new Object(); - - /** * Callback which is used to sync drag state with the vendor-specific code. */ - @NonNull private IDragDropCallback mCallback = new IDragDropCallback() {}; + @NonNull private AtomicReference<IDragDropCallback> mCallback = new AtomicReference<>( + new IDragDropCallback() {}); boolean dragDropActiveLocked() { return mDragState != null; @@ -114,9 +83,7 @@ class DragDropController { void registerCallback(IDragDropCallback callback) { Preconditions.checkNotNull(callback); - synchronized (mWriteLock) { - mCallback = callback; - } + mCallback.set(callback); } DragDropController(WindowManagerService service, Looper looper) { @@ -136,45 +103,48 @@ class DragDropController { + " asbinder=" + window.asBinder()); } - synchronized (mWriteLock) { - synchronized (mService.mWindowMap) { - if (dragDropActiveLocked()) { - Slog.w(TAG_WM, "Drag already in progress"); - return null; - } + if (width <= 0 || height <= 0) { + Slog.w(TAG_WM, "width and height of drag shadow must be positive"); + return null; + } - // TODO(multi-display): support other displays - final DisplayContent displayContent = - mService.getDefaultDisplayContentLocked(); - final Display display = displayContent.getDisplay(); - - final SurfaceControl surface = new SurfaceControl.Builder(session) - .setName("drag surface") - .setSize(width, height) - .setFormat(PixelFormat.TRANSLUCENT) - .build(); - surface.setLayerStack(display.getLayerStack()); - float alpha = 1; - if ((flags & View.DRAG_FLAG_OPAQUE) == 0) { - alpha = DRAG_SHADOW_ALPHA_TRANSPARENT; - } - surface.setAlpha(alpha); - - if (SHOW_TRANSACTIONS) - Slog.i(TAG_WM, " DRAG " + surface + ": CREATE"); - outSurface.copyFrom(surface); - final IBinder winBinder = window.asBinder(); - IBinder token = new Binder(); - mDragState = new DragState(mService, token, surface, flags, winBinder); - mDragState.mPid = callerPid; - mDragState.mUid = callerUid; - mDragState.mOriginalAlpha = alpha; - token = mDragState.mToken = new Binder(); - - // 5 second timeout for this window to actually begin the drag - sendTimeoutMessage(MSG_DRAG_START_TIMEOUT, winBinder); - return token; + synchronized (mService.mWindowMap) { + if (dragDropActiveLocked()) { + Slog.w(TAG_WM, "Drag already in progress"); + return null; + } + + // TODO(multi-display): support other displays + final DisplayContent displayContent = + mService.getDefaultDisplayContentLocked(); + final Display display = displayContent.getDisplay(); + + final SurfaceControl surface = new SurfaceControl.Builder(session) + .setName("drag surface") + .setSize(width, height) + .setFormat(PixelFormat.TRANSLUCENT) + .build(); + surface.setLayerStack(display.getLayerStack()); + float alpha = 1; + if ((flags & View.DRAG_FLAG_OPAQUE) == 0) { + alpha = DRAG_SHADOW_ALPHA_TRANSPARENT; } + surface.setAlpha(alpha); + + if (SHOW_TRANSACTIONS) + Slog.i(TAG_WM, " DRAG " + surface + ": CREATE"); + outSurface.copyFrom(surface); + final IBinder winBinder = window.asBinder(); + IBinder token = new Binder(); + mDragState = new DragState(mService, token, surface, flags, winBinder); + mDragState.mPid = callerPid; + mDragState.mUid = callerUid; + mDragState.mOriginalAlpha = alpha; + token = mDragState.mToken = new Binder(); + + // 5 second timeout for this window to actually begin the drag + sendTimeoutMessage(MSG_DRAG_START_TIMEOUT, winBinder); + return token; } } @@ -185,84 +155,89 @@ class DragDropController { Slog.d(TAG_WM, "perform drag: win=" + window + " data=" + data); } - synchronized (mWriteLock) { - if (!mCallback.performDrag(window, dragToken, touchSource, touchX, touchY, thumbCenterX, - thumbCenterY, data)) { - return false; - } + final boolean callbackResult = mCallback.get().prePerformDrag(window, dragToken, + touchSource, touchX, touchY, thumbCenterX, thumbCenterY, data); + try { synchronized (mService.mWindowMap) { - if (mDragState == null) { - Slog.w(TAG_WM, "No drag prepared"); - throw new IllegalStateException("performDrag() without prepareDrag()"); - } - - if (dragToken != mDragState.mToken) { - Slog.w(TAG_WM, "Performing mismatched drag"); - throw new IllegalStateException("performDrag() does not match prepareDrag()"); - } - - final WindowState callingWin = mService.windowForClientLocked(null, window, false); - if (callingWin == null) { - Slog.w(TAG_WM, "Bad requesting window " + window); - return false; // !!! TODO: throw here? - } + mHandler.removeMessages(MSG_DRAG_START_TIMEOUT, window.asBinder()); + try { + if (!callbackResult) { + return false; + } - // !!! TODO: if input is not still focused on the initiating window, fail - // the drag initiation (e.g. an alarm window popped up just as the application - // called performDrag() + Preconditions.checkState( + mDragState != null, "performDrag() without prepareDrag()"); + Preconditions.checkState( + mDragState.mToken == dragToken, + "performDrag() does not match prepareDrag()"); + + final WindowState callingWin = mService.windowForClientLocked( + null, window, false); + if (callingWin == null) { + Slog.w(TAG_WM, "Bad requesting window " + window); + return false; // !!! TODO: throw here? + } - mHandler.removeMessages(MSG_DRAG_START_TIMEOUT, window.asBinder()); + // !!! TODO: if input is not still focused on the initiating window, fail + // the drag initiation (e.g. an alarm window popped up just as the application + // called performDrag() - // !!! TODO: extract the current touch (x, y) in screen coordinates. That - // will let us eliminate the (touchX,touchY) parameters from the API. + // !!! TODO: extract the current touch (x, y) in screen coordinates. That + // will let us eliminate the (touchX,touchY) parameters from the API. - // !!! FIXME: put all this heavy stuff onto the mHandler looper, as well as - // the actual drag event dispatch stuff in the dragstate + // !!! FIXME: put all this heavy stuff onto the mHandler looper, as well as + // the actual drag event dispatch stuff in the dragstate - final DisplayContent displayContent = callingWin.getDisplayContent(); - if (displayContent == null) { - return false; - } - Display display = displayContent.getDisplay(); - mDragState.register(display); - if (!mService.mInputManager.transferTouchFocus(callingWin.mInputChannel, - mDragState.getInputChannel())) { - Slog.e(TAG_WM, "Unable to transfer touch focus"); - mDragState.closeLocked(); - return false; - } + final DisplayContent displayContent = callingWin.getDisplayContent(); + if (displayContent == null) { + Slog.w(TAG_WM, "display content is null"); + return false; + } - mDragState.mDisplayContent = displayContent; - mDragState.mData = data; - mDragState.broadcastDragStartedLocked(touchX, touchY); - mDragState.overridePointerIconLocked(touchSource); + final Display display = displayContent.getDisplay(); + mDragState.register(display); + if (!mService.mInputManager.transferTouchFocus(callingWin.mInputChannel, + mDragState.getInputChannel())) { + Slog.e(TAG_WM, "Unable to transfer touch focus"); + return false; + } - // remember the thumb offsets for later - mDragState.mThumbOffsetX = thumbCenterX; - mDragState.mThumbOffsetY = thumbCenterY; + mDragState.mDisplayContent = displayContent; + mDragState.mData = data; + mDragState.broadcastDragStartedLocked(touchX, touchY); + mDragState.overridePointerIconLocked(touchSource); + // remember the thumb offsets for later + mDragState.mThumbOffsetX = thumbCenterX; + mDragState.mThumbOffsetY = thumbCenterY; + + // Make the surface visible at the proper location + final SurfaceControl surfaceControl = mDragState.mSurfaceControl; + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, ">>> OPEN TRANSACTION performDrag"); + mService.openSurfaceTransaction(); + try { + surfaceControl.setPosition(touchX - thumbCenterX, + touchY - thumbCenterY); + surfaceControl.setLayer(mDragState.getDragLayerLocked()); + surfaceControl.setLayerStack(display.getLayerStack()); + surfaceControl.show(); + } finally { + mService.closeSurfaceTransaction("performDrag"); + if (SHOW_LIGHT_TRANSACTIONS) { + Slog.i(TAG_WM, "<<< CLOSE TRANSACTION performDrag"); + } + } - // Make the surface visible at the proper location - final SurfaceControl surfaceControl = mDragState.mSurfaceControl; - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, ">>> OPEN TRANSACTION performDrag"); - mService.openSurfaceTransaction(); - try { - surfaceControl.setPosition(touchX - thumbCenterX, - touchY - thumbCenterY); - surfaceControl.setLayer(mDragState.getDragLayerLocked()); - surfaceControl.setLayerStack(display.getLayerStack()); - surfaceControl.show(); + mDragState.notifyLocationLocked(touchX, touchY); } finally { - mService.closeSurfaceTransaction("performDrag"); - if (SHOW_LIGHT_TRANSACTIONS) { - Slog.i(TAG_WM, "<<< CLOSE TRANSACTION performDrag"); + if (mDragState != null && !mDragState.isInProgress()) { + mDragState.closeLocked(); } } - - mDragState.notifyLocationLocked(touchX, touchY); } + return true; // success! + } finally { + mCallback.get().postPerformDrag(); } - - return true; // success! } void reportDropResult(IWindow window, boolean consumed) { @@ -271,8 +246,8 @@ class DragDropController { Slog.d(TAG_WM, "Drop result=" + consumed + " reported by " + token); } - synchronized (mWriteLock) { - mCallback.reportDropResult(window, consumed); + mCallback.get().preReportDropResult(window, consumed); + try { synchronized (mService.mWindowMap) { if (mDragState == null) { // Most likely the drop recipient ANRed and we ended the drag @@ -297,10 +272,11 @@ class DragDropController { return; // !!! TODO: throw here? } - mDragState.mDragResult = consumed; mDragState.endDragLocked(); } + } finally { + mCallback.get().postReportDropResult(); } } @@ -309,8 +285,8 @@ class DragDropController { Slog.d(TAG_WM, "cancelDragAndDrop"); } - synchronized (mWriteLock) { - mCallback.cancelDragAndDrop(dragToken); + mCallback.get().preCancelDragAndDrop(dragToken); + try { synchronized (mService.mWindowMap) { if (mDragState == null) { Slog.w(TAG_WM, "cancelDragAndDrop() without prepareDrag()"); @@ -327,6 +303,8 @@ class DragDropController { mDragState.mDragResult = false; mDragState.cancelDragLocked(); } + } finally { + mCallback.get().postCancelDragAndDrop(); } } @@ -338,20 +316,18 @@ class DragDropController { * @param newY Y coordinate value in dp in the screen coordinate */ void handleMotionEvent(boolean keepHandling, float newX, float newY) { - synchronized (mWriteLock) { - synchronized (mService.mWindowMap) { - if (!dragDropActiveLocked()) { - // The drag has ended but the clean-up message has not been processed by - // window manager. Drop events that occur after this until window manager - // has a chance to clean-up the input handle. - return; - } + synchronized (mService.mWindowMap) { + if (!dragDropActiveLocked()) { + // The drag has ended but the clean-up message has not been processed by + // window manager. Drop events that occur after this until window manager + // has a chance to clean-up the input handle. + return; + } - if (keepHandling) { - mDragState.notifyMoveLocked(newX, newY); - } else { - mDragState.notifyDropLocked(newX, newY); - } + if (keepHandling) { + mDragState.notifyMoveLocked(newX, newY); + } else { + mDragState.notifyDropLocked(newX, newY); } } } @@ -414,12 +390,11 @@ class DragDropController { if (DEBUG_DRAG) { Slog.w(TAG_WM, "Timeout starting drag by win " + win); } - synchronized (mWriteLock) { - synchronized (mService.mWindowMap) { - // !!! TODO: ANR the app that has failed to start the drag in time - if (mDragState != null) { - mDragState.closeLocked(); - } + + synchronized (mService.mWindowMap) { + // !!! TODO: ANR the app that has failed to start the drag in time + if (mDragState != null) { + mDragState.closeLocked(); } } break; @@ -430,13 +405,12 @@ class DragDropController { if (DEBUG_DRAG) { Slog.w(TAG_WM, "Timeout ending drag to win " + win); } - synchronized (mWriteLock) { - synchronized (mService.mWindowMap) { - // !!! TODO: ANR the drag-receiving app - if (mDragState != null) { - mDragState.mDragResult = false; - mDragState.endDragLocked(); - } + + synchronized (mService.mWindowMap) { + // !!! TODO: ANR the drag-receiving app + if (mDragState != null) { + mDragState.mDragResult = false; + mDragState.endDragLocked(); } } break; @@ -455,15 +429,13 @@ class DragDropController { } case MSG_ANIMATION_END: { - synchronized (mWriteLock) { - synchronized (mService.mWindowMap) { - if (mDragState == null) { - Slog.wtf(TAG_WM, "mDragState unexpectedly became null while " + - "plyaing animation"); - return; - } - mDragState.closeLocked(); + synchronized (mService.mWindowMap) { + if (mDragState == null) { + Slog.wtf(TAG_WM, "mDragState unexpectedly became null while " + + "plyaing animation"); + return; } + mDragState.closeLocked(); } break; } diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java index 112e62f27ea2..b9f437af20e4 100644 --- a/services/core/java/com/android/server/wm/DragState.java +++ b/services/core/java/com/android/server/wm/DragState.java @@ -568,6 +568,14 @@ class DragState { mToken = token; } + /** + * Returns true if it has sent DRAG_STARTED broadcast out but has not been sent DRAG_END + * broadcast. + */ + boolean isInProgress() { + return mDragInProgress; + } + private static DragEvent obtainDragEvent(WindowState win, int action, float x, float y, Object localState, ClipDescription description, ClipData data, diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java index 036f7b0aea03..62d2e7d8e1c5 100644 --- a/services/core/java/com/android/server/wm/WindowManagerInternal.java +++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java @@ -151,23 +151,38 @@ public abstract class WindowManagerInternal { */ public interface IDragDropCallback { /** - * Called when drag operation is started. + * Called when drag operation is starting. */ - default boolean performDrag(IWindow window, IBinder dragToken, + default boolean prePerformDrag(IWindow window, IBinder dragToken, int touchSource, float touchX, float touchY, float thumbCenterX, float thumbCenterY, ClipData data) { return true; } /** - * Called when drop result is reported. + * Called when drag operation is started. + */ + default void postPerformDrag() {} + + /** + * Called when drop result is being reported. + */ + default void preReportDropResult(IWindow window, boolean consumed) {} + + /** + * Called when drop result was reported. + */ + default void postReportDropResult() {} + + /** + * Called when drag operation is being cancelled. */ - default void reportDropResult(IWindow window, boolean consumed) {} + default void preCancelDragAndDrop(IBinder dragToken) {} /** - * Called when drag operation is cancelled. + * Called when drag operation was cancelled. */ - default void cancelDragAndDrop(IBinder dragToken) {} + default void postCancelDragAndDrop() {} } /** diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 5d76304627c6..e53aa81c575c 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -115,7 +115,7 @@ cc_defaults { ], static_libs: [ - "android.hardware.broadcastradio@common-utils-lib", + "android.hardware.broadcastradio@common-utils-1x-lib", "libscrypt_static", ], } diff --git a/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp index e1dbdebdcb97..222ac5b903fb 100644 --- a/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp +++ b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp @@ -25,7 +25,7 @@ #include <android/hardware/broadcastradio/1.1/IBroadcastRadio.h> #include <android/hardware/broadcastradio/1.2/IBroadcastRadioFactory.h> #include <android/hidl/manager/1.0/IServiceManager.h> -#include <broadcastradio-utils/Utils.h> +#include <broadcastradio-utils-1x/Utils.h> #include <core_jni_helpers.h> #include <hidl/ServiceManagement.h> #include <nativehelper/JNIHelp.h> diff --git a/services/core/jni/BroadcastRadio/Tuner.cpp b/services/core/jni/BroadcastRadio/Tuner.cpp index df53feeaf8fa..63339e933cac 100644 --- a/services/core/jni/BroadcastRadio/Tuner.cpp +++ b/services/core/jni/BroadcastRadio/Tuner.cpp @@ -24,7 +24,7 @@ #include <android/hardware/broadcastradio/1.2/IBroadcastRadioFactory.h> #include <binder/IPCThreadState.h> -#include <broadcastradio-utils/Utils.h> +#include <broadcastradio-utils-1x/Utils.h> #include <core_jni_helpers.h> #include <media/AudioSystem.h> #include <nativehelper/JNIHelp.h> diff --git a/services/core/jni/BroadcastRadio/TunerCallback.cpp b/services/core/jni/BroadcastRadio/TunerCallback.cpp index d624df69a7ff..d0ba00529d0b 100644 --- a/services/core/jni/BroadcastRadio/TunerCallback.cpp +++ b/services/core/jni/BroadcastRadio/TunerCallback.cpp @@ -22,7 +22,7 @@ #include "Tuner.h" #include "convert.h" -#include <broadcastradio-utils/Utils.h> +#include <broadcastradio-utils-1x/Utils.h> #include <core_jni_helpers.h> #include <nativehelper/JNIHelp.h> #include <utils/Log.h> diff --git a/services/core/jni/BroadcastRadio/convert.cpp b/services/core/jni/BroadcastRadio/convert.cpp index 734ce793e833..f5381a8caac1 100644 --- a/services/core/jni/BroadcastRadio/convert.cpp +++ b/services/core/jni/BroadcastRadio/convert.cpp @@ -21,7 +21,7 @@ #include "regions.h" -#include <broadcastradio-utils/Utils.h> +#include <broadcastradio-utils-1x/Utils.h> #include <core_jni_helpers.h> #include <nativehelper/JNIHelp.h> #include <utils/Log.h> diff --git a/services/core/jni/BroadcastRadio/regions.cpp b/services/core/jni/BroadcastRadio/regions.cpp index b7fd0f33ccfc..1757a4d5c369 100644 --- a/services/core/jni/BroadcastRadio/regions.cpp +++ b/services/core/jni/BroadcastRadio/regions.cpp @@ -19,7 +19,7 @@ #include "regions.h" -#include <broadcastradio-utils/Utils.h> +#include <broadcastradio-utils-1x/Utils.h> #include <utils/Log.h> namespace android { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 1c841cb52125..7ee047b0c8d2 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.BIND_DEVICE_ADMIN; import static android.Manifest.permission.MANAGE_CA_CERTIFICATES; import static android.app.ActivityManager.LOCK_TASK_MODE_NONE; import static android.app.ActivityManager.USER_OP_SUCCESS; +import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_USER; import static android.app.admin.DevicePolicyManager.CODE_ACCOUNTS_NOT_EMPTY; import static android.app.admin.DevicePolicyManager.CODE_ADD_MANAGED_PROFILE_DISALLOWED; import static android.app.admin.DevicePolicyManager.CODE_CANNOT_ADD_MANAGED_PROFILE; @@ -44,7 +45,9 @@ import static android.app.admin.DevicePolicyManager.DELEGATION_INSTALL_EXISTING_ import static android.app.admin.DevicePolicyManager.DELEGATION_KEEP_UNINSTALLED_PACKAGES; import static android.app.admin.DevicePolicyManager.DELEGATION_PACKAGE_ACCESS; import static android.app.admin.DevicePolicyManager.DELEGATION_PERMISSION_GRANT; +import static android.app.admin.DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED; 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; import static android.app.admin.DevicePolicyManager.START_USER_IN_BACKGROUND; import static android.app.admin.DevicePolicyManager.WIPE_EUICC; @@ -216,6 +219,7 @@ import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Function; /** * Implementation of the device policy APIs. @@ -289,6 +293,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private static final String ATTR_APPLICATION_RESTRICTIONS_MANAGER = "application-restrictions-manager"; + private static final String MANAGED_PROVISIONING_PKG = "com.android.managedprovisioning"; + // Comprehensive list of delegations. private static final String DELEGATIONS[] = { DELEGATION_CERT_INSTALL, @@ -390,6 +396,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private final LockPatternUtils mLockPatternUtils; private final DevicePolicyConstants mConstants; private final DeviceAdminServiceController mDeviceAdminServiceController; + private final OverlayPackagesProvider mOverlayPackagesProvider; /** * Contains (package-user) pairs to remove. An entry (p, u) implies that removal of package p @@ -759,7 +766,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { static final int DEF_MINIMUM_PASSWORD_NON_LETTER = 0; @NonNull PasswordMetrics minimumPasswordMetrics = new PasswordMetrics( - DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, DEF_MINIMUM_PASSWORD_LENGTH, + PASSWORD_QUALITY_UNSPECIFIED, DEF_MINIMUM_PASSWORD_LENGTH, DEF_MINIMUM_PASSWORD_LETTERS, DEF_MINIMUM_PASSWORD_UPPER_CASE, DEF_MINIMUM_PASSWORD_LOWER_CASE, DEF_MINIMUM_PASSWORD_NUMERIC, DEF_MINIMUM_PASSWORD_SYMBOLS, DEF_MINIMUM_PASSWORD_NON_LETTER); @@ -885,8 +892,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { out.startTag(null, TAG_POLICIES); info.writePoliciesToXml(out); out.endTag(null, TAG_POLICIES); - if (minimumPasswordMetrics.quality - != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { + if (minimumPasswordMetrics.quality != PASSWORD_QUALITY_UNSPECIFIED) { out.startTag(null, TAG_PASSWORD_QUALITY); out.attribute(null, ATTR_VALUE, Integer.toString(minimumPasswordMetrics.quality)); out.endTag(null, TAG_PASSWORD_QUALITY); @@ -1903,6 +1909,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { mDeviceAdminServiceController = new DeviceAdminServiceController(this, mConstants); + mOverlayPackagesProvider = new OverlayPackagesProvider(mContext); + if (!mHasFeature) { // Skip the rest of the initialization return; @@ -3571,11 +3579,11 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public int getPasswordQuality(ComponentName who, int userHandle, boolean parent) { if (!mHasFeature) { - return DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; + return PASSWORD_QUALITY_UNSPECIFIED; } enforceFullCrossUsersPermission(userHandle); synchronized (this) { - int mode = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; + int mode = PASSWORD_QUALITY_UNSPECIFIED; if (who != null) { ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent); @@ -3658,30 +3666,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public int getPasswordMinimumLength(ComponentName who, int userHandle, boolean parent) { - if (!mHasFeature) { - return 0; - } - enforceFullCrossUsersPermission(userHandle); - synchronized (this) { - int length = 0; - - if (who != null) { - ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent); - return admin != null ? admin.minimumPasswordMetrics.length : length; - } - - // Return the strictest policy across all participating admins. - List<ActiveAdmin> admins = - getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent); - final int N = admins.size(); - for (int i = 0; i < N; i++) { - ActiveAdmin admin = admins.get(i); - if (length < admin.minimumPasswordMetrics.length) { - length = admin.minimumPasswordMetrics.length; - } - } - return length; - } + return getStrictestPasswordRequirement(who, userHandle, parent, + admin -> admin.minimumPasswordMetrics.length, PASSWORD_QUALITY_UNSPECIFIED); } @Override @@ -3703,31 +3689,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public int getPasswordHistoryLength(ComponentName who, int userHandle, boolean parent) { - if (!mHasFeature) { - return 0; - } - enforceFullCrossUsersPermission(userHandle); - synchronized (this) { - int length = 0; - - if (who != null) { - ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent); - return admin != null ? admin.passwordHistoryLength : length; - } - - // Return the strictest policy across all participating admins. - List<ActiveAdmin> admins = - getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent); - final int N = admins.size(); - for (int i = 0; i < N; i++) { - ActiveAdmin admin = admins.get(i); - if (length < admin.passwordHistoryLength) { - length = admin.passwordHistoryLength; - } - } - - return length; - } + return getStrictestPasswordRequirement(who, userHandle, parent, + admin -> admin.passwordHistoryLength, PASSWORD_QUALITY_UNSPECIFIED); } @Override @@ -3916,30 +3879,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public int getPasswordMinimumUpperCase(ComponentName who, int userHandle, boolean parent) { - if (!mHasFeature) { - return 0; - } - enforceFullCrossUsersPermission(userHandle); - synchronized (this) { - int length = 0; - - if (who != null) { - ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent); - return admin != null ? admin.minimumPasswordMetrics.upperCase : length; - } - - // Return the strictest policy across all participating admins. - List<ActiveAdmin> admins = - getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent); - final int N = admins.size(); - for (int i = 0; i < N; i++) { - ActiveAdmin admin = admins.get(i); - if (length < admin.minimumPasswordMetrics.upperCase) { - length = admin.minimumPasswordMetrics.upperCase; - } - } - return length; - } + return getStrictestPasswordRequirement(who, userHandle, parent, + admin -> admin.minimumPasswordMetrics.upperCase, PASSWORD_QUALITY_COMPLEX); } @Override @@ -3958,30 +3899,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public int getPasswordMinimumLowerCase(ComponentName who, int userHandle, boolean parent) { - if (!mHasFeature) { - return 0; - } - enforceFullCrossUsersPermission(userHandle); - synchronized (this) { - int length = 0; - - if (who != null) { - ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent); - return admin != null ? admin.minimumPasswordMetrics.lowerCase : length; - } - - // Return the strictest policy across all participating admins. - List<ActiveAdmin> admins = - getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent); - final int N = admins.size(); - for (int i = 0; i < N; i++) { - ActiveAdmin admin = admins.get(i); - if (length < admin.minimumPasswordMetrics.lowerCase) { - length = admin.minimumPasswordMetrics.lowerCase; - } - } - return length; - } + return getStrictestPasswordRequirement(who, userHandle, parent, + admin -> admin.minimumPasswordMetrics.lowerCase, PASSWORD_QUALITY_COMPLEX); } @Override @@ -4003,33 +3922,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public int getPasswordMinimumLetters(ComponentName who, int userHandle, boolean parent) { - if (!mHasFeature) { - return 0; - } - enforceFullCrossUsersPermission(userHandle); - synchronized (this) { - int length = 0; - - if (who != null) { - ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent); - return admin != null ? admin.minimumPasswordMetrics.letters : length; - } - - // Return the strictest policy across all participating admins. - List<ActiveAdmin> admins = - getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent); - final int N = admins.size(); - for (int i = 0; i < N; i++) { - ActiveAdmin admin = admins.get(i); - if (!isLimitPasswordAllowed(admin, PASSWORD_QUALITY_COMPLEX)) { - continue; - } - if (length < admin.minimumPasswordMetrics.letters) { - length = admin.minimumPasswordMetrics.letters; - } - } - return length; - } + return getStrictestPasswordRequirement(who, userHandle, parent, + admin -> admin.minimumPasswordMetrics.letters, PASSWORD_QUALITY_COMPLEX); } @Override @@ -4051,34 +3945,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public int getPasswordMinimumNumeric(ComponentName who, int userHandle, boolean parent) { - if (!mHasFeature) { - return 0; - } - enforceFullCrossUsersPermission(userHandle); - synchronized (this) { - int length = 0; - - if (who != null) { - ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent); - return admin != null ? admin.minimumPasswordMetrics.numeric : length; - } - - // Return the strictest policy across all participating admins. - List<ActiveAdmin> admins = - getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent); - final int N = admins.size(); - for (int i = 0; i < N; i++) { - ActiveAdmin admin = admins.get(i); - if (!isLimitPasswordAllowed(admin, PASSWORD_QUALITY_COMPLEX)) { - continue; - } - if (length < admin.minimumPasswordMetrics.numeric) { - length = admin.minimumPasswordMetrics.numeric; - } - } - return length; - } - } + return getStrictestPasswordRequirement(who, userHandle, parent, + admin -> admin.minimumPasswordMetrics.numeric, PASSWORD_QUALITY_COMPLEX); + } @Override public void setPasswordMinimumSymbols(ComponentName who, int length, boolean parent) { @@ -4099,33 +3968,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public int getPasswordMinimumSymbols(ComponentName who, int userHandle, boolean parent) { - if (!mHasFeature) { - return 0; - } - enforceFullCrossUsersPermission(userHandle); - synchronized (this) { - int length = 0; - - if (who != null) { - ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent); - return admin != null ? admin.minimumPasswordMetrics.symbols : length; - } - - // Return the strictest policy across all participating admins. - List<ActiveAdmin> admins = - getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent); - final int N = admins.size(); - for (int i = 0; i < N; i++) { - ActiveAdmin admin = admins.get(i); - if (!isLimitPasswordAllowed(admin, PASSWORD_QUALITY_COMPLEX)) { - continue; - } - if (length < admin.minimumPasswordMetrics.symbols) { - length = admin.minimumPasswordMetrics.symbols; - } - } - return length; - } + return getStrictestPasswordRequirement(who, userHandle, parent, + admin -> admin.minimumPasswordMetrics.symbols, PASSWORD_QUALITY_COMPLEX); } @Override @@ -4147,32 +3991,40 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public int getPasswordMinimumNonLetter(ComponentName who, int userHandle, boolean parent) { + return getStrictestPasswordRequirement(who, userHandle, parent, + admin -> admin.minimumPasswordMetrics.nonLetter, PASSWORD_QUALITY_COMPLEX); + } + + /** + * Calculates strictest (maximum) value for a given password property enforced by admin[s]. + */ + private int getStrictestPasswordRequirement(ComponentName who, int userHandle, + boolean parent, Function<ActiveAdmin, Integer> getter, int minimumPasswordQuality) { if (!mHasFeature) { return 0; } enforceFullCrossUsersPermission(userHandle); synchronized (this) { - int length = 0; - if (who != null) { - ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent); - return admin != null ? admin.minimumPasswordMetrics.nonLetter : length; + final ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent); + return admin != null ? getter.apply(admin) : 0; } - // Return the strictest policy across all participating admins. - List<ActiveAdmin> admins = + int maxValue = 0; + final List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent); final int N = admins.size(); for (int i = 0; i < N; i++) { - ActiveAdmin admin = admins.get(i); - if (!isLimitPasswordAllowed(admin, PASSWORD_QUALITY_COMPLEX)) { + final ActiveAdmin admin = admins.get(i); + if (!isLimitPasswordAllowed(admin, minimumPasswordQuality)) { continue; } - if (length < admin.minimumPasswordMetrics.nonLetter) { - length = admin.minimumPasswordMetrics.nonLetter; + final Integer adminValue = getter.apply(admin); + if (adminValue > maxValue) { + maxValue = adminValue; } } - return length; + return maxValue; } } @@ -4212,7 +4064,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private boolean isActivePasswordSufficientForUserLocked( DevicePolicyData policy, int userHandle, boolean parent) { final int requiredPasswordQuality = getPasswordQuality(null, userHandle, parent); - if (requiredPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { + if (requiredPasswordQuality == PASSWORD_QUALITY_UNSPECIFIED) { // A special case is when there is no required password quality, then we just return // true since any password would be sufficient. This is for the scenario when a work // profile is first created so there is no information about the current password but @@ -4452,10 +4304,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { synchronized (this) { quality = getPasswordQuality(null, userHandle, /* parent */ false); if (quality == DevicePolicyManager.PASSWORD_QUALITY_MANAGED) { - quality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; + quality = PASSWORD_QUALITY_UNSPECIFIED; } final PasswordMetrics metrics = PasswordMetrics.computeForPassword(password); - if (quality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { + if (quality != PASSWORD_QUALITY_UNSPECIFIED) { final int realQuality = metrics.quality; if (realQuality < quality && quality != DevicePolicyManager.PASSWORD_QUALITY_COMPLEX) { @@ -8321,6 +8173,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final boolean ephemeral = (flags & DevicePolicyManager.MAKE_USER_EPHEMERAL) != 0; final boolean demo = (flags & DevicePolicyManager.MAKE_USER_DEMO) != 0 && UserManager.isDeviceInDemoMode(mContext); + final boolean leaveAllSystemAppsEnabled = (flags & LEAVE_ALL_SYSTEM_APPS_ENABLED) != 0; // Create user. UserHandle user = null; synchronized (this) { @@ -8335,8 +8188,14 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (demo) { userInfoFlags |= UserInfo.FLAG_DEMO; } + String[] disallowedPackages = null; + if (!leaveAllSystemAppsEnabled) { + disallowedPackages = mOverlayPackagesProvider.getNonRequiredApps(admin, + UserHandle.myUserId(), ACTION_PROVISION_MANAGED_USER).toArray( + new String[0]); + } UserInfo userInfo = mUserManagerInternal.createUserEvenWhenDisallowed(name, - userInfoFlags); + userInfoFlags, disallowedPackages); if (userInfo != null) { user = userInfo.getUserHandle(); } @@ -8347,11 +8206,20 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (user == null) { return null; } + + final int userHandle = user.getIdentifier(); + final Intent intent = new Intent(DevicePolicyManager.ACTION_MANAGED_USER_CREATED) + .putExtra(Intent.EXTRA_USER_HANDLE, userHandle) + .putExtra( + DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED, + leaveAllSystemAppsEnabled) + .setPackage(MANAGED_PROVISIONING_PKG) + .addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + mContext.sendBroadcastAsUser(intent, UserHandle.SYSTEM); + final long id = mInjector.binderClearCallingIdentity(); try { final String adminPkg = admin.getPackageName(); - - final int userHandle = user.getIdentifier(); try { // Install the profile owner if not present. if (!mIPackageManager.isPackageAvailable(adminPkg, userHandle)) { @@ -8381,7 +8249,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if ((flags & START_USER_IN_BACKGROUND) != 0) { try { - mInjector.getIActivityManager().startUserInBackground(user.getIdentifier()); + mInjector.getIActivityManager().startUserInBackground(userHandle); } catch (RemoteException re) { // Does not happen, same process } @@ -8389,7 +8257,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return user; } catch (Throwable re) { - mUserManager.removeUser(user.getIdentifier()); + mUserManager.removeUser(userHandle); return null; } finally { mInjector.binderRestoreCallingIdentity(id); @@ -11663,4 +11531,11 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return (deviceOwner != null) && deviceOwner.isLogoutEnabled; } + @Override + public List<String> getDisallowedSystemApps(ComponentName admin, int userId, + String provisioningAction) throws RemoteException { + enforceCanManageProfileAndDeviceOwners(); + return new ArrayList<>( + mOverlayPackagesProvider.getNonRequiredApps(admin, userId, provisioningAction)); + } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/OverlayPackagesProvider.java b/services/devicepolicy/java/com/android/server/devicepolicy/OverlayPackagesProvider.java new file mode 100644 index 000000000000..d0ec0eeebd5c --- /dev/null +++ b/services/devicepolicy/java/com/android/server/devicepolicy/OverlayPackagesProvider.java @@ -0,0 +1,232 @@ +/* + * Copyright 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 com.android.server.devicepolicy; + +import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE; +import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE; +import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_USER; + +import static com.android.internal.util.Preconditions.checkNotNull; + +import android.annotation.NonNull; +import android.app.admin.DeviceAdminReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.ArraySet; +import android.view.inputmethod.InputMethodInfo; + +import com.android.internal.R; +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.view.IInputMethodManager; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +/** + * Class that provides the apps that are not required on a managed device / profile according to the + * overlays provided via (vendor_|)required_apps_managed_(profile|device).xml. + */ +public class OverlayPackagesProvider { + + protected static final String TAG = "OverlayPackagesProvider"; + + private final PackageManager mPm; + private final IInputMethodManager mIInputMethodManager; + private final Context mContext; + + public OverlayPackagesProvider(Context context) { + this(context, getIInputMethodManager()); + } + + @VisibleForTesting + OverlayPackagesProvider(Context context, IInputMethodManager iInputMethodManager) { + mContext = context; + mPm = checkNotNull(context.getPackageManager()); + mIInputMethodManager = checkNotNull(iInputMethodManager); + } + + /** + * Computes non-required apps. All the system apps with a launcher that are not in + * the required set of packages will be considered as non-required apps. + * + * Note: If an app is mistakenly listed as both required and disallowed, it will be treated as + * disallowed. + * + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param userId The userId for which the non-required apps needs to be computed. + * @param provisioningAction action indicating type of provisioning, should be one of + * {@link ACTION_PROVISION_MANAGED_DEVICE}, {@link + * ACTION_PROVISION_MANAGED_PROFILE} or + * {@link ACTION_PROVISION_MANAGED_USER}. + * @return the set of non-required apps. + */ + @NonNull + public Set<String> getNonRequiredApps(@NonNull ComponentName admin, int userId, + @NonNull String provisioningAction) { + final Set<String> nonRequiredApps = getLaunchableApps(userId); + // Newly installed system apps are uninstalled when they are not required and are either + // disallowed or have a launcher icon. + nonRequiredApps.removeAll(getRequiredApps(provisioningAction, admin.getPackageName())); + // Don't delete the system input method packages in case of Device owner provisioning. + if (ACTION_PROVISION_MANAGED_DEVICE.equals(provisioningAction) + || ACTION_PROVISION_MANAGED_USER.equals(provisioningAction)) { + nonRequiredApps.removeAll(getSystemInputMethods()); + } + nonRequiredApps.addAll(getDisallowedApps(provisioningAction)); + return nonRequiredApps; + } + + private Set<String> getLaunchableApps(int userId) { + final Intent launcherIntent = new Intent(Intent.ACTION_MAIN); + launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER); + final List<ResolveInfo> resolveInfos = mPm.queryIntentActivitiesAsUser(launcherIntent, + PackageManager.MATCH_UNINSTALLED_PACKAGES + | PackageManager.MATCH_DISABLED_COMPONENTS + | PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, + userId); + final Set<String> apps = new ArraySet<>(); + for (ResolveInfo resolveInfo : resolveInfos) { + apps.add(resolveInfo.activityInfo.packageName); + } + return apps; + } + + private Set<String> getSystemInputMethods() { + // InputMethodManager is final so it cannot be mocked. + // So, we're using IInputMethodManager directly because it can be mocked. + final List<InputMethodInfo> inputMethods; + try { + inputMethods = mIInputMethodManager.getInputMethodList(); + } catch (RemoteException e) { + // Should not happen + return null; + } + final Set<String> systemInputMethods = new ArraySet<>(); + for (InputMethodInfo inputMethodInfo : inputMethods) { + ApplicationInfo applicationInfo = inputMethodInfo.getServiceInfo().applicationInfo; + if (applicationInfo.isSystemApp()) { + systemInputMethods.add(inputMethodInfo.getPackageName()); + } + } + return systemInputMethods; + } + + private Set<String> getRequiredApps(String provisioningAction, String dpcPackageName) { + final Set<String> requiredApps = new ArraySet<>(); + requiredApps.addAll(getRequiredAppsSet(provisioningAction)); + requiredApps.addAll(getVendorRequiredAppsSet(provisioningAction)); + requiredApps.add(dpcPackageName); + return requiredApps; + } + + private Set<String> getDisallowedApps(String provisioningAction) { + final Set<String> disallowedApps = new ArraySet<>(); + disallowedApps.addAll(getDisallowedAppsSet(provisioningAction)); + disallowedApps.addAll(getVendorDisallowedAppsSet(provisioningAction)); + return disallowedApps; + } + + private static IInputMethodManager getIInputMethodManager() { + final IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE); + return IInputMethodManager.Stub.asInterface(b); + } + + private Set<String> getRequiredAppsSet(String provisioningAction) { + final int resId; + switch (provisioningAction) { + case ACTION_PROVISION_MANAGED_USER: + resId = R.array.required_apps_managed_user; + break; + case ACTION_PROVISION_MANAGED_PROFILE: + resId = R.array.required_apps_managed_profile; + break; + case ACTION_PROVISION_MANAGED_DEVICE: + resId = R.array.required_apps_managed_device; + break; + default: + throw new IllegalArgumentException("Provisioning type " + + provisioningAction + " not supported."); + } + return new ArraySet<>(Arrays.asList(mContext.getResources().getStringArray(resId))); + } + + private Set<String> getDisallowedAppsSet(String provisioningAction) { + final int resId; + switch (provisioningAction) { + case ACTION_PROVISION_MANAGED_USER: + resId = R.array.disallowed_apps_managed_user; + break; + case ACTION_PROVISION_MANAGED_PROFILE: + resId = R.array.disallowed_apps_managed_profile; + break; + case ACTION_PROVISION_MANAGED_DEVICE: + resId = R.array.disallowed_apps_managed_device; + break; + default: + throw new IllegalArgumentException("Provisioning type " + + provisioningAction + " not supported."); + } + return new ArraySet<>(Arrays.asList(mContext.getResources().getStringArray(resId))); + } + + private Set<String> getVendorRequiredAppsSet(String provisioningAction) { + final int resId; + switch (provisioningAction) { + case ACTION_PROVISION_MANAGED_USER: + resId = R.array.vendor_required_apps_managed_user; + break; + case ACTION_PROVISION_MANAGED_PROFILE: + resId = R.array.vendor_required_apps_managed_profile; + break; + case ACTION_PROVISION_MANAGED_DEVICE: + resId = R.array.vendor_required_apps_managed_device; + break; + default: + throw new IllegalArgumentException("Provisioning type " + + provisioningAction + " not supported."); + } + return new ArraySet<>(Arrays.asList(mContext.getResources().getStringArray(resId))); + } + + private Set<String> getVendorDisallowedAppsSet(String provisioningAction) { + final int resId; + switch (provisioningAction) { + case ACTION_PROVISION_MANAGED_USER: + resId = R.array.vendor_disallowed_apps_managed_user; + break; + case ACTION_PROVISION_MANAGED_PROFILE: + resId = R.array.vendor_disallowed_apps_managed_profile; + break; + case ACTION_PROVISION_MANAGED_DEVICE: + resId = R.array.vendor_disallowed_apps_managed_device; + break; + default: + throw new IllegalArgumentException("Provisioning type " + + provisioningAction + " not supported."); + } + return new ArraySet<>(Arrays.asList(mContext.getResources().getStringArray(resId))); + } +} diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 4c994b94e71b..7aa628af4621 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1088,14 +1088,17 @@ public final class SystemServer { } traceEnd(); - // Wifi Service must be started first for wifi-related services. - traceBeginAndSlog("StartWifi"); - mSystemServiceManager.startService(WIFI_SERVICE_CLASS); - traceEnd(); - traceBeginAndSlog("StartWifiScanning"); - mSystemServiceManager.startService( - "com.android.server.wifi.scanner.WifiScanningService"); - traceEnd(); + if (context.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_WIFI)) { + // Wifi Service must be started first for wifi-related services. + traceBeginAndSlog("StartWifi"); + mSystemServiceManager.startService(WIFI_SERVICE_CLASS); + traceEnd(); + traceBeginAndSlog("StartWifiScanning"); + mSystemServiceManager.startService( + "com.android.server.wifi.scanner.WifiScanningService"); + traceEnd(); + } if (!disableRtt) { traceBeginAndSlog("StartWifiRtt"); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java new file mode 100644 index 000000000000..4447fe91e34e --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java @@ -0,0 +1,390 @@ +/* + * Copyright 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 com.android.server.devicepolicy; + +import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE; +import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE; +import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_USER; + +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; +import android.content.res.Resources; +import android.os.RemoteException; +import android.support.test.InstrumentationRegistry; +import android.test.AndroidTestCase; +import android.test.mock.MockPackageManager; +import android.view.inputmethod.InputMethodInfo; + +import com.android.internal.R; +import com.android.internal.view.IInputMethodManager; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class OverlayPackagesProviderTest extends AndroidTestCase { + private static final String TEST_DPC_PACKAGE_NAME = "dpc.package.name"; + private static final ComponentName TEST_MDM_COMPONENT_NAME = new ComponentName( + TEST_DPC_PACKAGE_NAME, "pc.package.name.DeviceAdmin"); + private static final int TEST_USER_ID = 123; + + private @Mock + Resources mResources; + private @Mock + IInputMethodManager mIInputMethodManager; + private @Mock + Context mTestContext; + private Resources mRealResources; + + private FakePackageManager mPackageManager; + private String[] mSystemAppsWithLauncher; + private OverlayPackagesProvider mHelper; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mPackageManager = new FakePackageManager(); + when(mTestContext.getResources()).thenReturn(mResources); + when(mTestContext.getPackageManager()).thenReturn(mPackageManager); + when(mTestContext.getFilesDir()).thenReturn( + InstrumentationRegistry.getTargetContext().getCacheDir()); + + setSystemInputMethods(); + setRequiredAppsManagedDevice(); + setVendorRequiredAppsManagedDevice(); + setDisallowedAppsManagedDevice(); + setVendorDisallowedAppsManagedDevice(); + setRequiredAppsManagedProfile(); + setVendorRequiredAppsManagedProfile(); + setDisallowedAppsManagedProfile(); + setVendorDisallowedAppsManagedProfile(); + setRequiredAppsManagedUser(); + setVendorRequiredAppsManagedUser(); + setDisallowedAppsManagedUser(); + setVendorDisallowedAppsManagedUser(); + + mRealResources = InstrumentationRegistry.getTargetContext().getResources(); + mHelper = new OverlayPackagesProvider(mTestContext, mIInputMethodManager); + } + + @Test + public void testAppsWithLauncherAreNonRequiredByDefault() { + setSystemAppsWithLauncher("app.a", "app.b"); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.a", "app.b"); + } + + @Test + public void testDeviceOwnerRequiredApps() { + setSystemAppsWithLauncher("app.a", "app.b", "app.c"); + setRequiredAppsManagedDevice("app.a"); + setVendorRequiredAppsManagedDevice("app.b"); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.c"); + } + + @Test + public void testProfileOwnerRequiredApps() { + setSystemAppsWithLauncher("app.a", "app.b", "app.c"); + setRequiredAppsManagedProfile("app.a"); + setVendorRequiredAppsManagedProfile("app.b"); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_PROFILE, "app.c"); + } + + @Test + public void testManagedUserRequiredApps() { + setSystemAppsWithLauncher("app.a", "app.b", "app.c"); + setRequiredAppsManagedUser("app.a"); + setVendorRequiredAppsManagedUser("app.b"); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_USER, "app.c"); + } + + @Test + public void testDpcIsRequired() { + setSystemAppsWithLauncher("app.a", TEST_DPC_PACKAGE_NAME); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.a"); + } + + @Test + public void testDisallowedAppsAreNonRequiredEvenIfNoLauncher() { + setSystemAppsWithLauncher(); + setDisallowedAppsManagedDevice("app.a"); + setVendorDisallowedAppsManagedDevice("app.b"); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.a", "app.b"); + } + + @Test + public void testDeviceOwnerImesAreRequired() { + setSystemAppsWithLauncher("app.a", "app.b"); + setSystemInputMethods("app.a"); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.b"); + } + + @Test + public void testProfileOwnerImesAreNonRequired() { + setSystemAppsWithLauncher("app.a", "app.b"); + setSystemInputMethods("app.a"); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_PROFILE, "app.a", "app.b"); + } + + @Test + public void testManagedUserImesAreRequired() { + setSystemAppsWithLauncher("app.a", "app.b"); + setSystemInputMethods("app.a"); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_USER, "app.b"); + } + + @Test + public void testDisallowedAppsAreNonInstalled() { + setSystemAppsWithLauncher("app.a"); + setDisallowedAppsManagedDevice("app.c"); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, "app.a", "app.c"); + } + + /** + * If an app is listed as both required and disallowed, it should be only in the disallowed + * list. Therefore, it should be present in the non-required list. + */ + @Test + public void testAllowedAndDisallowedAtTheSameTimeManagedDevice() { + setDisallowedAppsManagedDevice(TEST_DPC_PACKAGE_NAME); + setRequiredAppsManagedDevice(TEST_DPC_PACKAGE_NAME); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_DEVICE, TEST_DPC_PACKAGE_NAME); + } + + /** + * @see {@link #testAllowedAndDisallowedAtTheSameTimeManagedDevice} + */ + @Test + public void testAllowedAndDisallowedAtTheSameTimeManagedUser() { + setDisallowedAppsManagedUser(TEST_DPC_PACKAGE_NAME); + setRequiredAppsManagedUser(TEST_DPC_PACKAGE_NAME); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_USER, TEST_DPC_PACKAGE_NAME); + } + + /** + * @see {@link #testAllowedAndDisallowedAtTheSameTimeManagedDevice} + */ + @Test + public void testAllowedAndDisallowedAtTheSameTimeManagedProfile() { + setDisallowedAppsManagedProfile(TEST_DPC_PACKAGE_NAME); + setRequiredAppsManagedProfile(TEST_DPC_PACKAGE_NAME); + + verifyAppsAreNonRequired(ACTION_PROVISION_MANAGED_PROFILE, TEST_DPC_PACKAGE_NAME); + } + + @Test + public void testNotRequiredAndDisallowedInResManagedDevice() { + verifyEmptyIntersection(R.array.required_apps_managed_device, + R.array.disallowed_apps_managed_device); + } + + @Test + public void testNotRequiredAndDisallowedInResManagedUser() { + verifyEmptyIntersection(R.array.required_apps_managed_user, + R.array.disallowed_apps_managed_user); + } + + @Test + public void testNotRequiredAndDisallowedInResManagedProfile() { + verifyEmptyIntersection(R.array.required_apps_managed_profile, + R.array.disallowed_apps_managed_profile); + } + + @Test + public void testNotRequiredAndDisallowedInResManagedDeviceVendor() { + verifyEmptyIntersection(R.array.vendor_required_apps_managed_device, + R.array.vendor_disallowed_apps_managed_device); + } + + @Test + public void testNotRequiredAndDisallowedInResManagedUserVendor() { + verifyEmptyIntersection(R.array.vendor_required_apps_managed_user, + R.array.vendor_disallowed_apps_managed_user); + } + + @Test + public void testNotRequiredAndDisallowedInResManagedProfileVendor() { + verifyEmptyIntersection(R.array.vendor_required_apps_managed_profile, + R.array.vendor_disallowed_apps_managed_profile); + } + + private ArrayList<String> getStringArrayInRealResources(int id) { + return new ArrayList<>(Arrays.asList(mRealResources.getStringArray(id))); + } + + private void verifyEmptyIntersection(int requiredId, int disallowedId) { + ArrayList<String> required = getStringArrayInRealResources(requiredId); + ArrayList<String> disallowed = getStringArrayInRealResources(disallowedId); + required.retainAll(disallowed); + assertTrue(required.isEmpty()); + } + + private void verifyAppsAreNonRequired(String action, String... appArray) { + assertEquals(listFromArray(appArray), + mHelper.getNonRequiredApps(TEST_MDM_COMPONENT_NAME, TEST_USER_ID, action)); + } + + private void setRequiredAppsManagedDevice(String... apps) { + setStringArray(R.array.required_apps_managed_device, apps); + } + + private void setVendorRequiredAppsManagedDevice(String... apps) { + setStringArray(R.array.vendor_required_apps_managed_device, apps); + } + + private void setDisallowedAppsManagedDevice(String... apps) { + setStringArray(R.array.disallowed_apps_managed_device, apps); + } + + private void setVendorDisallowedAppsManagedDevice(String... apps) { + setStringArray(R.array.vendor_disallowed_apps_managed_device, apps); + } + + private void setRequiredAppsManagedProfile(String... apps) { + setStringArray(R.array.required_apps_managed_profile, apps); + } + + private void setVendorRequiredAppsManagedProfile(String... apps) { + setStringArray(R.array.vendor_required_apps_managed_profile, apps); + } + + private void setDisallowedAppsManagedProfile(String... apps) { + setStringArray(R.array.disallowed_apps_managed_profile, apps); + } + + private void setVendorDisallowedAppsManagedProfile(String... apps) { + setStringArray(R.array.vendor_disallowed_apps_managed_profile, apps); + } + + private void setRequiredAppsManagedUser(String... apps) { + setStringArray(R.array.required_apps_managed_user, apps); + } + + private void setVendorRequiredAppsManagedUser(String... apps) { + setStringArray(R.array.vendor_required_apps_managed_user, apps); + } + + private void setDisallowedAppsManagedUser(String... apps) { + setStringArray(R.array.disallowed_apps_managed_user, apps); + } + + private void setVendorDisallowedAppsManagedUser(String... apps) { + setStringArray(R.array.vendor_disallowed_apps_managed_user, apps); + } + + private void setStringArray(int resourceId, String[] strs) { + when(mResources.getStringArray(eq(resourceId))) + .thenReturn(strs); + } + + private void setSystemInputMethods(String... packageNames) { + List<InputMethodInfo> inputMethods = new ArrayList<InputMethodInfo>(); + for (String packageName : packageNames) { + ApplicationInfo aInfo = new ApplicationInfo(); + aInfo.flags = ApplicationInfo.FLAG_SYSTEM; + ServiceInfo serviceInfo = new ServiceInfo(); + serviceInfo.applicationInfo = aInfo; + serviceInfo.packageName = packageName; + serviceInfo.name = ""; + ResolveInfo ri = new ResolveInfo(); + ri.serviceInfo = serviceInfo; + InputMethodInfo inputMethodInfo = new InputMethodInfo(ri, false, null, null, 0, false); + inputMethods.add(inputMethodInfo); + } + try { + when(mIInputMethodManager.getInputMethodList()).thenReturn(inputMethods); + } catch (RemoteException e) { + fail(e.toString()); + } + } + + private void setSystemAppsWithLauncher(String... apps) { + mSystemAppsWithLauncher = apps; + } + + private <T> Set<T> setFromArray(T... array) { + if (array == null) { + return null; + } + return new HashSet<T>(Arrays.asList(array)); + } + + private <T> List<T> listFromArray(T... array) { + if (array == null) { + return null; + } + return Arrays.asList(array); + } + + class FakePackageManager extends MockPackageManager { + @Override + public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) { + assertTrue("Expected an intent with action ACTION_MAIN", + Intent.ACTION_MAIN.equals(intent.getAction())); + assertEquals("Expected an intent with category CATEGORY_LAUNCHER", + setFromArray(Intent.CATEGORY_LAUNCHER), intent.getCategories()); + assertTrue("Expected the flag MATCH_UNINSTALLED_PACKAGES", + (flags & PackageManager.MATCH_UNINSTALLED_PACKAGES) != 0); + assertTrue("Expected the flag MATCH_DISABLED_COMPONENTS", + (flags & PackageManager.MATCH_DISABLED_COMPONENTS) != 0); + assertTrue("Expected the flag MATCH_DIRECT_BOOT_AWARE", + (flags & PackageManager.MATCH_DIRECT_BOOT_AWARE) != 0); + assertTrue("Expected the flag MATCH_DIRECT_BOOT_UNAWARE", + (flags & PackageManager.MATCH_DIRECT_BOOT_UNAWARE) != 0); + assertEquals(userId, TEST_USER_ID); + List<ResolveInfo> result = new ArrayList<>(); + if (mSystemAppsWithLauncher == null) { + return result; + } + for (String packageName : mSystemAppsWithLauncher) { + ActivityInfo ai = new ActivityInfo(); + ai.packageName = packageName; + ResolveInfo ri = new ResolveInfo(); + ri.activityInfo = ai; + result.add(ri); + } + return result; + } + } +} diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java new file mode 100644 index 000000000000..2629b12375a4 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java @@ -0,0 +1,230 @@ +/* + * Copyright 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 com.android.server.display; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import android.os.PowerManager; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import android.util.Spline; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.Arrays; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class BrightnessMappingStrategyTest { + + private static final float[] LUX_LEVELS = { + 0f, + 5f, + 20f, + 40f, + 100f, + 325f, + 600f, + 1250f, + 2200f, + 4000f, + 5000f + }; + + private static final float[] DISPLAY_LEVELS_NITS = { + 13.25f, + 54.0f, + 78.85f, + 105.02f, + 132.7f, + 170.12f, + 212.1f, + 265.2f, + 335.8f, + 415.2f, + 478.5f, + }; + + private static final int[] DISPLAY_LEVELS_BACKLIGHT = { + 9, + 30, + 45, + 62, + 78, + 96, + 119, + 146, + 178, + 221, + 255 + }; + + private static final float[] DISPLAY_RANGE_NITS = { 2.685f, 478.5f }; + private static final int[] BACKLIGHT_RANGE = { 1, 255 }; + + @Test + public void testSimpleStrategyMappingAtControlPoints() { + BrightnessMappingStrategy simple = BrightnessMappingStrategy.create( + LUX_LEVELS, DISPLAY_LEVELS_BACKLIGHT, + null /*brightnessLevelsNits*/, null /*nitsRange*/, null /*backlightRange*/); + assertNotNull("BrightnessMappingStrategy should not be null", simple); + for (int i = 0; i < LUX_LEVELS.length; i++) { + final float expectedLevel = + (float) DISPLAY_LEVELS_BACKLIGHT[i] / PowerManager.BRIGHTNESS_ON; + assertEquals(expectedLevel, + simple.getBrightness(LUX_LEVELS[i]), 0.01f /*tolerance*/); + } + } + + @Test + public void testSimpleStrategyMappingBetweenControlPoints() { + BrightnessMappingStrategy simple = BrightnessMappingStrategy.create( + LUX_LEVELS, DISPLAY_LEVELS_BACKLIGHT, + null /*brightnessLevelsNits*/, null /*nitsRange*/, null /*backlightRange*/); + assertNotNull("BrightnessMappingStrategy should not be null", simple); + for (int i = 1; i < LUX_LEVELS.length; i++) { + final float lux = (LUX_LEVELS[i - 1] + LUX_LEVELS[i]) / 2; + final float backlight = simple.getBrightness(lux) * PowerManager.BRIGHTNESS_ON; + assertTrue("Desired brightness should be between adjacent control points.", + backlight > DISPLAY_LEVELS_BACKLIGHT[i-1] + && backlight < DISPLAY_LEVELS_BACKLIGHT[i]); + } + } + + @Test + public void testPhysicalStrategyMappingAtControlPoints() { + BrightnessMappingStrategy physical = BrightnessMappingStrategy.create( + LUX_LEVELS, null /*brightnessLevelsBacklight*/, + DISPLAY_LEVELS_NITS, DISPLAY_RANGE_NITS, BACKLIGHT_RANGE); + assertNotNull("BrightnessMappingStrategy should not be null", physical); + for (int i = 0; i < LUX_LEVELS.length; i++) { + final float expectedLevel = DISPLAY_LEVELS_NITS[i] / DISPLAY_RANGE_NITS[1]; + assertEquals(expectedLevel, + physical.getBrightness(LUX_LEVELS[i]), 0.01f /*tolerance*/); + } + } + + @Test + public void testPhysicalStrategyMappingBetweenControlPoints() { + BrightnessMappingStrategy physical = BrightnessMappingStrategy.create( + LUX_LEVELS, null /*brightnessLevelsBacklight*/, + DISPLAY_LEVELS_NITS, DISPLAY_RANGE_NITS, BACKLIGHT_RANGE); + assertNotNull("BrightnessMappingStrategy should not be null", physical); + Spline backlightToBrightness = + Spline.createSpline(toFloatArray(BACKLIGHT_RANGE), DISPLAY_RANGE_NITS); + for (int i = 1; i < LUX_LEVELS.length; i++) { + final float lux = (LUX_LEVELS[i - 1] + LUX_LEVELS[i]) / 2; + final float backlight = physical.getBrightness(lux) * PowerManager.BRIGHTNESS_ON; + final float nits = backlightToBrightness.interpolate(backlight); + assertTrue("Desired brightness should be between adjacent control points.", + nits > DISPLAY_LEVELS_NITS[i-1] && nits < DISPLAY_LEVELS_NITS[i]); + } + } + + @Test + public void testDefaultStrategyIsPhysical() { + BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create( + LUX_LEVELS, DISPLAY_LEVELS_BACKLIGHT, + DISPLAY_LEVELS_NITS, DISPLAY_RANGE_NITS, BACKLIGHT_RANGE); + assertTrue(strategy instanceof BrightnessMappingStrategy.PhysicalMappingStrategy); + } + + @Test + public void testNonStrictlyIncreasingLuxLevelsFails() { + final float[] lux = Arrays.copyOf(LUX_LEVELS, LUX_LEVELS.length); + final int idx = lux.length / 2; + float tmp = lux[idx]; + lux[idx] = lux[idx+1]; + lux[idx+1] = tmp; + BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create( + lux, null /*brightnessLevelsBacklight*/, + DISPLAY_LEVELS_NITS, DISPLAY_RANGE_NITS, BACKLIGHT_RANGE); + assertNull(strategy); + + // And make sure we get the same result even if it's monotone but not increasing. + lux[idx] = lux[idx+1]; + strategy = BrightnessMappingStrategy.create( + lux, null /*brightnessLevelsBacklight*/, + DISPLAY_LEVELS_NITS, DISPLAY_RANGE_NITS, BACKLIGHT_RANGE); + assertNull(strategy); + } + + @Test + public void testDifferentNumberOfControlPointValuesFails() { + //Extra lux level + final float[] lux = Arrays.copyOf(LUX_LEVELS, LUX_LEVELS.length+1); + // Make sure it's strictly increasing so that the only failure is the differing array + // lengths + lux[lux.length - 1] = lux[lux.length - 2] + 1; + BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create( + lux, null /*brightnessLevelsBacklight*/, + DISPLAY_LEVELS_NITS, DISPLAY_RANGE_NITS, BACKLIGHT_RANGE); + assertNull(strategy); + + strategy = BrightnessMappingStrategy.create( + lux, DISPLAY_LEVELS_BACKLIGHT, + null /*brightnessLevelsNits*/, null /*nitsRange*/, null /*backlightRange*/); + assertNull(strategy); + + // Extra backlight level + final int[] backlight = Arrays.copyOf( + DISPLAY_LEVELS_BACKLIGHT, DISPLAY_LEVELS_BACKLIGHT.length+1); + backlight[backlight.length - 1] = backlight[backlight.length - 2] + 1; + strategy = BrightnessMappingStrategy.create( + LUX_LEVELS, backlight, + null /*brightnessLevelsNits*/, null /*nitsRange*/, null /*backlightRange*/); + assertNull(strategy); + + // Extra nits level + final float[] nits = Arrays.copyOf(DISPLAY_RANGE_NITS, DISPLAY_LEVELS_NITS.length+1); + nits[nits.length - 1] = nits[nits.length - 2] + 1; + strategy = BrightnessMappingStrategy.create( + LUX_LEVELS, null /*brightnessLevelsBacklight*/, + nits, DISPLAY_RANGE_NITS, BACKLIGHT_RANGE); + assertNull(strategy); + } + + @Test + public void testPhysicalStrategyRequiresNitsMapping() { + BrightnessMappingStrategy physical = BrightnessMappingStrategy.create( + LUX_LEVELS, null /*brightnessLevelsBacklight*/, + DISPLAY_LEVELS_NITS, null, BACKLIGHT_RANGE); + assertNull(physical); + + physical = BrightnessMappingStrategy.create( + LUX_LEVELS, null /*brightnessLevelsBacklight*/, + DISPLAY_LEVELS_NITS, DISPLAY_RANGE_NITS, null); + assertNull(physical); + + physical = BrightnessMappingStrategy.create( + LUX_LEVELS, null /*brightnessLevelsBacklight*/, + DISPLAY_LEVELS_NITS, null, null); + assertNull(physical); + } + + private static float[] toFloatArray(int[] vals) { + float[] newVals = new float[vals.length]; + for (int i = 0; i < vals.length; i++) { + newVals[i] = (float) vals[i]; + } + return newVals; + } +} diff --git a/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java b/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java new file mode 100644 index 000000000000..0cc37b48184e --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java @@ -0,0 +1,223 @@ +/* + * Copyright 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 com.android.server.display; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import android.hardware.display.BrightnessConfiguration; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import android.util.AtomicFile; +import android.util.Pair; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.FileInputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class PersistentDataStoreTest { + private PersistentDataStore mDataStore; + private TestInjector mInjector; + + @Before + public void setUp() { + mInjector = new TestInjector(); + mDataStore = new PersistentDataStore(mInjector); + } + + @Test + public void testLoadingBrightnessConfigurations() { + String contents = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + + "<display-manager-state>\n" + + " <brightness-configurations>\n" + + " <brightness-configuration user-serial=\"1\">\n" + + " <brightness-curve>\n" + + " <brightness-point lux=\"0\" nits=\"13.25\"/>\n" + + " <brightness-point lux=\"25\" nits=\"35.94\"/>\n" + + " </brightness-curve>\n" + + " </brightness-configuration>\n" + + " <brightness-configuration user-serial=\"3\">\n" + + " <brightness-curve>\n" + + " <brightness-point lux=\"0\" nits=\"13.25\"/>\n" + + " <brightness-point lux=\"10.2\" nits=\"15\"/>\n" + + " </brightness-curve>\n" + + " </brightness-configuration>\n" + + " </brightness-configurations>\n" + + "</display-manager-state>\n"; + InputStream is = new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)); + mInjector.setReadStream(is); + mDataStore.loadIfNeeded(); + BrightnessConfiguration config = mDataStore.getBrightnessConfiguration(1 /*userSerial*/); + Pair<float[], float[]> curve = config.getCurve(); + float[] expectedLux = { 0f, 25f }; + float[] expectedNits = { 13.25f, 35.94f }; + assertArrayEquals(expectedLux, curve.first, "lux"); + assertArrayEquals(expectedNits, curve.second, "nits"); + + config = mDataStore.getBrightnessConfiguration(3 /*userSerial*/); + curve = config.getCurve(); + expectedLux = new float[] { 0f, 10.2f }; + expectedNits = new float[] { 13.25f, 15f }; + assertArrayEquals(expectedLux, curve.first, "lux"); + assertArrayEquals(expectedNits, curve.second, "nits"); + } + + @Test + public void testBrightnessConfigWithInvalidCurveIsIgnored() { + String contents = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + + "<display-manager-state>\n" + + " <brightness-configurations>\n" + + " <brightness-configuration user-serial=\"0\">\n" + + " <brightness-curve>\n" + + " <brightness-point lux=\"1\" nits=\"13.25\"/>\n" + + " <brightness-point lux=\"25\" nits=\"35.94\"/>\n" + + " </brightness-curve>\n" + + " </brightness-configuration>\n" + + " </brightness-configurations>\n" + + "</display-manager-state>\n"; + InputStream is = new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)); + mInjector.setReadStream(is); + mDataStore.loadIfNeeded(); + assertNull(mDataStore.getBrightnessConfiguration(0 /*userSerial*/)); + } + + @Test + public void testBrightnessConfigWithInvalidFloatsIsIgnored() { + String contents = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + + "<display-manager-state>\n" + + " <brightness-configurations>\n" + + " <brightness-configuration user-serial=\"0\">\n" + + " <brightness-curve>\n" + + " <brightness-point lux=\"0\" nits=\"13.25\"/>\n" + + " <brightness-point lux=\"0xFF\" nits=\"foo\"/>\n" + + " </brightness-curve>\n" + + " </brightness-configuration>\n" + + " </brightness-configurations>\n" + + "</display-manager-state>\n"; + InputStream is = new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)); + mInjector.setReadStream(is); + mDataStore.loadIfNeeded(); + assertNull(mDataStore.getBrightnessConfiguration(0 /*userSerial*/)); + } + + @Test + public void testEmptyBrightnessConfigurationsDoesntCrash() { + String contents = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + + "<display-manager-state>\n" + + " <brightness-configurations />\n" + + "</display-manager-state>\n"; + InputStream is = new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)); + mInjector.setReadStream(is); + mDataStore.loadIfNeeded(); + assertNull(mDataStore.getBrightnessConfiguration(0 /*userSerial*/)); + } + + @Test + public void testStoreAndReloadOfBrightnessConfigurations() { + final float[] lux = { 0f, 10f }; + final float[] nits = {1f, 100f }; + final BrightnessConfiguration config = new BrightnessConfiguration.Builder() + .setCurve(lux, nits) + .build(); + mDataStore.loadIfNeeded(); + assertNull(mDataStore.getBrightnessConfiguration(0 /*userSerial*/)); + mDataStore.setBrightnessConfigurationForUser(config, 0); + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + mInjector.setWriteStream(baos); + mDataStore.saveIfNeeded(); + assertTrue(mInjector.wasWriteSuccessful()); + + TestInjector newInjector = new TestInjector(); + PersistentDataStore newDataStore = new PersistentDataStore(newInjector); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + newInjector.setReadStream(bais); + newDataStore.loadIfNeeded(); + assertNotNull(newDataStore.getBrightnessConfiguration(0 /*userSerial*/)); + assertEquals(mDataStore.getBrightnessConfiguration(0 /*userSerial*/), + newDataStore.getBrightnessConfiguration(0 /*userSerial*/)); + } + + public class TestInjector extends PersistentDataStore.Injector { + private InputStream mReadStream; + private OutputStream mWriteStream; + + private boolean mWasSuccessful; + + @Override + public InputStream openRead() throws FileNotFoundException { + if (mReadStream != null) { + return mReadStream; + } else { + throw new FileNotFoundException(); + } + } + + @Override + public OutputStream startWrite() { + return mWriteStream; + } + + @Override + public void finishWrite(OutputStream os, boolean success) { + mWasSuccessful = success; + try { + os.close(); + } catch (IOException e) { + // This method can't throw IOException since the super implementation doesn't, so + // we just wrap it in a RuntimeException so we end up crashing the test all the + // same. + throw new RuntimeException(e); + } + } + + public void setReadStream(InputStream is) { + mReadStream = is; + } + + public void setWriteStream(OutputStream os) { + mWriteStream = os; + } + + public boolean wasWriteSuccessful() { + return mWasSuccessful; + } + } + + private static void assertArrayEquals(float[] expected, float[] actual, String name) { + assertEquals("Expected " + name + " arrays to be the same length!", + expected.length, actual.length); + for (int i = 0; i < expected.length; i++) { + assertEquals("Expected " + name + " arrays to be equivalent when value " + i + + "differs", expected[i], actual[i], 0.01 /*tolerance*/); + } + } +} diff --git a/core/tests/coretests/src/android/security/recoverablekeystore/RecoverableKeyGeneratorTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java index d85d3b898c3a..298a98822caa 100644 --- a/core/tests/coretests/src/android/security/recoverablekeystore/RecoverableKeyGeneratorTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.security.recoverablekeystore; +package com.android.server.locksettings.recoverablekeystore; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -53,7 +53,8 @@ public class RecoverableKeyGeneratorTest { private static final String TEST_ALIAS = "karlin"; private static final String WRAPPING_KEY_ALIAS = "RecoverableKeyGeneratorTestWrappingKey"; - @Mock RecoverableKeyStorage mRecoverableKeyStorage; + @Mock + RecoverableKeyStorage mRecoverableKeyStorage; @Captor ArgumentCaptor<KeyProtection> mKeyProtectionArgumentCaptor; diff --git a/core/tests/coretests/src/android/security/recoverablekeystore/WrappedKeyTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java index 233c8211dcb8..4cd5631c9b8d 100644 --- a/core/tests/coretests/src/android/security/recoverablekeystore/WrappedKeyTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.security.recoverablekeystore; +package com.android.server.locksettings.recoverablekeystore; import static org.junit.Assert.assertEquals; diff --git a/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java index b57cac06ce6e..74013b792f07 100644 --- a/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java +++ b/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java @@ -25,6 +25,7 @@ import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import java.io.File; +import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; @@ -33,6 +34,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; @SmallTest public class PackageStatusStorageTest { @@ -48,6 +50,7 @@ public class PackageStatusStorageTest { // Using the instrumentation context means the database is created in a test app-specific // directory. mPackageStatusStorage = new PackageStatusStorage(dataDir); + mPackageStatusStorage.initialize(); } @After @@ -56,6 +59,16 @@ public class PackageStatusStorageTest { } @Test + public void initialize_fail() { + File readOnlyDir = new File("/system/does/not/exist"); + PackageStatusStorage packageStatusStorage = new PackageStatusStorage(readOnlyDir); + try { + packageStatusStorage.initialize(); + fail(); + } catch (IOException expected) {} + } + + @Test public void getPackageStatus_initialState() { assertNull(mPackageStatusStorage.getPackageStatus()); } diff --git a/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java index 5d739a308e89..9cf6392cab97 100644 --- a/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java +++ b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java @@ -30,6 +30,8 @@ import android.provider.TimeZoneRulesDataContract; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; +import java.io.File; +import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.time.Clock; @@ -104,7 +106,7 @@ public class PackageTrackerTest { configureTrackingDisabled(); // Initialize the tracker. - mPackageTracker.start(); + assertFalse(mPackageTracker.start()); // Check the IntentHelper was not initialized. mFakeIntentHelper.assertNotInitialized(); @@ -119,7 +121,7 @@ public class PackageTrackerTest { configureTrackingDisabled(); // Initialize the tracker. - mPackageTracker.start(); + assertFalse(mPackageTracker.start()); // Check reliability triggering state. mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); @@ -141,7 +143,7 @@ public class PackageTrackerTest { configureTrackingDisabled(); // Initialize the tracker. - mPackageTracker.start(); + assertFalse(mPackageTracker.start()); // Check reliability triggering state. mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); @@ -166,7 +168,7 @@ public class PackageTrackerTest { mPackageStatusStorage.generateCheckToken(INITIAL_APP_PACKAGE_VERSIONS); // Initialize the tracker. - mPackageTracker.start(); + assertFalse(mPackageTracker.start()); // Check reliability triggering state. mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); @@ -262,6 +264,35 @@ public class PackageTrackerTest { } @Test + public void trackingEnabled_storageInitializationFails() throws Exception { + // Create a PackageStateStorage that will fail to initialize. + PackageStatusStorage packageStatusStorage = + new PackageStatusStorage(new File("/system/does/not/exist")); + + // Create a new PackageTracker to use the bad storage. + mPackageTracker = new PackageTracker( + mFakeClock, + mMockConfigHelper, + mMockPackageManagerHelper, + packageStatusStorage, + mFakeIntentHelper); + + // Set up device configuration. + configureTrackingEnabled(); + configureReliabilityConfigSettingsOk(); + configureValidApplications(); + + // Initialize the tracker. + assertFalse(mPackageTracker.start()); + + // Check the IntentHelper was not initialized. + mFakeIntentHelper.assertNotInitialized(); + + // Check reliability triggering state. + mFakeIntentHelper.assertReliabilityTriggerNotScheduled(); + } + + @Test public void trackingEnabled_packageUpdate_badUpdateAppManifestEntry() throws Exception { // Set up device configuration. configureTrackingEnabled(); @@ -269,7 +300,7 @@ public class PackageTrackerTest { configureValidApplications(); // Initialize the tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -306,7 +337,7 @@ public class PackageTrackerTest { configureValidApplications(); // Initialize the tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -351,7 +382,7 @@ public class PackageTrackerTest { configureValidApplications(); // Initialize the tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -399,7 +430,7 @@ public class PackageTrackerTest { configureValidApplications(); // Initialize the tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -438,7 +469,7 @@ public class PackageTrackerTest { configureValidApplications(); // Initialize the tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -484,7 +515,7 @@ public class PackageTrackerTest { configureValidApplications(); // Initialize the tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -533,7 +564,7 @@ public class PackageTrackerTest { configureValidApplications(); // Initialize the tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -593,7 +624,7 @@ public class PackageTrackerTest { configureValidApplications(); // Initialize the package tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -655,7 +686,7 @@ public class PackageTrackerTest { configureValidApplications(); // Initialize the package tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -711,7 +742,7 @@ public class PackageTrackerTest { configureValidApplications(); // Initialize the package tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -760,7 +791,7 @@ public class PackageTrackerTest { PackageVersions packageVersions = configureValidApplications(); // Initialize the package tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -797,7 +828,7 @@ public class PackageTrackerTest { PackageStatus.CHECK_COMPLETED_SUCCESS, packageVersions); // Initialize the package tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -837,7 +868,7 @@ public class PackageTrackerTest { PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); // Initialize the package tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -883,7 +914,7 @@ public class PackageTrackerTest { PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); // Initialize the package tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -942,7 +973,7 @@ public class PackageTrackerTest { PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); // Initialize the package tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -1017,7 +1048,7 @@ public class PackageTrackerTest { PackageStatus.CHECK_COMPLETED_FAILURE, oldPackageVersions); // Initialize the package tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -1083,7 +1114,7 @@ public class PackageTrackerTest { PackageStatus.CHECK_COMPLETED_SUCCESS, currentPackageVersions); // Initialize the package tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); @@ -1138,7 +1169,7 @@ public class PackageTrackerTest { PackageStatus.CHECK_COMPLETED_SUCCESS, currentPackageVersions); // Initialize the package tracker. - mPackageTracker.start(); + assertTrue(mPackageTracker.start()); // Check the intent helper is properly configured. checkIntentHelperInitializedAndReliabilityTrackingEnabled(); diff --git a/services/tests/servicestests/src/com/android/server/wm/DragDropControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/DragDropControllerTests.java new file mode 100644 index 000000000000..ce76a223ef20 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/wm/DragDropControllerTests.java @@ -0,0 +1,88 @@ +/* + * 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 com.android.server.wm; + +import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import android.os.IBinder; +import android.platform.test.annotations.Presubmit; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import android.view.InputChannel; +import android.view.Surface; +import android.view.SurfaceSession; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +/** + * Tests for the {@link DragDropController} class. + * + * atest com.android.server.wm.DragDropControllerTests + */ +@SmallTest +@RunWith(AndroidJUnit4.class) +@Presubmit +public class DragDropControllerTests extends WindowTestsBase { + private static final int TIMEOUT_MS = 1000; + private DragDropController mTarget; + private WindowState mWindow; + private IBinder mToken; + + @Before + public void setUp() throws Exception { + super.setUp(); + assertNotNull(sWm.mDragDropController); + mTarget = sWm.mDragDropController; + mWindow = createWindow(null, TYPE_BASE_APPLICATION, "window"); + synchronized (sWm.mWindowMap) { + // Because sWm is a static object, the previous operation may remain. + assertFalse(mTarget.dragDropActiveLocked()); + } + } + + @After + public void tearDown() { + if (mToken != null) { + mTarget.cancelDragAndDrop(mToken); + } + } + + @Test + public void testPrepareDrag() throws Exception { + final Surface surface = new Surface(); + mToken = mTarget.prepareDrag( + new SurfaceSession(), 0, 0, mWindow.mClient, 0, 100, 100, surface); + assertNotNull(mToken); + } + + @Test + public void testPrepareDrag_ZeroSizeSurface() throws Exception { + final Surface surface = new Surface(); + mToken = mTarget.prepareDrag( + new SurfaceSession(), 0, 0, mWindow.mClient, 0, 0, 0, surface); + assertNull(mToken); + } +} diff --git a/services/tests/shortcutmanagerutils/Android.mk b/services/tests/shortcutmanagerutils/Android.mk index 0848fd51fa71..019bcbd37628 100644 --- a/services/tests/shortcutmanagerutils/Android.mk +++ b/services/tests/shortcutmanagerutils/Android.mk @@ -21,7 +21,6 @@ LOCAL_SRC_FILES := \ LOCAL_JAVA_LIBRARIES := \ mockito-target \ - legacy-android-test \ android.test.runner.stubs LOCAL_MODULE_TAGS := optional diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 55ec133a29da..0343ab2d14f4 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -92,7 +92,9 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.*; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; import java.io.BufferedInputStream; @@ -873,6 +875,77 @@ public class NotificationManagerServiceTest extends NotificationTestCase { } @Test + public void testCancelAllCancelNotificationsFromListener_ForegroundServiceFlag() + throws Exception { + final NotificationRecord parent = generateNotificationRecord( + mTestNotificationChannel, 1, "group", true); + final NotificationRecord child = generateNotificationRecord( + mTestNotificationChannel, 2, "group", false); + final NotificationRecord child2 = generateNotificationRecord( + mTestNotificationChannel, 3, "group", false); + child2.getNotification().flags |= Notification.FLAG_FOREGROUND_SERVICE; + final NotificationRecord newGroup = generateNotificationRecord( + mTestNotificationChannel, 4, "group2", false); + mService.addNotification(parent); + mService.addNotification(child); + mService.addNotification(child2); + mService.addNotification(newGroup); + mService.getBinderService().cancelNotificationsFromListener(null, null); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(parent.sbn.getPackageName()); + assertEquals(0, notifs.length); + } + + @Test + public void testCancelAllCancelNotificationsFromListener_ForegroundServiceFlagWithParameter() + throws Exception { + final NotificationRecord parent = generateNotificationRecord( + mTestNotificationChannel, 1, "group", true); + final NotificationRecord child = generateNotificationRecord( + mTestNotificationChannel, 2, "group", false); + final NotificationRecord child2 = generateNotificationRecord( + mTestNotificationChannel, 3, "group", false); + child2.getNotification().flags |= Notification.FLAG_FOREGROUND_SERVICE; + final NotificationRecord newGroup = generateNotificationRecord( + mTestNotificationChannel, 4, "group2", false); + mService.addNotification(parent); + mService.addNotification(child); + mService.addNotification(child2); + mService.addNotification(newGroup); + String[] keys = {parent.sbn.getKey(), child.sbn.getKey(), + child2.sbn.getKey(), newGroup.sbn.getKey()}; + mService.getBinderService().cancelNotificationsFromListener(null, keys); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(parent.sbn.getPackageName()); + assertEquals(1, notifs.length); + } + + @Test + public void testUserInitiatedCancelAllWithGroup_ForegroundServiceFlag() throws Exception { + final NotificationRecord parent = generateNotificationRecord( + mTestNotificationChannel, 1, "group", true); + final NotificationRecord child = generateNotificationRecord( + mTestNotificationChannel, 2, "group", false); + final NotificationRecord child2 = generateNotificationRecord( + mTestNotificationChannel, 3, "group", false); + child2.getNotification().flags |= Notification.FLAG_FOREGROUND_SERVICE; + final NotificationRecord newGroup = generateNotificationRecord( + mTestNotificationChannel, 4, "group2", false); + mService.addNotification(parent); + mService.addNotification(child); + mService.addNotification(child2); + mService.addNotification(newGroup); + mService.mNotificationDelegate.onClearAll(mUid, Binder.getCallingPid(), + parent.getUserId()); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(parent.sbn.getPackageName()); + assertEquals(0, notifs.length); + } + + @Test public void testFindGroupNotificationsLocked() throws Exception { // make sure the same notification can be found in both lists and returned final NotificationRecord group1 = generateNotificationRecord( @@ -912,6 +985,157 @@ public class NotificationManagerServiceTest extends NotificationTestCase { } @Test + public void testCancelAllNotifications_CancelsNoClearFlagOnGoing() throws Exception { + final NotificationRecord notif = generateNotificationRecord( + mTestNotificationChannel, 1, "group", true); + notif.getNotification().flags |= Notification.FLAG_NO_CLEAR; + mService.addNotification(notif); + mService.cancelAllNotificationsInt(mUid, 0, PKG, null, 0, + Notification.FLAG_ONGOING_EVENT, true, notif.getUserId(), 0, null); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(notif.sbn.getPackageName()); + assertEquals(0, notifs.length); + } + + @Test + public void testCancelAllCancelNotificationsFromListener_NoClearFlagWithParameter() + throws Exception { + final NotificationRecord parent = generateNotificationRecord( + mTestNotificationChannel, 1, "group", true); + final NotificationRecord child = generateNotificationRecord( + mTestNotificationChannel, 2, "group", false); + final NotificationRecord child2 = generateNotificationRecord( + mTestNotificationChannel, 3, "group", false); + child2.getNotification().flags |= Notification.FLAG_NO_CLEAR; + final NotificationRecord newGroup = generateNotificationRecord( + mTestNotificationChannel, 4, "group2", false); + mService.addNotification(parent); + mService.addNotification(child); + mService.addNotification(child2); + mService.addNotification(newGroup); + String[] keys = {parent.sbn.getKey(), child.sbn.getKey(), + child2.sbn.getKey(), newGroup.sbn.getKey()}; + mService.getBinderService().cancelNotificationsFromListener(null, keys); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(parent.sbn.getPackageName()); + assertEquals(0, notifs.length); + } + + @Test + public void testAppInitiatedCancelAllNotifications_CancelsOnGoingFlag() throws Exception { + final StatusBarNotification sbn = generateNotificationRecord(null).sbn; + sbn.getNotification().flags |= Notification.FLAG_ONGOING_EVENT; + mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", + sbn.getId(), sbn.getNotification(), sbn.getUserId()); + mBinderService.cancelAllNotifications(PKG, sbn.getUserId()); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(sbn.getPackageName()); + assertEquals(0, notifs.length); + } + + @Test + public void testCancelAllNotifications_CancelsOnGoingFlag() throws Exception { + final NotificationRecord notif = generateNotificationRecord( + mTestNotificationChannel, 1, "group", true); + notif.getNotification().flags |= Notification.FLAG_ONGOING_EVENT; + mService.addNotification(notif); + mService.cancelAllNotificationsInt(mUid, 0, PKG, null, 0, 0, true, + notif.getUserId(), 0, null); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(notif.sbn.getPackageName()); + assertEquals(0, notifs.length); + } + + @Test + public void testUserInitiatedCancelAllOnClearAll_OnGoingFlag() throws Exception { + final NotificationRecord notif = generateNotificationRecord( + mTestNotificationChannel, 1, "group", true); + notif.getNotification().flags |= Notification.FLAG_ONGOING_EVENT; + mService.addNotification(notif); + + mService.mNotificationDelegate.onClearAll(mUid, Binder.getCallingPid(), + notif.getUserId()); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(notif.sbn.getPackageName()); + assertEquals(1, notifs.length); + } + + @Test + public void testCancelAllCancelNotificationsFromListener_OnGoingFlag() throws Exception { + final NotificationRecord parent = generateNotificationRecord( + mTestNotificationChannel, 1, "group", true); + final NotificationRecord child = generateNotificationRecord( + mTestNotificationChannel, 2, "group", false); + final NotificationRecord child2 = generateNotificationRecord( + mTestNotificationChannel, 3, "group", false); + child2.getNotification().flags |= Notification.FLAG_ONGOING_EVENT; + final NotificationRecord newGroup = generateNotificationRecord( + mTestNotificationChannel, 4, "group2", false); + mService.addNotification(parent); + mService.addNotification(child); + mService.addNotification(child2); + mService.addNotification(newGroup); + mService.getBinderService().cancelNotificationsFromListener(null, null); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(parent.sbn.getPackageName()); + assertEquals(1, notifs.length); + } + + @Test + public void testCancelAllCancelNotificationsFromListener_OnGoingFlagWithParameter() + throws Exception { + final NotificationRecord parent = generateNotificationRecord( + mTestNotificationChannel, 1, "group", true); + final NotificationRecord child = generateNotificationRecord( + mTestNotificationChannel, 2, "group", false); + final NotificationRecord child2 = generateNotificationRecord( + mTestNotificationChannel, 3, "group", false); + child2.getNotification().flags |= Notification.FLAG_ONGOING_EVENT; + final NotificationRecord newGroup = generateNotificationRecord( + mTestNotificationChannel, 4, "group2", false); + mService.addNotification(parent); + mService.addNotification(child); + mService.addNotification(child2); + mService.addNotification(newGroup); + String[] keys = {parent.sbn.getKey(), child.sbn.getKey(), + child2.sbn.getKey(), newGroup.sbn.getKey()}; + mService.getBinderService().cancelNotificationsFromListener(null, keys); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(parent.sbn.getPackageName()); + assertEquals(0, notifs.length); + } + + @Test + public void testUserInitiatedCancelAllWithGroup_OnGoingFlag() throws Exception { + final NotificationRecord parent = generateNotificationRecord( + mTestNotificationChannel, 1, "group", true); + final NotificationRecord child = generateNotificationRecord( + mTestNotificationChannel, 2, "group", false); + final NotificationRecord child2 = generateNotificationRecord( + mTestNotificationChannel, 3, "group", false); + child2.getNotification().flags |= Notification.FLAG_ONGOING_EVENT; + final NotificationRecord newGroup = generateNotificationRecord( + mTestNotificationChannel, 4, "group2", false); + mService.addNotification(parent); + mService.addNotification(child); + mService.addNotification(child2); + mService.addNotification(newGroup); + mService.mNotificationDelegate.onClearAll(mUid, Binder.getCallingPid(), + parent.getUserId()); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(parent.sbn.getPackageName()); + assertEquals(1, notifs.length); + } + + @Test public void testTvExtenderChannelOverride_onTv() throws Exception { mService.setIsTelevision(true); mService.setRankingHelper(mRankingHelper); diff --git a/services/usage/java/com/android/server/usage/AppIdleHistory.java b/services/usage/java/com/android/server/usage/AppIdleHistory.java index 6ac4b36a6ad7..620922ac1363 100644 --- a/services/usage/java/com/android/server/usage/AppIdleHistory.java +++ b/services/usage/java/com/android/server/usage/AppIdleHistory.java @@ -42,6 +42,8 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; /** * Keeps track of recent active state changes in apps. @@ -334,6 +336,16 @@ public class AppIdleHistory { return appUsageHistory.currentBucket; } + public Map<String, Integer> getAppStandbyBuckets(int userId, long elapsedRealtime) { + ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); + int size = userHistory.size(); + HashMap<String, Integer> buckets = new HashMap<>(size); + for (int i = 0; i < size; i++) { + buckets.put(userHistory.keyAt(i), userHistory.valueAt(i).currentBucket); + } + return buckets; + } + public String getAppStandbyReason(String packageName, int userId, long elapsedRealtime) { ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); AppUsageHistory appUsageHistory = diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java index d8086bb4a92d..46efbd059d52 100644 --- a/services/usage/java/com/android/server/usage/AppStandbyController.java +++ b/services/usage/java/com/android/server/usage/AppStandbyController.java @@ -84,6 +84,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; /** * Manages the standby state of an app, listening to various events. @@ -774,13 +775,23 @@ public class AppStandbyController { return STANDBY_BUCKET_ACTIVE; } - return mAppIdleHistory.getAppStandbyBucket(packageName, userId, elapsedRealtime); + synchronized (mAppIdleLock) { + return mAppIdleHistory.getAppStandbyBucket(packageName, userId, elapsedRealtime); + } + } + + public Map<String, Integer> getAppStandbyBuckets(int userId, long elapsedRealtime) { + synchronized (mAppIdleLock) { + return mAppIdleHistory.getAppStandbyBuckets(userId, elapsedRealtime); + } } void setAppStandbyBucket(String packageName, int userId, @StandbyBuckets int newBucket, String reason, long elapsedRealtime) { - mAppIdleHistory.setAppStandbyBucket(packageName, userId, elapsedRealtime, newBucket, - reason); + synchronized (mAppIdleLock) { + mAppIdleHistory.setAppStandbyBucket(packageName, userId, elapsedRealtime, newBucket, + reason); + } maybeInformListeners(packageName, userId, elapsedRealtime, newBucket); } diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java index 21b11b058160..82f800128beb 100644 --- a/services/usage/java/com/android/server/usage/StorageStatsService.java +++ b/services/usage/java/com/android/server/usage/StorageStatsService.java @@ -164,6 +164,14 @@ public class StorageStatsService extends IStorageStatsManager.Stub { } @Override + public boolean isReservedSupported(String volumeUuid, String callingPackage) { + enforcePermission(Binder.getCallingUid(), callingPackage); + + // TODO: implement as part of b/62024591 + return false; + } + + @Override public long getTotalBytes(String volumeUuid, String callingPackage) { // NOTE: No permissions required diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 0572771ab6e0..15284d5e3dec 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -68,7 +68,10 @@ import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Map; /** * A service that collects, aggregates, and persists application usage data. @@ -741,6 +744,68 @@ public class UsageStatsService extends SystemService implements } @Override + public Map getAppStandbyBuckets(String callingPackageName, int userId) { + final int callingUid = Binder.getCallingUid(); + try { + userId = ActivityManager.getService().handleIncomingUser( + Binder.getCallingPid(), callingUid, userId, false, false, + "getAppStandbyBucket", null); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + if (!hasPermission(callingPackageName)) { + throw new SecurityException( + "Don't have permission to query app standby bucket"); + } + final long token = Binder.clearCallingIdentity(); + try { + return mAppStandby.getAppStandbyBuckets(userId, + SystemClock.elapsedRealtime()); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override + public void setAppStandbyBuckets(Map appBuckets, int userId) { + getContext().enforceCallingPermission(Manifest.permission.CHANGE_APP_IDLE_STATE, + "No permission to change app standby state"); + + final int callingUid = Binder.getCallingUid(); + try { + userId = ActivityManager.getService().handleIncomingUser( + Binder.getCallingPid(), callingUid, userId, false, true, + "setAppStandbyBucket", null); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + final long token = Binder.clearCallingIdentity(); + try { + final long elapsedRealtime = SystemClock.elapsedRealtime(); + Map<String, Integer> buckets = (Map<String, Integer>) appBuckets; + for (Map.Entry<String, Integer> entry: buckets.entrySet()) { + String packageName = entry.getKey(); + int bucket = entry.getValue(); + if (bucket < UsageStatsManager.STANDBY_BUCKET_ACTIVE + || bucket > UsageStatsManager.STANDBY_BUCKET_NEVER) { + throw new IllegalArgumentException( + "Cannot set the standby bucket to " + bucket); + } + // Caller cannot set their own standby state + if (mPackageManagerInternal.getPackageUid(packageName, + PackageManager.MATCH_ANY_USER, userId) == callingUid) { + throw new IllegalArgumentException("Cannot set your own standby bucket"); + } + mAppStandby.setAppStandbyBucket(packageName, userId, bucket, + UsageStatsManager.REASON_PREDICTED + ":" + callingUid, + elapsedRealtime); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override public void whitelistAppTemporarily(String packageName, long duration, int userId) throws RemoteException { StringBuilder reason = new StringBuilder(32); diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index c050a1029eb0..ead8849c363e 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -735,12 +735,11 @@ public class CarrierConfigManager { public static final String KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL = "show_iccid_in_sim_status_bool"; /** - * Flag specifying whether signal strength is hidden in SIM Status screen, - * default to false. - * @hide + * Flag specifying whether the {@link android.telephony.SignalStrength} is shown in the SIM + * Status screen. The default value is true. */ - public static final String KEY_HIDE_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL = - "hide_signal_strength_in_sim_status_bool"; + public static final String KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL = + "show_signal_strength_in_sim_status_bool"; /** * Flag specifying whether an additional (client initiated) intent needs to be sent on System @@ -1801,7 +1800,7 @@ public class CarrierConfigManager { sDefaults.putString(KEY_CARRIER_VVM_PACKAGE_NAME_STRING, ""); sDefaults.putStringArray(KEY_CARRIER_VVM_PACKAGE_NAME_STRING_ARRAY, null); sDefaults.putBoolean(KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL, false); - sDefaults.putBoolean(KEY_HIDE_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL, false); + sDefaults.putBoolean(KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL, true); sDefaults.putBoolean(KEY_CI_ACTION_ON_SYS_UPDATE_BOOL, false); sDefaults.putString(KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING, ""); sDefaults.putString(KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING, ""); diff --git a/tools/aapt2/cmd/Optimize.cpp b/tools/aapt2/cmd/Optimize.cpp index 1bdb762528b6..eaadfd82629e 100644 --- a/tools/aapt2/cmd/Optimize.cpp +++ b/tools/aapt2/cmd/Optimize.cpp @@ -327,7 +327,6 @@ int Optimize(const std::vector<StringPiece>& args) { Maybe<std::string> config_path; Maybe<std::string> whitelist_path; Maybe<std::string> target_densities; - Maybe<std::string> target_abis; std::vector<std::string> configs; std::vector<std::string> split_args; std::unordered_set<std::string> kept_artifacts; @@ -349,12 +348,6 @@ int Optimize(const std::vector<StringPiece>& args) { "Path to the whitelist.cfg file containing whitelisted resources \n" "whose names should not be altered in final resource tables.", &whitelist_path) - .OptionalFlag( - "--target-abis", - "Comma separated list of the CPU ABIs that the APK will be optimized for.\n" - "All the native libraries that would be unused on devices of the given ABIs will \n" - "be removed from the APK.", - &target_abis) .OptionalFlagList("-c", "Comma separated list of configurations to include. The default\n" "is all configurations.", diff --git a/tools/aapt2/configuration/ConfigurationParser.cpp b/tools/aapt2/configuration/ConfigurationParser.cpp index b99240f0a40a..852ff176ed7d 100644 --- a/tools/aapt2/configuration/ConfigurationParser.cpp +++ b/tools/aapt2/configuration/ConfigurationParser.cpp @@ -519,14 +519,22 @@ ConfigurationParser::ActionHandler ConfigurationParser::android_sdk_group_handle } else { AndroidSdk entry; for (const auto& attr : child->attributes) { + Maybe<int>* target = nullptr; if (attr.name == "minSdkVersion") { - entry.min_sdk_version = ResourceUtils::ParseSdkVersion(attr.value); + target = &entry.min_sdk_version; } else if (attr.name == "targetSdkVersion") { - entry.target_sdk_version = ResourceUtils::ParseSdkVersion(attr.value); + target = &entry.target_sdk_version; } else if (attr.name == "maxSdkVersion") { - entry.max_sdk_version = ResourceUtils::ParseSdkVersion(attr.value); + target = &entry.max_sdk_version; } else { diag->Warn(DiagMessage() << "Unknown attribute: " << attr.name << " = " << attr.value); + continue; + } + + *target = ResourceUtils::ParseSdkVersion(attr.value); + if (!*target) { + diag->Error(DiagMessage() << "Invalid attribute: " << attr.name << " = " << attr.value); + valid = false; } } diff --git a/tools/aapt2/configuration/ConfigurationParser_test.cpp b/tools/aapt2/configuration/ConfigurationParser_test.cpp index afa155f46eb9..f7153c822bbc 100644 --- a/tools/aapt2/configuration/ConfigurationParser_test.cpp +++ b/tools/aapt2/configuration/ConfigurationParser_test.cpp @@ -18,8 +18,10 @@ #include <string> +#include "android-base/stringprintf.h" #include "androidfw/ResourceTypes.h" +#include "SdkConstants.h" #include "test/Test.h" #include "xml/XmlDom.h" @@ -35,18 +37,19 @@ void PrintTo(const AndroidSdk& sdk, std::ostream* os) { namespace { +using ::aapt::configuration::Abi; +using ::aapt::configuration::AndroidManifest; +using ::aapt::configuration::AndroidSdk; +using ::aapt::configuration::Artifact; +using ::aapt::configuration::DeviceFeature; +using ::aapt::configuration::GlTexture; +using ::aapt::configuration::Locale; +using ::aapt::configuration::PostProcessingConfiguration; +using ::aapt::xml::Element; +using ::aapt::xml::NodeCast; using ::android::ResTable_config; -using configuration::Abi; -using configuration::AndroidSdk; -using configuration::Artifact; -using configuration::PostProcessingConfiguration; -using configuration::DeviceFeature; -using configuration::GlTexture; -using configuration::Locale; -using configuration::AndroidManifest; +using ::android::base::StringPrintf; using ::testing::ElementsAre; -using xml::Element; -using xml::NodeCast; constexpr const char* kValidConfig = R"(<?xml version="1.0" encoding="utf-8" ?> <post-process xmlns="http://schemas.android.com/tools/aapt"> @@ -421,17 +424,106 @@ TEST_F(ConfigurationParserTest, AndroidSdkGroupAction) { ASSERT_EQ(sdk, out); } +TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_SingleVersion) { + { + static constexpr const char* xml = R"xml( + <android-sdk-group label="v19"> + <android-sdk minSdkVersion="19"></android-sdk> + </android-sdk-group>)xml"; + + auto doc = test::BuildXmlDom(xml); + + PostProcessingConfiguration config; + bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); + ASSERT_TRUE(ok); + + ASSERT_EQ(1ul, config.android_sdk_groups.size()); + ASSERT_EQ(1u, config.android_sdk_groups.count("v19")); + + auto& out = config.android_sdk_groups["v19"]; + EXPECT_EQ(19, out.min_sdk_version.value()); + EXPECT_FALSE(out.max_sdk_version); + EXPECT_FALSE(out.target_sdk_version); + } + + { + static constexpr const char* xml = R"xml( + <android-sdk-group label="v19"> + <android-sdk maxSdkVersion="19"></android-sdk> + </android-sdk-group>)xml"; + + auto doc = test::BuildXmlDom(xml); + + PostProcessingConfiguration config; + bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); + ASSERT_TRUE(ok); + + ASSERT_EQ(1ul, config.android_sdk_groups.size()); + ASSERT_EQ(1u, config.android_sdk_groups.count("v19")); + + auto& out = config.android_sdk_groups["v19"]; + EXPECT_EQ(19, out.max_sdk_version.value()); + EXPECT_FALSE(out.min_sdk_version); + EXPECT_FALSE(out.target_sdk_version); + } + + { + static constexpr const char* xml = R"xml( + <android-sdk-group label="v19"> + <android-sdk targetSdkVersion="19"></android-sdk> + </android-sdk-group>)xml"; + + auto doc = test::BuildXmlDom(xml); + + PostProcessingConfiguration config; + bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); + ASSERT_TRUE(ok); + + ASSERT_EQ(1ul, config.android_sdk_groups.size()); + ASSERT_EQ(1u, config.android_sdk_groups.count("v19")); + + auto& out = config.android_sdk_groups["v19"]; + EXPECT_EQ(19, out.target_sdk_version.value()); + EXPECT_FALSE(out.min_sdk_version); + EXPECT_FALSE(out.max_sdk_version); + } +} + +TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_InvalidVersion) { + static constexpr const char* xml = R"xml( + <android-sdk-group label="v19"> + <android-sdk + minSdkVersion="v19" + targetSdkVersion="v24" + maxSdkVersion="v25"> + <manifest> + <!--- manifest additions here XSLT? TODO --> + </manifest> + </android-sdk> + </android-sdk-group>)xml"; + + auto doc = test::BuildXmlDom(xml); + + PostProcessingConfiguration config; + bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); + ASSERT_FALSE(ok); +} + TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_NonNumeric) { static constexpr const char* xml = R"xml( <android-sdk-group label="P"> <android-sdk - minSdkVersion="M" - targetSdkVersion="P" - maxSdkVersion="P"> + minSdkVersion="25" + targetSdkVersion="%s" + maxSdkVersion="%s"> </android-sdk> </android-sdk-group>)xml"; - auto doc = test::BuildXmlDom(xml); + const auto& dev_sdk = GetDevelopmentSdkCodeNameAndVersion(); + const char* codename = dev_sdk.first.data(); + const ApiVersion& version = dev_sdk.second; + + auto doc = test::BuildXmlDom(StringPrintf(xml, codename, codename)); PostProcessingConfiguration config; bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); @@ -443,9 +535,9 @@ TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_NonNumeric) { auto& out = config.android_sdk_groups["P"]; AndroidSdk sdk; - sdk.min_sdk_version = {}; // Only the latest development version is supported. - sdk.target_sdk_version = 28; - sdk.max_sdk_version = 28; + sdk.min_sdk_version = 25; + sdk.target_sdk_version = version; + sdk.max_sdk_version = version; ASSERT_EQ(sdk, out); } diff --git a/tools/aapt2/optimize/MultiApkGenerator.cpp b/tools/aapt2/optimize/MultiApkGenerator.cpp index da3b8792be69..e2d738aec5a2 100644 --- a/tools/aapt2/optimize/MultiApkGenerator.cpp +++ b/tools/aapt2/optimize/MultiApkGenerator.cpp @@ -17,6 +17,7 @@ #include "MultiApkGenerator.h" #include <algorithm> +#include <regex> #include <string> #include "androidfw/StringPiece.h" @@ -125,6 +126,16 @@ class ContextWrapper : public IAaptContext { int min_sdk_ = -1; }; +class SignatureFilter : public IPathFilter { + bool Keep(const std::string& path) override { + static std::regex signature_regex(R"regex(^META-INF/.*\.(RSA|DSA|EC|SF)$)regex"); + if (std::regex_search(path, signature_regex)) { + return false; + } + return !(path == "META-INF/MANIFEST.MF"); + } +}; + MultiApkGenerator::MultiApkGenerator(LoadedApk* apk, IAaptContext* context) : apk_(apk), context_(context) { } @@ -209,6 +220,7 @@ bool MultiApkGenerator::FromBaseApk(const MultiApkGeneratorOptions& options) { diag.Note(DiagMessage() << "Writing output: " << out); } + filters.AddFilter(util::make_unique<SignatureFilter>()); if (!apk_->WriteToArchive(&wrapped_context, table.get(), options.table_flattener_options, &filters, writer.get(), manifest.get())) { return false; |